@yoryoboy/bi-mcp 1.5.3 → 1.7.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/mercadolibre/get-orders-summary.ts"],
4
- "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport {\n buildMercadoLibrePaginationMetadata,\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { searchMercadoLibreOrders } from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n compactDateTime,\n currencyBucket,\n mercadoLibreDateRegex,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nconst ordersSchema = [\"id\", \"date\", \"status\", \"total\", \"currency\", \"buyer\", \"shipping\", \"items\"] as const;\n\nexport const meliGetOrdersSummarySchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\n status: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre order status filter.\"),\n q: z.string().trim().min(1).optional().describe(\"Optional free-text search query supported by MercadoLibre orders search.\"),\n sort: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre sort expression.\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Pagination offset.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page (1-50).\"),\n});\n\nexport async function meliGetOrdersSummaryHandler(\n params: z.infer<typeof meliGetOrdersSummarySchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n q: params.q,\n sort: params.sort,\n offset: params.offset,\n limit: params.limit,\n });\n\n const orders = asArray<Record<string, unknown>>(response.results);\n const paging = normalizeMercadoLibrePaging(asRecord(response.paging));\n const metricsByCurrency: Record<string, { orders: number; revenue: number; avg_order_value: number }> = {};\n\n const compactOrders = orders.map((order) => {\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n const totalAmount = toNumber(order.total_amount);\n const bucket = currencyBucket(metricsByCurrency, currencyId, () => ({\n orders: 0,\n revenue: 0,\n avg_order_value: 0,\n }));\n bucket.orders += 1;\n bucket.revenue += totalAmount;\n bucket.avg_order_value = bucket.orders > 0 ? bucket.revenue / bucket.orders : 0;\n\n const orderItems = asArray<Record<string, unknown>>(order.order_items);\n const shipping = asRecord(order.shipping);\n const buyer = asRecord(order.buyer);\n\n return [\n normalizeString(order.id),\n compactDateTime(order.date_created),\n normalizeString(order.status),\n totalAmount,\n currencyId,\n normalizeString(buyer.nickname) || normalizeString(buyer.id),\n normalizeString(shipping.status),\n orderItems.length,\n ];\n });\n\n for (const metrics of Object.values(metricsByCurrency)) {\n metrics.revenue = roundMoney(metrics.revenue);\n metrics.avg_order_value = roundMoney(metrics.avg_order_value);\n }\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: buildMercadoLibrePaginationMetadata({\n total: paging.total,\n limit: paging.limit || params.limit || compactOrders.length,\n offset: paging.offset || params.offset || 0,\n returned: compactOrders.length,\n nextField: \"offset\",\n }),\n metrics_by_currency: metricsByCurrency,\n orders_schema: ordersSchema,\n orders: compactOrders,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to fetch MercadoLibre orders summary\"));\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport {\n buildMercadoLibrePaginationMetadata,\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n searchMercadoLibreOrders,\n searchMercadoLibreOrdersBatch,\n} from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n compactDateTime,\n currencyBucket,\n mercadoLibreDateRegex,\n normalizeScalarString,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nconst PAGE_FETCH_CONCURRENCY = 15;\nconst PAGE_FETCH_MAX_RETRIES = 2;\nconst ORDER_DETAIL_MAX_PAGES_PER_CALL = 15;\nconst DEFAULT_ORDER_DETAIL_PAGE_LIMIT = 50;\nconst TOP_LIMIT = 10;\n\nconst ordersSchema = [\n \"id\",\n \"date_created\",\n \"status\",\n \"total_amount\",\n \"currency\",\n \"buyer\",\n \"shipping_status\",\n \"items\",\n \"date_closed\",\n \"last_updated\",\n \"paid_amount\",\n \"buyer_id\",\n \"seller\",\n \"seller_id\",\n \"shipping_id\",\n \"pack_id\",\n \"fulfilled\",\n \"tags\",\n \"channel\",\n \"site\",\n \"payment_id\",\n \"payment_status\",\n \"payment_status_detail\",\n \"payment_method\",\n \"payment_type\",\n \"payment_total_paid\",\n \"payment_transaction_amount\",\n \"installments\",\n \"coupon_amount\",\n \"available_actions\",\n \"feedback_buyer\",\n \"feedback_seller\",\n \"order_request_change\",\n \"order_request_return\",\n \"first_item_id\",\n \"first_item_title\",\n \"first_item_sku\",\n \"first_item_quantity\",\n \"first_item_unit_price\",\n \"first_item_sale_fee\",\n \"first_item_listing_type\",\n \"variation_attributes\",\n \"stock_node_id\",\n] as const;\n\nfunction compactStringList(values: unknown, separator = \" | \"): string {\n return asArray(values)\n .map((value) => normalizeScalarString(value).trim())\n .filter(Boolean)\n .join(separator);\n}\n\nfunction compactNestedValue(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n\n const scalar = normalizeScalarString(value);\n if (scalar) {\n return scalar;\n }\n\n if (Array.isArray(value)) {\n return value\n .map((entry) => compactNestedValue(entry))\n .filter(Boolean)\n .join(\" | \");\n }\n\n const record = asRecord(value);\n return Object.entries(record)\n .map(([key, entryValue]) => {\n const normalized = compactNestedValue(entryValue);\n return normalized ? `${key}:${normalized}` : \"\";\n })\n .filter(Boolean)\n .join(\" | \");\n}\n\nfunction compactVariationAttributes(value: unknown): string {\n return asArray<Record<string, unknown>>(value)\n .map((attribute) => {\n const name = normalizeString(attribute.name) || normalizeString(attribute.id);\n const normalizedValue =\n normalizeString(attribute.value_name) ||\n normalizeString(attribute.value_id) ||\n normalizeScalarString(attribute.value);\n\n if (!name || !normalizedValue) {\n return \"\";\n }\n\n return `${name}: ${normalizedValue}`;\n })\n .filter(Boolean)\n .join(\" | \");\n}\n\nfunction createMetricsBucket() {\n return {\n orders: 0,\n revenue: 0,\n avg_order_value: 0,\n };\n}\n\ntype FailedPage = {\n offset: number;\n limit: number;\n page_number: number;\n message: string;\n status_code?: number;\n attempts: number;\n retryable: boolean;\n};\n\ntype OrderSummaryMetadata = ReturnType<typeof buildOrdersSummaryMetadata>;\n\ntype BreakdownEntry = {\n key: string;\n orders: number;\n rate: number;\n};\n\ntype BreakdownResult = {\n entries: BreakdownEntry[];\n other_orders?: number;\n other_rate?: number;\n};\n\ntype CurrencyCalculation = {\n revenue_total: number;\n paid_amount_total: number;\n payment_total_paid_amount: number;\n transaction_amount_total: number;\n coupon_amount_total: number;\n sale_fee_total: number;\n avg_order_value: number;\n avg_paid_amount_per_order: number;\n avg_units_per_order: number;\n avg_distinct_items_per_order: number;\n avg_sale_fee_per_order: number;\n sale_fee_rate: number;\n};\n\ntype BuyerAggregate = {\n buyer_id: string;\n nickname: string;\n orders: number;\n revenue_by_currency: Record<string, number>;\n};\n\ntype ItemAggregate = {\n item_id: string;\n title: string;\n seller_sku: string;\n variation_summary: string;\n orders: number;\n units: number;\n revenue_by_currency: Record<string, number>;\n sale_fee_by_currency: Record<string, number>;\n};\n\ntype VariationAggregate = {\n variation_summary: string;\n orders: number;\n units: number;\n revenue_by_currency: Record<string, number>;\n};\n\ntype SkuAggregate = {\n seller_sku: string;\n orders: number;\n units: number;\n revenue_by_currency: Record<string, number>;\n};\n\ntype CurrencyMetricBucket = {\n orders: number;\n units: number;\n revenue: number;\n paidRevenue: number;\n paymentTotalPaid: number;\n transactionAmount: number;\n refundedAmount: number;\n cancelledGmv: number;\n saleFee: number;\n shippingCost: number;\n couponAmount: number;\n paymentCouponAmount: number;\n discountedGmv: number;\n notDeliveredGmv: number;\n cancelledOrders: number;\n refundedOrders: number;\n ordersWithShippingCost: number;\n ordersWithCoupon: number;\n discountedOrders: number;\n notDeliveredOrders: number;\n};\n\ntype FlowAggregate = {\n flow: string;\n orders: number;\n units: number;\n cancelled_orders: number;\n revenue_by_currency: Record<string, number>;\n paid_revenue_by_currency: Record<string, number>;\n sale_fee_by_currency: Record<string, number>;\n};\n\ntype SkuEconomicsAggregate = {\n seller_sku: string;\n item_id: string;\n title: string;\n orders: number;\n units: number;\n cancelled_orders: number;\n refunded_orders: number;\n revenue_by_currency: Record<string, number>;\n paid_revenue_by_currency: Record<string, number>;\n sale_fee_by_currency: Record<string, number>;\n refunded_amount_by_currency: Record<string, number>;\n};\n\nfunction safeRate(numerator: number, denominator: number): number {\n if (!Number.isFinite(denominator) || denominator <= 0) {\n return 0;\n }\n\n return Number((numerator / denominator).toFixed(4));\n}\n\nfunction topBreakdownFromMap(\n counts: Map<string, number>,\n totalOrders: number,\n limit = TOP_LIMIT\n): BreakdownResult {\n const sorted = Array.from(counts.entries())\n .filter(([, count]) => count > 0)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]));\n\n const entries = sorted.slice(0, limit).map(([key, orders]) => ({\n key,\n orders,\n rate: safeRate(orders, totalOrders),\n }));\n\n const otherOrders = sorted.slice(limit).reduce((sum, [, count]) => sum + count, 0);\n return stripNulls({\n entries,\n other_orders: otherOrders > 0 ? otherOrders : undefined,\n other_rate: otherOrders > 0 ? safeRate(otherOrders, totalOrders) : undefined,\n }) as BreakdownResult;\n}\n\nfunction incrementCount(map: Map<string, number>, key: string) {\n if (!key) {\n return;\n }\n\n map.set(key, (map.get(key) ?? 0) + 1);\n}\n\nfunction incrementCurrency(map: Record<string, number>, currencyId: string, amount: number) {\n map[currencyId] = roundMoney((map[currencyId] ?? 0) + amount);\n}\n\nfunction sortedCurrencyTotals(input: Record<string, number>) {\n return Object.fromEntries(\n Object.entries(input)\n .filter(([, amount]) => amount !== 0)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currency, amount]) => [currency, roundMoney(amount)])\n );\n}\n\nfunction createCurrencyMetricBucket(): CurrencyMetricBucket {\n return {\n orders: 0,\n units: 0,\n revenue: 0,\n paidRevenue: 0,\n paymentTotalPaid: 0,\n transactionAmount: 0,\n refundedAmount: 0,\n cancelledGmv: 0,\n saleFee: 0,\n shippingCost: 0,\n couponAmount: 0,\n paymentCouponAmount: 0,\n discountedGmv: 0,\n notDeliveredGmv: 0,\n cancelledOrders: 0,\n refundedOrders: 0,\n ordersWithShippingCost: 0,\n ordersWithCoupon: 0,\n discountedOrders: 0,\n notDeliveredOrders: 0,\n };\n}\n\nfunction incrementCurrencyMetric(\n map: Record<string, CurrencyMetricBucket>,\n currencyId: string,\n updater: (bucket: CurrencyMetricBucket) => void\n) {\n map[currencyId] = map[currencyId] ?? createCurrencyMetricBucket();\n updater(map[currencyId]);\n}\n\nfunction sortedCurrencyMetrics(\n input: Record<string, CurrencyMetricBucket>,\n mapper: (bucket: CurrencyMetricBucket) => Record<string, number>\n) {\n return Object.fromEntries(\n Object.entries(input)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currencyId, bucket]) => [currencyId, stripNulls(mapper(bucket))])\n );\n}\n\nfunction topAmountBreakdownFromMap(\n counts: Map<string, number>,\n amounts: Map<string, Record<string, number>>,\n totalOrders: number,\n limit = TOP_LIMIT\n) {\n const sorted = Array.from(counts.entries())\n .filter(([, count]) => count > 0)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]));\n\n const entries = sorted.slice(0, limit).map(([key, orders]) => ({\n key,\n orders,\n rate: safeRate(orders, totalOrders),\n amount_by_currency: sortedCurrencyTotals(amounts.get(key) ?? {}),\n }));\n\n const otherOrders = sorted.slice(limit).reduce((sum, [, count]) => sum + count, 0);\n return stripNulls({\n entries,\n other_orders: otherOrders > 0 ? otherOrders : undefined,\n other_rate: otherOrders > 0 ? safeRate(otherOrders, totalOrders) : undefined,\n });\n}\n\nfunction revenueSum(input: Record<string, number>) {\n return Object.values(input).reduce((sum, value) => sum + value, 0);\n}\n\nfunction compactFeedbackValue(value: unknown): string {\n const compact = compactNestedValue(value);\n return compact.trim();\n}\n\nfunction getFirstPayment(order: Record<string, unknown>) {\n return asRecord(asArray<Record<string, unknown>>(order.payments)[0]);\n}\n\nfunction getOrderCurrency(order: Record<string, unknown>) {\n return normalizeString(order.currency_id, \"UNKNOWN\");\n}\n\nfunction buildCalculations(\n orders: Array<Record<string, unknown>>,\n metadata: OrderSummaryMetadata,\n failedPages: FailedPage[]\n) {\n const ordersTotal = orders.length;\n const statusCounts = new Map<string, number>();\n const tagCounts = new Map<string, number>();\n const channelCounts = new Map<string, number>();\n const siteCounts = new Map<string, number>();\n const paymentStatusCounts = new Map<string, number>();\n const paymentStatusDetailCounts = new Map<string, number>();\n const paymentMethodCounts = new Map<string, number>();\n const paymentTypeCounts = new Map<string, number>();\n const installmentsCounts = new Map<string, number>();\n const stockNodeCounts = new Map<string, number>();\n const listingTypeCounts = new Map<string, number>();\n const variationValueCounts = new Map<string, number>();\n const buyers = new Map<string, BuyerAggregate>();\n const items = new Map<string, ItemAggregate>();\n const variations = new Map<string, VariationAggregate>();\n const skus = new Map<string, SkuAggregate>();\n const dailyMetrics = new Map<string, Record<string, CurrencyMetricBucket>>();\n const flowMetrics = new Map<string, FlowAggregate>();\n const skuEconomics = new Map<string, SkuEconomicsAggregate>();\n const cancelGroupCounts = new Map<string, number>();\n const cancelCodeCounts = new Map<string, number>();\n const cancelRequestedByCounts = new Map<string, number>();\n const cancelReasonCounts = new Map<string, number>();\n const cancelReasonAmounts = new Map<string, Record<string, number>>();\n\n let unitsTotal = 0;\n let fulfilledOrders = 0;\n let deliveredOrders = 0;\n let packOrders = 0;\n let discountedOrders = 0;\n let catalogOrders = 0;\n let ordersWithFeedback = 0;\n let ordersWithChangeRequest = 0;\n let ordersWithReturnRequest = 0;\n let feedbackBuyerCount = 0;\n let feedbackSellerCount = 0;\n let ordersWithShipping = 0;\n let singleItemOrders = 0;\n let multiItemOrders = 0;\n let ordersWithoutPaymentData = 0;\n let paymentApprovedOrders = 0;\n let itemLineCount = 0;\n let ordersWithAnyPostSaleIssue = 0;\n let ordersWithRefundedAmount = 0;\n let ordersWithShippingCostAmount = 0;\n let ordersWithCouponAmount = 0;\n let notDeliveredOrders = 0;\n let multiUnitItemLines = 0;\n let multiUnitSaleFeeObservations = 0;\n\n const itemsSeen = new Set<string>();\n const buyerSeen = new Set<string>();\n const financialRaw: Record<\n string,\n {\n orders: number;\n units: number;\n distinctItems: number;\n revenue: number;\n paidAmount: number;\n paymentTotalPaidAmount: number;\n transactionAmount: number;\n couponAmount: number;\n saleFee: number;\n }\n > = {};\n const currencyMetrics: Record<string, CurrencyMetricBucket> = {};\n\n for (const order of orders) {\n const currencyId = getOrderCurrency(order);\n const totalAmount = toNumber(order.total_amount);\n const paidAmount = toNumber(order.paid_amount);\n const couponAmount = toNumber(asRecord(order.coupon).amount);\n const payment = getFirstPayment(order);\n const orderItems = asArray<Record<string, unknown>>(order.order_items);\n const buyer = asRecord(order.buyer);\n const seller = asRecord(order.seller);\n const feedback = asRecord(order.feedback);\n const orderRequest = asRecord(order.order_request);\n const shipping = asRecord(order.shipping);\n const context = asRecord(order.context);\n const paymentStatus = normalizeString(payment.status);\n const paymentStatusDetail = normalizeString(payment.status_detail);\n const paymentMethod = normalizeString(payment.payment_method_id);\n const paymentType = normalizeString(payment.payment_type);\n const installments = normalizeScalarString(payment.installments);\n const tags = asArray(order.tags).map((tag) => normalizeScalarString(tag)).filter(Boolean);\n const cancelDetail = asRecord(order.cancel_detail);\n const isCancelled = normalizeString(order.status) === \"cancelled\";\n const refundedAmount = toNumber(payment.transaction_amount_refunded);\n const shippingCost = toNumber(payment.shipping_cost);\n const paymentCouponAmount = toNumber(payment.coupon_amount);\n const dayKey = compactDateTime(order.date_created)?.slice(0, 10) || \"UNKNOWN_DATE\";\n const flows = asArray(context.flows).map((flow) => normalizeScalarString(flow)).filter(Boolean);\n const effectiveFlows = flows.length > 0 ? flows : [\"NO_FLOW\"];\n const isDiscounted = tags.includes(\"order_has_discount\") || couponAmount > 0 || paymentCouponAmount > 0;\n const isNotDelivered = tags.includes(\"not_delivered\") || normalizeString(cancelDetail.group) === \"shipment\";\n const orderItemDistinctIds = new Set<string>();\n\n financialRaw[currencyId] = financialRaw[currencyId] ?? {\n orders: 0,\n units: 0,\n distinctItems: 0,\n revenue: 0,\n paidAmount: 0,\n paymentTotalPaidAmount: 0,\n transactionAmount: 0,\n couponAmount: 0,\n saleFee: 0,\n };\n\n financialRaw[currencyId].orders += 1;\n financialRaw[currencyId].revenue += totalAmount;\n financialRaw[currencyId].paidAmount += paidAmount;\n financialRaw[currencyId].paymentTotalPaidAmount += toNumber(payment.total_paid_amount);\n financialRaw[currencyId].transactionAmount += toNumber(payment.transaction_amount);\n financialRaw[currencyId].couponAmount += couponAmount;\n\n const dailyCurrencyMetrics = dailyMetrics.get(dayKey) ?? {};\n dailyMetrics.set(dayKey, dailyCurrencyMetrics);\n const updateOrderCurrencyMetrics = (bucket: CurrencyMetricBucket) => {\n bucket.orders += 1;\n bucket.revenue += totalAmount;\n bucket.paidRevenue += paidAmount;\n bucket.paymentTotalPaid += toNumber(payment.total_paid_amount);\n bucket.transactionAmount += toNumber(payment.transaction_amount);\n bucket.refundedAmount += refundedAmount;\n bucket.shippingCost += shippingCost;\n bucket.couponAmount += couponAmount;\n bucket.paymentCouponAmount += paymentCouponAmount;\n if (isCancelled) {\n bucket.cancelledOrders += 1;\n bucket.cancelledGmv += totalAmount;\n }\n if (refundedAmount > 0) {\n bucket.refundedOrders += 1;\n }\n if (shippingCost > 0) {\n bucket.ordersWithShippingCost += 1;\n }\n if (couponAmount > 0 || paymentCouponAmount > 0) {\n bucket.ordersWithCoupon += 1;\n }\n if (isDiscounted) {\n bucket.discountedOrders += 1;\n }\n if (isNotDelivered) {\n bucket.notDeliveredOrders += 1;\n }\n };\n incrementCurrencyMetric(currencyMetrics, currencyId, updateOrderCurrencyMetrics);\n incrementCurrencyMetric(dailyCurrencyMetrics, currencyId, updateOrderCurrencyMetrics);\n\n incrementCount(statusCounts, normalizeString(order.status));\n incrementCount(channelCounts, normalizeString(context.channel));\n incrementCount(siteCounts, normalizeString(context.site));\n\n if (paymentStatus) {\n incrementCount(paymentStatusCounts, paymentStatus);\n } else {\n ordersWithoutPaymentData += 1;\n }\n incrementCount(paymentStatusDetailCounts, paymentStatusDetail);\n incrementCount(paymentMethodCounts, paymentMethod);\n incrementCount(paymentTypeCounts, paymentType);\n incrementCount(installmentsCounts, installments);\n\n if (paymentStatus === \"approved\") {\n paymentApprovedOrders += 1;\n }\n\n if (order.fulfilled === true) {\n fulfilledOrders += 1;\n }\n\n if (normalizeScalarString(shipping.id)) {\n ordersWithShipping += 1;\n }\n\n if (orderItems.length === 1) {\n singleItemOrders += 1;\n } else if (orderItems.length > 1) {\n multiItemOrders += 1;\n }\n\n for (const tag of tags) {\n incrementCount(tagCounts, tag);\n }\n\n if (tags.includes(\"delivered\")) {\n deliveredOrders += 1;\n }\n if (tags.includes(\"pack_order\")) {\n packOrders += 1;\n }\n if (tags.includes(\"order_has_discount\")) {\n discountedOrders += 1;\n }\n if (tags.includes(\"catalog\")) {\n catalogOrders += 1;\n }\n if (refundedAmount > 0) {\n ordersWithRefundedAmount += 1;\n }\n if (shippingCost > 0) {\n ordersWithShippingCostAmount += 1;\n }\n if (couponAmount > 0 || paymentCouponAmount > 0) {\n ordersWithCouponAmount += 1;\n }\n if (isNotDelivered) {\n notDeliveredOrders += 1;\n }\n if (isCancelled) {\n const cancelGroup = normalizeString(cancelDetail.group, \"UNKNOWN_GROUP\");\n const cancelCode = normalizeString(cancelDetail.code, \"UNKNOWN_CODE\");\n const requestedBy = normalizeString(cancelDetail.requested_by, \"UNKNOWN_REQUESTER\");\n const reasonKey = `${cancelGroup}:${cancelCode}:${requestedBy}`;\n incrementCount(cancelGroupCounts, cancelGroup);\n incrementCount(cancelCodeCounts, cancelCode);\n incrementCount(cancelRequestedByCounts, requestedBy);\n incrementCount(cancelReasonCounts, reasonKey);\n const reasonAmount = cancelReasonAmounts.get(reasonKey) ?? {};\n incrementCurrency(reasonAmount, currencyId, totalAmount);\n cancelReasonAmounts.set(reasonKey, reasonAmount);\n }\n\n for (const flow of effectiveFlows) {\n const flowAggregate = flowMetrics.get(flow) ?? {\n flow,\n orders: 0,\n units: 0,\n cancelled_orders: 0,\n revenue_by_currency: {},\n paid_revenue_by_currency: {},\n sale_fee_by_currency: {},\n };\n flowAggregate.orders += 1;\n if (isCancelled) {\n flowAggregate.cancelled_orders += 1;\n }\n incrementCurrency(flowAggregate.revenue_by_currency, currencyId, totalAmount);\n incrementCurrency(flowAggregate.paid_revenue_by_currency, currencyId, paidAmount);\n flowMetrics.set(flow, flowAggregate);\n }\n\n const feedbackBuyer = compactFeedbackValue(feedback.buyer);\n const feedbackSeller = compactFeedbackValue(feedback.seller);\n const hasFeedback = Boolean(feedbackBuyer || feedbackSeller);\n if (hasFeedback) {\n ordersWithFeedback += 1;\n }\n if (feedbackBuyer) {\n feedbackBuyerCount += 1;\n }\n if (feedbackSeller) {\n feedbackSellerCount += 1;\n }\n\n const hasChangeRequest = Boolean(compactFeedbackValue(orderRequest.change));\n const hasReturnRequest = Boolean(compactFeedbackValue(orderRequest.return));\n if (hasChangeRequest) {\n ordersWithChangeRequest += 1;\n }\n if (hasReturnRequest) {\n ordersWithReturnRequest += 1;\n }\n if (hasFeedback || hasChangeRequest || hasReturnRequest) {\n ordersWithAnyPostSaleIssue += 1;\n }\n\n const buyerId = normalizeScalarString(buyer.id);\n const buyerNickname = normalizeString(buyer.nickname);\n if (buyerId || buyerNickname) {\n const buyerKey = buyerId || buyerNickname;\n buyerSeen.add(buyerKey);\n const currentBuyer = buyers.get(buyerKey) ?? {\n buyer_id: buyerId,\n nickname: buyerNickname,\n orders: 0,\n revenue_by_currency: {},\n };\n currentBuyer.orders += 1;\n incrementCurrency(currentBuyer.revenue_by_currency, currencyId, totalAmount);\n buyers.set(buyerKey, currentBuyer);\n }\n\n for (const orderItem of orderItems) {\n itemLineCount += 1;\n const item = asRecord(orderItem.item);\n const stock = asRecord(orderItem.stock);\n const itemId = normalizeString(item.id);\n const title = normalizeString(item.title);\n const sellerSku = normalizeString(item.seller_sku);\n const quantity = toNumber(orderItem.quantity);\n const unitPrice = toNumber(orderItem.unit_price);\n const saleFee = toNumber(orderItem.sale_fee);\n const listingType = normalizeString(orderItem.listing_type_id);\n const stockNode = normalizeString(stock.node_id);\n const variationSummary = compactVariationAttributes(item.variation_attributes);\n const itemKey = `${itemId}::${variationSummary}::${sellerSku}`;\n const skuKey = sellerSku || itemId || title || \"UNKNOWN_SKU\";\n const variationKey = variationSummary || \"NO_VARIATION\";\n const itemRevenue = unitPrice * quantity;\n const paidRevenueApprox = totalAmount > 0 ? paidAmount * (itemRevenue / totalAmount) : itemRevenue;\n const refundedAmountApprox = totalAmount > 0 ? refundedAmount * (itemRevenue / totalAmount) : refundedAmount;\n\n if (quantity > 1) {\n multiUnitItemLines += 1;\n if (saleFee > 0) {\n multiUnitSaleFeeObservations += 1;\n }\n }\n\n unitsTotal += quantity;\n financialRaw[currencyId].units += quantity;\n financialRaw[currencyId].saleFee += saleFee;\n const updateItemCurrencyMetrics = (bucket: CurrencyMetricBucket) => {\n bucket.units += quantity;\n bucket.saleFee += saleFee;\n if (isDiscounted) {\n bucket.discountedGmv += itemRevenue;\n }\n if (isNotDelivered) {\n bucket.notDeliveredGmv += itemRevenue;\n }\n };\n incrementCurrencyMetric(currencyMetrics, currencyId, updateItemCurrencyMetrics);\n incrementCurrencyMetric(dailyCurrencyMetrics, currencyId, updateItemCurrencyMetrics);\n\n for (const flow of effectiveFlows) {\n const flowAggregate = flowMetrics.get(flow);\n if (flowAggregate) {\n flowAggregate.units += quantity;\n incrementCurrency(flowAggregate.sale_fee_by_currency, currencyId, saleFee);\n }\n }\n\n if (itemId) {\n itemsSeen.add(itemId);\n orderItemDistinctIds.add(itemId);\n }\n\n incrementCount(listingTypeCounts, listingType);\n incrementCount(stockNodeCounts, stockNode);\n incrementCount(variationValueCounts, variationKey);\n\n const itemAggregate = items.get(itemKey) ?? {\n item_id: itemId,\n title,\n seller_sku: sellerSku,\n variation_summary: variationSummary,\n orders: 0,\n units: 0,\n revenue_by_currency: {},\n sale_fee_by_currency: {},\n };\n itemAggregate.orders += 1;\n itemAggregate.units += quantity;\n incrementCurrency(itemAggregate.revenue_by_currency, currencyId, unitPrice * quantity);\n incrementCurrency(itemAggregate.sale_fee_by_currency, currencyId, saleFee);\n items.set(itemKey, itemAggregate);\n\n const variationAggregate = variations.get(variationKey) ?? {\n variation_summary: variationSummary,\n orders: 0,\n units: 0,\n revenue_by_currency: {},\n };\n variationAggregate.orders += 1;\n variationAggregate.units += quantity;\n incrementCurrency(variationAggregate.revenue_by_currency, currencyId, unitPrice * quantity);\n variations.set(variationKey, variationAggregate);\n\n const skuAggregate = skus.get(skuKey) ?? {\n seller_sku: sellerSku,\n orders: 0,\n units: 0,\n revenue_by_currency: {},\n };\n skuAggregate.orders += 1;\n skuAggregate.units += quantity;\n incrementCurrency(skuAggregate.revenue_by_currency, currencyId, unitPrice * quantity);\n skus.set(skuKey, skuAggregate);\n\n const skuEconomicsAggregate = skuEconomics.get(skuKey) ?? {\n seller_sku: sellerSku,\n item_id: itemId,\n title,\n orders: 0,\n units: 0,\n cancelled_orders: 0,\n refunded_orders: 0,\n revenue_by_currency: {},\n paid_revenue_by_currency: {},\n sale_fee_by_currency: {},\n refunded_amount_by_currency: {},\n };\n skuEconomicsAggregate.orders += 1;\n skuEconomicsAggregate.units += quantity;\n if (isCancelled) {\n skuEconomicsAggregate.cancelled_orders += 1;\n }\n if (refundedAmount > 0) {\n skuEconomicsAggregate.refunded_orders += 1;\n }\n incrementCurrency(skuEconomicsAggregate.revenue_by_currency, currencyId, itemRevenue);\n incrementCurrency(skuEconomicsAggregate.paid_revenue_by_currency, currencyId, paidRevenueApprox);\n incrementCurrency(skuEconomicsAggregate.sale_fee_by_currency, currencyId, saleFee);\n incrementCurrency(skuEconomicsAggregate.refunded_amount_by_currency, currencyId, refundedAmountApprox);\n skuEconomics.set(skuKey, skuEconomicsAggregate);\n }\n\n financialRaw[currencyId].distinctItems += orderItemDistinctIds.size;\n }\n\n const financialByCurrency: Record<string, CurrencyCalculation> = {};\n for (const [currencyId, raw] of Object.entries(financialRaw)) {\n financialByCurrency[currencyId] = {\n revenue_total: roundMoney(raw.revenue),\n paid_amount_total: roundMoney(raw.paidAmount),\n payment_total_paid_amount: roundMoney(raw.paymentTotalPaidAmount),\n transaction_amount_total: roundMoney(raw.transactionAmount),\n coupon_amount_total: roundMoney(raw.couponAmount),\n sale_fee_total: roundMoney(raw.saleFee),\n avg_order_value: roundMoney(raw.revenue / Math.max(1, raw.orders)),\n avg_paid_amount_per_order: roundMoney(raw.paidAmount / Math.max(1, raw.orders)),\n avg_units_per_order: roundMoney(raw.units / Math.max(1, raw.orders)),\n avg_distinct_items_per_order: roundMoney(raw.distinctItems / Math.max(1, raw.orders)),\n avg_sale_fee_per_order: roundMoney(raw.saleFee / Math.max(1, raw.orders)),\n sale_fee_rate: safeRate(raw.saleFee, raw.revenue),\n };\n }\n\n const topItemsByRevenue = Array.from(items.values())\n .sort((left, right) => {\n const leftRevenue = Object.values(left.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n const rightRevenue = Object.values(right.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n return rightRevenue - leftRevenue || left.item_id.localeCompare(right.item_id);\n })\n .slice(0, TOP_LIMIT)\n .map((item) => ({\n ...item,\n revenue_by_currency: sortedCurrencyTotals(item.revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(item.sale_fee_by_currency),\n }));\n\n const topItemsByUnits = Array.from(items.values())\n .sort((left, right) => right.units - left.units || left.item_id.localeCompare(right.item_id))\n .slice(0, TOP_LIMIT)\n .map((item) => ({\n ...item,\n revenue_by_currency: sortedCurrencyTotals(item.revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(item.sale_fee_by_currency),\n }));\n\n const topItemsByOrders = Array.from(items.values())\n .sort((left, right) => right.orders - left.orders || left.item_id.localeCompare(right.item_id))\n .slice(0, TOP_LIMIT)\n .map((item) => ({\n ...item,\n revenue_by_currency: sortedCurrencyTotals(item.revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(item.sale_fee_by_currency),\n }));\n\n const topVariations = Array.from(variations.values())\n .filter((variation) => variation.variation_summary)\n .sort((left, right) => right.units - left.units || left.variation_summary.localeCompare(right.variation_summary))\n .slice(0, TOP_LIMIT)\n .map((variation) => ({\n ...variation,\n revenue_by_currency: sortedCurrencyTotals(variation.revenue_by_currency),\n }));\n\n const topSkus = Array.from(skus.values())\n .filter((sku) => sku.seller_sku)\n .sort((left, right) => right.units - left.units || left.seller_sku.localeCompare(right.seller_sku))\n .slice(0, TOP_LIMIT)\n .map((sku) => ({\n ...sku,\n revenue_by_currency: sortedCurrencyTotals(sku.revenue_by_currency),\n }));\n\n const topBuyersByRevenue = Array.from(buyers.values())\n .sort((left, right) => {\n const leftRevenue = Object.values(left.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n const rightRevenue = Object.values(right.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n return rightRevenue - leftRevenue || left.buyer_id.localeCompare(right.buyer_id);\n })\n .slice(0, TOP_LIMIT)\n .map((buyer) => ({\n ...buyer,\n revenue_by_currency: sortedCurrencyTotals(buyer.revenue_by_currency),\n }));\n\n const topBuyersByOrders = Array.from(buyers.values())\n .sort((left, right) => right.orders - left.orders || left.buyer_id.localeCompare(right.buyer_id))\n .slice(0, TOP_LIMIT)\n .map((buyer) => ({\n ...buyer,\n revenue_by_currency: sortedCurrencyTotals(buyer.revenue_by_currency),\n }));\n\n const buyersWithMultipleOrders = Array.from(buyers.values()).filter((buyer) => buyer.orders > 1).length;\n\n const topVariationValues = Array.from(variationValueCounts.entries())\n .filter(([key]) => key && key !== \"NO_VARIATION\")\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))\n .slice(0, TOP_LIMIT)\n .map(([key, occurrences]) => ({ key, occurrences }));\n\n const topSingleValue = (counts: Map<string, number>) =>\n Array.from(counts.entries())\n .filter(([key]) => key)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))[0]?.[0] ?? \"\";\n\n const revenueQuality = {\n by_currency: sortedCurrencyMetrics(currencyMetrics, (bucket) => ({\n gross_gmv: roundMoney(bucket.revenue),\n paid_gmv: roundMoney(bucket.paidRevenue),\n payment_total_paid_amount: roundMoney(bucket.paymentTotalPaid),\n transaction_amount_total: roundMoney(bucket.transactionAmount),\n refunded_amount_total: roundMoney(bucket.refundedAmount),\n net_after_refunds: roundMoney(bucket.transactionAmount - bucket.refundedAmount),\n cancelled_gmv: roundMoney(bucket.cancelledGmv),\n cancelled_rate_by_orders: safeRate(bucket.cancelledOrders, bucket.orders),\n cancelled_rate_by_gmv: safeRate(bucket.cancelledGmv, bucket.revenue),\n paid_rate_by_gmv: safeRate(bucket.paidRevenue, bucket.revenue),\n })),\n };\n\n const refundsCancellations = {\n by_currency: sortedCurrencyMetrics(currencyMetrics, (bucket) => ({\n refunded_amount_total: roundMoney(bucket.refundedAmount),\n refunded_orders: bucket.refundedOrders,\n refund_rate_by_orders: safeRate(bucket.refundedOrders, bucket.orders),\n refund_rate_by_transaction_amount: safeRate(bucket.refundedAmount, bucket.transactionAmount),\n cancelled_orders: bucket.cancelledOrders,\n cancelled_gmv: roundMoney(bucket.cancelledGmv),\n cancelled_rate_by_orders: safeRate(bucket.cancelledOrders, bucket.orders),\n cancelled_rate_by_gmv: safeRate(bucket.cancelledGmv, bucket.revenue),\n })),\n cancel_group_breakdown: topBreakdownFromMap(cancelGroupCounts, ordersTotal),\n cancel_code_breakdown: topBreakdownFromMap(cancelCodeCounts, ordersTotal),\n cancel_requested_by_breakdown: topBreakdownFromMap(cancelRequestedByCounts, ordersTotal),\n top_cancel_reasons: topAmountBreakdownFromMap(cancelReasonCounts, cancelReasonAmounts, ordersTotal),\n };\n\n const shippingAndDiscounts = {\n by_currency: sortedCurrencyMetrics(currencyMetrics, (bucket) => ({\n buyer_shipping_paid_total: roundMoney(bucket.shippingCost),\n orders_with_shipping_cost: bucket.ordersWithShippingCost,\n avg_shipping_paid_by_order_with_cost: roundMoney(bucket.shippingCost / Math.max(1, bucket.ordersWithShippingCost)),\n shipping_cost_rate_on_paid_gmv: safeRate(bucket.shippingCost, bucket.paidRevenue),\n coupon_amount_total: roundMoney(bucket.couponAmount),\n payment_coupon_amount_total: roundMoney(bucket.paymentCouponAmount),\n orders_with_coupon: bucket.ordersWithCoupon,\n coupon_rate_by_orders: safeRate(bucket.ordersWithCoupon, bucket.orders),\n coupon_rate_on_gmv: safeRate(bucket.couponAmount + bucket.paymentCouponAmount, bucket.revenue),\n discounted_orders: bucket.discountedOrders,\n discounted_order_rate: safeRate(bucket.discountedOrders, bucket.orders),\n discounted_gmv: roundMoney(bucket.discountedGmv),\n not_delivered_orders: bucket.notDeliveredOrders,\n not_delivered_gmv: roundMoney(bucket.notDeliveredGmv),\n not_delivered_rate_by_orders: safeRate(bucket.notDeliveredOrders, bucket.orders),\n not_delivered_rate_by_gmv: safeRate(bucket.notDeliveredGmv, bucket.revenue),\n })),\n };\n\n const dailyTrend = Array.from(dailyMetrics.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([date, byCurrency]) => ({\n date,\n by_currency: sortedCurrencyMetrics(byCurrency, (bucket) => ({\n orders: bucket.orders,\n units: bucket.units,\n revenue: roundMoney(bucket.revenue),\n paid_revenue: roundMoney(bucket.paidRevenue),\n cancelled_orders: bucket.cancelledOrders,\n refunded_amount: roundMoney(bucket.refundedAmount),\n avg_order_value: roundMoney(bucket.revenue / Math.max(1, bucket.orders)),\n })),\n }));\n\n const flowPerformance = Array.from(flowMetrics.values())\n .sort((left, right) => revenueSum(right.revenue_by_currency) - revenueSum(left.revenue_by_currency) || left.flow.localeCompare(right.flow))\n .slice(0, TOP_LIMIT)\n .map((flow) => ({\n flow: flow.flow,\n orders: flow.orders,\n units: flow.units,\n revenue_by_currency: sortedCurrencyTotals(flow.revenue_by_currency),\n paid_revenue_by_currency: sortedCurrencyTotals(flow.paid_revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(flow.sale_fee_by_currency),\n cancelled_orders: flow.cancelled_orders,\n cancelled_rate: safeRate(flow.cancelled_orders, flow.orders),\n fee_rate_by_currency: Object.fromEntries(\n Object.keys(flow.revenue_by_currency)\n .sort((left, right) => left.localeCompare(right))\n .map((currencyId) => [currencyId, safeRate(flow.sale_fee_by_currency[currencyId] ?? 0, flow.revenue_by_currency[currencyId] ?? 0)])\n ),\n }));\n\n const skuUnitEconomics = Array.from(skuEconomics.values())\n .sort((left, right) => revenueSum(right.revenue_by_currency) - revenueSum(left.revenue_by_currency) || left.seller_sku.localeCompare(right.seller_sku))\n .slice(0, TOP_LIMIT)\n .map((sku) => ({\n seller_sku: sku.seller_sku,\n item_id: sku.item_id,\n title: sku.title,\n orders: sku.orders,\n units: sku.units,\n revenue_by_currency: sortedCurrencyTotals(sku.revenue_by_currency),\n paid_revenue_by_currency: sortedCurrencyTotals(sku.paid_revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(sku.sale_fee_by_currency),\n refunded_amount_by_currency: sortedCurrencyTotals(sku.refunded_amount_by_currency),\n avg_unit_price_by_currency: Object.fromEntries(\n Object.keys(sku.revenue_by_currency)\n .sort((left, right) => left.localeCompare(right))\n .map((currencyId) => [currencyId, roundMoney((sku.revenue_by_currency[currencyId] ?? 0) / Math.max(1, sku.units))])\n ),\n fee_rate_by_currency: Object.fromEntries(\n Object.keys(sku.revenue_by_currency)\n .sort((left, right) => left.localeCompare(right))\n .map((currencyId) => [currencyId, safeRate(sku.sale_fee_by_currency[currencyId] ?? 0, sku.revenue_by_currency[currencyId] ?? 0)])\n ),\n cancelled_orders: sku.cancelled_orders,\n cancelled_rate: safeRate(sku.cancelled_orders, sku.orders),\n refunded_orders: sku.refunded_orders,\n refund_rate: safeRate(sku.refunded_orders, sku.orders),\n }));\n\n const feeDiagnostics = {\n sale_fee_assumption: \"order_items.sale_fee is used as returned by MercadoLibre and is not multiplied by quantity yet.\",\n multi_unit_item_lines: multiUnitItemLines,\n multi_unit_sale_fee_observations: multiUnitSaleFeeObservations,\n needs_sale_fee_granularity_validation: true,\n };\n\n return {\n overview: {\n orders_total: ordersTotal,\n units_total: unitsTotal,\n distinct_items_total: itemsSeen.size,\n distinct_buyers_total: buyerSeen.size,\n fulfilled_orders: fulfilledOrders,\n delivered_orders: deliveredOrders,\n pack_orders: packOrders,\n orders_with_discount: discountedOrders,\n orders_with_feedback: ordersWithFeedback,\n orders_with_change_request: ordersWithChangeRequest,\n orders_with_return_request: ordersWithReturnRequest,\n },\n financial_by_currency: financialByCurrency,\n revenue_quality: revenueQuality,\n refunds_cancellations: refundsCancellations,\n shipping_and_discounts: shippingAndDiscounts,\n daily_trend: dailyTrend,\n flow_performance: flowPerformance,\n sku_unit_economics: skuUnitEconomics,\n fee_diagnostics: feeDiagnostics,\n order_mix: {\n status_breakdown: topBreakdownFromMap(statusCounts, ordersTotal),\n tags_breakdown: topBreakdownFromMap(tagCounts, ordersTotal),\n channel_breakdown: topBreakdownFromMap(channelCounts, ordersTotal),\n site_breakdown: topBreakdownFromMap(siteCounts, ordersTotal),\n single_item_order_rate: safeRate(singleItemOrders, ordersTotal),\n multi_item_order_rate: safeRate(multiItemOrders, ordersTotal),\n fulfilled_rate: safeRate(fulfilledOrders, ordersTotal),\n delivered_rate: safeRate(deliveredOrders, ordersTotal),\n pack_order_rate: safeRate(packOrders, ordersTotal),\n discounted_order_rate: safeRate(discountedOrders, ordersTotal),\n catalog_order_rate: safeRate(catalogOrders, ordersTotal),\n },\n payment_mix: {\n payment_status_breakdown: topBreakdownFromMap(paymentStatusCounts, ordersTotal),\n payment_status_detail_breakdown: topBreakdownFromMap(paymentStatusDetailCounts, ordersTotal),\n payment_method_breakdown: topBreakdownFromMap(paymentMethodCounts, ordersTotal),\n payment_type_breakdown: topBreakdownFromMap(paymentTypeCounts, ordersTotal),\n installments_breakdown: topBreakdownFromMap(installmentsCounts, ordersTotal),\n payment_approved_rate: safeRate(paymentApprovedOrders, ordersTotal),\n orders_without_payment_data: ordersWithoutPaymentData,\n },\n fulfillment: {\n orders_with_shipping: ordersWithShipping,\n shipping_attached_rate: safeRate(ordersWithShipping, ordersTotal),\n shipping_id_coverage: ordersWithShipping,\n stock_node_breakdown: topBreakdownFromMap(stockNodeCounts, Math.max(1, itemLineCount)),\n listing_type_breakdown: topBreakdownFromMap(listingTypeCounts, Math.max(1, itemLineCount)),\n },\n post_sale_friction: {\n orders_with_feedback_rate: safeRate(ordersWithFeedback, ordersTotal),\n feedback_buyer_count: feedbackBuyerCount,\n feedback_seller_count: feedbackSellerCount,\n change_request_rate: safeRate(ordersWithChangeRequest, ordersTotal),\n return_request_rate: safeRate(ordersWithReturnRequest, ordersTotal),\n orders_with_any_post_sale_issue_rate: safeRate(ordersWithAnyPostSaleIssue, ordersTotal),\n },\n product_insights: {\n top_items_by_revenue: topItemsByRevenue,\n top_items_by_units: topItemsByUnits,\n top_items_by_orders: topItemsByOrders,\n top_variations: topVariations,\n top_skus: topSkus,\n top_listing_types: topBreakdownFromMap(listingTypeCounts, Math.max(1, itemLineCount)),\n top_stock_nodes: topBreakdownFromMap(stockNodeCounts, Math.max(1, itemLineCount)),\n },\n customer_insights: {\n top_buyers_by_revenue: topBuyersByRevenue,\n top_buyers_by_orders: topBuyersByOrders,\n repeat_buyer_rate: safeRate(buyersWithMultipleOrders, buyerSeen.size),\n buyers_with_multiple_orders: buyersWithMultipleOrders,\n },\n operational_context: {\n most_used_payment_method: topSingleValue(paymentMethodCounts),\n most_used_listing_type: topSingleValue(listingTypeCounts),\n most_used_stock_node: topSingleValue(stockNodeCounts),\n most_used_channel: topSingleValue(channelCounts),\n most_common_tag: topSingleValue(tagCounts),\n most_common_variation_values: topVariationValues,\n },\n coverage: {\n fetch_mode: metadata.fetch_mode,\n universe_fully_fetched: metadata.universe_fully_fetched,\n orders_returned: metadata.returned,\n pages_requested: metadata.pages_requested,\n pages_succeeded: metadata.pages_succeeded,\n pages_failed: metadata.pages_failed,\n failed_pages_count: failedPages.length,\n failed_pages: failedPages,\n },\n };\n}\n\nfunction buildOrdersSummaryMetadata(params: {\n total: number;\n effectiveLimit: number;\n effectiveOffset: number;\n returned: number;\n responseMode: \"calculations\" | \"orders_chunk\";\n pagesRequested: number;\n pagesSucceeded: number;\n pagesFailed: number;\n failedOffsets: number[];\n}) {\n const requestedWindowEndOffset = params.effectiveOffset + params.effectiveLimit * params.pagesRequested;\n const nextOffset = params.responseMode === \"orders_chunk\" ? requestedWindowEndOffset : params.effectiveOffset + params.returned;\n const hasMoreOrders = nextOffset < params.total;\n const universeFullyFetched =\n params.responseMode === \"calculations\" && params.pagesFailed === 0 && params.returned >= params.total;\n\n let continuation = \"No more pages for this query.\";\n if (params.pagesFailed > 0) {\n const offsets = params.failedOffsets.slice(0, 5).join(\", \");\n const moreOffsets =\n params.failedOffsets.length > 5\n ? ` y ${params.failedOffsets.length - 5} offsets adicionales`\n : \"\";\n continuation = params.responseMode === \"orders_chunk\"\n ? `Se recuperaron paginas parciales. Reintentar primero la misma tool con responseMode=\"orders_chunk\", offset=${params.failedOffsets[0]} y limit=${params.effectiveLimit}. Offsets fallidos: ${offsets}${moreOffsets}. Luego continuar con offset=${nextOffset} si hace falta.`\n : `Calculos parciales por paginas fallidas. Reintentar la misma tool con responseMode=\"calculations\". Offsets fallidos: ${offsets}${moreOffsets}.`;\n } else if (params.responseMode === \"orders_chunk\" && hasMoreOrders) {\n continuation = `Para continuar trayendo ordenes, volver a invocar meli_get_orders_summary con los mismos filtros, responseMode=\"orders_chunk\", offset=${nextOffset} y limit=${params.effectiveLimit}. Repetir hasta has_more=false.`;\n } else if (params.responseMode === \"calculations\") {\n continuation = 'Calculos completos. Si el usuario pide detalle de ordenes, invocar la misma tool con responseMode=\"orders_chunk\", offset=0 y limit=50.';\n }\n\n return {\n total: params.total,\n limit: params.effectiveLimit,\n offset: params.effectiveOffset,\n returned: params.returned,\n has_more: params.responseMode === \"orders_chunk\" ? hasMoreOrders || params.pagesFailed > 0 : params.pagesFailed > 0,\n next_offset: params.responseMode === \"orders_chunk\" && hasMoreOrders ? nextOffset : undefined,\n continuation,\n fetch_mode: params.responseMode === \"orders_chunk\" ? \"orders_chunk\" : \"full_calculations\",\n pages_per_call_limit: params.responseMode === \"orders_chunk\" ? ORDER_DETAIL_MAX_PAGES_PER_CALL : undefined,\n pages_requested: params.pagesRequested,\n pages_succeeded: params.pagesSucceeded,\n pages_failed: params.pagesFailed,\n universe_fully_fetched: universeFullyFetched,\n };\n}\n\nfunction formatCompactOrder(\n order: Record<string, unknown>,\n metricsByCurrency: Record<string, { orders: number; revenue: number; avg_order_value: number }>\n) {\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n const totalAmount = toNumber(order.total_amount);\n const paidAmount = toNumber(order.paid_amount);\n const bucket = currencyBucket(metricsByCurrency, currencyId, createMetricsBucket);\n bucket.orders += 1;\n bucket.revenue += totalAmount;\n bucket.avg_order_value = bucket.orders > 0 ? bucket.revenue / bucket.orders : 0;\n\n const orderItems = asArray<Record<string, unknown>>(order.order_items);\n const firstOrderItem = asRecord(orderItems[0]);\n const firstItem = asRecord(firstOrderItem.item);\n const firstPayment = asRecord(asArray<Record<string, unknown>>(order.payments)[0]);\n const shipping = asRecord(order.shipping);\n const buyer = asRecord(order.buyer);\n const seller = asRecord(order.seller);\n const context = asRecord(order.context);\n const feedback = asRecord(order.feedback);\n const orderRequest = asRecord(order.order_request);\n const coupon = asRecord(order.coupon);\n const stock = asRecord(firstOrderItem.stock);\n\n return [\n normalizeScalarString(order.id),\n compactDateTime(order.date_created),\n normalizeString(order.status),\n totalAmount,\n currencyId,\n normalizeString(buyer.nickname) || normalizeScalarString(buyer.id),\n normalizeString(shipping.status),\n orderItems.length,\n compactDateTime(order.date_closed),\n compactDateTime(order.date_last_updated) || compactDateTime(order.last_updated),\n paidAmount,\n normalizeScalarString(buyer.id),\n normalizeString(seller.nickname) || normalizeScalarString(seller.id),\n normalizeScalarString(seller.id),\n normalizeScalarString(shipping.id),\n normalizeScalarString(order.pack_id),\n Boolean(order.fulfilled),\n compactStringList(order.tags),\n normalizeString(context.channel),\n normalizeString(context.site),\n normalizeScalarString(firstPayment.id),\n normalizeString(firstPayment.status),\n normalizeString(firstPayment.status_detail),\n normalizeString(firstPayment.payment_method_id),\n normalizeString(firstPayment.payment_type),\n toNumber(firstPayment.total_paid_amount),\n toNumber(firstPayment.transaction_amount),\n toNumber(firstPayment.installments),\n toNumber(coupon.amount),\n compactStringList(firstPayment.available_actions),\n compactNestedValue(feedback.buyer),\n compactNestedValue(feedback.seller),\n compactNestedValue(orderRequest.change),\n compactNestedValue(orderRequest.return),\n normalizeString(firstItem.id),\n normalizeString(firstItem.title),\n normalizeString(firstItem.seller_sku),\n toNumber(firstOrderItem.quantity),\n toNumber(firstOrderItem.unit_price),\n toNumber(firstOrderItem.sale_fee),\n normalizeString(firstOrderItem.listing_type_id),\n compactVariationAttributes(firstItem.variation_attributes),\n normalizeString(stock.node_id),\n ];\n}\n\nexport const meliGetOrdersSummarySchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\n status: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre order status filter.\"),\n q: z.string().trim().min(1).optional().describe(\"Optional free-text search query supported by MercadoLibre orders search.\"),\n sort: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre sort expression.\"),\n responseMode: z.enum([\"calculations\", \"orders_chunk\"]).optional().default(\"calculations\").describe(\"Response mode. calculations (default) fetches all matching orders internally and returns only aggregate KPIs. orders_chunk returns compact order rows for up to 15 MercadoLibre pages and includes continuation metadata.\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Starting offset for responseMode=orders_chunk. Use metadata.next_offset to continue.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"MercadoLibre page size for responseMode=orders_chunk (1-50). Defaults to 50.\"),\n});\n\nexport async function meliGetOrdersSummaryHandler(\n params: z.infer<typeof meliGetOrdersSummarySchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const responseMode = params.responseMode ?? \"calculations\";\n const requestedLimit = responseMode === \"orders_chunk\" ? params.limit ?? DEFAULT_ORDER_DETAIL_PAGE_LIMIT : DEFAULT_ORDER_DETAIL_PAGE_LIMIT;\n const requestedOffset = responseMode === \"orders_chunk\" ? params.offset ?? 0 : 0;\n const response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n q: params.q,\n sort: params.sort,\n offset: requestedOffset,\n limit: requestedLimit,\n });\n\n const paging = normalizeMercadoLibrePaging(asRecord(response.paging));\n const baseOrders = asArray<Record<string, unknown>>(response.results);\n const metricsByCurrency: Record<string, { orders: number; revenue: number; avg_order_value: number }> = {};\n const effectiveLimit = paging.limit || requestedLimit || baseOrders.length;\n const effectiveOffset = paging.offset || requestedOffset || 0;\n const maxPagesForResponse = responseMode === \"orders_chunk\" ? ORDER_DETAIL_MAX_PAGES_PER_CALL : Infinity;\n\n const allOrders = [...baseOrders];\n const failedPages: FailedPage[] = [];\n let pagesRequested = 1;\n let pagesSucceeded = 1;\n\n if (effectiveLimit > 0 && paging.total > baseOrders.length) {\n const nextOffsets: number[] = [];\n const maxPagesRemaining = Math.max(0, maxPagesForResponse - 1);\n let pagesAdded = 0;\n\n for (let nextOffset = effectiveOffset + effectiveLimit; nextOffset < paging.total; nextOffset += effectiveLimit) {\n if (responseMode === \"orders_chunk\" && pagesAdded >= maxPagesRemaining) {\n break;\n }\n\n nextOffsets.push(nextOffset);\n pagesAdded += 1;\n }\n\n pagesRequested += nextOffsets.length;\n\n if (nextOffsets.length > 0) {\n const batch = await searchMercadoLibreOrdersBatch(\n profileId,\n {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n q: params.q,\n sort: params.sort,\n limit: effectiveLimit,\n },\n nextOffsets,\n {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }\n );\n\n pagesSucceeded += batch.successful.length;\n batch.successful.forEach((entry) => {\n allOrders.push(...asArray<Record<string, unknown>>(entry.document.results));\n });\n batch.failed.forEach((failure) => {\n const failedOffset = Number(failure.id);\n failedPages.push({\n offset: failedOffset,\n limit: effectiveLimit,\n page_number: Math.floor(failedOffset / effectiveLimit) + 1,\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n }\n }\n\n const compactOrders = responseMode === \"orders_chunk\"\n ? allOrders.map((order) => formatCompactOrder(order, metricsByCurrency))\n : [];\n\n if (responseMode === \"calculations\") {\n for (const order of allOrders) {\n formatCompactOrder(order, metricsByCurrency);\n }\n }\n\n for (const metrics of Object.values(metricsByCurrency)) {\n metrics.revenue = roundMoney(metrics.revenue);\n metrics.avg_order_value = roundMoney(metrics.avg_order_value);\n }\n\n const returned = responseMode === \"orders_chunk\" ? compactOrders.length : allOrders.length;\n const metadata = buildOrdersSummaryMetadata({\n total: paging.total,\n effectiveLimit,\n effectiveOffset,\n returned,\n responseMode,\n pagesRequested,\n pagesSucceeded,\n pagesFailed: failedPages.length,\n failedOffsets: failedPages.map((failure) => failure.offset),\n });\n\n const calculations = responseMode === \"calculations\" ? buildCalculations(allOrders, metadata, failedPages) : undefined;\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: responseMode === \"orders_chunk\"\n ? {\n ...buildMercadoLibrePaginationMetadata({\n total: paging.total,\n limit: effectiveLimit,\n offset: effectiveOffset,\n returned: compactOrders.length,\n nextField: \"offset\",\n }),\n ...metadata,\n }\n : metadata,\n metrics_by_currency: metricsByCurrency,\n orders_schema: responseMode === \"orders_chunk\" ? ordersSchema : undefined,\n orders: responseMode === \"orders_chunk\" ? compactOrders : undefined,\n calculations,\n failed_pages: failedPages.length > 0 ? failedPages : undefined,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to fetch MercadoLibre orders summary\"));\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,6CAA6C;AACtD,SAAS,wCAAwC;AAEjD,MAAM,yBAAyB;AAC/B,MAAM,yBAAyB;AAC/B,MAAM,kCAAkC;AACxC,MAAM,kCAAkC;AACxC,MAAM,YAAY;AAElB,MAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,kBAAkB,QAAiB,YAAY,OAAe;AACrE,SAAO,QAAQ,MAAM,EAClB,IAAI,CAAC,UAAU,sBAAsB,KAAK,EAAE,KAAK,CAAC,EAClD,OAAO,OAAO,EACd,KAAK,SAAS;AACnB;AAEA,SAAS,mBAAmB,OAAwB;AAClD,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,sBAAsB,KAAK;AAC1C,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MACJ,IAAI,CAAC,UAAU,mBAAmB,KAAK,CAAC,EACxC,OAAO,OAAO,EACd,KAAK,KAAK;AAAA,EACf;AAEA,QAAM,SAAS,SAAS,KAAK;AAC7B,SAAO,OAAO,QAAQ,MAAM,EACzB,IAAI,CAAC,CAAC,KAAK,UAAU,MAAM;AAC1B,UAAM,aAAa,mBAAmB,UAAU;AAChD,WAAO,aAAa,GAAG,GAAG,IAAI,UAAU,KAAK;AAAA,EAC/C,CAAC,EACA,OAAO,OAAO,EACd,KAAK,KAAK;AACf;AAEA,SAAS,2BAA2B,OAAwB;AAC1D,SAAO,QAAiC,KAAK,EAC1C,IAAI,CAAC,cAAc;AAClB,UAAM,OAAO,gBAAgB,UAAU,IAAI,KAAK,gBAAgB,UAAU,EAAE;AAC5E,UAAM,kBACJ,gBAAgB,UAAU,UAAU,KACpC,gBAAgB,UAAU,QAAQ,KAClC,sBAAsB,UAAU,KAAK;AAEvC,QAAI,CAAC,QAAQ,CAAC,iBAAiB;AAC7B,aAAO;AAAA,IACT;AAEA,WAAO,GAAG,IAAI,KAAK,eAAe;AAAA,EACpC,CAAC,EACA,OAAO,OAAO,EACd,KAAK,KAAK;AACf;AAEA,SAAS,sBAAsB;AAC7B,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,iBAAiB;AAAA,EACnB;AACF;AAwHA,SAAS,SAAS,WAAmB,aAA6B;AAChE,MAAI,CAAC,OAAO,SAAS,WAAW,KAAK,eAAe,GAAG;AACrD,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,YAAY,aAAa,QAAQ,CAAC,CAAC;AACpD;AAEA,SAAS,oBACP,QACA,aACA,QAAQ,WACS;AACjB,QAAM,SAAS,MAAM,KAAK,OAAO,QAAQ,CAAC,EACvC,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,QAAQ,CAAC,EAC/B,KAAK,CAAC,MAAM,UAAU,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,cAAc,MAAM,CAAC,CAAC,CAAC;AAE9E,QAAM,UAAU,OAAO,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,OAAO;AAAA,IAC7D;AAAA,IACA;AAAA,IACA,MAAM,SAAS,QAAQ,WAAW;AAAA,EACpC,EAAE;AAEF,QAAM,cAAc,OAAO,MAAM,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,MAAM,OAAO,CAAC;AACjF,SAAO,WAAW;AAAA,IAChB;AAAA,IACA,cAAc,cAAc,IAAI,cAAc;AAAA,IAC9C,YAAY,cAAc,IAAI,SAAS,aAAa,WAAW,IAAI;AAAA,EACrE,CAAC;AACH;AAEA,SAAS,eAAe,KAA0B,KAAa;AAC7D,MAAI,CAAC,KAAK;AACR;AAAA,EACF;AAEA,MAAI,IAAI,MAAM,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC;AACtC;AAEA,SAAS,kBAAkB,KAA6B,YAAoB,QAAgB;AAC1F,MAAI,UAAU,IAAI,YAAY,IAAI,UAAU,KAAK,KAAK,MAAM;AAC9D;AAEA,SAAS,qBAAqB,OAA+B;AAC3D,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EACjB,OAAO,CAAC,CAAC,EAAE,MAAM,MAAM,WAAW,CAAC,EACnC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,UAAU,MAAM,MAAM,CAAC,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA,EAC/D;AACF;AAEA,SAAS,6BAAmD;AAC1D,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,SAAS;AAAA,IACT,cAAc;AAAA,IACd,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,EACtB;AACF;AAEA,SAAS,wBACP,KACA,YACA,SACA;AACA,MAAI,UAAU,IAAI,IAAI,UAAU,KAAK,2BAA2B;AAChE,UAAQ,IAAI,UAAU,CAAC;AACzB;AAEA,SAAS,sBACP,OACA,QACA;AACA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EACjB,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,YAAY,MAAM,MAAM,CAAC,YAAY,WAAW,OAAO,MAAM,CAAC,CAAC,CAAC;AAAA,EAC3E;AACF;AAEA,SAAS,0BACP,QACA,SACA,aACA,QAAQ,WACR;AACA,QAAM,SAAS,MAAM,KAAK,OAAO,QAAQ,CAAC,EACvC,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,QAAQ,CAAC,EAC/B,KAAK,CAAC,MAAM,UAAU,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,cAAc,MAAM,CAAC,CAAC,CAAC;AAE9E,QAAM,UAAU,OAAO,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,OAAO;AAAA,IAC7D;AAAA,IACA;AAAA,IACA,MAAM,SAAS,QAAQ,WAAW;AAAA,IAClC,oBAAoB,qBAAqB,QAAQ,IAAI,GAAG,KAAK,CAAC,CAAC;AAAA,EACjE,EAAE;AAEF,QAAM,cAAc,OAAO,MAAM,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,MAAM,OAAO,CAAC;AACjF,SAAO,WAAW;AAAA,IAChB;AAAA,IACA,cAAc,cAAc,IAAI,cAAc;AAAA,IAC9C,YAAY,cAAc,IAAI,SAAS,aAAa,WAAW,IAAI;AAAA,EACrE,CAAC;AACH;AAEA,SAAS,WAAW,OAA+B;AACjD,SAAO,OAAO,OAAO,KAAK,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACnE;AAEA,SAAS,qBAAqB,OAAwB;AACpD,QAAM,UAAU,mBAAmB,KAAK;AACxC,SAAO,QAAQ,KAAK;AACtB;AAEA,SAAS,gBAAgB,OAAgC;AACvD,SAAO,SAAS,QAAiC,MAAM,QAAQ,EAAE,CAAC,CAAC;AACrE;AAEA,SAAS,iBAAiB,OAAgC;AACxD,SAAO,gBAAgB,MAAM,aAAa,SAAS;AACrD;AAEA,SAAS,kBACP,QACA,UACA,aACA;AACA,QAAM,cAAc,OAAO;AAC3B,QAAM,eAAe,oBAAI,IAAoB;AAC7C,QAAM,YAAY,oBAAI,IAAoB;AAC1C,QAAM,gBAAgB,oBAAI,IAAoB;AAC9C,QAAM,aAAa,oBAAI,IAAoB;AAC3C,QAAM,sBAAsB,oBAAI,IAAoB;AACpD,QAAM,4BAA4B,oBAAI,IAAoB;AAC1D,QAAM,sBAAsB,oBAAI,IAAoB;AACpD,QAAM,oBAAoB,oBAAI,IAAoB;AAClD,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,QAAM,kBAAkB,oBAAI,IAAoB;AAChD,QAAM,oBAAoB,oBAAI,IAAoB;AAClD,QAAM,uBAAuB,oBAAI,IAAoB;AACrD,QAAM,SAAS,oBAAI,IAA4B;AAC/C,QAAM,QAAQ,oBAAI,IAA2B;AAC7C,QAAM,aAAa,oBAAI,IAAgC;AACvD,QAAM,OAAO,oBAAI,IAA0B;AAC3C,QAAM,eAAe,oBAAI,IAAkD;AAC3E,QAAM,cAAc,oBAAI,IAA2B;AACnD,QAAM,eAAe,oBAAI,IAAmC;AAC5D,QAAM,oBAAoB,oBAAI,IAAoB;AAClD,QAAM,mBAAmB,oBAAI,IAAoB;AACjD,QAAM,0BAA0B,oBAAI,IAAoB;AACxD,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,QAAM,sBAAsB,oBAAI,IAAoC;AAEpE,MAAI,aAAa;AACjB,MAAI,kBAAkB;AACtB,MAAI,kBAAkB;AACtB,MAAI,aAAa;AACjB,MAAI,mBAAmB;AACvB,MAAI,gBAAgB;AACpB,MAAI,qBAAqB;AACzB,MAAI,0BAA0B;AAC9B,MAAI,0BAA0B;AAC9B,MAAI,qBAAqB;AACzB,MAAI,sBAAsB;AAC1B,MAAI,qBAAqB;AACzB,MAAI,mBAAmB;AACvB,MAAI,kBAAkB;AACtB,MAAI,2BAA2B;AAC/B,MAAI,wBAAwB;AAC5B,MAAI,gBAAgB;AACpB,MAAI,6BAA6B;AACjC,MAAI,2BAA2B;AAC/B,MAAI,+BAA+B;AACnC,MAAI,yBAAyB;AAC7B,MAAI,qBAAqB;AACzB,MAAI,qBAAqB;AACzB,MAAI,+BAA+B;AAEnC,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,eAaF,CAAC;AACL,QAAM,kBAAwD,CAAC;AAE/D,aAAW,SAAS,QAAQ;AAC1B,UAAM,aAAa,iBAAiB,KAAK;AACzC,UAAM,cAAc,SAAS,MAAM,YAAY;AAC/C,UAAM,aAAa,SAAS,MAAM,WAAW;AAC7C,UAAM,eAAe,SAAS,SAAS,MAAM,MAAM,EAAE,MAAM;AAC3D,UAAM,UAAU,gBAAgB,KAAK;AACrC,UAAM,aAAa,QAAiC,MAAM,WAAW;AACrE,UAAM,QAAQ,SAAS,MAAM,KAAK;AAClC,UAAM,SAAS,SAAS,MAAM,MAAM;AACpC,UAAM,WAAW,SAAS,MAAM,QAAQ;AACxC,UAAM,eAAe,SAAS,MAAM,aAAa;AACjD,UAAM,WAAW,SAAS,MAAM,QAAQ;AACxC,UAAM,UAAU,SAAS,MAAM,OAAO;AACtC,UAAM,gBAAgB,gBAAgB,QAAQ,MAAM;AACpD,UAAM,sBAAsB,gBAAgB,QAAQ,aAAa;AACjE,UAAM,gBAAgB,gBAAgB,QAAQ,iBAAiB;AAC/D,UAAM,cAAc,gBAAgB,QAAQ,YAAY;AACxD,UAAM,eAAe,sBAAsB,QAAQ,YAAY;AAC/D,UAAM,OAAO,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,QAAQ,sBAAsB,GAAG,CAAC,EAAE,OAAO,OAAO;AACxF,UAAM,eAAe,SAAS,MAAM,aAAa;AACjD,UAAM,cAAc,gBAAgB,MAAM,MAAM,MAAM;AACtD,UAAM,iBAAiB,SAAS,QAAQ,2BAA2B;AACnE,UAAM,eAAe,SAAS,QAAQ,aAAa;AACnD,UAAM,sBAAsB,SAAS,QAAQ,aAAa;AAC1D,UAAM,SAAS,gBAAgB,MAAM,YAAY,GAAG,MAAM,GAAG,EAAE,KAAK;AACpE,UAAM,QAAQ,QAAQ,QAAQ,KAAK,EAAE,IAAI,CAAC,SAAS,sBAAsB,IAAI,CAAC,EAAE,OAAO,OAAO;AAC9F,UAAM,iBAAiB,MAAM,SAAS,IAAI,QAAQ,CAAC,SAAS;AAC5D,UAAM,eAAe,KAAK,SAAS,oBAAoB,KAAK,eAAe,KAAK,sBAAsB;AACtG,UAAM,iBAAiB,KAAK,SAAS,eAAe,KAAK,gBAAgB,aAAa,KAAK,MAAM;AACjG,UAAM,uBAAuB,oBAAI,IAAY;AAE7C,iBAAa,UAAU,IAAI,aAAa,UAAU,KAAK;AAAA,MACrD,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,eAAe;AAAA,MACf,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,wBAAwB;AAAA,MACxB,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,SAAS;AAAA,IACX;AAEA,iBAAa,UAAU,EAAE,UAAU;AACnC,iBAAa,UAAU,EAAE,WAAW;AACpC,iBAAa,UAAU,EAAE,cAAc;AACvC,iBAAa,UAAU,EAAE,0BAA0B,SAAS,QAAQ,iBAAiB;AACrF,iBAAa,UAAU,EAAE,qBAAqB,SAAS,QAAQ,kBAAkB;AACjF,iBAAa,UAAU,EAAE,gBAAgB;AAEzC,UAAM,uBAAuB,aAAa,IAAI,MAAM,KAAK,CAAC;AAC1D,iBAAa,IAAI,QAAQ,oBAAoB;AAC7C,UAAM,6BAA6B,CAAC,WAAiC;AACnE,aAAO,UAAU;AACjB,aAAO,WAAW;AAClB,aAAO,eAAe;AACtB,aAAO,oBAAoB,SAAS,QAAQ,iBAAiB;AAC7D,aAAO,qBAAqB,SAAS,QAAQ,kBAAkB;AAC/D,aAAO,kBAAkB;AACzB,aAAO,gBAAgB;AACvB,aAAO,gBAAgB;AACvB,aAAO,uBAAuB;AAC9B,UAAI,aAAa;AACf,eAAO,mBAAmB;AAC1B,eAAO,gBAAgB;AAAA,MACzB;AACA,UAAI,iBAAiB,GAAG;AACtB,eAAO,kBAAkB;AAAA,MAC3B;AACA,UAAI,eAAe,GAAG;AACpB,eAAO,0BAA0B;AAAA,MACnC;AACA,UAAI,eAAe,KAAK,sBAAsB,GAAG;AAC/C,eAAO,oBAAoB;AAAA,MAC7B;AACA,UAAI,cAAc;AAChB,eAAO,oBAAoB;AAAA,MAC7B;AACA,UAAI,gBAAgB;AAClB,eAAO,sBAAsB;AAAA,MAC/B;AAAA,IACF;AACA,4BAAwB,iBAAiB,YAAY,0BAA0B;AAC/E,4BAAwB,sBAAsB,YAAY,0BAA0B;AAEpF,mBAAe,cAAc,gBAAgB,MAAM,MAAM,CAAC;AAC1D,mBAAe,eAAe,gBAAgB,QAAQ,OAAO,CAAC;AAC9D,mBAAe,YAAY,gBAAgB,QAAQ,IAAI,CAAC;AAExD,QAAI,eAAe;AACjB,qBAAe,qBAAqB,aAAa;AAAA,IACnD,OAAO;AACL,kCAA4B;AAAA,IAC9B;AACA,mBAAe,2BAA2B,mBAAmB;AAC7D,mBAAe,qBAAqB,aAAa;AACjD,mBAAe,mBAAmB,WAAW;AAC7C,mBAAe,oBAAoB,YAAY;AAE/C,QAAI,kBAAkB,YAAY;AAChC,+BAAyB;AAAA,IAC3B;AAEA,QAAI,MAAM,cAAc,MAAM;AAC5B,yBAAmB;AAAA,IACrB;AAEA,QAAI,sBAAsB,SAAS,EAAE,GAAG;AACtC,4BAAsB;AAAA,IACxB;AAEA,QAAI,WAAW,WAAW,GAAG;AAC3B,0BAAoB;AAAA,IACtB,WAAW,WAAW,SAAS,GAAG;AAChC,yBAAmB;AAAA,IACrB;AAEA,eAAW,OAAO,MAAM;AACtB,qBAAe,WAAW,GAAG;AAAA,IAC/B;AAEA,QAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,yBAAmB;AAAA,IACrB;AACA,QAAI,KAAK,SAAS,YAAY,GAAG;AAC/B,oBAAc;AAAA,IAChB;AACA,QAAI,KAAK,SAAS,oBAAoB,GAAG;AACvC,0BAAoB;AAAA,IACtB;AACA,QAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,uBAAiB;AAAA,IACnB;AACA,QAAI,iBAAiB,GAAG;AACtB,kCAA4B;AAAA,IAC9B;AACA,QAAI,eAAe,GAAG;AACpB,sCAAgC;AAAA,IAClC;AACA,QAAI,eAAe,KAAK,sBAAsB,GAAG;AAC/C,gCAA0B;AAAA,IAC5B;AACA,QAAI,gBAAgB;AAClB,4BAAsB;AAAA,IACxB;AACA,QAAI,aAAa;AACf,YAAM,cAAc,gBAAgB,aAAa,OAAO,eAAe;AACvE,YAAM,aAAa,gBAAgB,aAAa,MAAM,cAAc;AACpE,YAAM,cAAc,gBAAgB,aAAa,cAAc,mBAAmB;AAClF,YAAM,YAAY,GAAG,WAAW,IAAI,UAAU,IAAI,WAAW;AAC7D,qBAAe,mBAAmB,WAAW;AAC7C,qBAAe,kBAAkB,UAAU;AAC3C,qBAAe,yBAAyB,WAAW;AACnD,qBAAe,oBAAoB,SAAS;AAC5C,YAAM,eAAe,oBAAoB,IAAI,SAAS,KAAK,CAAC;AAC5D,wBAAkB,cAAc,YAAY,WAAW;AACvD,0BAAoB,IAAI,WAAW,YAAY;AAAA,IACjD;AAEA,eAAW,QAAQ,gBAAgB;AACjC,YAAM,gBAAgB,YAAY,IAAI,IAAI,KAAK;AAAA,QAC7C;AAAA,QACA,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,kBAAkB;AAAA,QAClB,qBAAqB,CAAC;AAAA,QACtB,0BAA0B,CAAC;AAAA,QAC3B,sBAAsB,CAAC;AAAA,MACzB;AACA,oBAAc,UAAU;AACxB,UAAI,aAAa;AACf,sBAAc,oBAAoB;AAAA,MACpC;AACA,wBAAkB,cAAc,qBAAqB,YAAY,WAAW;AAC5E,wBAAkB,cAAc,0BAA0B,YAAY,UAAU;AAChF,kBAAY,IAAI,MAAM,aAAa;AAAA,IACrC;AAEA,UAAM,gBAAgB,qBAAqB,SAAS,KAAK;AACzD,UAAM,iBAAiB,qBAAqB,SAAS,MAAM;AAC3D,UAAM,cAAc,QAAQ,iBAAiB,cAAc;AAC3D,QAAI,aAAa;AACf,4BAAsB;AAAA,IACxB;AACA,QAAI,eAAe;AACjB,4BAAsB;AAAA,IACxB;AACA,QAAI,gBAAgB;AAClB,6BAAuB;AAAA,IACzB;AAEA,UAAM,mBAAmB,QAAQ,qBAAqB,aAAa,MAAM,CAAC;AAC1E,UAAM,mBAAmB,QAAQ,qBAAqB,aAAa,MAAM,CAAC;AAC1E,QAAI,kBAAkB;AACpB,iCAA2B;AAAA,IAC7B;AACA,QAAI,kBAAkB;AACpB,iCAA2B;AAAA,IAC7B;AACA,QAAI,eAAe,oBAAoB,kBAAkB;AACvD,oCAA8B;AAAA,IAChC;AAEA,UAAM,UAAU,sBAAsB,MAAM,EAAE;AAC9C,UAAM,gBAAgB,gBAAgB,MAAM,QAAQ;AACpD,QAAI,WAAW,eAAe;AAC5B,YAAM,WAAW,WAAW;AAC5B,gBAAU,IAAI,QAAQ;AACtB,YAAM,eAAe,OAAO,IAAI,QAAQ,KAAK;AAAA,QAC3C,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,qBAAqB,CAAC;AAAA,MACxB;AACA,mBAAa,UAAU;AACvB,wBAAkB,aAAa,qBAAqB,YAAY,WAAW;AAC3E,aAAO,IAAI,UAAU,YAAY;AAAA,IACnC;AAEA,eAAW,aAAa,YAAY;AAClC,uBAAiB;AACjB,YAAM,OAAO,SAAS,UAAU,IAAI;AACpC,YAAM,QAAQ,SAAS,UAAU,KAAK;AACtC,YAAM,SAAS,gBAAgB,KAAK,EAAE;AACtC,YAAM,QAAQ,gBAAgB,KAAK,KAAK;AACxC,YAAM,YAAY,gBAAgB,KAAK,UAAU;AACjD,YAAM,WAAW,SAAS,UAAU,QAAQ;AAC5C,YAAM,YAAY,SAAS,UAAU,UAAU;AAC/C,YAAM,UAAU,SAAS,UAAU,QAAQ;AAC3C,YAAM,cAAc,gBAAgB,UAAU,eAAe;AAC7D,YAAM,YAAY,gBAAgB,MAAM,OAAO;AAC/C,YAAM,mBAAmB,2BAA2B,KAAK,oBAAoB;AAC7E,YAAM,UAAU,GAAG,MAAM,KAAK,gBAAgB,KAAK,SAAS;AAC5D,YAAM,SAAS,aAAa,UAAU,SAAS;AAC/C,YAAM,eAAe,oBAAoB;AACzC,YAAM,cAAc,YAAY;AAChC,YAAM,oBAAoB,cAAc,IAAI,cAAc,cAAc,eAAe;AACvF,YAAM,uBAAuB,cAAc,IAAI,kBAAkB,cAAc,eAAe;AAE9F,UAAI,WAAW,GAAG;AAChB,8BAAsB;AACtB,YAAI,UAAU,GAAG;AACf,0CAAgC;AAAA,QAClC;AAAA,MACF;AAEA,oBAAc;AACd,mBAAa,UAAU,EAAE,SAAS;AAClC,mBAAa,UAAU,EAAE,WAAW;AACpC,YAAM,4BAA4B,CAAC,WAAiC;AAClE,eAAO,SAAS;AAChB,eAAO,WAAW;AAClB,YAAI,cAAc;AAChB,iBAAO,iBAAiB;AAAA,QAC1B;AACA,YAAI,gBAAgB;AAClB,iBAAO,mBAAmB;AAAA,QAC5B;AAAA,MACF;AACA,8BAAwB,iBAAiB,YAAY,yBAAyB;AAC9E,8BAAwB,sBAAsB,YAAY,yBAAyB;AAEnF,iBAAW,QAAQ,gBAAgB;AACjC,cAAM,gBAAgB,YAAY,IAAI,IAAI;AAC1C,YAAI,eAAe;AACjB,wBAAc,SAAS;AACvB,4BAAkB,cAAc,sBAAsB,YAAY,OAAO;AAAA,QAC3E;AAAA,MACF;AAEA,UAAI,QAAQ;AACV,kBAAU,IAAI,MAAM;AACpB,6BAAqB,IAAI,MAAM;AAAA,MACjC;AAEA,qBAAe,mBAAmB,WAAW;AAC7C,qBAAe,iBAAiB,SAAS;AACzC,qBAAe,sBAAsB,YAAY;AAEjD,YAAM,gBAAgB,MAAM,IAAI,OAAO,KAAK;AAAA,QAC1C,SAAS;AAAA,QACT;AAAA,QACA,YAAY;AAAA,QACZ,mBAAmB;AAAA,QACnB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,qBAAqB,CAAC;AAAA,QACtB,sBAAsB,CAAC;AAAA,MACzB;AACA,oBAAc,UAAU;AACxB,oBAAc,SAAS;AACvB,wBAAkB,cAAc,qBAAqB,YAAY,YAAY,QAAQ;AACrF,wBAAkB,cAAc,sBAAsB,YAAY,OAAO;AACzE,YAAM,IAAI,SAAS,aAAa;AAEhC,YAAM,qBAAqB,WAAW,IAAI,YAAY,KAAK;AAAA,QACzD,mBAAmB;AAAA,QACnB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,qBAAqB,CAAC;AAAA,MACxB;AACA,yBAAmB,UAAU;AAC7B,yBAAmB,SAAS;AAC5B,wBAAkB,mBAAmB,qBAAqB,YAAY,YAAY,QAAQ;AAC1F,iBAAW,IAAI,cAAc,kBAAkB;AAE/C,YAAM,eAAe,KAAK,IAAI,MAAM,KAAK;AAAA,QACvC,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,qBAAqB,CAAC;AAAA,MACxB;AACA,mBAAa,UAAU;AACvB,mBAAa,SAAS;AACtB,wBAAkB,aAAa,qBAAqB,YAAY,YAAY,QAAQ;AACpF,WAAK,IAAI,QAAQ,YAAY;AAE7B,YAAM,wBAAwB,aAAa,IAAI,MAAM,KAAK;AAAA,QACxD,YAAY;AAAA,QACZ,SAAS;AAAA,QACT;AAAA,QACA,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,QACjB,qBAAqB,CAAC;AAAA,QACtB,0BAA0B,CAAC;AAAA,QAC3B,sBAAsB,CAAC;AAAA,QACvB,6BAA6B,CAAC;AAAA,MAChC;AACA,4BAAsB,UAAU;AAChC,4BAAsB,SAAS;AAC/B,UAAI,aAAa;AACf,8BAAsB,oBAAoB;AAAA,MAC5C;AACA,UAAI,iBAAiB,GAAG;AACtB,8BAAsB,mBAAmB;AAAA,MAC3C;AACA,wBAAkB,sBAAsB,qBAAqB,YAAY,WAAW;AACpF,wBAAkB,sBAAsB,0BAA0B,YAAY,iBAAiB;AAC/F,wBAAkB,sBAAsB,sBAAsB,YAAY,OAAO;AACjF,wBAAkB,sBAAsB,6BAA6B,YAAY,oBAAoB;AACrG,mBAAa,IAAI,QAAQ,qBAAqB;AAAA,IAChD;AAEA,iBAAa,UAAU,EAAE,iBAAiB,qBAAqB;AAAA,EACjE;AAEA,QAAM,sBAA2D,CAAC;AAClE,aAAW,CAAC,YAAY,GAAG,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC5D,wBAAoB,UAAU,IAAI;AAAA,MAChC,eAAe,WAAW,IAAI,OAAO;AAAA,MACrC,mBAAmB,WAAW,IAAI,UAAU;AAAA,MAC5C,2BAA2B,WAAW,IAAI,sBAAsB;AAAA,MAChE,0BAA0B,WAAW,IAAI,iBAAiB;AAAA,MAC1D,qBAAqB,WAAW,IAAI,YAAY;AAAA,MAChD,gBAAgB,WAAW,IAAI,OAAO;AAAA,MACtC,iBAAiB,WAAW,IAAI,UAAU,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC;AAAA,MACjE,2BAA2B,WAAW,IAAI,aAAa,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC;AAAA,MAC9E,qBAAqB,WAAW,IAAI,QAAQ,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC;AAAA,MACnE,8BAA8B,WAAW,IAAI,gBAAgB,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC;AAAA,MACpF,wBAAwB,WAAW,IAAI,UAAU,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC;AAAA,MACxE,eAAe,SAAS,IAAI,SAAS,IAAI,OAAO;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,oBAAoB,MAAM,KAAK,MAAM,OAAO,CAAC,EAChD,KAAK,CAAC,MAAM,UAAU;AACrB,UAAM,cAAc,OAAO,OAAO,KAAK,mBAAmB,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACjG,UAAM,eAAe,OAAO,OAAO,MAAM,mBAAmB,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACnG,WAAO,eAAe,eAAe,KAAK,QAAQ,cAAc,MAAM,OAAO;AAAA,EAC/E,CAAC,EACA,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,UAAU;AAAA,IACd,GAAG;AAAA,IACH,qBAAqB,qBAAqB,KAAK,mBAAmB;AAAA,IAClE,sBAAsB,qBAAqB,KAAK,oBAAoB;AAAA,EACtE,EAAE;AAEJ,QAAM,kBAAkB,MAAM,KAAK,MAAM,OAAO,CAAC,EAC9C,KAAK,CAAC,MAAM,UAAU,MAAM,QAAQ,KAAK,SAAS,KAAK,QAAQ,cAAc,MAAM,OAAO,CAAC,EAC3F,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,UAAU;AAAA,IACd,GAAG;AAAA,IACH,qBAAqB,qBAAqB,KAAK,mBAAmB;AAAA,IAClE,sBAAsB,qBAAqB,KAAK,oBAAoB;AAAA,EACtE,EAAE;AAEJ,QAAM,mBAAmB,MAAM,KAAK,MAAM,OAAO,CAAC,EAC/C,KAAK,CAAC,MAAM,UAAU,MAAM,SAAS,KAAK,UAAU,KAAK,QAAQ,cAAc,MAAM,OAAO,CAAC,EAC7F,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,UAAU;AAAA,IACd,GAAG;AAAA,IACH,qBAAqB,qBAAqB,KAAK,mBAAmB;AAAA,IAClE,sBAAsB,qBAAqB,KAAK,oBAAoB;AAAA,EACtE,EAAE;AAEJ,QAAM,gBAAgB,MAAM,KAAK,WAAW,OAAO,CAAC,EACjD,OAAO,CAAC,cAAc,UAAU,iBAAiB,EACjD,KAAK,CAAC,MAAM,UAAU,MAAM,QAAQ,KAAK,SAAS,KAAK,kBAAkB,cAAc,MAAM,iBAAiB,CAAC,EAC/G,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,eAAe;AAAA,IACnB,GAAG;AAAA,IACH,qBAAqB,qBAAqB,UAAU,mBAAmB;AAAA,EACzE,EAAE;AAEJ,QAAM,UAAU,MAAM,KAAK,KAAK,OAAO,CAAC,EACrC,OAAO,CAAC,QAAQ,IAAI,UAAU,EAC9B,KAAK,CAAC,MAAM,UAAU,MAAM,QAAQ,KAAK,SAAS,KAAK,WAAW,cAAc,MAAM,UAAU,CAAC,EACjG,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,SAAS;AAAA,IACb,GAAG;AAAA,IACH,qBAAqB,qBAAqB,IAAI,mBAAmB;AAAA,EACnE,EAAE;AAEJ,QAAM,qBAAqB,MAAM,KAAK,OAAO,OAAO,CAAC,EAClD,KAAK,CAAC,MAAM,UAAU;AACrB,UAAM,cAAc,OAAO,OAAO,KAAK,mBAAmB,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACjG,UAAM,eAAe,OAAO,OAAO,MAAM,mBAAmB,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACnG,WAAO,eAAe,eAAe,KAAK,SAAS,cAAc,MAAM,QAAQ;AAAA,EACjF,CAAC,EACA,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,WAAW;AAAA,IACf,GAAG;AAAA,IACH,qBAAqB,qBAAqB,MAAM,mBAAmB;AAAA,EACrE,EAAE;AAEJ,QAAM,oBAAoB,MAAM,KAAK,OAAO,OAAO,CAAC,EACjD,KAAK,CAAC,MAAM,UAAU,MAAM,SAAS,KAAK,UAAU,KAAK,SAAS,cAAc,MAAM,QAAQ,CAAC,EAC/F,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,WAAW;AAAA,IACf,GAAG;AAAA,IACH,qBAAqB,qBAAqB,MAAM,mBAAmB;AAAA,EACrE,EAAE;AAEJ,QAAM,2BAA2B,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC,EAAE;AAEjG,QAAM,qBAAqB,MAAM,KAAK,qBAAqB,QAAQ,CAAC,EACjE,OAAO,CAAC,CAAC,GAAG,MAAM,OAAO,QAAQ,cAAc,EAC/C,KAAK,CAAC,MAAM,UAAU,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,cAAc,MAAM,CAAC,CAAC,CAAC,EAC3E,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,CAAC,KAAK,WAAW,OAAO,EAAE,KAAK,YAAY,EAAE;AAErD,QAAM,iBAAiB,CAAC,WACtB,MAAM,KAAK,OAAO,QAAQ,CAAC,EACxB,OAAO,CAAC,CAAC,GAAG,MAAM,GAAG,EACrB,KAAK,CAAC,MAAM,UAAU,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,cAAc,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK;AAE7F,QAAM,iBAAiB;AAAA,IACrB,aAAa,sBAAsB,iBAAiB,CAAC,YAAY;AAAA,MAC/D,WAAW,WAAW,OAAO,OAAO;AAAA,MACpC,UAAU,WAAW,OAAO,WAAW;AAAA,MACvC,2BAA2B,WAAW,OAAO,gBAAgB;AAAA,MAC7D,0BAA0B,WAAW,OAAO,iBAAiB;AAAA,MAC7D,uBAAuB,WAAW,OAAO,cAAc;AAAA,MACvD,mBAAmB,WAAW,OAAO,oBAAoB,OAAO,cAAc;AAAA,MAC9E,eAAe,WAAW,OAAO,YAAY;AAAA,MAC7C,0BAA0B,SAAS,OAAO,iBAAiB,OAAO,MAAM;AAAA,MACxE,uBAAuB,SAAS,OAAO,cAAc,OAAO,OAAO;AAAA,MACnE,kBAAkB,SAAS,OAAO,aAAa,OAAO,OAAO;AAAA,IAC/D,EAAE;AAAA,EACJ;AAEA,QAAM,uBAAuB;AAAA,IAC3B,aAAa,sBAAsB,iBAAiB,CAAC,YAAY;AAAA,MAC/D,uBAAuB,WAAW,OAAO,cAAc;AAAA,MACvD,iBAAiB,OAAO;AAAA,MACxB,uBAAuB,SAAS,OAAO,gBAAgB,OAAO,MAAM;AAAA,MACpE,mCAAmC,SAAS,OAAO,gBAAgB,OAAO,iBAAiB;AAAA,MAC3F,kBAAkB,OAAO;AAAA,MACzB,eAAe,WAAW,OAAO,YAAY;AAAA,MAC7C,0BAA0B,SAAS,OAAO,iBAAiB,OAAO,MAAM;AAAA,MACxE,uBAAuB,SAAS,OAAO,cAAc,OAAO,OAAO;AAAA,IACrE,EAAE;AAAA,IACF,wBAAwB,oBAAoB,mBAAmB,WAAW;AAAA,IAC1E,uBAAuB,oBAAoB,kBAAkB,WAAW;AAAA,IACxE,+BAA+B,oBAAoB,yBAAyB,WAAW;AAAA,IACvF,oBAAoB,0BAA0B,oBAAoB,qBAAqB,WAAW;AAAA,EACpG;AAEA,QAAM,uBAAuB;AAAA,IAC3B,aAAa,sBAAsB,iBAAiB,CAAC,YAAY;AAAA,MAC/D,2BAA2B,WAAW,OAAO,YAAY;AAAA,MACzD,2BAA2B,OAAO;AAAA,MAClC,sCAAsC,WAAW,OAAO,eAAe,KAAK,IAAI,GAAG,OAAO,sBAAsB,CAAC;AAAA,MACjH,gCAAgC,SAAS,OAAO,cAAc,OAAO,WAAW;AAAA,MAChF,qBAAqB,WAAW,OAAO,YAAY;AAAA,MACnD,6BAA6B,WAAW,OAAO,mBAAmB;AAAA,MAClE,oBAAoB,OAAO;AAAA,MAC3B,uBAAuB,SAAS,OAAO,kBAAkB,OAAO,MAAM;AAAA,MACtE,oBAAoB,SAAS,OAAO,eAAe,OAAO,qBAAqB,OAAO,OAAO;AAAA,MAC7F,mBAAmB,OAAO;AAAA,MAC1B,uBAAuB,SAAS,OAAO,kBAAkB,OAAO,MAAM;AAAA,MACtE,gBAAgB,WAAW,OAAO,aAAa;AAAA,MAC/C,sBAAsB,OAAO;AAAA,MAC7B,mBAAmB,WAAW,OAAO,eAAe;AAAA,MACpD,8BAA8B,SAAS,OAAO,oBAAoB,OAAO,MAAM;AAAA,MAC/E,2BAA2B,SAAS,OAAO,iBAAiB,OAAO,OAAO;AAAA,IAC5E,EAAE;AAAA,EACJ;AAEA,QAAM,aAAa,MAAM,KAAK,aAAa,QAAQ,CAAC,EACjD,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,MAAM,UAAU,OAAO;AAAA,IAC5B;AAAA,IACA,aAAa,sBAAsB,YAAY,CAAC,YAAY;AAAA,MAC1D,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,SAAS,WAAW,OAAO,OAAO;AAAA,MAClC,cAAc,WAAW,OAAO,WAAW;AAAA,MAC3C,kBAAkB,OAAO;AAAA,MACzB,iBAAiB,WAAW,OAAO,cAAc;AAAA,MACjD,iBAAiB,WAAW,OAAO,UAAU,KAAK,IAAI,GAAG,OAAO,MAAM,CAAC;AAAA,IACzE,EAAE;AAAA,EACJ,EAAE;AAEJ,QAAM,kBAAkB,MAAM,KAAK,YAAY,OAAO,CAAC,EACpD,KAAK,CAAC,MAAM,UAAU,WAAW,MAAM,mBAAmB,IAAI,WAAW,KAAK,mBAAmB,KAAK,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC,EACzI,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,UAAU;AAAA,IACd,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,qBAAqB,qBAAqB,KAAK,mBAAmB;AAAA,IAClE,0BAA0B,qBAAqB,KAAK,wBAAwB;AAAA,IAC5E,sBAAsB,qBAAqB,KAAK,oBAAoB;AAAA,IACpE,kBAAkB,KAAK;AAAA,IACvB,gBAAgB,SAAS,KAAK,kBAAkB,KAAK,MAAM;AAAA,IAC3D,sBAAsB,OAAO;AAAA,MAC3B,OAAO,KAAK,KAAK,mBAAmB,EACjC,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAC/C,IAAI,CAAC,eAAe,CAAC,YAAY,SAAS,KAAK,qBAAqB,UAAU,KAAK,GAAG,KAAK,oBAAoB,UAAU,KAAK,CAAC,CAAC,CAAC;AAAA,IACtI;AAAA,EACF,EAAE;AAEJ,QAAM,mBAAmB,MAAM,KAAK,aAAa,OAAO,CAAC,EACtD,KAAK,CAAC,MAAM,UAAU,WAAW,MAAM,mBAAmB,IAAI,WAAW,KAAK,mBAAmB,KAAK,KAAK,WAAW,cAAc,MAAM,UAAU,CAAC,EACrJ,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,SAAS;AAAA,IACb,YAAY,IAAI;AAAA,IAChB,SAAS,IAAI;AAAA,IACb,OAAO,IAAI;AAAA,IACX,QAAQ,IAAI;AAAA,IACZ,OAAO,IAAI;AAAA,IACX,qBAAqB,qBAAqB,IAAI,mBAAmB;AAAA,IACjE,0BAA0B,qBAAqB,IAAI,wBAAwB;AAAA,IAC3E,sBAAsB,qBAAqB,IAAI,oBAAoB;AAAA,IACnE,6BAA6B,qBAAqB,IAAI,2BAA2B;AAAA,IACjF,4BAA4B,OAAO;AAAA,MACjC,OAAO,KAAK,IAAI,mBAAmB,EAChC,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAC/C,IAAI,CAAC,eAAe,CAAC,YAAY,YAAY,IAAI,oBAAoB,UAAU,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC;AAAA,IACtH;AAAA,IACA,sBAAsB,OAAO;AAAA,MAC3B,OAAO,KAAK,IAAI,mBAAmB,EAChC,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAC/C,IAAI,CAAC,eAAe,CAAC,YAAY,SAAS,IAAI,qBAAqB,UAAU,KAAK,GAAG,IAAI,oBAAoB,UAAU,KAAK,CAAC,CAAC,CAAC;AAAA,IACpI;AAAA,IACA,kBAAkB,IAAI;AAAA,IACtB,gBAAgB,SAAS,IAAI,kBAAkB,IAAI,MAAM;AAAA,IACzD,iBAAiB,IAAI;AAAA,IACrB,aAAa,SAAS,IAAI,iBAAiB,IAAI,MAAM;AAAA,EACvD,EAAE;AAEJ,QAAM,iBAAiB;AAAA,IACrB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,kCAAkC;AAAA,IAClC,uCAAuC;AAAA,EACzC;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,MACR,cAAc;AAAA,MACd,aAAa;AAAA,MACb,sBAAsB,UAAU;AAAA,MAChC,uBAAuB,UAAU;AAAA,MACjC,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,4BAA4B;AAAA,MAC5B,4BAA4B;AAAA,IAC9B;AAAA,IACA,uBAAuB;AAAA,IACvB,iBAAiB;AAAA,IACjB,uBAAuB;AAAA,IACvB,wBAAwB;AAAA,IACxB,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,WAAW;AAAA,MACT,kBAAkB,oBAAoB,cAAc,WAAW;AAAA,MAC/D,gBAAgB,oBAAoB,WAAW,WAAW;AAAA,MAC1D,mBAAmB,oBAAoB,eAAe,WAAW;AAAA,MACjE,gBAAgB,oBAAoB,YAAY,WAAW;AAAA,MAC3D,wBAAwB,SAAS,kBAAkB,WAAW;AAAA,MAC9D,uBAAuB,SAAS,iBAAiB,WAAW;AAAA,MAC5D,gBAAgB,SAAS,iBAAiB,WAAW;AAAA,MACrD,gBAAgB,SAAS,iBAAiB,WAAW;AAAA,MACrD,iBAAiB,SAAS,YAAY,WAAW;AAAA,MACjD,uBAAuB,SAAS,kBAAkB,WAAW;AAAA,MAC7D,oBAAoB,SAAS,eAAe,WAAW;AAAA,IACzD;AAAA,IACA,aAAa;AAAA,MACX,0BAA0B,oBAAoB,qBAAqB,WAAW;AAAA,MAC9E,iCAAiC,oBAAoB,2BAA2B,WAAW;AAAA,MAC3F,0BAA0B,oBAAoB,qBAAqB,WAAW;AAAA,MAC9E,wBAAwB,oBAAoB,mBAAmB,WAAW;AAAA,MAC1E,wBAAwB,oBAAoB,oBAAoB,WAAW;AAAA,MAC3E,uBAAuB,SAAS,uBAAuB,WAAW;AAAA,MAClE,6BAA6B;AAAA,IAC/B;AAAA,IACA,aAAa;AAAA,MACX,sBAAsB;AAAA,MACtB,wBAAwB,SAAS,oBAAoB,WAAW;AAAA,MAChE,sBAAsB;AAAA,MACtB,sBAAsB,oBAAoB,iBAAiB,KAAK,IAAI,GAAG,aAAa,CAAC;AAAA,MACrF,wBAAwB,oBAAoB,mBAAmB,KAAK,IAAI,GAAG,aAAa,CAAC;AAAA,IAC3F;AAAA,IACA,oBAAoB;AAAA,MAClB,2BAA2B,SAAS,oBAAoB,WAAW;AAAA,MACnE,sBAAsB;AAAA,MACtB,uBAAuB;AAAA,MACvB,qBAAqB,SAAS,yBAAyB,WAAW;AAAA,MAClE,qBAAqB,SAAS,yBAAyB,WAAW;AAAA,MAClE,sCAAsC,SAAS,4BAA4B,WAAW;AAAA,IACxF;AAAA,IACA,kBAAkB;AAAA,MAChB,sBAAsB;AAAA,MACtB,oBAAoB;AAAA,MACpB,qBAAqB;AAAA,MACrB,gBAAgB;AAAA,MAChB,UAAU;AAAA,MACV,mBAAmB,oBAAoB,mBAAmB,KAAK,IAAI,GAAG,aAAa,CAAC;AAAA,MACpF,iBAAiB,oBAAoB,iBAAiB,KAAK,IAAI,GAAG,aAAa,CAAC;AAAA,IAClF;AAAA,IACA,mBAAmB;AAAA,MACjB,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,MACtB,mBAAmB,SAAS,0BAA0B,UAAU,IAAI;AAAA,MACpE,6BAA6B;AAAA,IAC/B;AAAA,IACA,qBAAqB;AAAA,MACnB,0BAA0B,eAAe,mBAAmB;AAAA,MAC5D,wBAAwB,eAAe,iBAAiB;AAAA,MACxD,sBAAsB,eAAe,eAAe;AAAA,MACpD,mBAAmB,eAAe,aAAa;AAAA,MAC/C,iBAAiB,eAAe,SAAS;AAAA,MACzC,8BAA8B;AAAA,IAChC;AAAA,IACA,UAAU;AAAA,MACR,YAAY,SAAS;AAAA,MACrB,wBAAwB,SAAS;AAAA,MACjC,iBAAiB,SAAS;AAAA,MAC1B,iBAAiB,SAAS;AAAA,MAC1B,iBAAiB,SAAS;AAAA,MAC1B,cAAc,SAAS;AAAA,MACvB,oBAAoB,YAAY;AAAA,MAChC,cAAc;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,2BAA2B,QAUjC;AACD,QAAM,2BAA2B,OAAO,kBAAkB,OAAO,iBAAiB,OAAO;AACzF,QAAM,aAAa,OAAO,iBAAiB,iBAAiB,2BAA2B,OAAO,kBAAkB,OAAO;AACvH,QAAM,gBAAgB,aAAa,OAAO;AAC1C,QAAM,uBACJ,OAAO,iBAAiB,kBAAkB,OAAO,gBAAgB,KAAK,OAAO,YAAY,OAAO;AAElG,MAAI,eAAe;AACnB,MAAI,OAAO,cAAc,GAAG;AAC1B,UAAM,UAAU,OAAO,cAAc,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AAC1D,UAAM,cACJ,OAAO,cAAc,SAAS,IAC1B,MAAM,OAAO,cAAc,SAAS,CAAC,yBACrC;AACN,mBAAe,OAAO,iBAAiB,iBACnC,8GAA8G,OAAO,cAAc,CAAC,CAAC,YAAY,OAAO,cAAc,uBAAuB,OAAO,GAAG,WAAW,gCAAgC,UAAU,oBAC5P,wHAAwH,OAAO,GAAG,WAAW;AAAA,EACnJ,WAAW,OAAO,iBAAiB,kBAAkB,eAAe;AAClE,mBAAe,yIAAyI,UAAU,YAAY,OAAO,cAAc;AAAA,EACrM,WAAW,OAAO,iBAAiB,gBAAgB;AACjD,mBAAe;AAAA,EACjB;AAEA,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO,iBAAiB,iBAAiB,iBAAiB,OAAO,cAAc,IAAI,OAAO,cAAc;AAAA,IAClH,aAAa,OAAO,iBAAiB,kBAAkB,gBAAgB,aAAa;AAAA,IACpF;AAAA,IACA,YAAY,OAAO,iBAAiB,iBAAiB,iBAAiB;AAAA,IACtE,sBAAsB,OAAO,iBAAiB,iBAAiB,kCAAkC;AAAA,IACjG,iBAAiB,OAAO;AAAA,IACxB,iBAAiB,OAAO;AAAA,IACxB,cAAc,OAAO;AAAA,IACrB,wBAAwB;AAAA,EAC1B;AACF;AAEA,SAAS,mBACP,OACA,mBACA;AACA,QAAM,aAAa,gBAAgB,MAAM,aAAa,SAAS;AAC/D,QAAM,cAAc,SAAS,MAAM,YAAY;AAC/C,QAAM,aAAa,SAAS,MAAM,WAAW;AAC7C,QAAM,SAAS,eAAe,mBAAmB,YAAY,mBAAmB;AAChF,SAAO,UAAU;AACjB,SAAO,WAAW;AAClB,SAAO,kBAAkB,OAAO,SAAS,IAAI,OAAO,UAAU,OAAO,SAAS;AAE9E,QAAM,aAAa,QAAiC,MAAM,WAAW;AACrE,QAAM,iBAAiB,SAAS,WAAW,CAAC,CAAC;AAC7C,QAAM,YAAY,SAAS,eAAe,IAAI;AAC9C,QAAM,eAAe,SAAS,QAAiC,MAAM,QAAQ,EAAE,CAAC,CAAC;AACjF,QAAM,WAAW,SAAS,MAAM,QAAQ;AACxC,QAAM,QAAQ,SAAS,MAAM,KAAK;AAClC,QAAM,SAAS,SAAS,MAAM,MAAM;AACpC,QAAM,UAAU,SAAS,MAAM,OAAO;AACtC,QAAM,WAAW,SAAS,MAAM,QAAQ;AACxC,QAAM,eAAe,SAAS,MAAM,aAAa;AACjD,QAAM,SAAS,SAAS,MAAM,MAAM;AACpC,QAAM,QAAQ,SAAS,eAAe,KAAK;AAE3C,SAAO;AAAA,IACL,sBAAsB,MAAM,EAAE;AAAA,IAC9B,gBAAgB,MAAM,YAAY;AAAA,IAClC,gBAAgB,MAAM,MAAM;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,gBAAgB,MAAM,QAAQ,KAAK,sBAAsB,MAAM,EAAE;AAAA,IACjE,gBAAgB,SAAS,MAAM;AAAA,IAC/B,WAAW;AAAA,IACX,gBAAgB,MAAM,WAAW;AAAA,IACjC,gBAAgB,MAAM,iBAAiB,KAAK,gBAAgB,MAAM,YAAY;AAAA,IAC9E;AAAA,IACA,sBAAsB,MAAM,EAAE;AAAA,IAC9B,gBAAgB,OAAO,QAAQ,KAAK,sBAAsB,OAAO,EAAE;AAAA,IACnE,sBAAsB,OAAO,EAAE;AAAA,IAC/B,sBAAsB,SAAS,EAAE;AAAA,IACjC,sBAAsB,MAAM,OAAO;AAAA,IACnC,QAAQ,MAAM,SAAS;AAAA,IACvB,kBAAkB,MAAM,IAAI;AAAA,IAC5B,gBAAgB,QAAQ,OAAO;AAAA,IAC/B,gBAAgB,QAAQ,IAAI;AAAA,IAC5B,sBAAsB,aAAa,EAAE;AAAA,IACrC,gBAAgB,aAAa,MAAM;AAAA,IACnC,gBAAgB,aAAa,aAAa;AAAA,IAC1C,gBAAgB,aAAa,iBAAiB;AAAA,IAC9C,gBAAgB,aAAa,YAAY;AAAA,IACzC,SAAS,aAAa,iBAAiB;AAAA,IACvC,SAAS,aAAa,kBAAkB;AAAA,IACxC,SAAS,aAAa,YAAY;AAAA,IAClC,SAAS,OAAO,MAAM;AAAA,IACtB,kBAAkB,aAAa,iBAAiB;AAAA,IAChD,mBAAmB,SAAS,KAAK;AAAA,IACjC,mBAAmB,SAAS,MAAM;AAAA,IAClC,mBAAmB,aAAa,MAAM;AAAA,IACtC,mBAAmB,aAAa,MAAM;AAAA,IACtC,gBAAgB,UAAU,EAAE;AAAA,IAC5B,gBAAgB,UAAU,KAAK;AAAA,IAC/B,gBAAgB,UAAU,UAAU;AAAA,IACpC,SAAS,eAAe,QAAQ;AAAA,IAChC,SAAS,eAAe,UAAU;AAAA,IAClC,SAAS,eAAe,QAAQ;AAAA,IAChC,gBAAgB,eAAe,eAAe;AAAA,IAC9C,2BAA2B,UAAU,oBAAoB;AAAA,IACzD,gBAAgB,MAAM,OAAO;AAAA,EAC/B;AACF;AAEO,MAAM,6BAA6B,EAAE,OAAO;AAAA,EACjD,WAAW;AAAA,EACX,WAAW,EAAE,OAAO,EAAE,MAAM,qBAAqB,EAAE,SAAS,kCAAkC;AAAA,EAC9F,SAAS,EAAE,OAAO,EAAE,MAAM,qBAAqB,EAAE,SAAS,gCAAgC;AAAA,EAC1F,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,EACjG,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,0EAA0E;AAAA,EAC1H,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,EAC3F,cAAc,EAAE,KAAK,CAAC,gBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,cAAc,EAAE,SAAS,2NAA2N;AAAA,EAC9T,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,SAAS,EAAE,SAAS,sFAAsF;AAAA,EACpJ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,8EAA8E;AAC3I,CAAC;AAED,eAAsB,4BACpB,QACA;AACA,MAAI;AACF,UAAM,oBAAoB,MAAM,sCAAsC,OAAO,SAAS;AACtF,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,YAAY,kBAAkB,MAAM;AAC1C,UAAM,eAAe,OAAO,gBAAgB;AAC5C,UAAM,iBAAiB,iBAAiB,iBAAiB,OAAO,SAAS,kCAAkC;AAC3G,UAAM,kBAAkB,iBAAiB,iBAAiB,OAAO,UAAU,IAAI;AAC/E,UAAM,WAAW,MAAM,yBAAyB,WAAW;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM,OAAO;AAAA,MACb,IAAI,OAAO;AAAA,MACX,QAAQ,OAAO;AAAA,MACf,GAAG,OAAO;AAAA,MACV,MAAM,OAAO;AAAA,MACb,QAAQ;AAAA,MACR,OAAO;AAAA,IACT,CAAC;AAED,UAAM,SAAS,4BAA4B,SAAS,SAAS,MAAM,CAAC;AACpE,UAAM,aAAa,QAAiC,SAAS,OAAO;AACpE,UAAM,oBAAkG,CAAC;AACzG,UAAM,iBAAiB,OAAO,SAAS,kBAAkB,WAAW;AACpE,UAAM,kBAAkB,OAAO,UAAU,mBAAmB;AAC5D,UAAM,sBAAsB,iBAAiB,iBAAiB,kCAAkC;AAEhG,UAAM,YAAY,CAAC,GAAG,UAAU;AAChC,UAAM,cAA4B,CAAC;AACnC,QAAI,iBAAiB;AACrB,QAAI,iBAAiB;AAErB,QAAI,iBAAiB,KAAK,OAAO,QAAQ,WAAW,QAAQ;AAC1D,YAAM,cAAwB,CAAC;AAC/B,YAAM,oBAAoB,KAAK,IAAI,GAAG,sBAAsB,CAAC;AAC7D,UAAI,aAAa;AAEjB,eAAS,aAAa,kBAAkB,gBAAgB,aAAa,OAAO,OAAO,cAAc,gBAAgB;AAC/G,YAAI,iBAAiB,kBAAkB,cAAc,mBAAmB;AACtE;AAAA,QACF;AAEA,oBAAY,KAAK,UAAU;AAC3B,sBAAc;AAAA,MAChB;AAEA,wBAAkB,YAAY;AAE9B,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,QAAQ,MAAM;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,MAAM,OAAO;AAAA,YACb,IAAI,OAAO;AAAA,YACX,QAAQ,OAAO;AAAA,YACf,GAAG,OAAO;AAAA,YACV,MAAM,OAAO;AAAA,YACb,OAAO;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,YACE,gBAAgB;AAAA,YAChB,YAAY;AAAA,UACd;AAAA,QACF;AAEA,0BAAkB,MAAM,WAAW;AACnC,cAAM,WAAW,QAAQ,CAAC,UAAU;AAClC,oBAAU,KAAK,GAAG,QAAiC,MAAM,SAAS,OAAO,CAAC;AAAA,QAC5E,CAAC;AACD,cAAM,OAAO,QAAQ,CAAC,YAAY;AAChC,gBAAM,eAAe,OAAO,QAAQ,EAAE;AACtC,sBAAY,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,aAAa,KAAK,MAAM,eAAe,cAAc,IAAI;AAAA,YACzD,SAAS,QAAQ;AAAA,YACjB,aAAa,QAAQ;AAAA,YACrB,UAAU,QAAQ;AAAA,YAClB,WAAW,QAAQ;AAAA,UACrB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,gBAAgB,iBAAiB,iBACnC,UAAU,IAAI,CAAC,UAAU,mBAAmB,OAAO,iBAAiB,CAAC,IACrE,CAAC;AAEL,QAAI,iBAAiB,gBAAgB;AACnC,iBAAW,SAAS,WAAW;AAC7B,2BAAmB,OAAO,iBAAiB;AAAA,MAC7C;AAAA,IACF;AAEA,eAAW,WAAW,OAAO,OAAO,iBAAiB,GAAG;AACtD,cAAQ,UAAU,WAAW,QAAQ,OAAO;AAC5C,cAAQ,kBAAkB,WAAW,QAAQ,eAAe;AAAA,IAC9D;AAEA,UAAM,WAAW,iBAAiB,iBAAiB,cAAc,SAAS,UAAU;AACpF,UAAM,WAAW,2BAA2B;AAAA,MAC1C,OAAO,OAAO;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,YAAY;AAAA,MACzB,eAAe,YAAY,IAAI,CAAC,YAAY,QAAQ,MAAM;AAAA,IAC5D,CAAC;AAED,UAAM,eAAe,iBAAiB,iBAAiB,kBAAkB,WAAW,UAAU,WAAW,IAAI;AAE7G,WAAO;AAAA,MACL,WAAW;AAAA,QACT,YAAY;AAAA,QACZ,UAAU,iBAAiB,iBACvB;AAAA,UACE,GAAG,oCAAoC;AAAA,YACrC,OAAO,OAAO;AAAA,YACd,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,UAAU,cAAc;AAAA,YACxB,WAAW;AAAA,UACb,CAAC;AAAA,UACD,GAAG;AAAA,QACL,IACA;AAAA,QACJ,qBAAqB;AAAA,QACrB,eAAe,iBAAiB,iBAAiB,eAAe;AAAA,QAChE,QAAQ,iBAAiB,iBAAiB,gBAAgB;AAAA,QAC1D;AAAA,QACA,cAAc,YAAY,SAAS,IAAI,cAAc;AAAA,MACvD,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,wBAAwB,KAAK,6CAA6C,CAAC;AAAA,EAC1F;AACF;",
6
6
  "names": []
