medusa-product-helper 0.0.18 → 0.0.19
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/.medusa/server/src/api/store/product-helper/products/route.js +105 -11
- package/.medusa/server/src/api/store/product-helper/products/validators.js +10 -1
- package/.medusa/server/src/providers/filter-providers/metadata-provider.js +9 -5
- package/.medusa/server/src/services/dynamic-filter-service.js +471 -96
- package/.medusa/server/src/services/product-filter-service.js +61 -3
- package/package.json +1 -1
|
@@ -14,18 +14,44 @@ class DynamicFilterService {
|
|
|
14
14
|
async applyFilters(options) {
|
|
15
15
|
const { filterParams, options: pluginOptions, pagination, projection, context = {} } = options;
|
|
16
16
|
const filterContext = { ...context, options: pluginOptions };
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
console.log(`[DynamicFilterService] applyFilters called with context:`, {
|
|
18
|
+
hasPricingContext: !!context.pricingContext,
|
|
19
|
+
pricingContextKeys: context.pricingContext ? Object.keys(context.pricingContext) : []
|
|
20
|
+
});
|
|
21
|
+
const { queryFilters, priceRangeFilter, promotionFilter, metadataFilter } = await this.processFilters(filterParams, filterContext);
|
|
22
|
+
// Check if pricing context has currency_code before including calculated_price
|
|
23
|
+
const pricingContext = context?.pricingContext;
|
|
24
|
+
console.log(`[DynamicFilterService] Pricing context check:`, {
|
|
25
|
+
hasPricingContext: !!pricingContext,
|
|
26
|
+
currencyCode: pricingContext?.currency_code,
|
|
27
|
+
currencyCodeType: typeof pricingContext?.currency_code
|
|
28
|
+
});
|
|
29
|
+
const hasValidPricingContext = !!pricingContext && typeof pricingContext.currency_code === "string" && pricingContext.currency_code.trim().length > 0;
|
|
30
|
+
console.log(`[DynamicFilterService] Has valid pricing context:`, hasValidPricingContext);
|
|
31
|
+
// Build query context first to verify it's valid
|
|
19
32
|
const queryContext = this.buildQueryContext(context);
|
|
33
|
+
console.log(`[DynamicFilterService] Query context built:`, {
|
|
34
|
+
hasVariants: !!queryContext.variants,
|
|
35
|
+
hasCalculatedPrice: !!queryContext.variants?.calculated_price,
|
|
36
|
+
calculatedPriceKeys: queryContext.variants?.calculated_price ? Object.keys(queryContext.variants.calculated_price) : []
|
|
37
|
+
});
|
|
38
|
+
// Only include calculated_price in fields if query context has the proper structure
|
|
39
|
+
// This ensures we don't request calculated_price if currency_code is missing
|
|
40
|
+
const hasValidQueryContext = !!(queryContext.variants?.calculated_price);
|
|
41
|
+
console.log(`[DynamicFilterService] Has valid query context for calculated_price:`, hasValidQueryContext);
|
|
42
|
+
const fields = this.buildFields(projection?.fields, hasValidQueryContext);
|
|
43
|
+
console.log(`[DynamicFilterService] Fields built, includes calculated_price:`, fields.some(f => f.includes("calculated_price")));
|
|
20
44
|
const queryOptions = this.buildQueryOptions(queryFilters, fields, pagination, queryContext);
|
|
21
45
|
const result = await this.query.graph(queryOptions);
|
|
22
46
|
const { data: productsRaw = [], metadata } = result;
|
|
23
47
|
let products = this.normalizeProducts(productsRaw);
|
|
24
|
-
|
|
48
|
+
// Extract currency_code from pricing context for currency filtering
|
|
49
|
+
const currencyCode = pricingContext?.currency_code;
|
|
50
|
+
products = await this.applyPostQueryFilters(products, priceRangeFilter, promotionFilter, metadataFilter, currencyCode);
|
|
25
51
|
// Count should reflect filtered products, not initial query count
|
|
26
52
|
// If post-query filters were applied, use filtered products length
|
|
27
53
|
// Otherwise, use metadata count or products length
|
|
28
|
-
const hasPostQueryFilters = priceRangeFilter || promotionFilter;
|
|
54
|
+
const hasPostQueryFilters = priceRangeFilter || promotionFilter || metadataFilter;
|
|
29
55
|
const count = hasPostQueryFilters
|
|
30
56
|
? products.length
|
|
31
57
|
: await this.getCount(queryFilters, metadata, products.length);
|
|
@@ -62,6 +88,7 @@ class DynamicFilterService {
|
|
|
62
88
|
let queryFilters = {};
|
|
63
89
|
let priceRangeFilter;
|
|
64
90
|
let promotionFilter;
|
|
91
|
+
let metadataFilter;
|
|
65
92
|
for (const [identifier, value] of Object.entries(filterParams)) {
|
|
66
93
|
if (value == null)
|
|
67
94
|
continue;
|
|
@@ -74,16 +101,26 @@ class DynamicFilterService {
|
|
|
74
101
|
this.validateWithProvider(provider, value);
|
|
75
102
|
const result = await Promise.resolve(provider.apply(queryFilters, value, filterContext));
|
|
76
103
|
queryFilters = result;
|
|
77
|
-
|
|
78
|
-
|
|
104
|
+
// Extract special filter keys, but preserve existing values if not set by this provider
|
|
105
|
+
// This ensures filters work independently - each filter can be applied alone or with others
|
|
106
|
+
if (queryFilters.__price_range_filter__ !== undefined) {
|
|
107
|
+
priceRangeFilter = queryFilters.__price_range_filter__;
|
|
108
|
+
}
|
|
109
|
+
if (queryFilters.__promotion_filter__ !== undefined) {
|
|
110
|
+
promotionFilter = queryFilters.__promotion_filter__;
|
|
111
|
+
}
|
|
112
|
+
if (queryFilters.__metadata_filter__ !== undefined) {
|
|
113
|
+
metadataFilter = queryFilters.__metadata_filter__;
|
|
114
|
+
}
|
|
79
115
|
delete queryFilters.__price_range_filter__;
|
|
80
116
|
delete queryFilters.__promotion_filter__;
|
|
117
|
+
delete queryFilters.__metadata_filter__;
|
|
81
118
|
}
|
|
82
119
|
catch (error) {
|
|
83
120
|
throw new Error(`Error applying filter "${identifier}": ${error}`);
|
|
84
121
|
}
|
|
85
122
|
}
|
|
86
|
-
return { queryFilters, priceRangeFilter, promotionFilter };
|
|
123
|
+
return { queryFilters, priceRangeFilter, promotionFilter, metadataFilter };
|
|
87
124
|
}
|
|
88
125
|
validateWithProvider(provider, value) {
|
|
89
126
|
if (provider.validate) {
|
|
@@ -94,19 +131,50 @@ class DynamicFilterService {
|
|
|
94
131
|
}
|
|
95
132
|
}
|
|
96
133
|
}
|
|
97
|
-
buildFields(requestedFields) {
|
|
134
|
+
buildFields(requestedFields, hasPricingContext) {
|
|
135
|
+
console.log(`[DynamicFilterService] buildFields called:`, {
|
|
136
|
+
hasPricingContext,
|
|
137
|
+
requestedFieldsCount: requestedFields?.length || 0
|
|
138
|
+
});
|
|
98
139
|
const essentialRelations = [
|
|
99
|
-
"variants.*", "variants.prices.*",
|
|
140
|
+
"variants.*", "variants.prices.*", // Always include all prices for multi-currency support
|
|
100
141
|
"options.*", "options.values.*",
|
|
101
142
|
"images.*", "collection.*", "type.*"
|
|
102
143
|
];
|
|
144
|
+
// Include calculated_price ONLY if pricing context is available AND valid
|
|
145
|
+
// This is a critical check - we should never include calculated_price without currency_code
|
|
146
|
+
if (hasPricingContext) {
|
|
147
|
+
essentialRelations.push("variants.calculated_price.*");
|
|
148
|
+
console.log(`[DynamicFilterService] Added calculated_price.* to essential relations`);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
console.log(`[DynamicFilterService] NOT adding calculated_price.* (hasPricingContext=false)`);
|
|
152
|
+
}
|
|
103
153
|
if (!requestedFields?.length || requestedFields.includes("*")) {
|
|
104
|
-
|
|
154
|
+
const result = ["*", ...essentialRelations];
|
|
155
|
+
console.log(`[DynamicFilterService] Returning all fields with essential relations, includes calculated_price:`, result.some(f => f.includes("calculated_price")));
|
|
156
|
+
return result;
|
|
105
157
|
}
|
|
106
158
|
const fields = [...requestedFields];
|
|
107
159
|
const has = (prefix) => fields.some(f => f.startsWith(prefix));
|
|
108
|
-
if (!has("variants"))
|
|
109
|
-
fields.push("variants.*", "variants.prices.*");
|
|
160
|
+
if (!has("variants")) {
|
|
161
|
+
fields.push("variants.*", "variants.prices.*"); // Always include all prices
|
|
162
|
+
if (hasPricingContext) {
|
|
163
|
+
fields.push("variants.calculated_price.*");
|
|
164
|
+
console.log(`[DynamicFilterService] Added calculated_price.* to fields`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Even if variants are requested, ensure prices are included
|
|
169
|
+
if (!has("variants.prices")) {
|
|
170
|
+
fields.push("variants.prices.*");
|
|
171
|
+
}
|
|
172
|
+
// Check if calculated_price is already in requested fields
|
|
173
|
+
if (hasPricingContext && !has("variants.calculated_price")) {
|
|
174
|
+
fields.push("variants.calculated_price.*");
|
|
175
|
+
console.log(`[DynamicFilterService] Added calculated_price.* to fields (variants already present)`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
110
178
|
if (!has("options"))
|
|
111
179
|
fields.push("options.*", "options.values.*");
|
|
112
180
|
if (!has("images"))
|
|
@@ -115,15 +183,66 @@ class DynamicFilterService {
|
|
|
115
183
|
fields.push("collection.*");
|
|
116
184
|
if (!has("type"))
|
|
117
185
|
fields.push("type.*");
|
|
186
|
+
const includesCalculatedPrice = fields.some(f => f.includes("calculated_price"));
|
|
187
|
+
console.log(`[DynamicFilterService] Final fields include calculated_price:`, includesCalculatedPrice);
|
|
118
188
|
return fields;
|
|
119
189
|
}
|
|
120
190
|
buildQueryContext(context) {
|
|
121
|
-
|
|
122
|
-
|
|
191
|
+
const pricingContext = context?.pricingContext;
|
|
192
|
+
// Only include calculated_price if currency_code is present and valid in pricing context
|
|
193
|
+
// Medusa's calculatePrices method requires currency_code to be a non-empty string
|
|
194
|
+
if (pricingContext) {
|
|
195
|
+
const currencyCode = pricingContext.currency_code;
|
|
196
|
+
if (typeof currencyCode === "string" && currencyCode.trim().length > 0) {
|
|
197
|
+
// Ensure currency_code is trimmed and set in the context we pass to Medusa
|
|
198
|
+
const validPricingContext = {
|
|
199
|
+
...pricingContext,
|
|
200
|
+
currency_code: currencyCode.trim()
|
|
201
|
+
};
|
|
202
|
+
// Double-check currency_code is present before returning
|
|
203
|
+
if (validPricingContext.currency_code) {
|
|
204
|
+
// Use QueryContext() helper to properly wrap the pricing context
|
|
205
|
+
// This is required by Medusa's query.graph() for calculated_price
|
|
206
|
+
const pricingContextForLogging = validPricingContext;
|
|
207
|
+
console.log(`[DynamicFilterService] Wrapping pricing context with QueryContext():`, {
|
|
208
|
+
currency_code: pricingContextForLogging.currency_code,
|
|
209
|
+
region_id: pricingContextForLogging.region_id,
|
|
210
|
+
allKeys: Object.keys(pricingContextForLogging)
|
|
211
|
+
});
|
|
212
|
+
const wrappedContext = (0, utils_1.QueryContext)(validPricingContext);
|
|
213
|
+
console.log(`[DynamicFilterService] QueryContext() returned:`, {
|
|
214
|
+
type: typeof wrappedContext,
|
|
215
|
+
isFunction: typeof wrappedContext === "function",
|
|
216
|
+
keys: typeof wrappedContext === "object" && wrappedContext !== null ? Object.keys(wrappedContext) : "N/A"
|
|
217
|
+
});
|
|
218
|
+
return {
|
|
219
|
+
variants: {
|
|
220
|
+
calculated_price: wrappedContext
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
console.warn("[DynamicFilterService] Pricing context exists but currency_code is missing or invalid:", {
|
|
227
|
+
hasPricingContext: !!pricingContext,
|
|
228
|
+
currencyCodeType: typeof currencyCode,
|
|
229
|
+
currencyCodeValue: currencyCode
|
|
230
|
+
});
|
|
231
|
+
}
|
|
123
232
|
}
|
|
124
233
|
return {};
|
|
125
234
|
}
|
|
126
235
|
buildQueryOptions(filters, fields, pagination, queryContext) {
|
|
236
|
+
console.log(`[DynamicFilterService] buildQueryOptions called`);
|
|
237
|
+
// Note: QueryContext() wraps the pricing context, so we can't directly access currency_code
|
|
238
|
+
// from the wrapped object. We trust that buildQueryContext() already validated it.
|
|
239
|
+
// If queryContext has calculated_price, it means currency_code was validated before wrapping.
|
|
240
|
+
let safeQueryContext = queryContext;
|
|
241
|
+
if (queryContext?.variants?.calculated_price) {
|
|
242
|
+
// QueryContext() wraps the context, so we can't check currency_code here
|
|
243
|
+
// But we know it was validated in buildQueryContext() before wrapping
|
|
244
|
+
console.log(`[DynamicFilterService] Query context includes calculated_price (wrapped with QueryContext())`);
|
|
245
|
+
}
|
|
127
246
|
const options = {
|
|
128
247
|
entity: "product",
|
|
129
248
|
fields,
|
|
@@ -150,9 +269,20 @@ class DynamicFilterService {
|
|
|
150
269
|
skip: 0
|
|
151
270
|
};
|
|
152
271
|
}
|
|
153
|
-
if (
|
|
154
|
-
options.context =
|
|
272
|
+
if (safeQueryContext && Object.keys(safeQueryContext).length > 0) {
|
|
273
|
+
options.context = safeQueryContext;
|
|
274
|
+
console.log(`[DynamicFilterService] Query options include context with calculated_price:`, !!safeQueryContext.variants?.calculated_price);
|
|
155
275
|
}
|
|
276
|
+
else {
|
|
277
|
+
console.log(`[DynamicFilterService] Query options do not include context`);
|
|
278
|
+
}
|
|
279
|
+
console.log(`[DynamicFilterService] Final query options:`, {
|
|
280
|
+
entity: options.entity,
|
|
281
|
+
fieldsCount: options.fields?.length || 0,
|
|
282
|
+
hasContext: !!options.context,
|
|
283
|
+
hasCalculatedPrice: !!options.context?.variants?.calculated_price,
|
|
284
|
+
filtersCount: Object.keys(options.filters || {}).length
|
|
285
|
+
});
|
|
156
286
|
return options;
|
|
157
287
|
}
|
|
158
288
|
normalizeProducts(productsRaw) {
|
|
@@ -162,46 +292,166 @@ class DynamicFilterService {
|
|
|
162
292
|
console.warn("[DynamicFilterService] Unexpected data structure from query.graph()");
|
|
163
293
|
return [];
|
|
164
294
|
}
|
|
165
|
-
async applyPostQueryFilters(products, priceRangeFilter, promotionFilter) {
|
|
295
|
+
async applyPostQueryFilters(products, priceRangeFilter, promotionFilter, metadataFilter, currencyCode) {
|
|
166
296
|
let filteredProducts = products;
|
|
297
|
+
// Apply currency filter first - only include products available in the selected currency
|
|
298
|
+
if (currencyCode && filteredProducts.length > 0) {
|
|
299
|
+
console.log(`[DynamicFilterService] Applying currency filter: ${currencyCode} to ${filteredProducts.length} products`);
|
|
300
|
+
filteredProducts = this.filterByCurrency(filteredProducts, currencyCode);
|
|
301
|
+
console.log(`[DynamicFilterService] Filtered to ${filteredProducts.length} products available in ${currencyCode}`);
|
|
302
|
+
}
|
|
303
|
+
if (metadataFilter && filteredProducts.length > 0) {
|
|
304
|
+
filteredProducts = this.filterByMetadata(filteredProducts, metadataFilter);
|
|
305
|
+
}
|
|
167
306
|
if (priceRangeFilter && filteredProducts.length > 0) {
|
|
168
|
-
|
|
307
|
+
console.log(`[DynamicFilterService] Applying price range filter:`, priceRangeFilter, `to ${filteredProducts.length} products`);
|
|
308
|
+
filteredProducts = this.filterByPriceRange(filteredProducts, priceRangeFilter, currencyCode);
|
|
309
|
+
console.log(`[DynamicFilterService] Filtered to ${filteredProducts.length} products`);
|
|
169
310
|
}
|
|
170
311
|
if (promotionFilter && filteredProducts.length > 0) {
|
|
171
312
|
filteredProducts = await this.filterByPromotion(filteredProducts, promotionFilter);
|
|
172
313
|
}
|
|
173
314
|
return filteredProducts;
|
|
174
315
|
}
|
|
175
|
-
|
|
316
|
+
filterByMetadata(products, metadataFilter) {
|
|
176
317
|
return products.filter(product => {
|
|
318
|
+
const productMetadata = product.metadata || {};
|
|
319
|
+
// Check each metadata filter criteria
|
|
320
|
+
for (const [key, filterValue] of Object.entries(metadataFilter)) {
|
|
321
|
+
const productValue = productMetadata[key];
|
|
322
|
+
// If product doesn't have this metadata key, it doesn't match
|
|
323
|
+
if (productValue === undefined || productValue === null) {
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
// Handle array filter values (e.g., metadata[color]=["red","blue"])
|
|
327
|
+
if (Array.isArray(filterValue)) {
|
|
328
|
+
// Product value should be in the filter array
|
|
329
|
+
if (Array.isArray(productValue)) {
|
|
330
|
+
// Both are arrays - check if any product value matches any filter value
|
|
331
|
+
const matches = productValue.some((pv) => filterValue.some((fv) => this.metadataValuesMatch(pv, fv)));
|
|
332
|
+
if (!matches)
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
// Product value is single, filter is array - check if product value matches any filter value
|
|
337
|
+
const matches = filterValue.some((fv) => this.metadataValuesMatch(productValue, fv));
|
|
338
|
+
if (!matches)
|
|
339
|
+
return false;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
// Single value filter
|
|
344
|
+
if (Array.isArray(productValue)) {
|
|
345
|
+
// Product value is array, filter is single - check if any product value matches filter
|
|
346
|
+
const matches = productValue.some((pv) => this.metadataValuesMatch(pv, filterValue));
|
|
347
|
+
if (!matches)
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
// Both are single values - direct comparison
|
|
352
|
+
if (!this.metadataValuesMatch(productValue, filterValue)) {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return true;
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
metadataValuesMatch(productValue, filterValue) {
|
|
362
|
+
// Normalize string comparison (case-insensitive)
|
|
363
|
+
if (typeof productValue === "string" && typeof filterValue === "string") {
|
|
364
|
+
return productValue.toLowerCase() === filterValue.toLowerCase();
|
|
365
|
+
}
|
|
366
|
+
// Direct equality for numbers and booleans
|
|
367
|
+
return productValue === filterValue;
|
|
368
|
+
}
|
|
369
|
+
filterByPriceRange(products, priceRangeFilter, currencyCode) {
|
|
370
|
+
const { min, max } = priceRangeFilter;
|
|
371
|
+
// Use currency_code from filter, context, or parameter (priority: filter > parameter > context)
|
|
372
|
+
const targetCurrency = priceRangeFilter.currency_code || currencyCode;
|
|
373
|
+
console.log(`[DynamicFilterService] Filtering ${products.length} products by price range: min=${min}, max=${max}, currency=${targetCurrency}`);
|
|
374
|
+
const filtered = products.filter(product => {
|
|
177
375
|
if (!product.variants?.length)
|
|
178
376
|
return false;
|
|
179
377
|
return product.variants.some((variant) => {
|
|
180
|
-
|
|
181
|
-
|
|
378
|
+
// Get all prices for this variant
|
|
379
|
+
const prices = variant.prices || [];
|
|
380
|
+
// Find price matching the target currency
|
|
381
|
+
const matchingPrice = prices.find((price) => {
|
|
382
|
+
if (!targetCurrency)
|
|
383
|
+
return true; // If no currency specified, use first price
|
|
384
|
+
return price.currency_code === targetCurrency;
|
|
385
|
+
});
|
|
386
|
+
// If no matching price found and currency is required, exclude this variant
|
|
387
|
+
if (targetCurrency && !matchingPrice) {
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
390
|
+
// Use calculated_price if available (includes price list overrides)
|
|
391
|
+
let priceToUse;
|
|
392
|
+
let currencyToUse;
|
|
393
|
+
if (variant.calculated_price?.calculated_amount !== undefined) {
|
|
394
|
+
// Only use calculated_price if it matches the target currency
|
|
395
|
+
if (!targetCurrency || variant.calculated_price.currency_code === targetCurrency) {
|
|
396
|
+
priceToUse = variant.calculated_price.calculated_amount;
|
|
397
|
+
currencyToUse = variant.calculated_price.currency_code;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
// Fall back to regular price if calculated_price not available or doesn't match
|
|
401
|
+
if (priceToUse === undefined && matchingPrice) {
|
|
402
|
+
priceToUse = matchingPrice.amount;
|
|
403
|
+
currencyToUse = matchingPrice.currency_code;
|
|
404
|
+
}
|
|
405
|
+
if (priceToUse === undefined)
|
|
182
406
|
return false;
|
|
183
|
-
if
|
|
407
|
+
// Ensure currency matches if target currency is specified
|
|
408
|
+
if (targetCurrency && currencyToUse !== targetCurrency) {
|
|
184
409
|
return false;
|
|
185
410
|
}
|
|
186
|
-
|
|
187
|
-
if (min !== undefined && priceInfo.price < min)
|
|
411
|
+
if (min !== undefined && priceToUse < min)
|
|
188
412
|
return false;
|
|
189
|
-
if (max !== undefined &&
|
|
413
|
+
if (max !== undefined && priceToUse > max)
|
|
190
414
|
return false;
|
|
191
415
|
return true;
|
|
192
416
|
});
|
|
193
417
|
});
|
|
418
|
+
console.log(`[DynamicFilterService] Filtered ${products.length} products down to ${filtered.length} matching price range`);
|
|
419
|
+
return filtered;
|
|
420
|
+
}
|
|
421
|
+
filterByCurrency(products, currencyCode) {
|
|
422
|
+
console.log(`[DynamicFilterService] Filtering ${products.length} products by currency: ${currencyCode}`);
|
|
423
|
+
const filtered = products.filter(product => {
|
|
424
|
+
if (!product.variants?.length)
|
|
425
|
+
return false;
|
|
426
|
+
// Check if at least one variant has a price in the target currency
|
|
427
|
+
return product.variants.some((variant) => {
|
|
428
|
+
// Check calculated_price first (if available and matches currency)
|
|
429
|
+
if (variant.calculated_price?.currency_code === currencyCode) {
|
|
430
|
+
return true;
|
|
431
|
+
}
|
|
432
|
+
// Check regular prices
|
|
433
|
+
const prices = variant.prices || [];
|
|
434
|
+
return prices.some((price) => price.currency_code === currencyCode);
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
console.log(`[DynamicFilterService] Filtered ${products.length} products down to ${filtered.length} available in ${currencyCode}`);
|
|
438
|
+
return filtered;
|
|
194
439
|
}
|
|
195
440
|
getPriceInfo(variant) {
|
|
441
|
+
// Prioritize calculated_price if available (includes price list overrides when pricing context is provided)
|
|
196
442
|
if (variant.calculated_price?.calculated_amount !== undefined) {
|
|
197
443
|
return {
|
|
198
444
|
price: variant.calculated_price.calculated_amount,
|
|
199
445
|
currency: variant.calculated_price.currency_code
|
|
200
446
|
};
|
|
201
447
|
}
|
|
448
|
+
// Fall back to regular price if calculated_price is not available
|
|
202
449
|
if (variant.prices?.[0]) {
|
|
203
450
|
const price = variant.prices[0];
|
|
204
|
-
return {
|
|
451
|
+
return {
|
|
452
|
+
price: price.amount,
|
|
453
|
+
currency: price.currency_code
|
|
454
|
+
};
|
|
205
455
|
}
|
|
206
456
|
return {};
|
|
207
457
|
}
|
|
@@ -219,6 +469,18 @@ class DynamicFilterService {
|
|
|
219
469
|
console.log(`[DynamicFilterService] Extracted ${productPromotionData.productIds.size} unique product IDs from promotions`);
|
|
220
470
|
console.log(`[DynamicFilterService] Found discounts for ${productPromotionData.discounts.size} products`);
|
|
221
471
|
console.log(`[DynamicFilterService] Has universal promotions (no rules): ${productPromotionData.hasUniversalPromotions}`);
|
|
472
|
+
if (productPromotionData.universalDiscount !== undefined) {
|
|
473
|
+
console.log(`[DynamicFilterService] Universal discount: ${productPromotionData.universalDiscount}%`);
|
|
474
|
+
}
|
|
475
|
+
// Log discount filter criteria
|
|
476
|
+
if (promotionFilter.min_discount_percentage !== undefined || promotionFilter.max_discount_percentage !== undefined) {
|
|
477
|
+
console.log(`[DynamicFilterService] Filtering by discount: min=${promotionFilter.min_discount_percentage}, max=${promotionFilter.max_discount_percentage}`);
|
|
478
|
+
}
|
|
479
|
+
// Log sample discounts for debugging
|
|
480
|
+
if (productPromotionData.discounts.size > 0) {
|
|
481
|
+
const sampleDiscounts = Array.from(productPromotionData.discounts.entries()).slice(0, 5);
|
|
482
|
+
console.log(`[DynamicFilterService] Sample product discounts:`, sampleDiscounts.map(([id, discount]) => `${id.substring(0, 8)}...: ${discount}%`).join(", "));
|
|
483
|
+
}
|
|
222
484
|
// If we have universal promotions (no rules = applies to all products)
|
|
223
485
|
// or if we have product IDs, filter accordingly
|
|
224
486
|
const hasProductIds = productPromotionData.productIds.size > 0;
|
|
@@ -231,22 +493,43 @@ class DynamicFilterService {
|
|
|
231
493
|
const productId = product?.id;
|
|
232
494
|
if (!productId)
|
|
233
495
|
return false;
|
|
234
|
-
//
|
|
235
|
-
|
|
236
|
-
|
|
496
|
+
// Determine if this product should be included based on promotion rules
|
|
497
|
+
let shouldInclude = false;
|
|
498
|
+
let discount;
|
|
499
|
+
if (hasProductIds) {
|
|
500
|
+
// If promotion has product-specific rules, only include products in the promotion
|
|
501
|
+
if (productPromotionData.productIds.has(productId)) {
|
|
502
|
+
shouldInclude = true;
|
|
503
|
+
// Get discount for this product (from specific promotion)
|
|
504
|
+
// Don't default to 0 - if discount is undefined, the product should be excluded
|
|
505
|
+
discount = productPromotionData.discounts.get(productId);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
else if (hasUniversalPromotions) {
|
|
509
|
+
// If promotion is universal (no product-specific rules), it applies to all products
|
|
510
|
+
// Use the universal discount - don't default to 0
|
|
511
|
+
discount = productPromotionData.universalDiscount;
|
|
512
|
+
shouldInclude = true;
|
|
513
|
+
}
|
|
514
|
+
// If product is not in any promotion, exclude it
|
|
515
|
+
if (!shouldInclude) {
|
|
516
|
+
console.log(`[DynamicFilterService] Product ${productId} is not in any promotion`);
|
|
237
517
|
return false;
|
|
238
518
|
}
|
|
239
|
-
//
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
discount = productPromotionData.universalDiscount || 0;
|
|
519
|
+
// If product is in promotion but discount is undefined, exclude it
|
|
520
|
+
// This happens when discount calculation failed or promotion has no valid discount
|
|
521
|
+
if (discount === undefined) {
|
|
522
|
+
console.log(`[DynamicFilterService] Product ${productId} is in promotion but has no valid discount - excluding`);
|
|
523
|
+
return false;
|
|
245
524
|
}
|
|
525
|
+
// Check if discount meets the filter criteria
|
|
246
526
|
const meetsCriteria = this.meetsDiscountCriteria(discount, promotionFilter);
|
|
247
527
|
if (!meetsCriteria) {
|
|
248
528
|
console.log(`[DynamicFilterService] Product ${productId} discount ${discount}% does not meet criteria (min: ${promotionFilter.min_discount_percentage}, max: ${promotionFilter.max_discount_percentage})`);
|
|
249
529
|
}
|
|
530
|
+
else {
|
|
531
|
+
console.log(`[DynamicFilterService] Product ${productId} discount ${discount}% meets criteria (min: ${promotionFilter.min_discount_percentage}, max: ${promotionFilter.max_discount_percentage})`);
|
|
532
|
+
}
|
|
250
533
|
return meetsCriteria;
|
|
251
534
|
});
|
|
252
535
|
console.log(`[DynamicFilterService] Filtered ${products.length} products down to ${filtered.length} matching promotion criteria`);
|
|
@@ -261,7 +544,9 @@ class DynamicFilterService {
|
|
|
261
544
|
const queryOptions = {
|
|
262
545
|
entity: "promotion",
|
|
263
546
|
fields: [
|
|
264
|
-
"id", "code", "type", "application_method.*", "
|
|
547
|
+
"id", "code", "type", "application_method.*", "application_method.target_rules.*",
|
|
548
|
+
"application_method.target_rules.values.*", "application_method.buy_rules.*",
|
|
549
|
+
"application_method.buy_rules.values.*", "campaign.*",
|
|
265
550
|
"rules.*", "rules.values.*", "starts_at", "ends_at", "status", "metadata"
|
|
266
551
|
],
|
|
267
552
|
};
|
|
@@ -333,7 +618,7 @@ class DynamicFilterService {
|
|
|
333
618
|
const productIds = new Set();
|
|
334
619
|
const discounts = new Map();
|
|
335
620
|
let hasUniversalPromotions = false;
|
|
336
|
-
let universalDiscount =
|
|
621
|
+
let universalDiscount = undefined;
|
|
337
622
|
for (const promotion of promotions) {
|
|
338
623
|
const discount = this.calculateDiscountPercentage(promotion);
|
|
339
624
|
// Debug: Log full promotion structure for first promotion
|
|
@@ -352,8 +637,14 @@ class DynamicFilterService {
|
|
|
352
637
|
if (hasNoRules) {
|
|
353
638
|
console.log(`[DynamicFilterService] Promotion ${promotion.id || promotion.code} has no rules - applies to all products`);
|
|
354
639
|
hasUniversalPromotions = true;
|
|
355
|
-
|
|
356
|
-
|
|
640
|
+
// Only update universal discount if it's valid and greater than current
|
|
641
|
+
if (discount !== undefined) {
|
|
642
|
+
if (universalDiscount === undefined || discount > universalDiscount) {
|
|
643
|
+
universalDiscount = discount;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
else {
|
|
647
|
+
console.warn(`[DynamicFilterService] Universal promotion ${promotion.id || promotion.code} has no valid discount - products will be excluded if filtering by discount`);
|
|
357
648
|
}
|
|
358
649
|
}
|
|
359
650
|
const ids = await this.extractProductIdsFromPromotion(promotion);
|
|
@@ -367,16 +658,36 @@ class DynamicFilterService {
|
|
|
367
658
|
console.warn(`[DynamicFilterService] No product IDs extracted from promotion ${promotion.id || promotion.code}`);
|
|
368
659
|
}
|
|
369
660
|
}
|
|
370
|
-
//
|
|
371
|
-
//
|
|
372
|
-
|
|
661
|
+
// If we found product IDs (from rules, target_rules, or buy_rules), this is NOT a universal promotion
|
|
662
|
+
// Only treat as universal if there are no rules AND no product IDs found
|
|
663
|
+
const isActuallyUniversal = hasNoRules && ids.length === 0;
|
|
664
|
+
if (isActuallyUniversal) {
|
|
665
|
+
// Universal promotion - applies to all products
|
|
666
|
+
console.log(`[DynamicFilterService] Promotion ${promotion.id || promotion.code} is universal (no rules, no product IDs)`);
|
|
667
|
+
}
|
|
668
|
+
else {
|
|
669
|
+
// Product-specific promotion - only apply to the specified products
|
|
373
670
|
ids.forEach(id => {
|
|
374
671
|
productIds.add(id);
|
|
672
|
+
// Only store discount if it's valid (not undefined)
|
|
673
|
+
// When multiple promotions apply to the same product, use the maximum discount
|
|
375
674
|
if (discount !== undefined) {
|
|
376
|
-
const
|
|
377
|
-
|
|
675
|
+
const currentDiscount = discounts.get(id);
|
|
676
|
+
if (currentDiscount === undefined) {
|
|
677
|
+
discounts.set(id, discount);
|
|
678
|
+
}
|
|
679
|
+
else {
|
|
680
|
+
discounts.set(id, Math.max(currentDiscount, discount));
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
else {
|
|
684
|
+
console.warn(`[DynamicFilterService] Promotion ${promotion.id || promotion.code} has product ${id} but discount is undefined - product will be excluded if filtering by discount`);
|
|
378
685
|
}
|
|
379
686
|
});
|
|
687
|
+
// If we found product IDs, this is not a universal promotion
|
|
688
|
+
if (ids.length > 0) {
|
|
689
|
+
hasUniversalPromotions = false;
|
|
690
|
+
}
|
|
380
691
|
}
|
|
381
692
|
}
|
|
382
693
|
return { productIds, discounts, hasUniversalPromotions, universalDiscount };
|
|
@@ -408,8 +719,103 @@ class DynamicFilterService {
|
|
|
408
719
|
console.log(`[DynamicFilterService] Promotion ${promotion.id || promotion.code}: Could not calculate discount percentage. type=${promotion.type}, appMethod.type=${appMethod.type}, appMethod.value=${appMethod.value}`);
|
|
409
720
|
return undefined;
|
|
410
721
|
}
|
|
722
|
+
extractIdsFromRuleValues(values) {
|
|
723
|
+
const ids = [];
|
|
724
|
+
if (!values)
|
|
725
|
+
return ids;
|
|
726
|
+
let valueArray = [];
|
|
727
|
+
if (Array.isArray(values)) {
|
|
728
|
+
valueArray = values;
|
|
729
|
+
}
|
|
730
|
+
else {
|
|
731
|
+
valueArray = [values];
|
|
732
|
+
}
|
|
733
|
+
for (const value of valueArray) {
|
|
734
|
+
if (typeof value === "string") {
|
|
735
|
+
if (value.length > 0) {
|
|
736
|
+
ids.push(value);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
else if (typeof value === "object" && value !== null) {
|
|
740
|
+
// Prioritize "value" property if it looks like a product ID (starts with "prod_")
|
|
741
|
+
// This handles Medusa v2 promotion rule values where product IDs are in the "value" field
|
|
742
|
+
if ("value" in value && typeof value.value === "string" && value.value.startsWith("prod_")) {
|
|
743
|
+
ids.push(value.value);
|
|
744
|
+
}
|
|
745
|
+
else if ("product_id" in value && typeof value.product_id === "string") {
|
|
746
|
+
ids.push(value.product_id);
|
|
747
|
+
}
|
|
748
|
+
else if ("id" in value && typeof value.id === "string") {
|
|
749
|
+
// Only use "id" if it looks like a product ID, otherwise it might be a rule value ID
|
|
750
|
+
if (value.id.startsWith("prod_")) {
|
|
751
|
+
ids.push(value.id);
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
else {
|
|
755
|
+
// Try to extract any string field that looks like a product ID
|
|
756
|
+
for (const [key, val] of Object.entries(value)) {
|
|
757
|
+
if (typeof val === "string" && val.length > 0 && val.startsWith("prod_")) {
|
|
758
|
+
ids.push(val);
|
|
759
|
+
break; // Found product ID, no need to check other fields
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
return ids;
|
|
766
|
+
}
|
|
411
767
|
async extractProductIdsFromPromotion(promotion) {
|
|
412
768
|
const productIds = new Set();
|
|
769
|
+
// Check application_method.target_rules for product IDs (Medusa v2 stores product selections here)
|
|
770
|
+
// This is where products are stored when you select "items" in the promotion configuration
|
|
771
|
+
if (promotion.application_method?.target_rules?.length) {
|
|
772
|
+
console.log(`[DynamicFilterService] Processing ${promotion.application_method.target_rules.length} target_rules for promotion ${promotion.id || promotion.code}`);
|
|
773
|
+
for (const rule of promotion.application_method.target_rules) {
|
|
774
|
+
const ruleType = rule.attribute || rule.type || "";
|
|
775
|
+
const normalizedType = String(ruleType).toLowerCase();
|
|
776
|
+
console.log(`[DynamicFilterService] Target rule: attribute=${ruleType}, values=`, rule.values);
|
|
777
|
+
// Extract product IDs from target_rules
|
|
778
|
+
// Attribute can be "items", "items.product.id", "product", etc.
|
|
779
|
+
// If it contains "item" or "product", extract IDs from values
|
|
780
|
+
if (rule.values && (normalizedType.includes("item") || normalizedType.includes("product"))) {
|
|
781
|
+
const extracted = this.extractIdsFromRuleValues(rule.values);
|
|
782
|
+
extracted.forEach(id => productIds.add(id));
|
|
783
|
+
console.log(`[DynamicFilterService] Extracted ${extracted.length} product IDs from target_rules (attribute: ${ruleType})`);
|
|
784
|
+
}
|
|
785
|
+
else if (rule.values) {
|
|
786
|
+
// Even if attribute doesn't match, try extracting IDs anyway (might be product-related)
|
|
787
|
+
const extracted = this.extractIdsFromRuleValues(rule.values);
|
|
788
|
+
if (extracted.length > 0) {
|
|
789
|
+
console.log(`[DynamicFilterService] Extracted ${extracted.length} product IDs from target_rules (unknown attribute: ${ruleType})`);
|
|
790
|
+
extracted.forEach(id => productIds.add(id));
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
// Check application_method.buy_rules for product IDs (buy-x-get-y promotions)
|
|
796
|
+
if (promotion.application_method?.buy_rules?.length) {
|
|
797
|
+
console.log(`[DynamicFilterService] Processing ${promotion.application_method.buy_rules.length} buy_rules for promotion ${promotion.id || promotion.code}`);
|
|
798
|
+
for (const rule of promotion.application_method.buy_rules) {
|
|
799
|
+
const ruleType = rule.attribute || rule.type || "";
|
|
800
|
+
const normalizedType = String(ruleType).toLowerCase();
|
|
801
|
+
console.log(`[DynamicFilterService] Buy rule: attribute=${ruleType}, values=`, rule.values);
|
|
802
|
+
// Extract product IDs from buy_rules
|
|
803
|
+
// Attribute can be "items", "items.product.id", "product", etc.
|
|
804
|
+
if (rule.values && (normalizedType.includes("item") || normalizedType.includes("product"))) {
|
|
805
|
+
const extracted = this.extractIdsFromRuleValues(rule.values);
|
|
806
|
+
extracted.forEach(id => productIds.add(id));
|
|
807
|
+
console.log(`[DynamicFilterService] Extracted ${extracted.length} product IDs from buy_rules`);
|
|
808
|
+
}
|
|
809
|
+
else if (rule.values) {
|
|
810
|
+
// Even if attribute doesn't match, try extracting IDs anyway
|
|
811
|
+
const extracted = this.extractIdsFromRuleValues(rule.values);
|
|
812
|
+
if (extracted.length > 0) {
|
|
813
|
+
extracted.forEach(id => productIds.add(id));
|
|
814
|
+
console.log(`[DynamicFilterService] Extracted ${extracted.length} product IDs from buy_rules (unknown attribute: ${ruleType})`);
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
}
|
|
413
819
|
// Debug: Log rule structure
|
|
414
820
|
if (promotion.rules?.length) {
|
|
415
821
|
console.log(`[DynamicFilterService] Processing ${promotion.rules.length} rules for promotion ${promotion.id || promotion.code}`);
|
|
@@ -428,52 +834,10 @@ class DynamicFilterService {
|
|
|
428
834
|
continue;
|
|
429
835
|
}
|
|
430
836
|
// Process all other rules (including product-related ones)
|
|
431
|
-
//
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
let values = [];
|
|
436
|
-
if (Array.isArray(rule.values)) {
|
|
437
|
-
values = rule.values;
|
|
438
|
-
}
|
|
439
|
-
else if (rule.values !== undefined && rule.values !== null) {
|
|
440
|
-
values = [rule.values];
|
|
441
|
-
}
|
|
442
|
-
console.log(`[DynamicFilterService] Processing ${values.length} values from rule ${ruleType}`);
|
|
443
|
-
for (const value of values) {
|
|
444
|
-
if (typeof value === "string") {
|
|
445
|
-
// String values could be product IDs
|
|
446
|
-
if (value.length > 0) {
|
|
447
|
-
console.log(`[DynamicFilterService] Adding product ID from string: ${value}`);
|
|
448
|
-
productIds.add(value);
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
else if (typeof value === "object" && value !== null) {
|
|
452
|
-
// Handle object values - could be { id: "prod_123" } or similar
|
|
453
|
-
console.log(`[DynamicFilterService] Processing object value:`, value);
|
|
454
|
-
if ("id" in value && typeof value.id === "string") {
|
|
455
|
-
console.log(`[DynamicFilterService] Adding product ID from object.id: ${value.id}`);
|
|
456
|
-
productIds.add(value.id);
|
|
457
|
-
}
|
|
458
|
-
else if ("value" in value && typeof value.value === "string") {
|
|
459
|
-
console.log(`[DynamicFilterService] Adding product ID from object.value: ${value.value}`);
|
|
460
|
-
productIds.add(value.value);
|
|
461
|
-
}
|
|
462
|
-
else if ("product_id" in value && typeof value.product_id === "string") {
|
|
463
|
-
console.log(`[DynamicFilterService] Adding product ID from object.product_id: ${value.product_id}`);
|
|
464
|
-
productIds.add(value.product_id);
|
|
465
|
-
}
|
|
466
|
-
else {
|
|
467
|
-
// Try to extract any string field that looks like an ID
|
|
468
|
-
for (const [key, val] of Object.entries(value)) {
|
|
469
|
-
if (typeof val === "string" && val.length > 0 && (val.startsWith("prod_") || key.toLowerCase().includes("id"))) {
|
|
470
|
-
console.log(`[DynamicFilterService] Adding product ID from object.${key}: ${val}`);
|
|
471
|
-
productIds.add(val);
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
}
|
|
837
|
+
// Extract product IDs from rule values
|
|
838
|
+
const extracted = this.extractIdsFromRuleValues(rule.values);
|
|
839
|
+
extracted.forEach(id => productIds.add(id));
|
|
840
|
+
console.log(`[DynamicFilterService] Extracted ${extracted.length} product IDs from rule ${ruleType}`);
|
|
477
841
|
}
|
|
478
842
|
}
|
|
479
843
|
else {
|
|
@@ -493,13 +857,24 @@ class DynamicFilterService {
|
|
|
493
857
|
return result;
|
|
494
858
|
}
|
|
495
859
|
meetsDiscountCriteria(discount, promotionFilter) {
|
|
496
|
-
|
|
497
|
-
|
|
860
|
+
// Validate discount is a valid number
|
|
861
|
+
if (typeof discount !== "number" || Number.isNaN(discount)) {
|
|
862
|
+
console.warn(`[DynamicFilterService] Invalid discount value: ${discount}`);
|
|
498
863
|
return false;
|
|
499
864
|
}
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
865
|
+
// Check minimum discount percentage
|
|
866
|
+
if (promotionFilter.min_discount_percentage !== undefined) {
|
|
867
|
+
const minDiscount = Number(promotionFilter.min_discount_percentage);
|
|
868
|
+
if (!Number.isNaN(minDiscount) && discount < minDiscount) {
|
|
869
|
+
return false;
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
// Check maximum discount percentage
|
|
873
|
+
if (promotionFilter.max_discount_percentage !== undefined) {
|
|
874
|
+
const maxDiscount = Number(promotionFilter.max_discount_percentage);
|
|
875
|
+
if (!Number.isNaN(maxDiscount) && discount > maxDiscount) {
|
|
876
|
+
return false;
|
|
877
|
+
}
|
|
503
878
|
}
|
|
504
879
|
return true;
|
|
505
880
|
}
|
|
@@ -522,4 +897,4 @@ class DynamicFilterService {
|
|
|
522
897
|
}
|
|
523
898
|
}
|
|
524
899
|
exports.DynamicFilterService = DynamicFilterService;
|
|
525
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWx0ZXItc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9keW5hbWljLWZpbHRlci1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFxRTtBQUNyRSx5RUFBbUU7QUFrQm5FLE1BQWEsb0JBQW9CO0lBSS9CLFlBQVksU0FBMEI7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBUSxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN4RSxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUE0QjtRQUM3QyxNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFBO1FBQzlGLE1BQU0sYUFBYSxHQUFrQixFQUFFLEdBQUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQTtRQUUzRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFFbEgsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDbkQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUUzRixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ25ELE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxHQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLENBQUE7UUFFbkQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ2xELFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFFeEYsa0VBQWtFO1FBQ2xFLG1FQUFtRTtRQUNuRSxtREFBbUQ7UUFDbkQsTUFBTSxtQkFBbUIsR0FBRyxnQkFBZ0IsSUFBSSxlQUFlLENBQUE7UUFDL0QsTUFBTSxLQUFLLEdBQUcsbUJBQW1CO1lBQy9CLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUNqQixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRWhFLE9BQU87WUFDTCxRQUFRO1lBQ1IsS0FBSztZQUNMLFFBQVEsRUFBRTtnQkFDUixLQUFLO2dCQUNMLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTTtnQkFDeEIsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDbEU7U0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FBQyxTQUEwQjtRQUNoRCxJQUFJLENBQUM7WUFDSCxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQXlCLHdCQUF3QixDQUFDLENBQUE7UUFDNUUsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE1BQU0sUUFBUSxHQUFHLElBQUksaURBQXNCLEVBQUUsQ0FBQTtZQUM3QyxJQUFJLENBQUMsNEJBQTRCLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDM0MsT0FBTyxRQUFRLENBQUE7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFTyw0QkFBNEIsQ0FBQyxRQUFnQztRQUNuRSxJQUFJLENBQUM7WUFDSCxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyxPQUFPLENBQUMsK0JBQStCLENBQUMsQ0FBQTtZQUM3RSx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNwQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0VBQW9FLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDM0YsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsY0FBYyxDQUMxQixZQUFxQyxFQUNyQyxhQUE0QjtRQU01QixJQUFJLFlBQVksR0FBNEIsRUFBRSxDQUFBO1FBQzlDLElBQUksZ0JBQXFCLENBQUE7UUFDekIsSUFBSSxlQUFvQixDQUFBO1FBRXhCLEtBQUssTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDL0QsSUFBSSxLQUFLLElBQUksSUFBSTtnQkFBRSxTQUFRO1lBRTNCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQzlDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxPQUFPLENBQUMsSUFBSSxDQUFDLHlEQUF5RCxVQUFVLEdBQUcsQ0FBQyxDQUFBO2dCQUNwRixTQUFRO1lBQ1YsQ0FBQztZQUVELElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFBO2dCQUMxQyxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUE7Z0JBRXhGLFlBQVksR0FBRyxNQUFNLENBQUE7Z0JBQ3JCLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQTtnQkFDdEQsZUFBZSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQTtnQkFFbkQsT0FBTyxZQUFZLENBQUMsc0JBQXNCLENBQUE7Z0JBQzFDLE9BQU8sWUFBWSxDQUFDLG9CQUFvQixDQUFBO1lBQzFDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLFVBQVUsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFBO1lBQ3BFLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsQ0FBQTtJQUM1RCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsUUFBYSxFQUFFLEtBQWM7UUFDeEQsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEIsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2pELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ3pHLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDekIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sV0FBVyxDQUFDLGVBQTBCO1FBQzVDLE1BQU0sa0JBQWtCLEdBQUc7WUFDekIsWUFBWSxFQUFFLG1CQUFtQjtZQUNqQyxXQUFXLEVBQUUsa0JBQWtCO1lBQy9CLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUTtTQUNyQyxDQUFBO1FBRUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxNQUFNLElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlELE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ3JDLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUE7UUFDbkMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFFdEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO1FBQ3BFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtRQUNqRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUM7WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ25ELElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QyxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxPQUFZO1FBQ3BDLElBQUksT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQTtRQUNuRSxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBRU8saUJBQWlCLENBQ3ZCLE9BQWdDLEVBQ2hDLE1BQWdCLEVBQ2hCLFVBQWdELEVBQ2hELFlBQWtCO1FBRWxCLE1BQU0sT0FBTyxHQUFRO1lBQ25CLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU07WUFDTixHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7U0FDcEQsQ0FBQTtRQUVELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQTtZQUN2QixrREFBa0Q7WUFDbEQsSUFBSSxVQUFVLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxVQUFVLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFBO1lBQzVDLENBQUM7aUJBQU0sQ0FBQztnQkFDTiw2Q0FBNkM7Z0JBQzdDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQTtZQUM5QixDQUFDO1lBQ0QsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNwQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFBO1lBQzdDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLHlDQUF5QztZQUN6QyxPQUFPLENBQUMsVUFBVSxHQUFHO2dCQUNuQixJQUFJLEVBQUUsRUFBRTtnQkFDUixJQUFJLEVBQUUsQ0FBQzthQUNSLENBQUE7UUFDSCxDQUFDO1FBRUQsSUFBSSxZQUFZLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekQsT0FBTyxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUE7UUFDaEMsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFBO0lBQ2hCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxXQUFvQjtRQUM1QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUMvQixPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUE7UUFDM0MsQ0FBQztRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMscUVBQXFFLENBQUMsQ0FBQTtRQUNuRixPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7SUFFTyxLQUFLLENBQUMscUJBQXFCLENBQ2pDLFFBQW1CLEVBQ25CLGdCQUFzQixFQUN0QixlQUFxQjtRQUVyQixJQUFJLGdCQUFnQixHQUFHLFFBQVEsQ0FBQTtRQUUvQixJQUFJLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUNoRixDQUFDO1FBRUQsSUFBSSxlQUFlLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25ELGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLGVBQWUsQ0FBQyxDQUFBO1FBQ3BGLENBQUM7UUFFRCxPQUFPLGdCQUFnQixDQUFBO0lBQ3pCLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxRQUFlLEVBQUUsZ0JBQXFCO1FBQy9ELE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNO2dCQUFFLE9BQU8sS0FBSyxDQUFBO1lBRTNDLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQkFDNUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLO29CQUFFLE9BQU8sS0FBSyxDQUFBO2dCQUVsQyxJQUFJLGdCQUFnQixDQUFDLGFBQWEsSUFBSSxTQUFTLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUM1RixPQUFPLEtBQUssQ0FBQTtnQkFDZCxDQUFDO2dCQUVELE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsZ0JBQWdCLENBQUE7Z0JBQ3JDLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsS0FBSyxHQUFHLEdBQUc7b0JBQUUsT0FBTyxLQUFLLENBQUE7Z0JBQzVELElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsS0FBSyxHQUFHLEdBQUc7b0JBQUUsT0FBTyxLQUFLLENBQUE7Z0JBRTVELE9BQU8sSUFBSSxDQUFBO1lBQ2IsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTyxZQUFZLENBQUMsT0FBWTtRQUMvQixJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5RCxPQUFPO2dCQUNMLEtBQUssRUFBRSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCO2dCQUNqRCxRQUFRLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGFBQWE7YUFDakQsQ0FBQTtRQUNILENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDL0QsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUVPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFlLEVBQUUsZUFBb0I7UUFDbkUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBRTlELGdCQUFnQjtZQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxVQUFVLENBQUMsTUFBTSw2QkFBNkIsQ0FBQyxDQUFBO1lBRTNGLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxvRUFBb0UsQ0FBQyxDQUFBO2dCQUNsRixPQUFPLEVBQUUsQ0FBQTtZQUNYLENBQUM7WUFFRCxNQUFNLG9CQUFvQixHQUFHLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRS9FLGdCQUFnQjtZQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxxQ0FBcUMsQ0FBQyxDQUFBO1lBQzFILE9BQU8sQ0FBQyxHQUFHLENBQUMsOENBQThDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFBO1lBQ3pHLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0RBQStELG9CQUFvQixDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQTtZQUV6SCx1RUFBdUU7WUFDdkUsZ0RBQWdEO1lBQ2hELE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1lBQzlELE1BQU0sc0JBQXNCLEdBQUcsb0JBQW9CLENBQUMsc0JBQXNCLENBQUE7WUFFMUUsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQzlDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUdBQWlHLENBQUMsQ0FBQTtnQkFDL0csT0FBTyxFQUFFLENBQUE7WUFDWCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDekMsTUFBTSxTQUFTLEdBQUcsT0FBTyxFQUFFLEVBQUUsQ0FBQTtnQkFDN0IsSUFBSSxDQUFDLFNBQVM7b0JBQUUsT0FBTyxLQUFLLENBQUE7Z0JBRTVCLG9FQUFvRTtnQkFDcEUsaUVBQWlFO2dCQUNqRSxJQUFJLGFBQWEsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztvQkFDckUsT0FBTyxLQUFLLENBQUE7Z0JBQ2QsQ0FBQztnQkFFRCxpRkFBaUY7Z0JBQ2pGLElBQUksUUFBUSxHQUFHLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUVqRSw2RkFBNkY7Z0JBQzdGLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO29CQUM3QyxzREFBc0Q7b0JBQ3RELFFBQVEsR0FBRyxvQkFBb0IsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUE7Z0JBQ3hELENBQUM7Z0JBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQTtnQkFFM0UsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxTQUFTLGFBQWEsUUFBUSxrQ0FBa0MsZUFBZSxDQUFDLHVCQUF1QixVQUFVLGVBQWUsQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUE7Z0JBQzVNLENBQUM7Z0JBRUQsT0FBTyxhQUFhLENBQUE7WUFDdEIsQ0FBQyxDQUFDLENBQUE7WUFFRixPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxRQUFRLENBQUMsTUFBTSxxQkFBcUIsUUFBUSxDQUFDLE1BQU0sOEJBQThCLENBQUMsQ0FBQTtZQUVqSSxPQUFPLFFBQVEsQ0FBQTtRQUNqQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsdURBQXVELEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDNUUsT0FBTyxRQUFRLENBQUE7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLGVBQW9CO1FBQ2hELE1BQU0sWUFBWSxHQUFRO1lBQ3hCLE1BQU0sRUFBRSxXQUFXO1lBQ25CLE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxZQUFZO2dCQUMxRCxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVTthQUMxRTtTQUNGLENBQUE7UUFFRCxNQUFNLE9BQU8sR0FBNEIsRUFBRSxDQUFBO1FBRTNDLHFEQUFxRDtRQUNyRCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUE7UUFDekMsQ0FBQzthQUFNLENBQUM7WUFDTiwrQkFBK0I7WUFDL0IsT0FBTyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUE7UUFDM0IsQ0FBQztRQUVELElBQUksZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQTtRQUMvQyxDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxZQUFZLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUNoQyxDQUFDO1FBRUQsb0RBQW9EO1FBQ3BELDZEQUE2RDtRQUM3RCw2Q0FBNkM7UUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNuRCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRTlELGdDQUFnQztRQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1FBRXRCLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDNUMsa0JBQWtCO1lBQ2xCLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNwQixNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQzFDLElBQUksZUFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUM5QixtRkFBbUY7b0JBQ25GLE1BQU0sY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtvQkFDMUQsSUFBSSxRQUFRLEdBQUcsY0FBYzt3QkFBRSxPQUFPLEtBQUssQ0FBQTtnQkFDN0MsQ0FBQztxQkFBTSxDQUFDO29CQUNOLHFEQUFxRDtvQkFDckQsSUFBSSxRQUFRLEdBQUcsR0FBRzt3QkFBRSxPQUFPLEtBQUssQ0FBQTtnQkFDbEMsQ0FBQztZQUNILENBQUM7WUFFRCxnQkFBZ0I7WUFDaEIsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDdEMsSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzVCLDhFQUE4RTtvQkFDOUUsTUFBTSxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUN0RCxJQUFJLE1BQU0sR0FBRyxZQUFZO3dCQUFFLE9BQU8sS0FBSyxDQUFBO2dCQUN6QyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sMERBQTBEO29CQUMxRCxJQUFJLE1BQU0sR0FBRyxHQUFHO3dCQUFFLE9BQU8sS0FBSyxDQUFBO2dCQUNoQyxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLG9DQUFvQztnQkFDcEMsMEVBQTBFO2dCQUMxRSxJQUFJLGVBQWUsQ0FBQyxrQkFBa0IsS0FBSyxLQUFLLEVBQUUsQ0FBQztvQkFDakQsT0FBTyxLQUFLLENBQUE7Z0JBQ2QsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQTtRQUNiLENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxVQUFVLENBQUE7SUFDbkIsQ0FBQztJQUVPLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxVQUFpQjtRQU16RCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFBO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFBO1FBQzNDLElBQUksc0JBQXNCLEdBQUcsS0FBSyxDQUFBO1FBQ2xDLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFBO1FBRXpCLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7WUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBRTVELDBEQUEwRDtZQUMxRCxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkNBQTZDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDeEUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFO29CQUNoQixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7b0JBQ3BCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSTtvQkFDcEIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLO29CQUN0QixrQkFBa0IsRUFBRSxTQUFTLENBQUMsa0JBQWtCO29CQUNoRCxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7aUJBQzdCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDZCxDQUFDO1lBRUQsa0ZBQWtGO1lBQ2xGLE1BQU0sVUFBVSxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUE7WUFFbkUsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxTQUFTLENBQUMsRUFBRSxJQUFJLFNBQVMsQ0FBQyxJQUFJLHlDQUF5QyxDQUFDLENBQUE7Z0JBQ3hILHNCQUFzQixHQUFHLElBQUksQ0FBQTtnQkFDN0IsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO29CQUMzRCxpQkFBaUIsR0FBRyxRQUFRLENBQUE7Z0JBQzlCLENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsOEJBQThCLENBQUMsU0FBUyxDQUFDLENBQUE7WUFFaEUsb0NBQW9DO1lBQ3BDLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsU0FBUyxDQUFDLEVBQUUsSUFBSSxTQUFTLENBQUMsSUFBSSxjQUFjLFFBQVEsaUJBQWlCLEdBQUcsQ0FBQyxNQUFNLGVBQWUsVUFBVSxFQUFFLENBQUMsQ0FBQTtnQkFDM0osSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLDhDQUE4QyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUN6RixDQUFDO3FCQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxrRUFBa0UsU0FBUyxDQUFDLEVBQUUsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtnQkFDbEgsQ0FBQztZQUNILENBQUM7WUFFRCw4Q0FBOEM7WUFDOUMsd0RBQXdEO1lBQ3hELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtvQkFDZixVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO29CQUNsQixJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDM0IsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7d0JBQ3pDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7b0JBQ25ELENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLENBQUE7SUFDN0UsQ0FBQztJQUVPLDJCQUEyQixDQUFDLFNBQWM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFBO1FBQzlDLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsU0FBUyxDQUFDLEVBQUUsSUFBSSxTQUFTLENBQUMsSUFBSSx5QkFBeUIsQ0FBQyxDQUFBO1lBQ3hHLE9BQU8sU0FBUyxDQUFBO1FBQ2xCLENBQUM7UUFFRCxvRUFBb0U7UUFDcEUsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxPQUFPLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxTQUFTLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUM3RixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6QixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxTQUFTLENBQUMsRUFBRSxJQUFJLFNBQVMsQ0FBQyxJQUFJLCtCQUErQixLQUFLLDJDQUEyQyxDQUFDLENBQUE7Z0JBQzlKLE9BQU8sS0FBSyxDQUFBO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFFRCwwQ0FBMEM7UUFDMUMsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLHdCQUF3QixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssc0JBQXNCLEVBQUUsQ0FBQztZQUM3RixJQUFJLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxLQUFLLEdBQUcsT0FBTyxTQUFTLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDN0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsU0FBUyxDQUFDLEVBQUUsSUFBSSxTQUFTLENBQUMsSUFBSSwrQkFBK0IsS0FBSyx5QkFBeUIsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7b0JBQzVKLE9BQU8sS0FBSyxDQUFBO2dCQUNkLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLFNBQVMsQ0FBQyxFQUFFLElBQUksU0FBUyxDQUFDLElBQUksbURBQW1ELFNBQVMsQ0FBQyxJQUFJLG9CQUFvQixTQUFTLENBQUMsSUFBSSxxQkFBcUIsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDeE4sT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVPLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxTQUFjO1FBQ3pELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUE7UUFFcEMsNEJBQTRCO1FBQzVCLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sd0JBQXdCLFNBQVMsQ0FBQyxFQUFFLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7WUFFaEksS0FBSyxNQUFNLElBQUksSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUE7Z0JBQ2xELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtnQkFFckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsUUFBUSxlQUFlLElBQUksQ0FBQyxTQUFTLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBRS9HLHVEQUF1RDtnQkFDdkQsSUFBSSxjQUFjO29CQUNkLENBQUMsY0FBYyxLQUFLLGlCQUFpQjt3QkFDcEMsY0FBYyxLQUFLLFNBQVM7d0JBQzVCLGNBQWMsS0FBSyxVQUFVO3dCQUM3QixjQUFjLEtBQUssZ0JBQWdCO3dCQUNuQyxjQUFjLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxREFBcUQsUUFBUSxFQUFFLENBQUMsQ0FBQTtvQkFDNUUsU0FBUTtnQkFDVixDQUFDO2dCQUVELDJEQUEyRDtnQkFDM0QscUNBQXFDO2dCQUNyQyxzQ0FBc0M7Z0JBQ3RDLDZDQUE2QztnQkFDN0MsbUJBQW1CO2dCQUNuQixJQUFJLE1BQU0sR0FBYyxFQUFFLENBQUE7Z0JBRTFCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDL0IsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUE7Z0JBQ3RCLENBQUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUM3RCxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ3hCLENBQUM7Z0JBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLFFBQVEsRUFBRSxDQUFDLENBQUE7Z0JBRTlGLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQzNCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQzlCLHFDQUFxQzt3QkFDckMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLHlEQUF5RCxLQUFLLEVBQUUsQ0FBQyxDQUFBOzRCQUM3RSxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO3dCQUN2QixDQUFDO29CQUNILENBQUM7eUJBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO3dCQUN2RCxnRUFBZ0U7d0JBQ2hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsaURBQWlELEVBQUUsS0FBSyxDQUFDLENBQUE7d0JBRXJFLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7NEJBQ2xELE9BQU8sQ0FBQyxHQUFHLENBQUMsNERBQTRELEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBOzRCQUNuRixVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTt3QkFDMUIsQ0FBQzs2QkFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDOzRCQUMvRCxPQUFPLENBQUMsR0FBRyxDQUFDLCtEQUErRCxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTs0QkFDekYsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7d0JBQzdCLENBQUM7NkJBQU0sSUFBSSxZQUFZLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQzs0QkFDekUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvRUFBb0UsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUE7NEJBQ25HLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO3dCQUNsQyxDQUFDOzZCQUFNLENBQUM7NEJBQ04sd0RBQXdEOzRCQUN4RCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dDQUMvQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7b0NBQy9HLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0RBQXdELEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFBO29DQUNsRixVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dDQUNyQixDQUFDOzRCQUNILENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxTQUFTLENBQUMsRUFBRSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3JHLENBQUM7UUFFRCxpREFBaUQ7UUFDakQsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLHVEQUF1RCxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDcEcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBVSxFQUFFLEVBQUU7Z0JBQ3BELElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzNCLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBQ3BCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLE1BQU0sQ0FBQyxNQUFNLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNyRixPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxRQUFnQixFQUFFLGVBQW9CO1FBQ2xFLElBQUksZUFBZSxDQUFDLHVCQUF1QixLQUFLLFNBQVM7WUFDckQsUUFBUSxHQUFHLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3ZELE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQztRQUVELElBQUksZUFBZSxDQUFDLHVCQUF1QixLQUFLLFNBQVM7WUFDckQsUUFBUSxHQUFHLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3ZELE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRLENBQ3BCLFlBQXFDLEVBQ3JDLFFBQWEsRUFDYixjQUFzQjtRQUV0QixJQUFJLFFBQVEsRUFBRSxLQUFLLEtBQUssU0FBUztZQUFFLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQTtRQUV4RCxJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUN6QyxNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO2dCQUNkLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQUM7YUFDdkUsQ0FBQyxDQUFBO1lBRUYsT0FBTyxXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUs7Z0JBQzNCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNyRixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsbURBQW1ELEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDeEUsT0FBTyxjQUFjLENBQUE7UUFDdkIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQW5tQkQsb0RBbW1CQyJ9
|
|
900
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWx0ZXItc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9keW5hbWljLWZpbHRlci1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFtRjtBQUNuRix5RUFBbUU7QUFrQm5FLE1BQWEsb0JBQW9CO0lBSS9CLFlBQVksU0FBMEI7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBUSxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN4RSxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUE0QjtRQUM3QyxNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFBO1FBQzlGLE1BQU0sYUFBYSxHQUFrQixFQUFFLEdBQUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQTtRQUUzRSxPQUFPLENBQUMsR0FBRyxDQUFDLDBEQUEwRCxFQUFFO1lBQ3RFLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYztZQUMzQyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUN0RixDQUFDLENBQUE7UUFFRixNQUFNLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENB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
|