7
7
  }
@@ -30,12 +30,25 @@ function roundMoney(value) {
30
30
  function normalizeString(value, fallback = "") {
31
31
  return typeof value === "string" ? value : fallback;
32
32
  }
33
+ function normalizeScalarString(value, fallback = "") {
34
+ if (typeof value === "string") {
35
+ return value;
36
+ }
37
+ if (typeof value === "number" || typeof value === "bigint") {
38
+ return String(value);
39
+ }
40
+ if (typeof value === "boolean") {
41
+ return value ? "true" : "false";
42
+ }
43
+ return fallback;
44
+ }
33
45
  export {
34
46
  asArray,
35
47
  asRecord,
36
48
  compactDateTime,
37
49
  currencyBucket,
38
50
  mercadoLibreDateRegex,
51
+ normalizeScalarString,
39
52
  normalizeString,
40
53
  roundMoney,
41
54
  toNumber
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/mercadolibre/helpers.ts"],
4
- "sourcesContent": ["export const mercadoLibreDateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport function toNumber(value: unknown): number {\n const numericValue = typeof value === \"number\" ? value : Number(value ?? 0);\n return Number.isFinite(numericValue) ? numericValue : 0;\n}\n\nexport function compactDateTime(value: unknown): string | null {\n if (typeof value !== \"string\" || !value) {\n return null;\n }\n\n const match = value.match(/^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}:\\d{2})/);\n if (!match) {\n return value;\n }\n\n return `${match[1]} ${match[2]}`;\n}\n\nexport function asArray<T = Record<string, unknown>>(value: unknown): T[] {\n return Array.isArray(value) ? (value as T[]) : [];\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" ? (value as Record<string, unknown>) : {};\n}\n\nexport function currencyBucket<T>(store: Record<string, T>, currencyId: string, initial: () => T): T {\n const key = currencyId.trim() || \"UNKNOWN\";\n store[key] = store[key] ?? initial();\n return store[key];\n}\n\nexport function roundMoney(value: number): number {\n return Number(value.toFixed(2));\n}\n\nexport function normalizeString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n"],
5
- "mappings": "AAAO,MAAM,wBAAwB;AAE9B,SAAS,SAAS,OAAwB;AAC/C,QAAM,eAAe,OAAO,UAAU,WAAW,QAAQ,OAAO,SAAS,CAAC;AAC1E,SAAO,OAAO,SAAS,YAAY,IAAI,eAAe;AACxD;AAEO,SAAS,gBAAgB,OAA+B;AAC7D,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,MAAM,uCAAuC;AACjE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAChC;AAEO,SAAS,QAAqC,OAAqB;AACxE,SAAO,MAAM,QAAQ,KAAK,IAAK,QAAgB,CAAC;AAClD;AAEO,SAAS,SAAS,OAAyC;AAChE,SAAO,SAAS,OAAO,UAAU,WAAY,QAAoC,CAAC;AACpF;AAEO,SAAS,eAAkB,OAA0B,YAAoB,SAAqB;AACnG,QAAM,MAAM,WAAW,KAAK,KAAK;AACjC,QAAM,GAAG,IAAI,MAAM,GAAG,KAAK,QAAQ;AACnC,SAAO,MAAM,GAAG;AAClB;AAEO,SAAS,WAAW,OAAuB;AAChD,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEO,SAAS,gBAAgB,OAAgB,WAAW,IAAY;AACrE,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;",
4
+ "sourcesContent": ["export const mercadoLibreDateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport function toNumber(value: unknown): number {\n const numericValue = typeof value === \"number\" ? value : Number(value ?? 0);\n return Number.isFinite(numericValue) ? numericValue : 0;\n}\n\nexport function compactDateTime(value: unknown): string | null {\n if (typeof value !== \"string\" || !value) {\n return null;\n }\n\n const match = value.match(/^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}:\\d{2})/);\n if (!match) {\n return value;\n }\n\n return `${match[1]} ${match[2]}`;\n}\n\nexport function asArray<T = Record<string, unknown>>(value: unknown): T[] {\n return Array.isArray(value) ? (value as T[]) : [];\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" ? (value as Record<string, unknown>) : {};\n}\n\nexport function currencyBucket<T>(store: Record<string, T>, currencyId: string, initial: () => T): T {\n const key = currencyId.trim() || \"UNKNOWN\";\n store[key] = store[key] ?? initial();\n return store[key];\n}\n\nexport function roundMoney(value: number): number {\n return Number(value.toFixed(2));\n}\n\nexport function normalizeString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nexport function normalizeScalarString(value: unknown, fallback = \"\"): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"bigint\") {\n return String(value);\n }\n\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n\n return fallback;\n}\n"],
5
+ "mappings": "AAAO,MAAM,wBAAwB;AAE9B,SAAS,SAAS,OAAwB;AAC/C,QAAM,eAAe,OAAO,UAAU,WAAW,QAAQ,OAAO,SAAS,CAAC;AAC1E,SAAO,OAAO,SAAS,YAAY,IAAI,eAAe;AACxD;AAEO,SAAS,gBAAgB,OAA+B;AAC7D,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,MAAM,uCAAuC;AACjE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAChC;AAEO,SAAS,QAAqC,OAAqB;AACxE,SAAO,MAAM,QAAQ,KAAK,IAAK,QAAgB,CAAC;AAClD;AAEO,SAAS,SAAS,OAAyC;AAChE,SAAO,SAAS,OAAO,UAAU,WAAY,QAAoC,CAAC;AACpF;AAEO,SAAS,eAAkB,OAA0B,YAAoB,SAAqB;AACnG,QAAM,MAAM,WAAW,KAAK,KAAK;AACjC,QAAM,GAAG,IAAI,MAAM,GAAG,KAAK,QAAQ;AACnC,SAAO,MAAM,GAAG;AAClB;AAEO,SAAS,WAAW,OAAuB;AAChD,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEO,SAAS,gBAAgB,OAAgB,WAAW,IAAY;AACrE,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEO,SAAS,sBAAsB,OAAgB,WAAW,IAAY;AAC3E,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAC1D,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO,QAAQ,SAAS;AAAA,EAC1B;AAEA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@yoryoboy/bi-mcp",
3
3
  "type": "module",
4
- "version": "1.5.3",
4
+ "version": "1.7.0",
5
5
  "description": "MCP server: bi-mcp",
6
6
  "author": "",
7
7
  "license": "MIT",
@@ -60,8 +60,8 @@
60
60
  },
61
61
  "scripts": {
62
62
  "generate:types": "mcp-use generate-types",
63
- "build": "mcp-use build",
64
- "dev": "mcp-use dev",
63
+ "build": "node scripts/run-mcp-use-build.mjs",
64
+ "dev": "node scripts/run-mcp-use-dev.mjs",
65
65
  "start": "mcp-use start",
66
66
  "deploy": "mcp-use deploy",
67
67
  "db:test": "pnpm exec tsx scripts/test-db-connection.ts",
@@ -69,6 +69,7 @@
69
69
  "admin:profile-upsert": "pnpm exec tsx scripts/admin-profile-upsert.ts",
70
70
  "admin:profile-list": "pnpm exec tsx scripts/admin-profile-list.ts",
71
71
  "admin:profile-delete": "pnpm exec tsx scripts/admin-profile-delete.ts",
72
+ "admin:decrypt-secret": "pnpm exec tsx scripts/decrypt-secret.ts",
72
73
  "admin:vtex-upsert": "pnpm exec tsx scripts/admin-vtex-upsert.ts",
73
74
  "admin:vtex-validate": "pnpm exec tsx scripts/admin-vtex-validate.ts",
74
75
  "admin:vtex-list": "pnpm exec tsx scripts/admin-vtex-list.ts"