@open-mercato/core 0.6.1-develop.3174.1.c3822bcdf0 → 0.6.1-develop.3179.1.9ee0441adc

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.
@@ -224,6 +224,21 @@ async function waitForDialogFieldReady(dialog, field, loadingPattern) {
224
224
  await field.scrollIntoViewIfNeeded().catch(() => {
225
225
  });
226
226
  }
227
+ async function fillControlledInput(input, value, timeout = 2e3) {
228
+ await waitForStableVisibility(input, TEST_WAIT_TIMEOUT_MS);
229
+ await input.fill(value);
230
+ await input.evaluate((element, nextValue) => {
231
+ const control = element;
232
+ const prototype = control instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;
233
+ const valueSetter = Object.getOwnPropertyDescriptor(prototype, "value")?.set;
234
+ valueSetter?.call(control, nextValue);
235
+ control.dispatchEvent(new InputEvent("input", { bubbles: true, inputType: "insertText", data: nextValue }));
236
+ control.dispatchEvent(new Event("change", { bubbles: true }));
237
+ }, value);
238
+ await expect(input).toHaveValue(value, { timeout });
239
+ await input.press("Tab").catch(() => {
240
+ });
241
+ }
227
242
  async function recoverGenericErrorPageIfPresent(page) {
228
243
  const errorHeading = page.getByRole("heading", { name: /^Something went wrong$/i }).first();
229
244
  if (!await errorHeading.isVisible().catch(() => false)) return false;
@@ -822,16 +837,23 @@ async function addAdjustment(page, options) {
822
837
  await expect(kindTrigger).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });
823
838
  const labelInput = dialog.getByPlaceholder(/e\.g\. Shipping fee/i).first();
824
839
  await expect(labelInput).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });
825
- await labelInput.fill(options.label);
826
- await expect(labelInput).toHaveValue(options.label, { timeout: 2e3 });
840
+ await fillControlledInput(labelInput, options.label);
827
841
  if (await kindTrigger.count() > 0) {
828
842
  const expectedKindValue = normalizeAdjustmentKindValue(options.kindLabel ?? "Surcharge");
829
843
  const kindLabel = options.kindLabel ?? "Surcharge";
830
844
  await kindTrigger.click();
831
- await page.waitForTimeout(150);
832
- await page.keyboard.type(kindLabel.charAt(0));
833
- await page.waitForTimeout(150);
834
- await page.keyboard.press("Enter");
845
+ const option = page.getByRole("option", { name: new RegExp(`^${escapeRegExp(kindLabel)}$`, "i") }).first();
846
+ const optionVisible = await option.waitFor({ state: "visible", timeout: 2e3 }).then(
847
+ () => true,
848
+ () => false
849
+ );
850
+ if (optionVisible) {
851
+ await option.click({ force: true });
852
+ } else {
853
+ await page.keyboard.type(kindLabel.charAt(0));
854
+ await page.waitForTimeout(150);
855
+ await page.keyboard.press("Enter");
856
+ }
835
857
  void expectedKindValue;
836
858
  }
837
859
  const fixedAmountButton = dialog.getByRole("button", { name: /^Fixed amount$/i }).first();
@@ -842,9 +864,7 @@ async function addAdjustment(page, options) {
842
864
  const enabledAmountInputs = dialog.locator('input[placeholder="0.00"]:not([disabled])');
843
865
  await expect(enabledAmountInputs.first()).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });
844
866
  if (await enabledAmountInputs.count() > 0) {
845
- await enabledAmountInputs.first().fill(String(options.netAmount));
846
- await expect(enabledAmountInputs.first()).toHaveValue(String(options.netAmount), { timeout: 2e3 }).catch(() => {
847
- });
867
+ await fillControlledInput(enabledAmountInputs.first(), String(options.netAmount));
848
868
  }
849
869
  };
850
870
  let saved = false;
@@ -869,8 +889,7 @@ async function addAdjustment(page, options) {
869
889
  if (!await adjustmentRow.isVisible().catch(() => false)) {
870
890
  await adjustmentsTab.click().catch(() => {
871
891
  });
872
- await adjustmentRow.waitFor({ state: "visible", timeout: 2e3 }).catch(() => {
873
- });
892
+ await expect(adjustmentRow).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });
874
893
  }
875
894
  }
876
895
  async function addPayment(page, amount) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/helpers/integration/salesUi.ts"],
4
- "sourcesContent": ["import { expect, type Locator, type Page } from '@playwright/test';\nimport { apiRequest, getAuthToken } from './api';\n\ntype DocumentKind = 'quote' | 'order';\n\ntype CreateDocumentOptions = {\n kind: DocumentKind;\n customerQuery?: string;\n channelQuery?: string;\n preferApi?: boolean;\n token?: string;\n};\n\ntype ChannelListItem = {\n id?: string | null;\n name?: string | null;\n code?: string | null;\n isActive?: boolean | null;\n};\n\ntype CustomerAddressListItem = {\n id?: string | null;\n name?: string | null;\n purpose?: string | null;\n company_name?: string | null;\n companyName?: string | null;\n address_line1?: string | null;\n addressLine1?: string | null;\n address_line2?: string | null;\n addressLine2?: string | null;\n building_number?: string | null;\n buildingNumber?: string | null;\n flat_number?: string | null;\n flatNumber?: string | null;\n city?: string | null;\n region?: string | null;\n postal_code?: string | null;\n postalCode?: string | null;\n country?: string | null;\n};\n\ntype DocumentAddressPayload = {\n customerAddressId?: string;\n name?: string;\n purpose?: string;\n companyName?: string;\n addressLine1: string;\n addressLine2?: string;\n buildingNumber?: string;\n flatNumber?: string;\n city?: string;\n region?: string;\n postalCode?: string;\n country?: string;\n};\n\ntype SalesOrderLineListItem = {\n id?: string | null;\n};\n\ntype PaymentMethodListItem = {\n id?: string | null;\n name?: string | null;\n code?: string | null;\n isActive?: boolean | null;\n};\n\ntype AddLineOptions = {\n name: string;\n quantity: number;\n unitPriceGross: number;\n taxClassName?: string;\n};\n\ntype AddAdjustmentOptions = {\n label: string;\n kindLabel?: string;\n netAmount: number;\n};\n\nconst TEST_WAIT_TIMEOUT_MS = 10_000;\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction parseCurrencyAmount(value: string): number {\n const normalized = value.replace(/,/g, '');\n const matches = normalized.match(/-?\\$[0-9]+(?:\\.[0-9]{2})?/g);\n const lastMatch = matches?.[matches.length - 1];\n if (!lastMatch) {\n throw new Error(`Could not parse currency from: ${value}`);\n }\n return Number.parseFloat(lastMatch.replace('$', ''));\n}\n\nfunction normalizeAdjustmentKindValue(kindLabel: string): string {\n return kindLabel.trim().toLowerCase().replace(/\\s+/g, '_');\n}\n\nfunction readId(payload: unknown, keys: string[]): string | null {\n if (!payload || typeof payload !== 'object') return null;\n const map = payload as Record<string, unknown>;\n for (const key of keys) {\n const value = map[key];\n if (typeof value === 'string' && value.length > 0) return value;\n }\n for (const value of Object.values(map)) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const nested = readId(value, keys);\n if (nested) return nested;\n }\n }\n return null;\n}\n\nfunction readListItems<T>(payload: { result?: { items?: T[] }; items?: T[] } | null): T[] {\n return Array.isArray(payload?.result?.items)\n ? payload.result.items\n : Array.isArray(payload?.items)\n ? payload.items\n : [];\n}\n\nfunction resolveOrderIdFromPage(page: Page): string | null {\n const match = page.url().match(/\\/backend\\/sales\\/(?:documents|orders)\\/([0-9a-f-]{36})/i);\n return match?.[1] ?? null;\n}\n\nasync function ensureSalesDocumentFixtures(\n page: Page,\n options: CreateDocumentOptions,\n): Promise<{\n customerQuery: string;\n channelQuery: string;\n customerEntityId?: string | null;\n channelId?: string | null;\n customerAddressId?: string | null;\n authToken?: string | null;\n}> {\n let customerQuery = options.customerQuery;\n let channelQuery = options.channelQuery;\n let customerEntityId: string | null = null;\n let channelId: string | null = null;\n let customerAddressId: string | null = null;\n\n if (customerQuery && channelQuery) {\n return { customerQuery, channelQuery, authToken: options.token ?? null };\n }\n\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n if (!token) {\n if (!customerQuery) {\n customerQuery = `QA Sales Customer ${Date.now()}`;\n await page.goto('/backend/customers/companies/create');\n await page.locator('form').getByRole('textbox').first().fill(customerQuery);\n await page.getByPlaceholder('https://example.com').fill('https://example.com');\n await page.locator('form').getByRole('button', { name: /Create Company/i }).click();\n await expect(page).toHaveURL(/\\/backend\\/customers\\/companies\\/[0-9a-f-]{36}$/i);\n }\n if (!channelQuery) {\n const timestamp = Date.now();\n channelQuery = `QA Sales Channel ${timestamp}`;\n const channelCode = `qa-sales-channel-${timestamp}`;\n await page.goto('/backend/sales/channels');\n await page.getByRole('link', { name: /Add channel/i }).click();\n const createForm = page.locator('form').first();\n await createForm.getByRole('textbox').nth(0).fill(channelQuery);\n await createForm.getByRole('textbox').nth(1).fill(channelCode);\n await page.getByRole('button', { name: /Create channel|Create/i }).last().click();\n await expect(page).toHaveURL(/\\/backend\\/sales\\/channels$/i);\n }\n return {\n customerQuery,\n channelQuery,\n authToken: options.token ?? null,\n };\n }\n\n if (!customerQuery) {\n const companyName = `QA Sales Customer ${Date.now()}`;\n const companyResponse = await apiRequest(page.request, 'POST', '/api/customers/companies', {\n token,\n data: { displayName: companyName },\n }).catch(() => null);\n if (companyResponse && companyResponse.ok()) {\n const companyBody = (await companyResponse.json().catch(() => null)) as unknown;\n customerEntityId = readId(companyBody, ['id', 'entityId', 'companyId']);\n if (customerEntityId) {\n await apiRequest(page.request, 'POST', '/api/customers/addresses', {\n token,\n data: {\n entityId: customerEntityId,\n name: 'Primary',\n purpose: 'Shipping',\n addressLine1: '100 QA Street',\n city: 'Austin',\n postalCode: '78701',\n country: 'US',\n isPrimary: true,\n },\n }).then(async (response) => {\n const body = (await response.json().catch(() => null)) as unknown;\n customerAddressId = readId(body, ['id', 'addressId']);\n }).catch(() => {});\n customerQuery = companyName;\n }\n }\n if (!customerQuery) {\n customerQuery = 'Copperleaf';\n }\n }\n\n if (!channelQuery) {\n const existingChannelsResponse = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/channels?page=1&pageSize=20&isActive=true',\n { token },\n ).catch(() => null);\n const existingChannelsBody = (await existingChannelsResponse?.json().catch(() => null)) as { items?: ChannelListItem[] } | null;\n const existingChannels = Array.isArray(existingChannelsBody?.items) ? existingChannelsBody.items : [];\n const preferredExistingChannel =\n existingChannels.find((item) => item.code === 'online' && item.isActive !== false) ??\n existingChannels.find((item) => item.isActive !== false);\n if (preferredExistingChannel?.name) {\n channelQuery = preferredExistingChannel.name;\n channelId = preferredExistingChannel.id ?? null;\n } else {\n const timestamp = Date.now();\n const channelName = `QA Sales Channel ${timestamp}`;\n const channelCode = `qa-sales-channel-${timestamp}`;\n const channelResponse = await apiRequest(page.request, 'POST', '/api/sales/channels', {\n token,\n data: {\n name: channelName,\n code: channelCode,\n },\n }).catch(() => null);\n if (channelResponse && channelResponse.ok()) {\n channelQuery = channelName;\n const channelBody = (await channelResponse.json().catch(() => null)) as unknown;\n channelId = readId(channelBody, ['id', 'channelId']);\n } else {\n channelQuery = 'online';\n }\n }\n }\n\n return {\n customerQuery: customerQuery ?? 'Copperleaf',\n channelQuery: channelQuery ?? 'online',\n customerEntityId,\n channelId,\n customerAddressId,\n authToken: token,\n };\n}\n\nasync function selectFirstAddressIfAvailable(page: Page): Promise<void> {\n // Radix Select: trigger has placeholder text \"Select address\" rendered inside\n const addressTrigger = page\n .locator('[role=\"combobox\"]')\n .filter({ hasText: /Select address/i })\n .first();\n if ((await addressTrigger.count()) === 0) return;\n if (!(await addressTrigger.isEnabled().catch(() => false))) return;\n\n await addressTrigger.click();\n // Pick the first available option from the portal-rendered listbox\n const firstOption = page.getByRole('option').first();\n if ((await firstOption.count()) === 0) {\n // Close listbox if no options\n await page.keyboard.press('Escape');\n return;\n }\n await firstOption.click();\n}\n\nasync function ensureShippingMethodFixture(page: Page): Promise<void> {\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n if (!token) return;\n\n const existing = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/shipping-methods?page=1&pageSize=1&isActive=true',\n { token },\n ).catch(() => null);\n const existingBody = (await existing?.json().catch(() => null)) as { result?: { items?: unknown[] } } | null;\n const existingItems = Array.isArray(existingBody?.result?.items) ? existingBody?.result?.items : [];\n if (existingItems.length > 0) return;\n\n const stamp = Date.now();\n await apiRequest(page.request, 'POST', '/api/sales/shipping-methods', {\n token,\n data: {\n name: `QA Shipping Method ${stamp}`,\n code: `qa-shipping-${stamp}`,\n isActive: true,\n currencyCode: 'USD',\n baseRateNet: '10.00',\n baseRateGross: '10.00',\n },\n }).catch(() => {});\n}\n\nfunction lookupRootFromInput(input: Locator): Locator {\n return input.locator('xpath=ancestor::div[contains(@class,\"space-y-3\")][1]');\n}\n\nasync function waitForLookupIdle(root: Locator): Promise<void> {\n await root\n .getByText(/Searching\u2026|Searching\\.\\.\\.|Loading\u2026|Loading\\.\\.\\./i)\n .first()\n .waitFor({ state: 'hidden', timeout: 1_200 })\n .catch(() => {});\n}\n\nasync function waitForOptionalTextToDisappear(scope: Locator, pattern: RegExp, timeout = 2_500): Promise<void> {\n await scope.getByText(pattern).first().waitFor({ state: 'hidden', timeout }).catch(() => {});\n}\n\nasync function waitForStableVisibility(locator: Locator, timeout = TEST_WAIT_TIMEOUT_MS): Promise<void> {\n await expect(locator).toBeVisible({ timeout });\n let stableChecks = 0;\n const deadline = Date.now() + Math.min(timeout, 2_000);\n while (Date.now() < deadline) {\n if (await locator.isVisible().catch(() => false)) {\n stableChecks += 1;\n if (stableChecks >= 3) return;\n } else {\n stableChecks = 0;\n }\n await locator.page().waitForTimeout(50).catch(() => {});\n }\n}\n\nasync function waitForDialogFieldReady(\n dialog: Locator,\n field: Locator,\n loadingPattern?: RegExp,\n): Promise<void> {\n await expect(dialog).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n if (loadingPattern) {\n await waitForOptionalTextToDisappear(dialog, loadingPattern, TEST_WAIT_TIMEOUT_MS);\n }\n await waitForStableVisibility(field, TEST_WAIT_TIMEOUT_MS);\n await field.scrollIntoViewIfNeeded().catch(() => {});\n}\n\nasync function recoverGenericErrorPageIfPresent(page: Page): Promise<boolean> {\n const errorHeading = page.getByRole('heading', { name: /^Something went wrong$/i }).first();\n if (!(await errorHeading.isVisible().catch(() => false))) return false;\n const retryButton = page.getByRole('button', { name: /Try again/i }).first();\n if (await retryButton.isVisible().catch(() => false)) {\n await retryButton.click().catch(() => {});\n await page.waitForLoadState('domcontentloaded').catch(() => {});\n } else {\n await page.reload({ waitUntil: 'domcontentloaded' }).catch(() => {});\n }\n return true;\n}\n\nasync function resolveCustomerEntityId(\n page: Page,\n token: string,\n customerQuery: string,\n): Promise<string | null> {\n const params = new URLSearchParams({ page: '1', pageSize: '5', search: customerQuery });\n const response = await apiRequest(page.request, 'GET', `/api/customers/companies?${params.toString()}`, { token }).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: Array<Record<string, unknown>> };\n items?: Array<Record<string, unknown>>;\n } | null;\n const items = Array.isArray(body?.result?.items)\n ? body.result.items\n : Array.isArray(body?.items)\n ? body.items\n : [];\n const exactMatch = items.find((item) => {\n const displayName = typeof item.displayName === 'string'\n ? item.displayName\n : typeof item.display_name === 'string'\n ? item.display_name\n : '';\n return displayName.trim().toLowerCase() === customerQuery.trim().toLowerCase();\n }) ?? items[0];\n return exactMatch ? readId(exactMatch, ['id', 'entityId', 'companyId']) : null;\n}\n\nfunction toDocumentAddressPayload(address: CustomerAddressListItem): DocumentAddressPayload | null {\n const addressLine1 = typeof address.addressLine1 === 'string'\n ? address.addressLine1\n : typeof address.address_line1 === 'string'\n ? address.address_line1\n : null;\n if (!addressLine1) return null;\n return {\n customerAddressId: typeof address.id === 'string' ? address.id : undefined,\n name: typeof address.name === 'string' ? address.name : undefined,\n purpose: typeof address.purpose === 'string' ? address.purpose : undefined,\n companyName: typeof address.companyName === 'string'\n ? address.companyName\n : typeof address.company_name === 'string'\n ? address.company_name\n : undefined,\n addressLine1,\n addressLine2: typeof address.addressLine2 === 'string'\n ? address.addressLine2\n : typeof address.address_line2 === 'string'\n ? address.address_line2\n : undefined,\n buildingNumber: typeof address.buildingNumber === 'string'\n ? address.buildingNumber\n : typeof address.building_number === 'string'\n ? address.building_number\n : undefined,\n flatNumber: typeof address.flatNumber === 'string'\n ? address.flatNumber\n : typeof address.flat_number === 'string'\n ? address.flat_number\n : undefined,\n city: typeof address.city === 'string' ? address.city : undefined,\n region: typeof address.region === 'string' ? address.region : undefined,\n postalCode: typeof address.postalCode === 'string'\n ? address.postalCode\n : typeof address.postal_code === 'string'\n ? address.postal_code\n : undefined,\n country: typeof address.country === 'string' ? address.country : undefined,\n };\n}\n\nasync function ensureCustomerAddressFixture(\n page: Page,\n token: string,\n customerEntityId: string,\n preferredAddressId?: string | null,\n): Promise<DocumentAddressPayload | null> {\n const existingResponse = await apiRequest(\n page.request,\n 'GET',\n `/api/customers/addresses?page=1&pageSize=20&entityId=${customerEntityId}`,\n { token },\n ).catch(() => null);\n const existingBody = (await existingResponse?.json().catch(() => null)) as {\n result?: { items?: CustomerAddressListItem[] };\n items?: CustomerAddressListItem[];\n } | null;\n const existingItems = Array.isArray(existingBody?.result?.items)\n ? existingBody.result.items\n : Array.isArray(existingBody?.items)\n ? existingBody.items\n : [];\n const preferredAddress = existingItems.find((item) => item.id === preferredAddressId)\n ?? existingItems.find((item) => item.purpose?.toLowerCase() === 'shipping')\n ?? existingItems[0];\n const preferredPayload = preferredAddress ? toDocumentAddressPayload(preferredAddress) : null;\n if (preferredPayload) return preferredPayload;\n\n const createResponse = await apiRequest(page.request, 'POST', '/api/customers/addresses', {\n token,\n data: {\n entityId: customerEntityId,\n name: 'Primary',\n purpose: 'Shipping',\n addressLine1: '100 QA Street',\n city: 'Austin',\n postalCode: '78701',\n country: 'US',\n isPrimary: true,\n },\n }).catch(() => null);\n const createBody = (await createResponse?.json().catch(() => null)) as unknown;\n const createdAddressId = readId(createBody, ['id', 'addressId']);\n if (!createResponse?.ok() || !createdAddressId) return null;\n return {\n customerAddressId: createdAddressId,\n name: 'Primary',\n purpose: 'Shipping',\n addressLine1: '100 QA Street',\n city: 'Austin',\n postalCode: '78701',\n country: 'US',\n };\n}\n\nasync function resolveSalesChannelId(page: Page, token: string, channelQuery: string): Promise<string | null> {\n const resolveItems = async (search?: string): Promise<ChannelListItem[]> => {\n const params = new URLSearchParams({ page: '1', pageSize: '5', isActive: 'true' });\n if (search && search.trim().length > 0) params.set('search', search.trim());\n const response = await apiRequest(page.request, 'GET', `/api/sales/channels?${params.toString()}`, {\n token,\n }).catch(() => null);\n const body = (await response?.json().catch(() => null)) as { result?: { items?: ChannelListItem[] }; items?: ChannelListItem[] } | null;\n return Array.isArray(body?.result?.items)\n ? body.result.items\n : Array.isArray(body?.items)\n ? body.items\n : [];\n };\n const initialItems = await resolveItems(channelQuery);\n const items = initialItems.length > 0 ? initialItems : await resolveItems();\n const normalizedQuery = channelQuery.trim().toLowerCase();\n const exactMatch = items.find((item) => item.name?.trim().toLowerCase() === normalizedQuery)\n ?? items.find((item) => item.code?.trim().toLowerCase() === normalizedQuery)\n ?? items.find((item) => item.code === 'online')\n ?? items[0];\n return exactMatch?.id ?? null;\n}\n\nasync function resolveOrderLineId(page: Page, token: string, orderId: string): Promise<string | null> {\n const response = await apiRequest(page.request, 'GET', `/api/sales/order-lines?page=1&pageSize=20&orderId=${orderId}`, {\n token,\n }).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: SalesOrderLineListItem[] };\n items?: SalesOrderLineListItem[];\n } | null;\n const items = readListItems(body);\n return items.find((item) => typeof item.id === 'string' && item.id.length > 0)?.id ?? null;\n}\n\nasync function resolveShippingMethodId(page: Page, token: string): Promise<string | null> {\n const response = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/shipping-methods?page=1&pageSize=20&isActive=true',\n { token },\n ).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: ChannelListItem[] };\n items?: ChannelListItem[];\n } | null;\n const items = readListItems(body);\n const preferred = items.find((item) => item.code === 'standard-ground')\n ?? items.find((item) => item.name?.toLowerCase().includes('standard'))\n ?? items[0];\n return preferred?.id ?? null;\n}\n\nasync function resolvePaymentMethodId(page: Page, token: string): Promise<string | null> {\n const response = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/payment-methods?page=1&pageSize=20&isActive=true',\n { token },\n ).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: PaymentMethodListItem[] };\n items?: PaymentMethodListItem[];\n } | null;\n const items = readListItems(body);\n const preferred = items.find((item) => item.code === 'bank-transfer')\n ?? items.find((item) => item.name?.toLowerCase().includes('bank'))\n ?? items[0];\n return preferred?.id ?? null;\n}\n\nasync function refreshSalesDocumentPage(page: Page, activeTabName: 'Shipments' | 'Payments'): Promise<void> {\n await page.reload({ waitUntil: 'domcontentloaded' }).catch(() => {});\n await ensureSalesDocumentReady(page);\n const tab = page.getByRole('button', { name: new RegExp(`^${activeTabName}$`, 'i') }).first();\n await waitForStableVisibility(tab, TEST_WAIT_TIMEOUT_MS).catch(() => {});\n await tab.click().catch(() => {});\n}\n\nasync function addShipmentViaApi(\n page: Page,\n shipmentNumber: string,\n trackingNumber: string,\n): Promise<boolean> {\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n const orderId = resolveOrderIdFromPage(page);\n if (!token || !orderId) return false;\n const [orderLineId, shippingMethodId] = await Promise.all([\n resolveOrderLineId(page, token, orderId),\n resolveShippingMethodId(page, token),\n ]);\n if (!orderLineId) return false;\n const response = await apiRequest(page.request, 'POST', '/api/sales/shipments', {\n token,\n data: {\n orderId,\n shipmentNumber,\n ...(shippingMethodId ? { shippingMethodId } : {}),\n trackingNumbers: [trackingNumber],\n shippedAt: new Date().toISOString(),\n currencyCode: 'USD',\n items: [{ orderLineId, quantity: '1' }],\n },\n }).catch(() => null);\n if (!response?.ok()) return false;\n await refreshSalesDocumentPage(page, 'Shipments');\n return true;\n}\n\nasync function addPaymentViaApi(page: Page, amount: number): Promise<boolean> {\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n const orderId = resolveOrderIdFromPage(page);\n if (!token || !orderId) return false;\n const paymentMethodId = await resolvePaymentMethodId(page, token);\n const response = await apiRequest(page.request, 'POST', '/api/sales/payments', {\n token,\n data: {\n orderId,\n ...(paymentMethodId ? { paymentMethodId } : {}),\n amount: amount.toFixed(2),\n currencyCode: 'USD',\n receivedAt: new Date().toISOString(),\n },\n }).catch(() => null);\n if (!response?.ok()) return false;\n await refreshSalesDocumentPage(page, 'Payments');\n return true;\n}\n\nasync function createSalesDocumentFixture(\n page: Page,\n token: string,\n kind: DocumentKind,\n customerQuery: string,\n channelQuery: string,\n ids?: { customerEntityId?: string | null; channelId?: string | null; customerAddressId?: string | null },\n): Promise<string> {\n const customerEntityId =\n ids?.customerEntityId ??\n await resolveCustomerEntityId(page, token, customerQuery);\n const channelId =\n ids?.channelId ??\n await resolveSalesChannelId(page, token, channelQuery);\n const payload: Record<string, unknown> = {\n currencyCode: 'USD',\n };\n if (customerEntityId) payload.customerEntityId = customerEntityId;\n if (channelId) payload.channelId = channelId;\n\n const response = await apiRequest(page.request, 'POST', kind === 'quote' ? '/api/sales/quotes' : '/api/sales/orders', {\n token,\n data: payload,\n });\n const body = (await response.json().catch(() => null)) as unknown;\n if (!response.ok()) {\n throw new Error(`Failed to create sales ${kind} fixture via API.`);\n }\n const id = readId(body, ['id', kind === 'quote' ? 'quoteId' : 'orderId']);\n if (!id) {\n throw new Error(`Missing sales ${kind} id in API fallback response.`);\n }\n\n if (customerEntityId) {\n const address = await ensureCustomerAddressFixture(page, token, customerEntityId, ids?.customerAddressId);\n if (address) {\n await apiRequest(page.request, 'POST', '/api/sales/document-addresses', {\n token,\n data: {\n documentId: id,\n documentKind: kind,\n ...address,\n },\n }).catch(() => {});\n }\n }\n\n return id;\n}\n\nasync function waitForDocumentLoaded(page: Page, timeout = TEST_WAIT_TIMEOUT_MS): Promise<boolean> {\n const itemsButton = page.getByRole('button', { name: /^Items$/i }).first();\n if (await itemsButton.isVisible().catch(() => false)) return true;\n const loadingIndicator = page.getByText(/Loading document\u2026|Loading document\\.\\.\\./i).first();\n const isLoading = await loadingIndicator.isVisible().catch(() => false);\n if (isLoading) {\n await loadingIndicator.waitFor({ state: 'hidden', timeout }).catch(() => {});\n }\n return await itemsButton.waitFor({ state: 'visible', timeout: Math.min(timeout, 5_000) }).then(() => true).catch(() => false);\n}\n\nasync function openSalesDocumentPage(page: Page, id: string, kind: DocumentKind): Promise<void> {\n const documentUrl = `/backend/sales/documents/${id}?kind=${kind}`;\n await page.goto(documentUrl, { waitUntil: 'domcontentloaded' });\n\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const recovered = await recoverGenericErrorPageIfPresent(page);\n if (recovered) {\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n continue;\n }\n await page.goto(documentUrl, { waitUntil: 'domcontentloaded' });\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n }\n await expect(page.getByRole('button', { name: /^Items$/i }).first()).toBeVisible({\n timeout: TEST_WAIT_TIMEOUT_MS,\n });\n}\n\nasync function ensureSalesDocumentReady(page: Page): Promise<void> {\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const recovered = await recoverGenericErrorPageIfPresent(page);\n if (recovered) {\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n continue;\n }\n await page.reload({ waitUntil: 'domcontentloaded' }).catch(() => {});\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n }\n await expect(page.getByRole('button', { name: /^Items$/i }).first()).toBeVisible({\n timeout: TEST_WAIT_TIMEOUT_MS,\n });\n}\n\nasync function selectAnyLookupOption(root: Locator): Promise<boolean> {\n const selectButton = root.getByRole('button', { name: /^Select$/i }).first();\n if (await selectButton.isVisible().catch(() => false)) {\n await selectButton.click().catch(() => {});\n return true;\n }\n\n const row = root.locator('[role=\"button\"]').first();\n if (await row.isVisible().catch(() => false)) {\n await row.click().catch(() => {});\n return true;\n }\n\n return false;\n}\n\nasync function selectLookupValue(\n input: Locator,\n query: string,\n preferredRowPattern?: RegExp,\n): Promise<boolean> {\n if (!(await input.isVisible().catch(() => false)) && (await input.count().catch(() => 0)) === 0) return false;\n await waitForStableVisibility(input, 4_000).catch(() => {});\n await input.click().catch(() => {});\n await input.press('ControlOrMeta+a').catch(() => {});\n await input.fill(query).catch(() => {});\n\n const root = lookupRootFromInput(input);\n await waitForLookupIdle(root);\n\n const selectByPreferredRow = async (): Promise<boolean> => {\n if (!preferredRowPattern) return false;\n const row = root.locator('[role=\"button\"]').filter({ hasText: preferredRowPattern }).first();\n const action = row.getByRole('button', { name: /^Select$/i }).first();\n if (await action.isVisible().catch(() => false)) {\n await action.click();\n return true;\n }\n if ((await row.isVisible().catch(() => false))) {\n await row.click().catch(() => {});\n return true;\n }\n return false;\n };\n\n if (await selectByPreferredRow()) return true;\n\n const deadline = Date.now() + 2_000;\n while (Date.now() < deadline) {\n await waitForLookupIdle(root);\n if (await selectAnyLookupOption(root)) return true;\n if (await selectByPreferredRow()) return true;\n const selectedButton = root.getByRole('button', { name: /^Selected$/i }).first();\n if (await selectedButton.isVisible().catch(() => false)) {\n return true;\n }\n await input.page().waitForTimeout(100);\n }\n\n await input.press('ArrowDown').catch(() => {});\n await input.press('Enter').catch(() => {});\n const selectedButton = root.getByRole('button', { name: /^Selected$/i }).first();\n if (await selectedButton.isVisible().catch(() => false)) {\n return true;\n }\n return await selectAnyLookupOption(root);\n}\n\nexport async function createSalesDocument(page: Page, options: CreateDocumentOptions): Promise<string> {\n const fixtureContext = await ensureSalesDocumentFixtures(page, options);\n const customerQuery = fixtureContext.customerQuery;\n const channelQuery = fixtureContext.channelQuery;\n let fallbackToken: string | null = options.token ?? fixtureContext.authToken ?? null;\n const resolveFallbackToken = async (): Promise<string> => {\n if (fallbackToken) return fallbackToken;\n fallbackToken = await getAuthToken(page.request, 'admin');\n return fallbackToken;\n };\n\n if (options.preferApi) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n let createPageReady = false;\n for (let attempt = 0; attempt < 3; attempt += 1) {\n await page.goto(`/backend/sales/documents/create?kind=${options.kind}`, {\n waitUntil: 'domcontentloaded',\n });\n await page.getByText(/Loading\u2026|Loading\\.\\.\\./i).first().waitFor({ state: 'hidden', timeout: TEST_WAIT_TIMEOUT_MS }).catch(() => {});\n const createButton = page.getByRole('button', { name: /^Create$/i }).first();\n if (await createButton.isVisible().catch(() => false)) {\n createPageReady = true;\n break;\n }\n const recovered = await recoverGenericErrorPageIfPresent(page);\n if (!recovered && attempt === 2) {\n await expect(createButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n }\n }\n if (!createPageReady) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n await expect(page.getByRole('button', { name: /^Create$/i }).first()).toBeVisible({\n timeout: TEST_WAIT_TIMEOUT_MS,\n });\n\n const generateButton = page.getByRole('button', { name: /Generate/i }).first();\n const createButton = page.getByRole('button', { name: /^Create$/i }).first();\n const hasGenerateButton = (await generateButton.count()) > 0;\n if (hasGenerateButton) {\n await expect(generateButton).toBeVisible({ timeout: 10_000 });\n }\n\n await page.getByText('Document type').click();\n const customerSelected = await selectLookupValue(\n page.getByRole('textbox', { name: /Search customers/i }).first(),\n customerQuery,\n new RegExp(escapeRegExp(customerQuery), 'i'),\n );\n const channelSelected = await selectLookupValue(\n page.getByRole('textbox', { name: /Select a channel/i }).first(),\n channelQuery,\n new RegExp(escapeRegExp(channelQuery), 'i'),\n );\n if (!customerSelected || !channelSelected) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n await selectFirstAddressIfAvailable(page);\n\n const createEnabled = await createButton.isEnabled().catch(() => false);\n if (!createEnabled) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n await createButton.click();\n const navigated = await page.waitForURL(\n new RegExp(\n `/backend/sales/(?:documents/[0-9a-f-]{36}\\\\?kind=${options.kind}|${options.kind === 'order' ? 'orders' : 'quotes'}/[0-9a-f-]{36})$`,\n 'i',\n ),\n { timeout: TEST_WAIT_TIMEOUT_MS },\n ).then(() => true).catch(() => false);\n if (!navigated) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n const match = page.url().match(/\\/backend\\/sales\\/(?:documents|orders|quotes)\\/([0-9a-f-]{36})/i);\n if (!match) {\n throw new Error(`Could not resolve document id from URL: ${page.url()}`);\n }\n const loaded = await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS);\n if (!loaded) {\n await openSalesDocumentPage(page, match[1], options.kind);\n }\n return match[1];\n}\n\nfunction lineDialog(page: Page): Locator {\n return page.getByRole('dialog', { name: /Add line|Edit line/i });\n}\n\nasync function selectFirstOption(container: Locator, rowNamePattern: RegExp): Promise<void> {\n const optionRow = container.getByRole('button', { name: rowNamePattern }).first();\n await optionRow.waitFor({ state: 'visible', timeout: 4_000 }).catch(() => {});\n if ((await optionRow.count()) === 0) return;\n\n const selectButton = optionRow.getByRole('button', { name: /^Select$/i }).first();\n if ((await selectButton.count()) > 0) {\n await selectButton.click();\n return;\n }\n await optionRow.click();\n}\n\nasync function selectFirstLookupOption(input: Locator, rowNamePattern: RegExp): Promise<void> {\n const root = lookupRootFromInput(input);\n await waitForLookupIdle(root);\n await selectFirstOption(root, rowNamePattern);\n}\n\nasync function selectShipmentMethod(dialog: Locator): Promise<void> {\n const shippingMethodInput = dialog.getByPlaceholder(/Select method/i).first();\n if ((await shippingMethodInput.count()) === 0) return;\n const selected = await selectLookupValue(shippingMethodInput, 'Standard', /standard ground|express air|standard/i);\n if (!selected) {\n await selectFirstLookupOption(shippingMethodInput, /standard ground|express air|standard/i);\n }\n}\n\nasync function selectShipmentStatus(dialog: Locator): Promise<void> {\n const statusInput = dialog.getByPlaceholder(/Select shipment status/i).first();\n if ((await statusInput.count()) > 0) {\n const selected = await selectLookupValue(statusInput, 'Shipped', /shipped|in transit|packed/i);\n if (selected) return;\n await selectFirstLookupOption(statusInput, /shipped|in transit|packed/i);\n return;\n }\n}\n\nasync function selectShipmentAddress(dialog: Locator): Promise<void> {\n const addressInput = dialog.getByPlaceholder(/Select address/i).first();\n if ((await addressInput.count()) === 0) return;\n const currentValue = await addressInput.inputValue().catch(() => '');\n if (currentValue.trim().length > 0) return;\n const selected = await selectLookupValue(addressInput, 'Address', /shipping address|document address|address/i);\n if (!selected) {\n await selectFirstLookupOption(addressInput, /shipping address|document address|address/i);\n }\n}\n\nasync function fillShipmentQuantity(dialog: Locator): Promise<void> {\n const quantityInputs = dialog.getByRole('spinbutton');\n const count = await quantityInputs.count();\n for (let index = 0; index < count; index += 1) {\n const input = quantityInputs.nth(index);\n const isVisible = await input.isVisible().catch(() => false);\n const isEnabled = await input.isEnabled().catch(() => false);\n if (!isVisible || !isEnabled) continue;\n await input.fill('1').catch(() => {});\n }\n}\n\nasync function fillShipmentDates(dialog: Locator): Promise<void> {\n const now = new Date();\n const day = String(now.getDate()).padStart(2, '0');\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const year = String(now.getFullYear());\n const shippedDateValue = `${day}/${month}/${year}`;\n\n const shippedDateInput = dialog.getByLabel(/Shipped date/i).first();\n if ((await shippedDateInput.count()) > 0) {\n const currentValue = await shippedDateInput.inputValue().catch(() => '');\n if (currentValue.trim().length === 0) {\n await shippedDateInput.fill(shippedDateValue).catch(() => {});\n }\n }\n}\n\nasync function fillShipmentNumber(dialog: Locator, shipmentNumber: string): Promise<void> {\n const shipmentNumberInput = dialog.getByRole('textbox').first();\n if (!(await shipmentNumberInput.isVisible().catch(() => false)) && (await shipmentNumberInput.count().catch(() => 0)) === 0) {\n return;\n }\n await waitForStableVisibility(shipmentNumberInput, 4_000).catch(() => {});\n await shipmentNumberInput.fill(shipmentNumber).catch(() => {});\n await shipmentNumberInput.press('Tab').catch(() => {});\n}\n\nexport async function addCustomLine(page: Page, options: AddLineOptions): Promise<void> {\n await ensureSalesDocumentReady(page);\n await page.getByRole('button', { name: /^Items$/i }).click();\n const addItemButton = page.getByRole('button', { name: /Add item/i }).first();\n await expect(addItemButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await expect(addItemButton).toBeEnabled({ timeout: TEST_WAIT_TIMEOUT_MS });\n await addItemButton.click();\n\n const dialog = lineDialog(page);\n await expect(dialog).toBeVisible();\n\n const customLineButton = dialog.getByRole('button', { name: /Custom line/i });\n await expect(customLineButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await customLineButton.click();\n\n const nameInput = dialog.getByRole('textbox', { name: /Optional line name/i });\n await expect(nameInput).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await nameInput.fill(options.name);\n await dialog.getByRole('textbox', { name: '0.00' }).fill(String(options.unitPriceGross));\n await dialog.getByRole('textbox', { name: '1' }).fill(String(options.quantity));\n\n if (options.taxClassName) {\n // Radix Select inside Dialog \u2014 force click on option to bypass overlay\n const taxClassTrigger = dialog\n .locator('[role=\"combobox\"]')\n .filter({ hasText: /No tax class selected/i })\n .first();\n if ((await taxClassTrigger.count()) > 0) {\n await taxClassTrigger.click();\n const opt = page.getByRole('option', { name: options.taxClassName, exact: true });\n await opt.first().waitFor({ state: 'visible', timeout: 3_000 });\n await opt.first().click({ force: true });\n }\n }\n\n const submitButton = dialog.getByRole('button', { name: /Add item/i });\n await expect(submitButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await expect(submitButton).toBeEnabled({ timeout: TEST_WAIT_TIMEOUT_MS });\n const lineRow = page.getByRole('row', { name: new RegExp(escapeRegExp(options.name), 'i') });\n for (let attempt = 0; attempt < 2; attempt += 1) {\n await submitButton.click();\n await Promise.race([\n dialog.waitFor({ state: 'hidden', timeout: 3_000 }).catch(() => {}),\n lineRow.waitFor({ state: 'visible', timeout: 3_000 }).catch(() => {}),\n ]);\n if (await lineRow.isVisible().catch(() => false)) break;\n if (!(await dialog.isVisible().catch(() => false))) break;\n }\n\n if (await dialog.isVisible().catch(() => false)) {\n await expect(dialog).toBeHidden({ timeout: TEST_WAIT_TIMEOUT_MS });\n }\n await page.getByRole('button', { name: /^Items$/i }).click().catch(() => {});\n await expect(lineRow).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n}\n\nexport async function updateLineQuantity(page: Page, lineName: string, quantity: number): Promise<void> {\n await page.getByRole('button', { name: /^Items$/i }).click();\n const row = page.getByRole('row', { name: new RegExp(escapeRegExp(lineName), 'i') });\n await row.click();\n\n const dialog = page.getByRole('dialog', { name: /Edit line/i });\n await expect(dialog).toBeVisible();\n await dialog.getByRole('textbox', { name: '1' }).fill(String(quantity));\n await dialog.getByRole('button', { name: /Save changes/i }).click();\n\n await expect(page.getByRole('row', { name: new RegExp(`${escapeRegExp(lineName)}.*\\\\b${quantity}\\\\b`, 'i') })).toBeVisible();\n}\n\nexport async function deleteLine(page: Page, lineName: string): Promise<void> {\n await page.getByRole('button', { name: /^Items$/i }).click();\n const row = page.getByRole('row', { name: new RegExp(escapeRegExp(lineName), 'i') });\n await expect(row).toBeVisible();\n await row.locator('button').last().click();\n\n const confirmDialog = page.getByRole('alertdialog');\n if (await confirmDialog.isVisible().catch(() => false)) {\n await confirmDialog.getByRole('button', { name: /^Delete$/i }).first().click();\n await expect(confirmDialog).toBeHidden();\n }\n\n await expect(page.getByRole('row', { name: new RegExp(escapeRegExp(lineName), 'i') })).toHaveCount(0);\n}\n\nexport async function addAdjustment(page: Page, options: AddAdjustmentOptions): Promise<void> {\n const adjustmentsTab = page.getByRole('button', { name: /^Adjustments$/i }).first();\n await waitForStableVisibility(adjustmentsTab, TEST_WAIT_TIMEOUT_MS);\n await adjustmentsTab.click();\n const addAdjustmentButton = page.getByRole('button', { name: /Add adjustment/i }).first();\n await waitForStableVisibility(addAdjustmentButton, TEST_WAIT_TIMEOUT_MS);\n await addAdjustmentButton.click();\n\n const dialog = page.getByRole('dialog', { name: /Add adjustment/i });\n await expect(dialog).toBeVisible();\n const adjustmentRow = page.getByRole('row', { name: new RegExp(escapeRegExp(options.label), 'i') });\n const fillAdjustmentForm = async (): Promise<void> => {\n await dialog.getByText(/Loading adjustments/i).waitFor({ state: 'hidden', timeout: 3_000 }).catch(() => {});\n // Radix Select trigger \u2014 target by CrudForm field id (kind picker)\n const kindTrigger = dialog.locator('[data-crud-field-id=\"kind\"] [role=\"combobox\"]').first();\n await expect(kindTrigger).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n\n const labelInput = dialog.getByPlaceholder(/e\\.g\\. Shipping fee/i).first();\n await expect(labelInput).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await labelInput.fill(options.label);\n await expect(labelInput).toHaveValue(options.label, { timeout: 2_000 });\n\n if ((await kindTrigger.count()) > 0) {\n const expectedKindValue = normalizeAdjustmentKindValue(options.kindLabel ?? 'Surcharge');\n const kindLabel = options.kindLabel ?? 'Surcharge';\n // Open Radix Select via click; then drive selection via keyboard so the\n // listbox keystroke matching jumps to the desired option (Discount /\n // Surcharge / etc.). This sidesteps modal-backdrop click interception\n // that occurs when a Radix Select is rendered inside a Radix Dialog.\n await kindTrigger.click();\n await page.waitForTimeout(150);\n // Type the first letter to jump to the matching option\n await page.keyboard.type(kindLabel.charAt(0));\n await page.waitForTimeout(150);\n await page.keyboard.press('Enter');\n void expectedKindValue;\n }\n\n const fixedAmountButton = dialog.getByRole('button', { name: /^Fixed amount$/i }).first();\n if ((await fixedAmountButton.count()) > 0) {\n await fixedAmountButton.click().catch(() => {});\n }\n\n const enabledAmountInputs = dialog.locator('input[placeholder=\"0.00\"]:not([disabled])');\n await expect(enabledAmountInputs.first()).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n if ((await enabledAmountInputs.count()) > 0) {\n await enabledAmountInputs.first().fill(String(options.netAmount));\n await expect(enabledAmountInputs.first()).toHaveValue(String(options.netAmount), { timeout: 2_000 }).catch(() => {});\n }\n };\n\n let saved = false;\n for (let attempt = 0; attempt < 3; attempt += 1) {\n await fillAdjustmentForm();\n const submitButton = dialog.getByRole('button', { name: /Add adjustment/i }).first();\n await waitForStableVisibility(submitButton, 4_000).catch(() => {});\n await submitButton.click();\n await Promise.race([\n dialog.waitFor({ state: 'hidden', timeout: 3_000 }).catch(() => {}),\n adjustmentRow.waitFor({ state: 'visible', timeout: 3_000 }).catch(() => {}),\n ]);\n saved =\n !(await dialog.isVisible().catch(() => false)) ||\n (await adjustmentRow.isVisible().catch(() => false));\n if (saved) break;\n }\n\n if (await dialog.isVisible().catch(() => false)) {\n await expect(dialog).toBeHidden({ timeout: 5_000 });\n }\n if (!(await adjustmentRow.isVisible().catch(() => false))) {\n await adjustmentsTab.click().catch(() => {});\n await adjustmentRow.waitFor({ state: 'visible', timeout: 2_000 }).catch(() => {});\n }\n}\n\nexport async function addPayment(page: Page, amount: number): Promise<{ amountLabel: string; added: boolean }> {\n await ensureSalesDocumentReady(page);\n const paymentsTab = page.getByRole('button', { name: /^Payments$/i }).first();\n await waitForStableVisibility(paymentsTab, TEST_WAIT_TIMEOUT_MS);\n await paymentsTab.click();\n const amountLabel = amount.toFixed(2);\n const amountInputValue = String(Math.max(1, Math.round(amount)));\n const addPaymentButton = page.getByRole('button', { name: /Add payment/i }).first();\n await waitForStableVisibility(addPaymentButton, TEST_WAIT_TIMEOUT_MS);\n await expect(addPaymentButton).toBeEnabled({ timeout: TEST_WAIT_TIMEOUT_MS });\n await addPaymentButton.click();\n\n const dialog = page.getByRole('dialog', { name: /Add payment/i });\n const amountInput = dialog.locator('input[placeholder=\"0.00\"]').first();\n await waitForDialogFieldReady(dialog, amountInput, /Loading payment methods\u2026|Loading payment methods\\.\\.\\./i);\n const setAmount = async (): Promise<void> => {\n const refreshedAmountInput = dialog.locator('input[placeholder=\"0.00\"]').first();\n await waitForStableVisibility(refreshedAmountInput, 4_000).catch(() => {});\n await refreshedAmountInput.fill(amountInputValue).catch(() => {});\n await refreshedAmountInput.press('Tab').catch(() => {});\n };\n const selectMethodInput = dialog.getByPlaceholder(/Search payment method/i).first();\n const statusInput = dialog.getByPlaceholder(/Select status/i).first();\n await setAmount();\n await waitForStableVisibility(selectMethodInput, 4_000).catch(() => {});\n await selectLookupValue(selectMethodInput, 'Bank', /bank transfer|credit card|cash on delivery/i).catch(() => false);\n await waitForStableVisibility(statusInput, 4_000).catch(() => {});\n await selectLookupValue(statusInput, 'Pending', /pending|captured/i).catch(() => false);\n const saveButton = dialog.getByRole('button', { name: /Save/i }).first();\n const operationMessage = page.getByText(/Last operation:\\s*Create payment/i).first();\n for (let attempt = 0; attempt < 2; attempt += 1) {\n await setAmount();\n await selectLookupValue(selectMethodInput, 'Bank', /bank transfer|credit card|cash on delivery/i).catch(() => false);\n await selectLookupValue(statusInput, 'Pending', /pending|captured/i).catch(() => false);\n await waitForStableVisibility(saveButton, 4_000).catch(() => {});\n await saveButton.click();\n await Promise.race([\n dialog.waitFor({ state: 'hidden', timeout: 3_500 }).catch(() => {}),\n operationMessage.waitFor({ state: 'visible', timeout: 3_500 }).catch(() => {}),\n dialog.getByText(/This field is required/i).first().waitFor({ state: 'visible', timeout: 3_500 }).catch(() => {}),\n ]);\n if (!(await dialog.isVisible().catch(() => false))) break;\n if (await operationMessage.isVisible().catch(() => false)) break;\n await waitForOptionalTextToDisappear(dialog, /Loading payment methods\u2026|Loading payment methods\\.\\.\\./i, 3_000);\n }\n if (await dialog.isVisible().catch(() => false)) {\n await dialog.press('Escape').catch(() => {});\n await dialog.waitFor({ state: 'hidden', timeout: 1_500 }).catch(() => {});\n }\n await operationMessage.waitFor({ state: 'visible', timeout: 2_500 }).catch(() => {});\n let added = await operationMessage.isVisible().catch(() => false);\n if (!added) {\n added = await addPaymentViaApi(page, amount);\n }\n return { amountLabel, added };\n}\n\nexport async function addShipment(page: Page): Promise<{ trackingNumber: string; shipmentNumber: string; added: boolean }> {\n await ensureSalesDocumentReady(page);\n await ensureShippingMethodFixture(page);\n const shipmentsTab = page.getByRole('button', { name: /^Shipments$/i }).first();\n await waitForStableVisibility(shipmentsTab, TEST_WAIT_TIMEOUT_MS);\n await shipmentsTab.click();\n const trackingNumber = `SHIP-${Date.now()}`;\n const shipmentNumber = String(Date.now());\n const dialog = page.getByRole('dialog', { name: /Add shipment/i });\n const openShipmentDialog = async (): Promise<boolean> => {\n const addShipmentButtons = page.getByRole('button', { name: /Add shipment/i });\n const buttonCount = await addShipmentButtons.count();\n for (let index = buttonCount - 1; index >= 0; index -= 1) {\n const button = addShipmentButtons.nth(index);\n if (!(await button.isVisible().catch(() => false))) continue;\n if (!(await button.isEnabled().catch(() => false))) continue;\n await waitForStableVisibility(button, TEST_WAIT_TIMEOUT_MS).catch(() => {});\n await button.scrollIntoViewIfNeeded().catch(() => {});\n await button.click().catch(() => {});\n const visible = await dialog.waitFor({ state: 'visible', timeout: 2_500 }).then(() => true).catch(() => false);\n if (visible) return true;\n }\n return false;\n };\n\n let dialogReady = false;\n for (let attempt = 0; attempt < 2; attempt += 1) {\n const opened = await openShipmentDialog();\n if (!opened) break;\n await dialog\n .getByText(/Loading shipments\u2026|Loading shipments\\.\\.\\./i)\n .first()\n .waitFor({ state: 'hidden', timeout: 5_000 })\n .catch(() => {});\n const shipmentNumberInput = dialog.locator('input, textarea').first();\n if (await shipmentNumberInput.isVisible().catch(() => false)) {\n await waitForStableVisibility(shipmentNumberInput, TEST_WAIT_TIMEOUT_MS).catch(() => {});\n dialogReady = true;\n break;\n }\n await dialog.getByRole('button', { name: /Close/i }).first().click().catch(() => {});\n await dialog.waitFor({ state: 'hidden', timeout: 2_000 }).catch(() => {});\n }\n if (!dialogReady) {\n const added = await addShipmentViaApi(page, shipmentNumber, trackingNumber);\n if (!added) {\n await openShipmentDialog();\n const shipmentNumberInput = dialog.locator('input, textarea').first();\n await waitForDialogFieldReady(dialog, shipmentNumberInput, /Loading shipments\u2026|Loading shipments\\.\\.\\./i);\n } else {\n const shipmentLabel = page.getByText(new RegExp(`Shipment\\\\s+${escapeRegExp(shipmentNumber)}`, 'i')).first();\n const visible = await shipmentLabel\n .waitFor({ state: 'visible', timeout: TEST_WAIT_TIMEOUT_MS })\n .then(() => true)\n .catch(() => false);\n return { trackingNumber, shipmentNumber, added: visible };\n }\n }\n\n const shipmentNumberInput = dialog.locator('input, textarea').first();\n await fillShipmentNumber(dialog, shipmentNumber);\n const trackingInput = dialog.getByPlaceholder(/One per line or comma separated/i).first();\n await waitForStableVisibility(trackingInput, 4_000).catch(() => {});\n await trackingInput.fill(trackingNumber).catch(() => {});\n await selectShipmentMethod(dialog);\n await selectShipmentStatus(dialog);\n await selectShipmentAddress(dialog);\n await fillShipmentQuantity(dialog);\n await fillShipmentDates(dialog);\n await fillShipmentNumber(dialog, shipmentNumber);\n\n await dialog.getByText(/Searching\u2026|Searching\\.\\.\\./i).first().waitFor({ state: 'hidden', timeout: TEST_WAIT_TIMEOUT_MS }).catch(() => {});\n const saveButton = dialog.getByRole('button', { name: /^Save\\b/i }).first();\n const canClickSave = (await saveButton.count()) > 0 && (await saveButton.isVisible().catch(() => false));\n if (canClickSave) {\n await saveButton.click({ timeout: TEST_WAIT_TIMEOUT_MS }).catch(() => {});\n } else {\n await dialog.press('ControlOrMeta+Enter').catch(() => {});\n }\n\n let closed = await dialog\n .waitFor({ state: 'hidden', timeout: TEST_WAIT_TIMEOUT_MS })\n .then(() => true)\n .catch(() => false);\n\n if (!closed) {\n for (let attempt = 0; attempt < 2; attempt += 1) {\n if (!(await dialog.isVisible().catch(() => false))) break;\n await selectShipmentMethod(dialog);\n await selectShipmentAddress(dialog);\n await fillShipmentQuantity(dialog);\n await fillShipmentDates(dialog);\n await fillShipmentNumber(dialog, shipmentNumber);\n if (canClickSave) {\n await saveButton.click({ timeout: 2_000 }).catch(() => {});\n } else {\n await dialog.press('ControlOrMeta+Enter').catch(() => {});\n }\n closed = await dialog\n .waitFor({ state: 'hidden', timeout: 2_000 })\n .then(() => true)\n .catch(() => false);\n if (closed) break;\n }\n }\n\n if (!closed) {\n return { trackingNumber, shipmentNumber, added: false };\n }\n\n await page.getByRole('button', { name: /^Shipments$/i }).click();\n const shipmentLabel = page.getByText(new RegExp(`Shipment\\\\s+${escapeRegExp(shipmentNumber)}`, 'i')).first();\n const added = await shipmentLabel\n .waitFor({ state: 'visible', timeout: TEST_WAIT_TIMEOUT_MS })\n .then(() => true)\n .catch(() => false);\n return { trackingNumber, shipmentNumber, added };\n}\n\nexport async function readGrandTotalGross(page: Page): Promise<number> {\n const row = page.getByRole('row', { name: /Grand total \\(gross\\)/i }).first();\n await expect(row).toBeVisible();\n const text = (await row.innerText()).trim();\n return parseCurrencyAmount(text);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { expect, type Locator, type Page } from '@playwright/test';\nimport { apiRequest, getAuthToken } from './api';\n\ntype DocumentKind = 'quote' | 'order';\n\ntype CreateDocumentOptions = {\n kind: DocumentKind;\n customerQuery?: string;\n channelQuery?: string;\n preferApi?: boolean;\n token?: string;\n};\n\ntype ChannelListItem = {\n id?: string | null;\n name?: string | null;\n code?: string | null;\n isActive?: boolean | null;\n};\n\ntype CustomerAddressListItem = {\n id?: string | null;\n name?: string | null;\n purpose?: string | null;\n company_name?: string | null;\n companyName?: string | null;\n address_line1?: string | null;\n addressLine1?: string | null;\n address_line2?: string | null;\n addressLine2?: string | null;\n building_number?: string | null;\n buildingNumber?: string | null;\n flat_number?: string | null;\n flatNumber?: string | null;\n city?: string | null;\n region?: string | null;\n postal_code?: string | null;\n postalCode?: string | null;\n country?: string | null;\n};\n\ntype DocumentAddressPayload = {\n customerAddressId?: string;\n name?: string;\n purpose?: string;\n companyName?: string;\n addressLine1: string;\n addressLine2?: string;\n buildingNumber?: string;\n flatNumber?: string;\n city?: string;\n region?: string;\n postalCode?: string;\n country?: string;\n};\n\ntype SalesOrderLineListItem = {\n id?: string | null;\n};\n\ntype PaymentMethodListItem = {\n id?: string | null;\n name?: string | null;\n code?: string | null;\n isActive?: boolean | null;\n};\n\ntype AddLineOptions = {\n name: string;\n quantity: number;\n unitPriceGross: number;\n taxClassName?: string;\n};\n\ntype AddAdjustmentOptions = {\n label: string;\n kindLabel?: string;\n netAmount: number;\n};\n\nconst TEST_WAIT_TIMEOUT_MS = 10_000;\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction parseCurrencyAmount(value: string): number {\n const normalized = value.replace(/,/g, '');\n const matches = normalized.match(/-?\\$[0-9]+(?:\\.[0-9]{2})?/g);\n const lastMatch = matches?.[matches.length - 1];\n if (!lastMatch) {\n throw new Error(`Could not parse currency from: ${value}`);\n }\n return Number.parseFloat(lastMatch.replace('$', ''));\n}\n\nfunction normalizeAdjustmentKindValue(kindLabel: string): string {\n return kindLabel.trim().toLowerCase().replace(/\\s+/g, '_');\n}\n\nfunction readId(payload: unknown, keys: string[]): string | null {\n if (!payload || typeof payload !== 'object') return null;\n const map = payload as Record<string, unknown>;\n for (const key of keys) {\n const value = map[key];\n if (typeof value === 'string' && value.length > 0) return value;\n }\n for (const value of Object.values(map)) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const nested = readId(value, keys);\n if (nested) return nested;\n }\n }\n return null;\n}\n\nfunction readListItems<T>(payload: { result?: { items?: T[] }; items?: T[] } | null): T[] {\n return Array.isArray(payload?.result?.items)\n ? payload.result.items\n : Array.isArray(payload?.items)\n ? payload.items\n : [];\n}\n\nfunction resolveOrderIdFromPage(page: Page): string | null {\n const match = page.url().match(/\\/backend\\/sales\\/(?:documents|orders)\\/([0-9a-f-]{36})/i);\n return match?.[1] ?? null;\n}\n\nasync function ensureSalesDocumentFixtures(\n page: Page,\n options: CreateDocumentOptions,\n): Promise<{\n customerQuery: string;\n channelQuery: string;\n customerEntityId?: string | null;\n channelId?: string | null;\n customerAddressId?: string | null;\n authToken?: string | null;\n}> {\n let customerQuery = options.customerQuery;\n let channelQuery = options.channelQuery;\n let customerEntityId: string | null = null;\n let channelId: string | null = null;\n let customerAddressId: string | null = null;\n\n if (customerQuery && channelQuery) {\n return { customerQuery, channelQuery, authToken: options.token ?? null };\n }\n\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n if (!token) {\n if (!customerQuery) {\n customerQuery = `QA Sales Customer ${Date.now()}`;\n await page.goto('/backend/customers/companies/create');\n await page.locator('form').getByRole('textbox').first().fill(customerQuery);\n await page.getByPlaceholder('https://example.com').fill('https://example.com');\n await page.locator('form').getByRole('button', { name: /Create Company/i }).click();\n await expect(page).toHaveURL(/\\/backend\\/customers\\/companies\\/[0-9a-f-]{36}$/i);\n }\n if (!channelQuery) {\n const timestamp = Date.now();\n channelQuery = `QA Sales Channel ${timestamp}`;\n const channelCode = `qa-sales-channel-${timestamp}`;\n await page.goto('/backend/sales/channels');\n await page.getByRole('link', { name: /Add channel/i }).click();\n const createForm = page.locator('form').first();\n await createForm.getByRole('textbox').nth(0).fill(channelQuery);\n await createForm.getByRole('textbox').nth(1).fill(channelCode);\n await page.getByRole('button', { name: /Create channel|Create/i }).last().click();\n await expect(page).toHaveURL(/\\/backend\\/sales\\/channels$/i);\n }\n return {\n customerQuery,\n channelQuery,\n authToken: options.token ?? null,\n };\n }\n\n if (!customerQuery) {\n const companyName = `QA Sales Customer ${Date.now()}`;\n const companyResponse = await apiRequest(page.request, 'POST', '/api/customers/companies', {\n token,\n data: { displayName: companyName },\n }).catch(() => null);\n if (companyResponse && companyResponse.ok()) {\n const companyBody = (await companyResponse.json().catch(() => null)) as unknown;\n customerEntityId = readId(companyBody, ['id', 'entityId', 'companyId']);\n if (customerEntityId) {\n await apiRequest(page.request, 'POST', '/api/customers/addresses', {\n token,\n data: {\n entityId: customerEntityId,\n name: 'Primary',\n purpose: 'Shipping',\n addressLine1: '100 QA Street',\n city: 'Austin',\n postalCode: '78701',\n country: 'US',\n isPrimary: true,\n },\n }).then(async (response) => {\n const body = (await response.json().catch(() => null)) as unknown;\n customerAddressId = readId(body, ['id', 'addressId']);\n }).catch(() => {});\n customerQuery = companyName;\n }\n }\n if (!customerQuery) {\n customerQuery = 'Copperleaf';\n }\n }\n\n if (!channelQuery) {\n const existingChannelsResponse = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/channels?page=1&pageSize=20&isActive=true',\n { token },\n ).catch(() => null);\n const existingChannelsBody = (await existingChannelsResponse?.json().catch(() => null)) as { items?: ChannelListItem[] } | null;\n const existingChannels = Array.isArray(existingChannelsBody?.items) ? existingChannelsBody.items : [];\n const preferredExistingChannel =\n existingChannels.find((item) => item.code === 'online' && item.isActive !== false) ??\n existingChannels.find((item) => item.isActive !== false);\n if (preferredExistingChannel?.name) {\n channelQuery = preferredExistingChannel.name;\n channelId = preferredExistingChannel.id ?? null;\n } else {\n const timestamp = Date.now();\n const channelName = `QA Sales Channel ${timestamp}`;\n const channelCode = `qa-sales-channel-${timestamp}`;\n const channelResponse = await apiRequest(page.request, 'POST', '/api/sales/channels', {\n token,\n data: {\n name: channelName,\n code: channelCode,\n },\n }).catch(() => null);\n if (channelResponse && channelResponse.ok()) {\n channelQuery = channelName;\n const channelBody = (await channelResponse.json().catch(() => null)) as unknown;\n channelId = readId(channelBody, ['id', 'channelId']);\n } else {\n channelQuery = 'online';\n }\n }\n }\n\n return {\n customerQuery: customerQuery ?? 'Copperleaf',\n channelQuery: channelQuery ?? 'online',\n customerEntityId,\n channelId,\n customerAddressId,\n authToken: token,\n };\n}\n\nasync function selectFirstAddressIfAvailable(page: Page): Promise<void> {\n // Radix Select: trigger has placeholder text \"Select address\" rendered inside\n const addressTrigger = page\n .locator('[role=\"combobox\"]')\n .filter({ hasText: /Select address/i })\n .first();\n if ((await addressTrigger.count()) === 0) return;\n if (!(await addressTrigger.isEnabled().catch(() => false))) return;\n\n await addressTrigger.click();\n // Pick the first available option from the portal-rendered listbox\n const firstOption = page.getByRole('option').first();\n if ((await firstOption.count()) === 0) {\n // Close listbox if no options\n await page.keyboard.press('Escape');\n return;\n }\n await firstOption.click();\n}\n\nasync function ensureShippingMethodFixture(page: Page): Promise<void> {\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n if (!token) return;\n\n const existing = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/shipping-methods?page=1&pageSize=1&isActive=true',\n { token },\n ).catch(() => null);\n const existingBody = (await existing?.json().catch(() => null)) as { result?: { items?: unknown[] } } | null;\n const existingItems = Array.isArray(existingBody?.result?.items) ? existingBody?.result?.items : [];\n if (existingItems.length > 0) return;\n\n const stamp = Date.now();\n await apiRequest(page.request, 'POST', '/api/sales/shipping-methods', {\n token,\n data: {\n name: `QA Shipping Method ${stamp}`,\n code: `qa-shipping-${stamp}`,\n isActive: true,\n currencyCode: 'USD',\n baseRateNet: '10.00',\n baseRateGross: '10.00',\n },\n }).catch(() => {});\n}\n\nfunction lookupRootFromInput(input: Locator): Locator {\n return input.locator('xpath=ancestor::div[contains(@class,\"space-y-3\")][1]');\n}\n\nasync function waitForLookupIdle(root: Locator): Promise<void> {\n await root\n .getByText(/Searching\u2026|Searching\\.\\.\\.|Loading\u2026|Loading\\.\\.\\./i)\n .first()\n .waitFor({ state: 'hidden', timeout: 1_200 })\n .catch(() => {});\n}\n\nasync function waitForOptionalTextToDisappear(scope: Locator, pattern: RegExp, timeout = 2_500): Promise<void> {\n await scope.getByText(pattern).first().waitFor({ state: 'hidden', timeout }).catch(() => {});\n}\n\nasync function waitForStableVisibility(locator: Locator, timeout = TEST_WAIT_TIMEOUT_MS): Promise<void> {\n await expect(locator).toBeVisible({ timeout });\n let stableChecks = 0;\n const deadline = Date.now() + Math.min(timeout, 2_000);\n while (Date.now() < deadline) {\n if (await locator.isVisible().catch(() => false)) {\n stableChecks += 1;\n if (stableChecks >= 3) return;\n } else {\n stableChecks = 0;\n }\n await locator.page().waitForTimeout(50).catch(() => {});\n }\n}\n\nasync function waitForDialogFieldReady(\n dialog: Locator,\n field: Locator,\n loadingPattern?: RegExp,\n): Promise<void> {\n await expect(dialog).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n if (loadingPattern) {\n await waitForOptionalTextToDisappear(dialog, loadingPattern, TEST_WAIT_TIMEOUT_MS);\n }\n await waitForStableVisibility(field, TEST_WAIT_TIMEOUT_MS);\n await field.scrollIntoViewIfNeeded().catch(() => {});\n}\n\nasync function fillControlledInput(input: Locator, value: string, timeout = 2_000): Promise<void> {\n await waitForStableVisibility(input, TEST_WAIT_TIMEOUT_MS);\n await input.fill(value);\n await input.evaluate((element, nextValue) => {\n const control = element as HTMLInputElement | HTMLTextAreaElement;\n const prototype = control instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;\n const valueSetter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set;\n valueSetter?.call(control, nextValue);\n control.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: nextValue }));\n control.dispatchEvent(new Event('change', { bubbles: true }));\n }, value);\n await expect(input).toHaveValue(value, { timeout });\n await input.press('Tab').catch(() => {});\n}\n\nasync function recoverGenericErrorPageIfPresent(page: Page): Promise<boolean> {\n const errorHeading = page.getByRole('heading', { name: /^Something went wrong$/i }).first();\n if (!(await errorHeading.isVisible().catch(() => false))) return false;\n const retryButton = page.getByRole('button', { name: /Try again/i }).first();\n if (await retryButton.isVisible().catch(() => false)) {\n await retryButton.click().catch(() => {});\n await page.waitForLoadState('domcontentloaded').catch(() => {});\n } else {\n await page.reload({ waitUntil: 'domcontentloaded' }).catch(() => {});\n }\n return true;\n}\n\nasync function resolveCustomerEntityId(\n page: Page,\n token: string,\n customerQuery: string,\n): Promise<string | null> {\n const params = new URLSearchParams({ page: '1', pageSize: '5', search: customerQuery });\n const response = await apiRequest(page.request, 'GET', `/api/customers/companies?${params.toString()}`, { token }).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: Array<Record<string, unknown>> };\n items?: Array<Record<string, unknown>>;\n } | null;\n const items = Array.isArray(body?.result?.items)\n ? body.result.items\n : Array.isArray(body?.items)\n ? body.items\n : [];\n const exactMatch = items.find((item) => {\n const displayName = typeof item.displayName === 'string'\n ? item.displayName\n : typeof item.display_name === 'string'\n ? item.display_name\n : '';\n return displayName.trim().toLowerCase() === customerQuery.trim().toLowerCase();\n }) ?? items[0];\n return exactMatch ? readId(exactMatch, ['id', 'entityId', 'companyId']) : null;\n}\n\nfunction toDocumentAddressPayload(address: CustomerAddressListItem): DocumentAddressPayload | null {\n const addressLine1 = typeof address.addressLine1 === 'string'\n ? address.addressLine1\n : typeof address.address_line1 === 'string'\n ? address.address_line1\n : null;\n if (!addressLine1) return null;\n return {\n customerAddressId: typeof address.id === 'string' ? address.id : undefined,\n name: typeof address.name === 'string' ? address.name : undefined,\n purpose: typeof address.purpose === 'string' ? address.purpose : undefined,\n companyName: typeof address.companyName === 'string'\n ? address.companyName\n : typeof address.company_name === 'string'\n ? address.company_name\n : undefined,\n addressLine1,\n addressLine2: typeof address.addressLine2 === 'string'\n ? address.addressLine2\n : typeof address.address_line2 === 'string'\n ? address.address_line2\n : undefined,\n buildingNumber: typeof address.buildingNumber === 'string'\n ? address.buildingNumber\n : typeof address.building_number === 'string'\n ? address.building_number\n : undefined,\n flatNumber: typeof address.flatNumber === 'string'\n ? address.flatNumber\n : typeof address.flat_number === 'string'\n ? address.flat_number\n : undefined,\n city: typeof address.city === 'string' ? address.city : undefined,\n region: typeof address.region === 'string' ? address.region : undefined,\n postalCode: typeof address.postalCode === 'string'\n ? address.postalCode\n : typeof address.postal_code === 'string'\n ? address.postal_code\n : undefined,\n country: typeof address.country === 'string' ? address.country : undefined,\n };\n}\n\nasync function ensureCustomerAddressFixture(\n page: Page,\n token: string,\n customerEntityId: string,\n preferredAddressId?: string | null,\n): Promise<DocumentAddressPayload | null> {\n const existingResponse = await apiRequest(\n page.request,\n 'GET',\n `/api/customers/addresses?page=1&pageSize=20&entityId=${customerEntityId}`,\n { token },\n ).catch(() => null);\n const existingBody = (await existingResponse?.json().catch(() => null)) as {\n result?: { items?: CustomerAddressListItem[] };\n items?: CustomerAddressListItem[];\n } | null;\n const existingItems = Array.isArray(existingBody?.result?.items)\n ? existingBody.result.items\n : Array.isArray(existingBody?.items)\n ? existingBody.items\n : [];\n const preferredAddress = existingItems.find((item) => item.id === preferredAddressId)\n ?? existingItems.find((item) => item.purpose?.toLowerCase() === 'shipping')\n ?? existingItems[0];\n const preferredPayload = preferredAddress ? toDocumentAddressPayload(preferredAddress) : null;\n if (preferredPayload) return preferredPayload;\n\n const createResponse = await apiRequest(page.request, 'POST', '/api/customers/addresses', {\n token,\n data: {\n entityId: customerEntityId,\n name: 'Primary',\n purpose: 'Shipping',\n addressLine1: '100 QA Street',\n city: 'Austin',\n postalCode: '78701',\n country: 'US',\n isPrimary: true,\n },\n }).catch(() => null);\n const createBody = (await createResponse?.json().catch(() => null)) as unknown;\n const createdAddressId = readId(createBody, ['id', 'addressId']);\n if (!createResponse?.ok() || !createdAddressId) return null;\n return {\n customerAddressId: createdAddressId,\n name: 'Primary',\n purpose: 'Shipping',\n addressLine1: '100 QA Street',\n city: 'Austin',\n postalCode: '78701',\n country: 'US',\n };\n}\n\nasync function resolveSalesChannelId(page: Page, token: string, channelQuery: string): Promise<string | null> {\n const resolveItems = async (search?: string): Promise<ChannelListItem[]> => {\n const params = new URLSearchParams({ page: '1', pageSize: '5', isActive: 'true' });\n if (search && search.trim().length > 0) params.set('search', search.trim());\n const response = await apiRequest(page.request, 'GET', `/api/sales/channels?${params.toString()}`, {\n token,\n }).catch(() => null);\n const body = (await response?.json().catch(() => null)) as { result?: { items?: ChannelListItem[] }; items?: ChannelListItem[] } | null;\n return Array.isArray(body?.result?.items)\n ? body.result.items\n : Array.isArray(body?.items)\n ? body.items\n : [];\n };\n const initialItems = await resolveItems(channelQuery);\n const items = initialItems.length > 0 ? initialItems : await resolveItems();\n const normalizedQuery = channelQuery.trim().toLowerCase();\n const exactMatch = items.find((item) => item.name?.trim().toLowerCase() === normalizedQuery)\n ?? items.find((item) => item.code?.trim().toLowerCase() === normalizedQuery)\n ?? items.find((item) => item.code === 'online')\n ?? items[0];\n return exactMatch?.id ?? null;\n}\n\nasync function resolveOrderLineId(page: Page, token: string, orderId: string): Promise<string | null> {\n const response = await apiRequest(page.request, 'GET', `/api/sales/order-lines?page=1&pageSize=20&orderId=${orderId}`, {\n token,\n }).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: SalesOrderLineListItem[] };\n items?: SalesOrderLineListItem[];\n } | null;\n const items = readListItems(body);\n return items.find((item) => typeof item.id === 'string' && item.id.length > 0)?.id ?? null;\n}\n\nasync function resolveShippingMethodId(page: Page, token: string): Promise<string | null> {\n const response = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/shipping-methods?page=1&pageSize=20&isActive=true',\n { token },\n ).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: ChannelListItem[] };\n items?: ChannelListItem[];\n } | null;\n const items = readListItems(body);\n const preferred = items.find((item) => item.code === 'standard-ground')\n ?? items.find((item) => item.name?.toLowerCase().includes('standard'))\n ?? items[0];\n return preferred?.id ?? null;\n}\n\nasync function resolvePaymentMethodId(page: Page, token: string): Promise<string | null> {\n const response = await apiRequest(\n page.request,\n 'GET',\n '/api/sales/payment-methods?page=1&pageSize=20&isActive=true',\n { token },\n ).catch(() => null);\n const body = (await response?.json().catch(() => null)) as {\n result?: { items?: PaymentMethodListItem[] };\n items?: PaymentMethodListItem[];\n } | null;\n const items = readListItems(body);\n const preferred = items.find((item) => item.code === 'bank-transfer')\n ?? items.find((item) => item.name?.toLowerCase().includes('bank'))\n ?? items[0];\n return preferred?.id ?? null;\n}\n\nasync function refreshSalesDocumentPage(page: Page, activeTabName: 'Shipments' | 'Payments'): Promise<void> {\n await page.reload({ waitUntil: 'domcontentloaded' }).catch(() => {});\n await ensureSalesDocumentReady(page);\n const tab = page.getByRole('button', { name: new RegExp(`^${activeTabName}$`, 'i') }).first();\n await waitForStableVisibility(tab, TEST_WAIT_TIMEOUT_MS).catch(() => {});\n await tab.click().catch(() => {});\n}\n\nasync function addShipmentViaApi(\n page: Page,\n shipmentNumber: string,\n trackingNumber: string,\n): Promise<boolean> {\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n const orderId = resolveOrderIdFromPage(page);\n if (!token || !orderId) return false;\n const [orderLineId, shippingMethodId] = await Promise.all([\n resolveOrderLineId(page, token, orderId),\n resolveShippingMethodId(page, token),\n ]);\n if (!orderLineId) return false;\n const response = await apiRequest(page.request, 'POST', '/api/sales/shipments', {\n token,\n data: {\n orderId,\n shipmentNumber,\n ...(shippingMethodId ? { shippingMethodId } : {}),\n trackingNumbers: [trackingNumber],\n shippedAt: new Date().toISOString(),\n currencyCode: 'USD',\n items: [{ orderLineId, quantity: '1' }],\n },\n }).catch(() => null);\n if (!response?.ok()) return false;\n await refreshSalesDocumentPage(page, 'Shipments');\n return true;\n}\n\nasync function addPaymentViaApi(page: Page, amount: number): Promise<boolean> {\n const token = await getAuthToken(page.request, 'admin').catch(() => null);\n const orderId = resolveOrderIdFromPage(page);\n if (!token || !orderId) return false;\n const paymentMethodId = await resolvePaymentMethodId(page, token);\n const response = await apiRequest(page.request, 'POST', '/api/sales/payments', {\n token,\n data: {\n orderId,\n ...(paymentMethodId ? { paymentMethodId } : {}),\n amount: amount.toFixed(2),\n currencyCode: 'USD',\n receivedAt: new Date().toISOString(),\n },\n }).catch(() => null);\n if (!response?.ok()) return false;\n await refreshSalesDocumentPage(page, 'Payments');\n return true;\n}\n\nasync function createSalesDocumentFixture(\n page: Page,\n token: string,\n kind: DocumentKind,\n customerQuery: string,\n channelQuery: string,\n ids?: { customerEntityId?: string | null; channelId?: string | null; customerAddressId?: string | null },\n): Promise<string> {\n const customerEntityId =\n ids?.customerEntityId ??\n await resolveCustomerEntityId(page, token, customerQuery);\n const channelId =\n ids?.channelId ??\n await resolveSalesChannelId(page, token, channelQuery);\n const payload: Record<string, unknown> = {\n currencyCode: 'USD',\n };\n if (customerEntityId) payload.customerEntityId = customerEntityId;\n if (channelId) payload.channelId = channelId;\n\n const response = await apiRequest(page.request, 'POST', kind === 'quote' ? '/api/sales/quotes' : '/api/sales/orders', {\n token,\n data: payload,\n });\n const body = (await response.json().catch(() => null)) as unknown;\n if (!response.ok()) {\n throw new Error(`Failed to create sales ${kind} fixture via API.`);\n }\n const id = readId(body, ['id', kind === 'quote' ? 'quoteId' : 'orderId']);\n if (!id) {\n throw new Error(`Missing sales ${kind} id in API fallback response.`);\n }\n\n if (customerEntityId) {\n const address = await ensureCustomerAddressFixture(page, token, customerEntityId, ids?.customerAddressId);\n if (address) {\n await apiRequest(page.request, 'POST', '/api/sales/document-addresses', {\n token,\n data: {\n documentId: id,\n documentKind: kind,\n ...address,\n },\n }).catch(() => {});\n }\n }\n\n return id;\n}\n\nasync function waitForDocumentLoaded(page: Page, timeout = TEST_WAIT_TIMEOUT_MS): Promise<boolean> {\n const itemsButton = page.getByRole('button', { name: /^Items$/i }).first();\n if (await itemsButton.isVisible().catch(() => false)) return true;\n const loadingIndicator = page.getByText(/Loading document\u2026|Loading document\\.\\.\\./i).first();\n const isLoading = await loadingIndicator.isVisible().catch(() => false);\n if (isLoading) {\n await loadingIndicator.waitFor({ state: 'hidden', timeout }).catch(() => {});\n }\n return await itemsButton.waitFor({ state: 'visible', timeout: Math.min(timeout, 5_000) }).then(() => true).catch(() => false);\n}\n\nasync function openSalesDocumentPage(page: Page, id: string, kind: DocumentKind): Promise<void> {\n const documentUrl = `/backend/sales/documents/${id}?kind=${kind}`;\n await page.goto(documentUrl, { waitUntil: 'domcontentloaded' });\n\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const recovered = await recoverGenericErrorPageIfPresent(page);\n if (recovered) {\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n continue;\n }\n await page.goto(documentUrl, { waitUntil: 'domcontentloaded' });\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n }\n await expect(page.getByRole('button', { name: /^Items$/i }).first()).toBeVisible({\n timeout: TEST_WAIT_TIMEOUT_MS,\n });\n}\n\nasync function ensureSalesDocumentReady(page: Page): Promise<void> {\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const recovered = await recoverGenericErrorPageIfPresent(page);\n if (recovered) {\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n continue;\n }\n await page.reload({ waitUntil: 'domcontentloaded' }).catch(() => {});\n if (await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS)) return;\n }\n await expect(page.getByRole('button', { name: /^Items$/i }).first()).toBeVisible({\n timeout: TEST_WAIT_TIMEOUT_MS,\n });\n}\n\nasync function selectAnyLookupOption(root: Locator): Promise<boolean> {\n const selectButton = root.getByRole('button', { name: /^Select$/i }).first();\n if (await selectButton.isVisible().catch(() => false)) {\n await selectButton.click().catch(() => {});\n return true;\n }\n\n const row = root.locator('[role=\"button\"]').first();\n if (await row.isVisible().catch(() => false)) {\n await row.click().catch(() => {});\n return true;\n }\n\n return false;\n}\n\nasync function selectLookupValue(\n input: Locator,\n query: string,\n preferredRowPattern?: RegExp,\n): Promise<boolean> {\n if (!(await input.isVisible().catch(() => false)) && (await input.count().catch(() => 0)) === 0) return false;\n await waitForStableVisibility(input, 4_000).catch(() => {});\n await input.click().catch(() => {});\n await input.press('ControlOrMeta+a').catch(() => {});\n await input.fill(query).catch(() => {});\n\n const root = lookupRootFromInput(input);\n await waitForLookupIdle(root);\n\n const selectByPreferredRow = async (): Promise<boolean> => {\n if (!preferredRowPattern) return false;\n const row = root.locator('[role=\"button\"]').filter({ hasText: preferredRowPattern }).first();\n const action = row.getByRole('button', { name: /^Select$/i }).first();\n if (await action.isVisible().catch(() => false)) {\n await action.click();\n return true;\n }\n if ((await row.isVisible().catch(() => false))) {\n await row.click().catch(() => {});\n return true;\n }\n return false;\n };\n\n if (await selectByPreferredRow()) return true;\n\n const deadline = Date.now() + 2_000;\n while (Date.now() < deadline) {\n await waitForLookupIdle(root);\n if (await selectAnyLookupOption(root)) return true;\n if (await selectByPreferredRow()) return true;\n const selectedButton = root.getByRole('button', { name: /^Selected$/i }).first();\n if (await selectedButton.isVisible().catch(() => false)) {\n return true;\n }\n await input.page().waitForTimeout(100);\n }\n\n await input.press('ArrowDown').catch(() => {});\n await input.press('Enter').catch(() => {});\n const selectedButton = root.getByRole('button', { name: /^Selected$/i }).first();\n if (await selectedButton.isVisible().catch(() => false)) {\n return true;\n }\n return await selectAnyLookupOption(root);\n}\n\nexport async function createSalesDocument(page: Page, options: CreateDocumentOptions): Promise<string> {\n const fixtureContext = await ensureSalesDocumentFixtures(page, options);\n const customerQuery = fixtureContext.customerQuery;\n const channelQuery = fixtureContext.channelQuery;\n let fallbackToken: string | null = options.token ?? fixtureContext.authToken ?? null;\n const resolveFallbackToken = async (): Promise<string> => {\n if (fallbackToken) return fallbackToken;\n fallbackToken = await getAuthToken(page.request, 'admin');\n return fallbackToken;\n };\n\n if (options.preferApi) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n let createPageReady = false;\n for (let attempt = 0; attempt < 3; attempt += 1) {\n await page.goto(`/backend/sales/documents/create?kind=${options.kind}`, {\n waitUntil: 'domcontentloaded',\n });\n await page.getByText(/Loading\u2026|Loading\\.\\.\\./i).first().waitFor({ state: 'hidden', timeout: TEST_WAIT_TIMEOUT_MS }).catch(() => {});\n const createButton = page.getByRole('button', { name: /^Create$/i }).first();\n if (await createButton.isVisible().catch(() => false)) {\n createPageReady = true;\n break;\n }\n const recovered = await recoverGenericErrorPageIfPresent(page);\n if (!recovered && attempt === 2) {\n await expect(createButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n }\n }\n if (!createPageReady) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n await expect(page.getByRole('button', { name: /^Create$/i }).first()).toBeVisible({\n timeout: TEST_WAIT_TIMEOUT_MS,\n });\n\n const generateButton = page.getByRole('button', { name: /Generate/i }).first();\n const createButton = page.getByRole('button', { name: /^Create$/i }).first();\n const hasGenerateButton = (await generateButton.count()) > 0;\n if (hasGenerateButton) {\n await expect(generateButton).toBeVisible({ timeout: 10_000 });\n }\n\n await page.getByText('Document type').click();\n const customerSelected = await selectLookupValue(\n page.getByRole('textbox', { name: /Search customers/i }).first(),\n customerQuery,\n new RegExp(escapeRegExp(customerQuery), 'i'),\n );\n const channelSelected = await selectLookupValue(\n page.getByRole('textbox', { name: /Select a channel/i }).first(),\n channelQuery,\n new RegExp(escapeRegExp(channelQuery), 'i'),\n );\n if (!customerSelected || !channelSelected) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n await selectFirstAddressIfAvailable(page);\n\n const createEnabled = await createButton.isEnabled().catch(() => false);\n if (!createEnabled) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n await createButton.click();\n const navigated = await page.waitForURL(\n new RegExp(\n `/backend/sales/(?:documents/[0-9a-f-]{36}\\\\?kind=${options.kind}|${options.kind === 'order' ? 'orders' : 'quotes'}/[0-9a-f-]{36})$`,\n 'i',\n ),\n { timeout: TEST_WAIT_TIMEOUT_MS },\n ).then(() => true).catch(() => false);\n if (!navigated) {\n const token = await resolveFallbackToken();\n const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);\n await openSalesDocumentPage(page, id, options.kind);\n return id;\n }\n\n const match = page.url().match(/\\/backend\\/sales\\/(?:documents|orders|quotes)\\/([0-9a-f-]{36})/i);\n if (!match) {\n throw new Error(`Could not resolve document id from URL: ${page.url()}`);\n }\n const loaded = await waitForDocumentLoaded(page, TEST_WAIT_TIMEOUT_MS);\n if (!loaded) {\n await openSalesDocumentPage(page, match[1], options.kind);\n }\n return match[1];\n}\n\nfunction lineDialog(page: Page): Locator {\n return page.getByRole('dialog', { name: /Add line|Edit line/i });\n}\n\nasync function selectFirstOption(container: Locator, rowNamePattern: RegExp): Promise<void> {\n const optionRow = container.getByRole('button', { name: rowNamePattern }).first();\n await optionRow.waitFor({ state: 'visible', timeout: 4_000 }).catch(() => {});\n if ((await optionRow.count()) === 0) return;\n\n const selectButton = optionRow.getByRole('button', { name: /^Select$/i }).first();\n if ((await selectButton.count()) > 0) {\n await selectButton.click();\n return;\n }\n await optionRow.click();\n}\n\nasync function selectFirstLookupOption(input: Locator, rowNamePattern: RegExp): Promise<void> {\n const root = lookupRootFromInput(input);\n await waitForLookupIdle(root);\n await selectFirstOption(root, rowNamePattern);\n}\n\nasync function selectShipmentMethod(dialog: Locator): Promise<void> {\n const shippingMethodInput = dialog.getByPlaceholder(/Select method/i).first();\n if ((await shippingMethodInput.count()) === 0) return;\n const selected = await selectLookupValue(shippingMethodInput, 'Standard', /standard ground|express air|standard/i);\n if (!selected) {\n await selectFirstLookupOption(shippingMethodInput, /standard ground|express air|standard/i);\n }\n}\n\nasync function selectShipmentStatus(dialog: Locator): Promise<void> {\n const statusInput = dialog.getByPlaceholder(/Select shipment status/i).first();\n if ((await statusInput.count()) > 0) {\n const selected = await selectLookupValue(statusInput, 'Shipped', /shipped|in transit|packed/i);\n if (selected) return;\n await selectFirstLookupOption(statusInput, /shipped|in transit|packed/i);\n return;\n }\n}\n\nasync function selectShipmentAddress(dialog: Locator): Promise<void> {\n const addressInput = dialog.getByPlaceholder(/Select address/i).first();\n if ((await addressInput.count()) === 0) return;\n const currentValue = await addressInput.inputValue().catch(() => '');\n if (currentValue.trim().length > 0) return;\n const selected = await selectLookupValue(addressInput, 'Address', /shipping address|document address|address/i);\n if (!selected) {\n await selectFirstLookupOption(addressInput, /shipping address|document address|address/i);\n }\n}\n\nasync function fillShipmentQuantity(dialog: Locator): Promise<void> {\n const quantityInputs = dialog.getByRole('spinbutton');\n const count = await quantityInputs.count();\n for (let index = 0; index < count; index += 1) {\n const input = quantityInputs.nth(index);\n const isVisible = await input.isVisible().catch(() => false);\n const isEnabled = await input.isEnabled().catch(() => false);\n if (!isVisible || !isEnabled) continue;\n await input.fill('1').catch(() => {});\n }\n}\n\nasync function fillShipmentDates(dialog: Locator): Promise<void> {\n const now = new Date();\n const day = String(now.getDate()).padStart(2, '0');\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const year = String(now.getFullYear());\n const shippedDateValue = `${day}/${month}/${year}`;\n\n const shippedDateInput = dialog.getByLabel(/Shipped date/i).first();\n if ((await shippedDateInput.count()) > 0) {\n const currentValue = await shippedDateInput.inputValue().catch(() => '');\n if (currentValue.trim().length === 0) {\n await shippedDateInput.fill(shippedDateValue).catch(() => {});\n }\n }\n}\n\nasync function fillShipmentNumber(dialog: Locator, shipmentNumber: string): Promise<void> {\n const shipmentNumberInput = dialog.getByRole('textbox').first();\n if (!(await shipmentNumberInput.isVisible().catch(() => false)) && (await shipmentNumberInput.count().catch(() => 0)) === 0) {\n return;\n }\n await waitForStableVisibility(shipmentNumberInput, 4_000).catch(() => {});\n await shipmentNumberInput.fill(shipmentNumber).catch(() => {});\n await shipmentNumberInput.press('Tab').catch(() => {});\n}\n\nexport async function addCustomLine(page: Page, options: AddLineOptions): Promise<void> {\n await ensureSalesDocumentReady(page);\n await page.getByRole('button', { name: /^Items$/i }).click();\n const addItemButton = page.getByRole('button', { name: /Add item/i }).first();\n await expect(addItemButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await expect(addItemButton).toBeEnabled({ timeout: TEST_WAIT_TIMEOUT_MS });\n await addItemButton.click();\n\n const dialog = lineDialog(page);\n await expect(dialog).toBeVisible();\n\n const customLineButton = dialog.getByRole('button', { name: /Custom line/i });\n await expect(customLineButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await customLineButton.click();\n\n const nameInput = dialog.getByRole('textbox', { name: /Optional line name/i });\n await expect(nameInput).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await nameInput.fill(options.name);\n await dialog.getByRole('textbox', { name: '0.00' }).fill(String(options.unitPriceGross));\n await dialog.getByRole('textbox', { name: '1' }).fill(String(options.quantity));\n\n if (options.taxClassName) {\n // Radix Select inside Dialog \u2014 force click on option to bypass overlay\n const taxClassTrigger = dialog\n .locator('[role=\"combobox\"]')\n .filter({ hasText: /No tax class selected/i })\n .first();\n if ((await taxClassTrigger.count()) > 0) {\n await taxClassTrigger.click();\n const opt = page.getByRole('option', { name: options.taxClassName, exact: true });\n await opt.first().waitFor({ state: 'visible', timeout: 3_000 });\n await opt.first().click({ force: true });\n }\n }\n\n const submitButton = dialog.getByRole('button', { name: /Add item/i });\n await expect(submitButton).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await expect(submitButton).toBeEnabled({ timeout: TEST_WAIT_TIMEOUT_MS });\n const lineRow = page.getByRole('row', { name: new RegExp(escapeRegExp(options.name), 'i') });\n for (let attempt = 0; attempt < 2; attempt += 1) {\n await submitButton.click();\n await Promise.race([\n dialog.waitFor({ state: 'hidden', timeout: 3_000 }).catch(() => {}),\n lineRow.waitFor({ state: 'visible', timeout: 3_000 }).catch(() => {}),\n ]);\n if (await lineRow.isVisible().catch(() => false)) break;\n if (!(await dialog.isVisible().catch(() => false))) break;\n }\n\n if (await dialog.isVisible().catch(() => false)) {\n await expect(dialog).toBeHidden({ timeout: TEST_WAIT_TIMEOUT_MS });\n }\n await page.getByRole('button', { name: /^Items$/i }).click().catch(() => {});\n await expect(lineRow).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n}\n\nexport async function updateLineQuantity(page: Page, lineName: string, quantity: number): Promise<void> {\n await page.getByRole('button', { name: /^Items$/i }).click();\n const row = page.getByRole('row', { name: new RegExp(escapeRegExp(lineName), 'i') });\n await row.click();\n\n const dialog = page.getByRole('dialog', { name: /Edit line/i });\n await expect(dialog).toBeVisible();\n await dialog.getByRole('textbox', { name: '1' }).fill(String(quantity));\n await dialog.getByRole('button', { name: /Save changes/i }).click();\n\n await expect(page.getByRole('row', { name: new RegExp(`${escapeRegExp(lineName)}.*\\\\b${quantity}\\\\b`, 'i') })).toBeVisible();\n}\n\nexport async function deleteLine(page: Page, lineName: string): Promise<void> {\n await page.getByRole('button', { name: /^Items$/i }).click();\n const row = page.getByRole('row', { name: new RegExp(escapeRegExp(lineName), 'i') });\n await expect(row).toBeVisible();\n await row.locator('button').last().click();\n\n const confirmDialog = page.getByRole('alertdialog');\n if (await confirmDialog.isVisible().catch(() => false)) {\n await confirmDialog.getByRole('button', { name: /^Delete$/i }).first().click();\n await expect(confirmDialog).toBeHidden();\n }\n\n await expect(page.getByRole('row', { name: new RegExp(escapeRegExp(lineName), 'i') })).toHaveCount(0);\n}\n\nexport async function addAdjustment(page: Page, options: AddAdjustmentOptions): Promise<void> {\n const adjustmentsTab = page.getByRole('button', { name: /^Adjustments$/i }).first();\n await waitForStableVisibility(adjustmentsTab, TEST_WAIT_TIMEOUT_MS);\n await adjustmentsTab.click();\n const addAdjustmentButton = page.getByRole('button', { name: /Add adjustment/i }).first();\n await waitForStableVisibility(addAdjustmentButton, TEST_WAIT_TIMEOUT_MS);\n await addAdjustmentButton.click();\n\n const dialog = page.getByRole('dialog', { name: /Add adjustment/i });\n await expect(dialog).toBeVisible();\n const adjustmentRow = page.getByRole('row', { name: new RegExp(escapeRegExp(options.label), 'i') });\n const fillAdjustmentForm = async (): Promise<void> => {\n await dialog.getByText(/Loading adjustments/i).waitFor({ state: 'hidden', timeout: 3_000 }).catch(() => {});\n // Radix Select trigger \u2014 target by CrudForm field id (kind picker)\n const kindTrigger = dialog.locator('[data-crud-field-id=\"kind\"] [role=\"combobox\"]').first();\n await expect(kindTrigger).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n\n const labelInput = dialog.getByPlaceholder(/e\\.g\\. Shipping fee/i).first();\n await expect(labelInput).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n await fillControlledInput(labelInput, options.label);\n\n if ((await kindTrigger.count()) > 0) {\n const expectedKindValue = normalizeAdjustmentKindValue(options.kindLabel ?? 'Surcharge');\n const kindLabel = options.kindLabel ?? 'Surcharge';\n await kindTrigger.click();\n const option = page.getByRole('option', { name: new RegExp(`^${escapeRegExp(kindLabel)}$`, 'i') }).first();\n const optionVisible = await option.waitFor({ state: 'visible', timeout: 2_000 }).then(\n () => true,\n () => false,\n );\n if (optionVisible) {\n await option.click({ force: true });\n } else {\n await page.keyboard.type(kindLabel.charAt(0));\n await page.waitForTimeout(150);\n await page.keyboard.press('Enter');\n }\n void expectedKindValue;\n }\n\n const fixedAmountButton = dialog.getByRole('button', { name: /^Fixed amount$/i }).first();\n if ((await fixedAmountButton.count()) > 0) {\n await fixedAmountButton.click().catch(() => {});\n }\n\n const enabledAmountInputs = dialog.locator('input[placeholder=\"0.00\"]:not([disabled])');\n await expect(enabledAmountInputs.first()).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n if ((await enabledAmountInputs.count()) > 0) {\n await fillControlledInput(enabledAmountInputs.first(), String(options.netAmount));\n }\n };\n\n let saved = false;\n for (let attempt = 0; attempt < 3; attempt += 1) {\n await fillAdjustmentForm();\n const submitButton = dialog.getByRole('button', { name: /Add adjustment/i }).first();\n await waitForStableVisibility(submitButton, 4_000).catch(() => {});\n await submitButton.click();\n await Promise.race([\n dialog.waitFor({ state: 'hidden', timeout: 3_000 }).catch(() => {}),\n adjustmentRow.waitFor({ state: 'visible', timeout: 3_000 }).catch(() => {}),\n ]);\n saved =\n !(await dialog.isVisible().catch(() => false)) ||\n (await adjustmentRow.isVisible().catch(() => false));\n if (saved) break;\n }\n\n if (await dialog.isVisible().catch(() => false)) {\n await expect(dialog).toBeHidden({ timeout: 5_000 });\n }\n if (!(await adjustmentRow.isVisible().catch(() => false))) {\n await adjustmentsTab.click().catch(() => {});\n await expect(adjustmentRow).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });\n }\n}\n\nexport async function addPayment(page: Page, amount: number): Promise<{ amountLabel: string; added: boolean }> {\n await ensureSalesDocumentReady(page);\n const paymentsTab = page.getByRole('button', { name: /^Payments$/i }).first();\n await waitForStableVisibility(paymentsTab, TEST_WAIT_TIMEOUT_MS);\n await paymentsTab.click();\n const amountLabel = amount.toFixed(2);\n const amountInputValue = String(Math.max(1, Math.round(amount)));\n const addPaymentButton = page.getByRole('button', { name: /Add payment/i }).first();\n await waitForStableVisibility(addPaymentButton, TEST_WAIT_TIMEOUT_MS);\n await expect(addPaymentButton).toBeEnabled({ timeout: TEST_WAIT_TIMEOUT_MS });\n await addPaymentButton.click();\n\n const dialog = page.getByRole('dialog', { name: /Add payment/i });\n const amountInput = dialog.locator('input[placeholder=\"0.00\"]').first();\n await waitForDialogFieldReady(dialog, amountInput, /Loading payment methods\u2026|Loading payment methods\\.\\.\\./i);\n const setAmount = async (): Promise<void> => {\n const refreshedAmountInput = dialog.locator('input[placeholder=\"0.00\"]').first();\n await waitForStableVisibility(refreshedAmountInput, 4_000).catch(() => {});\n await refreshedAmountInput.fill(amountInputValue).catch(() => {});\n await refreshedAmountInput.press('Tab').catch(() => {});\n };\n const selectMethodInput = dialog.getByPlaceholder(/Search payment method/i).first();\n const statusInput = dialog.getByPlaceholder(/Select status/i).first();\n await setAmount();\n await waitForStableVisibility(selectMethodInput, 4_000).catch(() => {});\n await selectLookupValue(selectMethodInput, 'Bank', /bank transfer|credit card|cash on delivery/i).catch(() => false);\n await waitForStableVisibility(statusInput, 4_000).catch(() => {});\n await selectLookupValue(statusInput, 'Pending', /pending|captured/i).catch(() => false);\n const saveButton = dialog.getByRole('button', { name: /Save/i }).first();\n const operationMessage = page.getByText(/Last operation:\\s*Create payment/i).first();\n for (let attempt = 0; attempt < 2; attempt += 1) {\n await setAmount();\n await selectLookupValue(selectMethodInput, 'Bank', /bank transfer|credit card|cash on delivery/i).catch(() => false);\n await selectLookupValue(statusInput, 'Pending', /pending|captured/i).catch(() => false);\n await waitForStableVisibility(saveButton, 4_000).catch(() => {});\n await saveButton.click();\n await Promise.race([\n dialog.waitFor({ state: 'hidden', timeout: 3_500 }).catch(() => {}),\n operationMessage.waitFor({ state: 'visible', timeout: 3_500 }).catch(() => {}),\n dialog.getByText(/This field is required/i).first().waitFor({ state: 'visible', timeout: 3_500 }).catch(() => {}),\n ]);\n if (!(await dialog.isVisible().catch(() => false))) break;\n if (await operationMessage.isVisible().catch(() => false)) break;\n await waitForOptionalTextToDisappear(dialog, /Loading payment methods\u2026|Loading payment methods\\.\\.\\./i, 3_000);\n }\n if (await dialog.isVisible().catch(() => false)) {\n await dialog.press('Escape').catch(() => {});\n await dialog.waitFor({ state: 'hidden', timeout: 1_500 }).catch(() => {});\n }\n await operationMessage.waitFor({ state: 'visible', timeout: 2_500 }).catch(() => {});\n let added = await operationMessage.isVisible().catch(() => false);\n if (!added) {\n added = await addPaymentViaApi(page, amount);\n }\n return { amountLabel, added };\n}\n\nexport async function addShipment(page: Page): Promise<{ trackingNumber: string; shipmentNumber: string; added: boolean }> {\n await ensureSalesDocumentReady(page);\n await ensureShippingMethodFixture(page);\n const shipmentsTab = page.getByRole('button', { name: /^Shipments$/i }).first();\n await waitForStableVisibility(shipmentsTab, TEST_WAIT_TIMEOUT_MS);\n await shipmentsTab.click();\n const trackingNumber = `SHIP-${Date.now()}`;\n const shipmentNumber = String(Date.now());\n const dialog = page.getByRole('dialog', { name: /Add shipment/i });\n const openShipmentDialog = async (): Promise<boolean> => {\n const addShipmentButtons = page.getByRole('button', { name: /Add shipment/i });\n const buttonCount = await addShipmentButtons.count();\n for (let index = buttonCount - 1; index >= 0; index -= 1) {\n const button = addShipmentButtons.nth(index);\n if (!(await button.isVisible().catch(() => false))) continue;\n if (!(await button.isEnabled().catch(() => false))) continue;\n await waitForStableVisibility(button, TEST_WAIT_TIMEOUT_MS).catch(() => {});\n await button.scrollIntoViewIfNeeded().catch(() => {});\n await button.click().catch(() => {});\n const visible = await dialog.waitFor({ state: 'visible', timeout: 2_500 }).then(() => true).catch(() => false);\n if (visible) return true;\n }\n return false;\n };\n\n let dialogReady = false;\n for (let attempt = 0; attempt < 2; attempt += 1) {\n const opened = await openShipmentDialog();\n if (!opened) break;\n await dialog\n .getByText(/Loading shipments\u2026|Loading shipments\\.\\.\\./i)\n .first()\n .waitFor({ state: 'hidden', timeout: 5_000 })\n .catch(() => {});\n const shipmentNumberInput = dialog.locator('input, textarea').first();\n if (await shipmentNumberInput.isVisible().catch(() => false)) {\n await waitForStableVisibility(shipmentNumberInput, TEST_WAIT_TIMEOUT_MS).catch(() => {});\n dialogReady = true;\n break;\n }\n await dialog.getByRole('button', { name: /Close/i }).first().click().catch(() => {});\n await dialog.waitFor({ state: 'hidden', timeout: 2_000 }).catch(() => {});\n }\n if (!dialogReady) {\n const added = await addShipmentViaApi(page, shipmentNumber, trackingNumber);\n if (!added) {\n await openShipmentDialog();\n const shipmentNumberInput = dialog.locator('input, textarea').first();\n await waitForDialogFieldReady(dialog, shipmentNumberInput, /Loading shipments\u2026|Loading shipments\\.\\.\\./i);\n } else {\n const shipmentLabel = page.getByText(new RegExp(`Shipment\\\\s+${escapeRegExp(shipmentNumber)}`, 'i')).first();\n const visible = await shipmentLabel\n .waitFor({ state: 'visible', timeout: TEST_WAIT_TIMEOUT_MS })\n .then(() => true)\n .catch(() => false);\n return { trackingNumber, shipmentNumber, added: visible };\n }\n }\n\n const shipmentNumberInput = dialog.locator('input, textarea').first();\n await fillShipmentNumber(dialog, shipmentNumber);\n const trackingInput = dialog.getByPlaceholder(/One per line or comma separated/i).first();\n await waitForStableVisibility(trackingInput, 4_000).catch(() => {});\n await trackingInput.fill(trackingNumber).catch(() => {});\n await selectShipmentMethod(dialog);\n await selectShipmentStatus(dialog);\n await selectShipmentAddress(dialog);\n await fillShipmentQuantity(dialog);\n await fillShipmentDates(dialog);\n await fillShipmentNumber(dialog, shipmentNumber);\n\n await dialog.getByText(/Searching\u2026|Searching\\.\\.\\./i).first().waitFor({ state: 'hidden', timeout: TEST_WAIT_TIMEOUT_MS }).catch(() => {});\n const saveButton = dialog.getByRole('button', { name: /^Save\\b/i }).first();\n const canClickSave = (await saveButton.count()) > 0 && (await saveButton.isVisible().catch(() => false));\n if (canClickSave) {\n await saveButton.click({ timeout: TEST_WAIT_TIMEOUT_MS }).catch(() => {});\n } else {\n await dialog.press('ControlOrMeta+Enter').catch(() => {});\n }\n\n let closed = await dialog\n .waitFor({ state: 'hidden', timeout: TEST_WAIT_TIMEOUT_MS })\n .then(() => true)\n .catch(() => false);\n\n if (!closed) {\n for (let attempt = 0; attempt < 2; attempt += 1) {\n if (!(await dialog.isVisible().catch(() => false))) break;\n await selectShipmentMethod(dialog);\n await selectShipmentAddress(dialog);\n await fillShipmentQuantity(dialog);\n await fillShipmentDates(dialog);\n await fillShipmentNumber(dialog, shipmentNumber);\n if (canClickSave) {\n await saveButton.click({ timeout: 2_000 }).catch(() => {});\n } else {\n await dialog.press('ControlOrMeta+Enter').catch(() => {});\n }\n closed = await dialog\n .waitFor({ state: 'hidden', timeout: 2_000 })\n .then(() => true)\n .catch(() => false);\n if (closed) break;\n }\n }\n\n if (!closed) {\n return { trackingNumber, shipmentNumber, added: false };\n }\n\n await page.getByRole('button', { name: /^Shipments$/i }).click();\n const shipmentLabel = page.getByText(new RegExp(`Shipment\\\\s+${escapeRegExp(shipmentNumber)}`, 'i')).first();\n const added = await shipmentLabel\n .waitFor({ state: 'visible', timeout: TEST_WAIT_TIMEOUT_MS })\n .then(() => true)\n .catch(() => false);\n return { trackingNumber, shipmentNumber, added };\n}\n\nexport async function readGrandTotalGross(page: Page): Promise<number> {\n const row = page.getByRole('row', { name: /Grand total \\(gross\\)/i }).first();\n await expect(row).toBeVisible();\n const text = (await row.innerText()).trim();\n return parseCurrencyAmount(text);\n}\n"],
5
+ "mappings": "AAAA,SAAS,cAAuC;AAChD,SAAS,YAAY,oBAAoB;AA+EzC,MAAM,uBAAuB;AAE7B,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAEA,SAAS,oBAAoB,OAAuB;AAClD,QAAM,aAAa,MAAM,QAAQ,MAAM,EAAE;AACzC,QAAM,UAAU,WAAW,MAAM,4BAA4B;AAC7D,QAAM,YAAY,UAAU,QAAQ,SAAS,CAAC;AAC9C,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,kCAAkC,KAAK,EAAE;AAAA,EAC3D;AACA,SAAO,OAAO,WAAW,UAAU,QAAQ,KAAK,EAAE,CAAC;AACrD;AAEA,SAAS,6BAA6B,WAA2B;AAC/D,SAAO,UAAU,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAQ,GAAG;AAC3D;AAEA,SAAS,OAAO,SAAkB,MAA+B;AAC/D,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAM,MAAM;AACZ,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,IAAI,GAAG;AACrB,QAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAAG,QAAO;AAAA,EAC5D;AACA,aAAW,SAAS,OAAO,OAAO,GAAG,GAAG;AACtC,QAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,YAAM,SAAS,OAAO,OAAO,IAAI;AACjC,UAAI,OAAQ,QAAO;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAiB,SAAgE;AACxF,SAAO,MAAM,QAAQ,SAAS,QAAQ,KAAK,IACvC,QAAQ,OAAO,QACf,MAAM,QAAQ,SAAS,KAAK,IAC1B,QAAQ,QACR,CAAC;AACT;AAEA,SAAS,uBAAuB,MAA2B;AACzD,QAAM,QAAQ,KAAK,IAAI,EAAE,MAAM,0DAA0D;AACzF,SAAO,QAAQ,CAAC,KAAK;AACvB;AAEA,eAAe,4BACb,MACA,SAQC;AACD,MAAI,gBAAgB,QAAQ;AAC5B,MAAI,eAAe,QAAQ;AAC3B,MAAI,mBAAkC;AACtC,MAAI,YAA2B;AAC/B,MAAI,oBAAmC;AAEvC,MAAI,iBAAiB,cAAc;AACjC,WAAO,EAAE,eAAe,cAAc,WAAW,QAAQ,SAAS,KAAK;AAAA,EACzE;AAEA,QAAM,QAAQ,MAAM,aAAa,KAAK,SAAS,OAAO,EAAE,MAAM,MAAM,IAAI;AACxE,MAAI,CAAC,OAAO;AACV,QAAI,CAAC,eAAe;AAClB,sBAAgB,qBAAqB,KAAK,IAAI,CAAC;AAC/C,YAAM,KAAK,KAAK,qCAAqC;AACrD,YAAM,KAAK,QAAQ,MAAM,EAAE,UAAU,SAAS,EAAE,MAAM,EAAE,KAAK,aAAa;AAC1E,YAAM,KAAK,iBAAiB,qBAAqB,EAAE,KAAK,qBAAqB;AAC7E,YAAM,KAAK,QAAQ,MAAM,EAAE,UAAU,UAAU,EAAE,MAAM,kBAAkB,CAAC,EAAE,MAAM;AAClF,YAAM,OAAO,IAAI,EAAE,UAAU,kDAAkD;AAAA,IACjF;AACA,QAAI,CAAC,cAAc;AACjB,YAAM,YAAY,KAAK,IAAI;AAC3B,qBAAe,oBAAoB,SAAS;AAC5C,YAAM,cAAc,oBAAoB,SAAS;AACjD,YAAM,KAAK,KAAK,yBAAyB;AACzC,YAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,eAAe,CAAC,EAAE,MAAM;AAC7D,YAAM,aAAa,KAAK,QAAQ,MAAM,EAAE,MAAM;AAC9C,YAAM,WAAW,UAAU,SAAS,EAAE,IAAI,CAAC,EAAE,KAAK,YAAY;AAC9D,YAAM,WAAW,UAAU,SAAS,EAAE,IAAI,CAAC,EAAE,KAAK,WAAW;AAC7D,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,yBAAyB,CAAC,EAAE,KAAK,EAAE,MAAM;AAChF,YAAM,OAAO,IAAI,EAAE,UAAU,8BAA8B;AAAA,IAC7D;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW,QAAQ,SAAS;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI,CAAC,eAAe;AAClB,UAAM,cAAc,qBAAqB,KAAK,IAAI,CAAC;AACnD,UAAM,kBAAkB,MAAM,WAAW,KAAK,SAAS,QAAQ,4BAA4B;AAAA,MACzF;AAAA,MACA,MAAM,EAAE,aAAa,YAAY;AAAA,IACnC,CAAC,EAAE,MAAM,MAAM,IAAI;AACnB,QAAI,mBAAmB,gBAAgB,GAAG,GAAG;AAC3C,YAAM,cAAe,MAAM,gBAAgB,KAAK,EAAE,MAAM,MAAM,IAAI;AAClE,yBAAmB,OAAO,aAAa,CAAC,MAAM,YAAY,WAAW,CAAC;AACtE,UAAI,kBAAkB;AACpB,cAAM,WAAW,KAAK,SAAS,QAAQ,4BAA4B;AAAA,UACjE;AAAA,UACA,MAAM;AAAA,YACJ,UAAU;AAAA,YACV,MAAM;AAAA,YACN,SAAS;AAAA,YACT,cAAc;AAAA,YACd,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF,CAAC,EAAE,KAAK,OAAO,aAAa;AAC1B,gBAAM,OAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACpD,8BAAoB,OAAO,MAAM,CAAC,MAAM,WAAW,CAAC;AAAA,QACtD,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACjB,wBAAgB;AAAA,MAClB;AAAA,IACF;AACA,QAAI,CAAC,eAAe;AAClB,sBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,CAAC,cAAc;AACjB,UAAM,2BAA2B,MAAM;AAAA,MACrC,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,EAAE,MAAM;AAAA,IACV,EAAE,MAAM,MAAM,IAAI;AAClB,UAAM,uBAAwB,MAAM,0BAA0B,KAAK,EAAE,MAAM,MAAM,IAAI;AACrF,UAAM,mBAAmB,MAAM,QAAQ,sBAAsB,KAAK,IAAI,qBAAqB,QAAQ,CAAC;AACpG,UAAM,2BACJ,iBAAiB,KAAK,CAAC,SAAS,KAAK,SAAS,YAAY,KAAK,aAAa,KAAK,KACjF,iBAAiB,KAAK,CAAC,SAAS,KAAK,aAAa,KAAK;AACzD,QAAI,0BAA0B,MAAM;AAClC,qBAAe,yBAAyB;AACxC,kBAAY,yBAAyB,MAAM;AAAA,IAC7C,OAAO;AACL,YAAM,YAAY,KAAK,IAAI;AAC3B,YAAM,cAAc,oBAAoB,SAAS;AACjD,YAAM,cAAc,oBAAoB,SAAS;AACjD,YAAM,kBAAkB,MAAM,WAAW,KAAK,SAAS,QAAQ,uBAAuB;AAAA,QACpF;AAAA,QACA,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF,CAAC,EAAE,MAAM,MAAM,IAAI;AACnB,UAAI,mBAAmB,gBAAgB,GAAG,GAAG;AAC3C,uBAAe;AACf,cAAM,cAAe,MAAM,gBAAgB,KAAK,EAAE,MAAM,MAAM,IAAI;AAClE,oBAAY,OAAO,aAAa,CAAC,MAAM,WAAW,CAAC;AAAA,MACrD,OAAO;AACL,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,eAAe,iBAAiB;AAAA,IAChC,cAAc,gBAAgB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEA,eAAe,8BAA8B,MAA2B;AAEtE,QAAM,iBAAiB,KACpB,QAAQ,mBAAmB,EAC3B,OAAO,EAAE,SAAS,kBAAkB,CAAC,EACrC,MAAM;AACT,MAAK,MAAM,eAAe,MAAM,MAAO,EAAG;AAC1C,MAAI,CAAE,MAAM,eAAe,UAAU,EAAE,MAAM,MAAM,KAAK,EAAI;AAE5D,QAAM,eAAe,MAAM;AAE3B,QAAM,cAAc,KAAK,UAAU,QAAQ,EAAE,MAAM;AACnD,MAAK,MAAM,YAAY,MAAM,MAAO,GAAG;AAErC,UAAM,KAAK,SAAS,MAAM,QAAQ;AAClC;AAAA,EACF;AACA,QAAM,YAAY,MAAM;AAC1B;AAEA,eAAe,4BAA4B,MAA2B;AACpE,QAAM,QAAQ,MAAM,aAAa,KAAK,SAAS,OAAO,EAAE,MAAM,MAAM,IAAI;AACxE,MAAI,CAAC,MAAO;AAEZ,QAAM,WAAW,MAAM;AAAA,IACrB,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,MAAM;AAAA,EACV,EAAE,MAAM,MAAM,IAAI;AAClB,QAAM,eAAgB,MAAM,UAAU,KAAK,EAAE,MAAM,MAAM,IAAI;AAC7D,QAAM,gBAAgB,MAAM,QAAQ,cAAc,QAAQ,KAAK,IAAI,cAAc,QAAQ,QAAQ,CAAC;AAClG,MAAI,cAAc,SAAS,EAAG;AAE9B,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,WAAW,KAAK,SAAS,QAAQ,+BAA+B;AAAA,IACpE;AAAA,IACA,MAAM;AAAA,MACJ,MAAM,sBAAsB,KAAK;AAAA,MACjC,MAAM,eAAe,KAAK;AAAA,MAC1B,UAAU;AAAA,MACV,cAAc;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,IACjB;AAAA,EACF,CAAC,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACnB;AAEA,SAAS,oBAAoB,OAAyB;AACpD,SAAO,MAAM,QAAQ,sDAAsD;AAC7E;AAEA,eAAe,kBAAkB,MAA8B;AAC7D,QAAM,KACH,UAAU,oDAAoD,EAC9D,MAAM,EACN,QAAQ,EAAE,OAAO,UAAU,SAAS,KAAM,CAAC,EAC3C,MAAM,MAAM;AAAA,EAAC,CAAC;AACnB;AAEA,eAAe,+BAA+B,OAAgB,SAAiB,UAAU,MAAsB;AAC7G,QAAM,MAAM,UAAU,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,UAAU,QAAQ,CAAC,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAC7F;AAEA,eAAe,wBAAwB,SAAkB,UAAU,sBAAqC;AACtG,QAAM,OAAO,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC;AAC7C,MAAI,eAAe;AACnB,QAAM,WAAW,KAAK,IAAI,IAAI,KAAK,IAAI,SAAS,GAAK;AACrD,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,QAAI,MAAM,QAAQ,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AAChD,sBAAgB;AAChB,UAAI,gBAAgB,EAAG;AAAA,IACzB,OAAO;AACL,qBAAe;AAAA,IACjB;AACA,UAAM,QAAQ,KAAK,EAAE,eAAe,EAAE,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACxD;AACF;AAEA,eAAe,wBACb,QACA,OACA,gBACe;AACf,QAAM,OAAO,MAAM,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AAClE,MAAI,gBAAgB;AAClB,UAAM,+BAA+B,QAAQ,gBAAgB,oBAAoB;AAAA,EACnF;AACA,QAAM,wBAAwB,OAAO,oBAAoB;AACzD,QAAM,MAAM,uBAAuB,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACrD;AAEA,eAAe,oBAAoB,OAAgB,OAAe,UAAU,KAAsB;AAChG,QAAM,wBAAwB,OAAO,oBAAoB;AACzD,QAAM,MAAM,KAAK,KAAK;AACtB,QAAM,MAAM,SAAS,CAAC,SAAS,cAAc;AAC3C,UAAM,UAAU;AAChB,UAAM,YAAY,mBAAmB,sBAAsB,oBAAoB,YAAY,iBAAiB;AAC5G,UAAM,cAAc,OAAO,yBAAyB,WAAW,OAAO,GAAG;AACzE,iBAAa,KAAK,SAAS,SAAS;AACpC,YAAQ,cAAc,IAAI,WAAW,SAAS,EAAE,SAAS,MAAM,WAAW,cAAc,MAAM,UAAU,CAAC,CAAC;AAC1G,YAAQ,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC;AAAA,EAC9D,GAAG,KAAK;AACR,QAAM,OAAO,KAAK,EAAE,YAAY,OAAO,EAAE,QAAQ,CAAC;AAClD,QAAM,MAAM,MAAM,KAAK,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACzC;AAEA,eAAe,iCAAiC,MAA8B;AAC5E,QAAM,eAAe,KAAK,UAAU,WAAW,EAAE,MAAM,0BAA0B,CAAC,EAAE,MAAM;AAC1F,MAAI,CAAE,MAAM,aAAa,UAAU,EAAE,MAAM,MAAM,KAAK,EAAI,QAAO;AACjE,QAAM,cAAc,KAAK,UAAU,UAAU,EAAE,MAAM,aAAa,CAAC,EAAE,MAAM;AAC3E,MAAI,MAAM,YAAY,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AACpD,UAAM,YAAY,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACxC,UAAM,KAAK,iBAAiB,kBAAkB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAChE,OAAO;AACL,UAAM,KAAK,OAAO,EAAE,WAAW,mBAAmB,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACrE;AACA,SAAO;AACT;AAEA,eAAe,wBACb,MACA,OACA,eACwB;AACxB,QAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,KAAK,QAAQ,cAAc,CAAC;AACtF,QAAM,WAAW,MAAM,WAAW,KAAK,SAAS,OAAO,4BAA4B,OAAO,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,MAAM,IAAI;AACnI,QAAM,OAAQ,MAAM,UAAU,KAAK,EAAE,MAAM,MAAM,IAAI;AAIrD,QAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,IAC3C,KAAK,OAAO,QACZ,MAAM,QAAQ,MAAM,KAAK,IACvB,KAAK,QACL,CAAC;AACP,QAAM,aAAa,MAAM,KAAK,CAAC,SAAS;AACtC,UAAM,cAAc,OAAO,KAAK,gBAAgB,WAC5C,KAAK,cACL,OAAO,KAAK,iBAAiB,WAC3B,KAAK,eACL;AACN,WAAO,YAAY,KAAK,EAAE,YAAY,MAAM,cAAc,KAAK,EAAE,YAAY;AAAA,EAC/E,CAAC,KAAK,MAAM,CAAC;AACb,SAAO,aAAa,OAAO,YAAY,CAAC,MAAM,YAAY,WAAW,CAAC,IAAI;AAC5E;AAEA,SAAS,yBAAyB,SAAiE;AACjG,QAAM,eAAe,OAAO,QAAQ,iBAAiB,WACjD,QAAQ,eACR,OAAO,QAAQ,kBAAkB,WAC/B,QAAQ,gBACR;AACN,MAAI,CAAC,aAAc,QAAO;AAC1B,SAAO;AAAA,IACL,mBAAmB,OAAO,QAAQ,OAAO,WAAW,QAAQ,KAAK;AAAA,IACjE,MAAM,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;AAAA,IACxD,SAAS,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;AAAA,IACjE,aAAa,OAAO,QAAQ,gBAAgB,WACxC,QAAQ,cACR,OAAO,QAAQ,iBAAiB,WAC9B,QAAQ,eACR;AAAA,IACN;AAAA,IACA,cAAc,OAAO,QAAQ,iBAAiB,WAC1C,QAAQ,eACR,OAAO,QAAQ,kBAAkB,WAC/B,QAAQ,gBACR;AAAA,IACN,gBAAgB,OAAO,QAAQ,mBAAmB,WAC9C,QAAQ,iBACR,OAAO,QAAQ,oBAAoB,WACjC,QAAQ,kBACR;AAAA,IACN,YAAY,OAAO,QAAQ,eAAe,WACtC,QAAQ,aACR,OAAO,QAAQ,gBAAgB,WAC7B,QAAQ,cACR;AAAA,IACN,MAAM,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;AAAA,IACxD,QAAQ,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS;AAAA,IAC9D,YAAY,OAAO,QAAQ,eAAe,WACtC,QAAQ,aACR,OAAO,QAAQ,gBAAgB,WAC7B,QAAQ,cACR;AAAA,IACN,SAAS,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;AAAA,EACnE;AACF;AAEA,eAAe,6BACb,MACA,OACA,kBACA,oBACwC;AACxC,QAAM,mBAAmB,MAAM;AAAA,IAC7B,KAAK;AAAA,IACL;AAAA,IACA,wDAAwD,gBAAgB;AAAA,IACxE,EAAE,MAAM;AAAA,EACV,EAAE,MAAM,MAAM,IAAI;AAClB,QAAM,eAAgB,MAAM,kBAAkB,KAAK,EAAE,MAAM,MAAM,IAAI;AAIrE,QAAM,gBAAgB,MAAM,QAAQ,cAAc,QAAQ,KAAK,IAC3D,aAAa,OAAO,QACpB,MAAM,QAAQ,cAAc,KAAK,IAC/B,aAAa,QACb,CAAC;AACP,QAAM,mBAAmB,cAAc,KAAK,CAAC,SAAS,KAAK,OAAO,kBAAkB,KAC/E,cAAc,KAAK,CAAC,SAAS,KAAK,SAAS,YAAY,MAAM,UAAU,KACvE,cAAc,CAAC;AACpB,QAAM,mBAAmB,mBAAmB,yBAAyB,gBAAgB,IAAI;AACzF,MAAI,iBAAkB,QAAO;AAE7B,QAAM,iBAAiB,MAAM,WAAW,KAAK,SAAS,QAAQ,4BAA4B;AAAA,IACxF;AAAA,IACA,MAAM;AAAA,MACJ,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,MACd,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AAAA,EACF,CAAC,EAAE,MAAM,MAAM,IAAI;AACnB,QAAM,aAAc,MAAM,gBAAgB,KAAK,EAAE,MAAM,MAAM,IAAI;AACjE,QAAM,mBAAmB,OAAO,YAAY,CAAC,MAAM,WAAW,CAAC;AAC/D,MAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,iBAAkB,QAAO;AACvD,SAAO;AAAA,IACL,mBAAmB;AAAA,IACnB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,EACX;AACF;AAEA,eAAe,sBAAsB,MAAY,OAAe,cAA8C;AAC5G,QAAM,eAAe,OAAO,WAAgD;AAC1E,UAAM,SAAS,IAAI,gBAAgB,EAAE,MAAM,KAAK,UAAU,KAAK,UAAU,OAAO,CAAC;AACjF,QAAI,UAAU,OAAO,KAAK,EAAE,SAAS,EAAG,QAAO,IAAI,UAAU,OAAO,KAAK,CAAC;AAC1E,UAAM,WAAW,MAAM,WAAW,KAAK,SAAS,OAAO,uBAAuB,OAAO,SAAS,CAAC,IAAI;AAAA,MACjG;AAAA,IACF,CAAC,EAAE,MAAM,MAAM,IAAI;AACnB,UAAM,OAAQ,MAAM,UAAU,KAAK,EAAE,MAAM,MAAM,IAAI;AACrD,WAAO,MAAM,QAAQ,MAAM,QAAQ,KAAK,IACpC,KAAK,OAAO,QACZ,MAAM,QAAQ,MAAM,KAAK,IACvB,KAAK,QACL,CAAC;AAAA,EACT;AACA,QAAM,eAAe,MAAM,aAAa,YAAY;AACpD,QAAM,QAAQ,aAAa,SAAS,IAAI,eAAe,MAAM,aAAa;AAC1E,QAAM,kBAAkB,aAAa,KAAK,EAAE,YAAY;AACxD,QAAM,aAAa,MAAM,KAAK,CAAC,SAAS,KAAK,MAAM,KAAK,EAAE,YAAY,MAAM,eAAe,KACtF,MAAM,KAAK,CAAC,SAAS,KAAK,MAAM,KAAK,EAAE,YAAY,MAAM,eAAe,KACxE,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ,KAC3C,MAAM,CAAC;AACZ,SAAO,YAAY,MAAM;AAC3B;AAEA,eAAe,mBAAmB,MAAY,OAAe,SAAyC;AACpG,QAAM,WAAW,MAAM,WAAW,KAAK,SAAS,OAAO,qDAAqD,OAAO,IAAI;AAAA,IACrH;AAAA,EACF,CAAC,EAAE,MAAM,MAAM,IAAI;AACnB,QAAM,OAAQ,MAAM,UAAU,KAAK,EAAE,MAAM,MAAM,IAAI;AAIrD,QAAM,QAAQ,cAAc,IAAI;AAChC,SAAO,MAAM,KAAK,CAAC,SAAS,OAAO,KAAK,OAAO,YAAY,KAAK,GAAG,SAAS,CAAC,GAAG,MAAM;AACxF;AAEA,eAAe,wBAAwB,MAAY,OAAuC;AACxF,QAAM,WAAW,MAAM;AAAA,IACrB,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,MAAM;AAAA,EACV,EAAE,MAAM,MAAM,IAAI;AAClB,QAAM,OAAQ,MAAM,UAAU,KAAK,EAAE,MAAM,MAAM,IAAI;AAIrD,QAAM,QAAQ,cAAc,IAAI;AAChC,QAAM,YAAY,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,iBAAiB,KACjE,MAAM,KAAK,CAAC,SAAS,KAAK,MAAM,YAAY,EAAE,SAAS,UAAU,CAAC,KAClE,MAAM,CAAC;AACZ,SAAO,WAAW,MAAM;AAC1B;AAEA,eAAe,uBAAuB,MAAY,OAAuC;AACvF,QAAM,WAAW,MAAM;AAAA,IACrB,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,MAAM;AAAA,EACV,EAAE,MAAM,MAAM,IAAI;AAClB,QAAM,OAAQ,MAAM,UAAU,KAAK,EAAE,MAAM,MAAM,IAAI;AAIrD,QAAM,QAAQ,cAAc,IAAI;AAChC,QAAM,YAAY,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,eAAe,KAC/D,MAAM,KAAK,CAAC,SAAS,KAAK,MAAM,YAAY,EAAE,SAAS,MAAM,CAAC,KAC9D,MAAM,CAAC;AACZ,SAAO,WAAW,MAAM;AAC1B;AAEA,eAAe,yBAAyB,MAAY,eAAwD;AAC1G,QAAM,KAAK,OAAO,EAAE,WAAW,mBAAmB,CAAC,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACnE,QAAM,yBAAyB,IAAI;AACnC,QAAM,MAAM,KAAK,UAAU,UAAU,EAAE,MAAM,IAAI,OAAO,IAAI,aAAa,KAAK,GAAG,EAAE,CAAC,EAAE,MAAM;AAC5F,QAAM,wBAAwB,KAAK,oBAAoB,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACvE,QAAM,IAAI,MAAM,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAClC;AAEA,eAAe,kBACb,MACA,gBACA,gBACkB;AAClB,QAAM,QAAQ,MAAM,aAAa,KAAK,SAAS,OAAO,EAAE,MAAM,MAAM,IAAI;AACxE,QAAM,UAAU,uBAAuB,IAAI;AAC3C,MAAI,CAAC,SAAS,CAAC,QAAS,QAAO;AAC/B,QAAM,CAAC,aAAa,gBAAgB,IAAI,MAAM,QAAQ,IAAI;AAAA,IACxD,mBAAmB,MAAM,OAAO,OAAO;AAAA,IACvC,wBAAwB,MAAM,KAAK;AAAA,EACrC,CAAC;AACD,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,WAAW,MAAM,WAAW,KAAK,SAAS,QAAQ,wBAAwB;AAAA,IAC9E;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;AAAA,MAC/C,iBAAiB,CAAC,cAAc;AAAA,MAChC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,cAAc;AAAA,MACd,OAAO,CAAC,EAAE,aAAa,UAAU,IAAI,CAAC;AAAA,IACxC;AAAA,EACF,CAAC,EAAE,MAAM,MAAM,IAAI;AACnB,MAAI,CAAC,UAAU,GAAG,EAAG,QAAO;AAC5B,QAAM,yBAAyB,MAAM,WAAW;AAChD,SAAO;AACT;AAEA,eAAe,iBAAiB,MAAY,QAAkC;AAC5E,QAAM,QAAQ,MAAM,aAAa,KAAK,SAAS,OAAO,EAAE,MAAM,MAAM,IAAI;AACxE,QAAM,UAAU,uBAAuB,IAAI;AAC3C,MAAI,CAAC,SAAS,CAAC,QAAS,QAAO;AAC/B,QAAM,kBAAkB,MAAM,uBAAuB,MAAM,KAAK;AAChE,QAAM,WAAW,MAAM,WAAW,KAAK,SAAS,QAAQ,uBAAuB;AAAA,IAC7E;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,MAC7C,QAAQ,OAAO,QAAQ,CAAC;AAAA,MACxB,cAAc;AAAA,MACd,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACrC;AAAA,EACF,CAAC,EAAE,MAAM,MAAM,IAAI;AACnB,MAAI,CAAC,UAAU,GAAG,EAAG,QAAO;AAC5B,QAAM,yBAAyB,MAAM,UAAU;AAC/C,SAAO;AACT;AAEA,eAAe,2BACb,MACA,OACA,MACA,eACA,cACA,KACiB;AACjB,QAAM,mBACJ,KAAK,oBACL,MAAM,wBAAwB,MAAM,OAAO,aAAa;AAC1D,QAAM,YACJ,KAAK,aACL,MAAM,sBAAsB,MAAM,OAAO,YAAY;AACvD,QAAM,UAAmC;AAAA,IACvC,cAAc;AAAA,EAChB;AACA,MAAI,iBAAkB,SAAQ,mBAAmB;AACjD,MAAI,UAAW,SAAQ,YAAY;AAEnC,QAAM,WAAW,MAAM,WAAW,KAAK,SAAS,QAAQ,SAAS,UAAU,sBAAsB,qBAAqB;AAAA,IACpH;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AACD,QAAM,OAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AACpD,MAAI,CAAC,SAAS,GAAG,GAAG;AAClB,UAAM,IAAI,MAAM,0BAA0B,IAAI,mBAAmB;AAAA,EACnE;AACA,QAAM,KAAK,OAAO,MAAM,CAAC,MAAM,SAAS,UAAU,YAAY,SAAS,CAAC;AACxE,MAAI,CAAC,IAAI;AACP,UAAM,IAAI,MAAM,iBAAiB,IAAI,+BAA+B;AAAA,EACtE;AAEA,MAAI,kBAAkB;AACpB,UAAM,UAAU,MAAM,6BAA6B,MAAM,OAAO,kBAAkB,KAAK,iBAAiB;AACxG,QAAI,SAAS;AACX,YAAM,WAAW,KAAK,SAAS,QAAQ,iCAAiC;AAAA,QACtE;AAAA,QACA,MAAM;AAAA,UACJ,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,GAAG;AAAA,QACL;AAAA,MACF,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,sBAAsB,MAAY,UAAU,sBAAwC;AACjG,QAAM,cAAc,KAAK,UAAU,UAAU,EAAE,MAAM,WAAW,CAAC,EAAE,MAAM;AACzE,MAAI,MAAM,YAAY,UAAU,EAAE,MAAM,MAAM,KAAK,EAAG,QAAO;AAC7D,QAAM,mBAAmB,KAAK,UAAU,2CAA2C,EAAE,MAAM;AAC3F,QAAM,YAAY,MAAM,iBAAiB,UAAU,EAAE,MAAM,MAAM,KAAK;AACtE,MAAI,WAAW;AACb,UAAM,iBAAiB,QAAQ,EAAE,OAAO,UAAU,QAAQ,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC7E;AACA,SAAO,MAAM,YAAY,QAAQ,EAAE,OAAO,WAAW,SAAS,KAAK,IAAI,SAAS,GAAK,EAAE,CAAC,EAAE,KAAK,MAAM,IAAI,EAAE,MAAM,MAAM,KAAK;AAC9H;AAEA,eAAe,sBAAsB,MAAY,IAAY,MAAmC;AAC9F,QAAM,cAAc,4BAA4B,EAAE,SAAS,IAAI;AAC/D,QAAM,KAAK,KAAK,aAAa,EAAE,WAAW,mBAAmB,CAAC;AAE9D,MAAI,MAAM,sBAAsB,MAAM,oBAAoB,EAAG;AAE7D,WAAS,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;AAC/C,UAAM,YAAY,MAAM,iCAAiC,IAAI;AAC7D,QAAI,WAAW;AACb,UAAI,MAAM,sBAAsB,MAAM,oBAAoB,EAAG;AAC7D;AAAA,IACF;AACA,UAAM,KAAK,KAAK,aAAa,EAAE,WAAW,mBAAmB,CAAC;AAC9D,QAAI,MAAM,sBAAsB,MAAM,oBAAoB,EAAG;AAAA,EAC/D;AACA,QAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY;AAAA,IAC/E,SAAS;AAAA,EACX,CAAC;AACH;AAEA,eAAe,yBAAyB,MAA2B;AACjE,MAAI,MAAM,sBAAsB,MAAM,oBAAoB,EAAG;AAE7D,WAAS,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;AAC/C,UAAM,YAAY,MAAM,iCAAiC,IAAI;AAC7D,QAAI,WAAW;AACb,UAAI,MAAM,sBAAsB,MAAM,oBAAoB,EAAG;AAC7D;AAAA,IACF;AACA,UAAM,KAAK,OAAO,EAAE,WAAW,mBAAmB,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACnE,QAAI,MAAM,sBAAsB,MAAM,oBAAoB,EAAG;AAAA,EAC/D;AACA,QAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY;AAAA,IAC/E,SAAS;AAAA,EACX,CAAC;AACH;AAEA,eAAe,sBAAsB,MAAiC;AACpE,QAAM,eAAe,KAAK,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC,EAAE,MAAM;AAC3E,MAAI,MAAM,aAAa,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AACrD,UAAM,aAAa,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,KAAK,QAAQ,iBAAiB,EAAE,MAAM;AAClD,MAAI,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AAC5C,UAAM,IAAI,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAChC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,kBACb,OACA,OACA,qBACkB;AAClB,MAAI,CAAE,MAAM,MAAM,UAAU,EAAE,MAAM,MAAM,KAAK,KAAO,MAAM,MAAM,MAAM,EAAE,MAAM,MAAM,CAAC,MAAO,EAAG,QAAO;AACxG,QAAM,wBAAwB,OAAO,GAAK,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAC1D,QAAM,MAAM,MAAM,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAClC,QAAM,MAAM,MAAM,iBAAiB,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACnD,QAAM,MAAM,KAAK,KAAK,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAEtC,QAAM,OAAO,oBAAoB,KAAK;AACtC,QAAM,kBAAkB,IAAI;AAE5B,QAAM,uBAAuB,YAA8B;AACzD,QAAI,CAAC,oBAAqB,QAAO;AACjC,UAAM,MAAM,KAAK,QAAQ,iBAAiB,EAAE,OAAO,EAAE,SAAS,oBAAoB,CAAC,EAAE,MAAM;AAC3F,UAAM,SAAS,IAAI,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC,EAAE,MAAM;AACpE,QAAI,MAAM,OAAO,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AAC/C,YAAM,OAAO,MAAM;AACnB,aAAO;AAAA,IACT;AACA,QAAK,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,KAAK,GAAI;AAC9C,YAAM,IAAI,MAAM,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAChC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,qBAAqB,EAAG,QAAO;AAEzC,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,UAAM,kBAAkB,IAAI;AAC5B,QAAI,MAAM,sBAAsB,IAAI,EAAG,QAAO;AAC9C,QAAI,MAAM,qBAAqB,EAAG,QAAO;AACzC,UAAMA,kBAAiB,KAAK,UAAU,UAAU,EAAE,MAAM,cAAc,CAAC,EAAE,MAAM;AAC/E,QAAI,MAAMA,gBAAe,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AACvD,aAAO;AAAA,IACT;AACA,UAAM,MAAM,KAAK,EAAE,eAAe,GAAG;AAAA,EACvC;AAEA,QAAM,MAAM,MAAM,WAAW,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAC7C,QAAM,MAAM,MAAM,OAAO,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACzC,QAAM,iBAAiB,KAAK,UAAU,UAAU,EAAE,MAAM,cAAc,CAAC,EAAE,MAAM;AAC/E,MAAI,MAAM,eAAe,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AACA,SAAO,MAAM,sBAAsB,IAAI;AACzC;AAEA,eAAsB,oBAAoB,MAAY,SAAiD;AACrG,QAAM,iBAAiB,MAAM,4BAA4B,MAAM,OAAO;AACtE,QAAM,gBAAgB,eAAe;AACrC,QAAM,eAAe,eAAe;AACpC,MAAI,gBAA+B,QAAQ,SAAS,eAAe,aAAa;AAChF,QAAM,uBAAuB,YAA6B;AACxD,QAAI,cAAe,QAAO;AAC1B,oBAAgB,MAAM,aAAa,KAAK,SAAS,OAAO;AACxD,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW;AACrB,UAAM,QAAQ,MAAM,qBAAqB;AACzC,UAAM,KAAK,MAAM,2BAA2B,MAAM,OAAO,QAAQ,MAAM,eAAe,cAAc,cAAc;AAClH,UAAM,sBAAsB,MAAM,IAAI,QAAQ,IAAI;AAClD,WAAO;AAAA,EACT;AAEA,MAAI,kBAAkB;AACtB,WAAS,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;AAC/C,UAAM,KAAK,KAAK,wCAAwC,QAAQ,IAAI,IAAI;AAAA,MACtE,WAAW;AAAA,IACb,CAAC;AACD,UAAM,KAAK,UAAU,yBAAyB,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,qBAAqB,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAClI,UAAMC,gBAAe,KAAK,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC,EAAE,MAAM;AAC3E,QAAI,MAAMA,cAAa,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AACrD,wBAAkB;AAClB;AAAA,IACF;AACA,UAAM,YAAY,MAAM,iCAAiC,IAAI;AAC7D,QAAI,CAAC,aAAa,YAAY,GAAG;AAC/B,YAAM,OAAOA,aAAY,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,MAAI,CAAC,iBAAiB;AACpB,UAAM,QAAQ,MAAM,qBAAqB;AACzC,UAAM,KAAK,MAAM,2BAA2B,MAAM,OAAO,QAAQ,MAAM,eAAe,cAAc,cAAc;AAClH,UAAM,sBAAsB,MAAM,IAAI,QAAQ,IAAI;AAClD,WAAO;AAAA,EACT;AACA,QAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY;AAAA,IAChF,SAAS;AAAA,EACX,CAAC;AAED,QAAM,iBAAiB,KAAK,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC,EAAE,MAAM;AAC7E,QAAM,eAAe,KAAK,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC,EAAE,MAAM;AAC3E,QAAM,oBAAqB,MAAM,eAAe,MAAM,IAAK;AAC3D,MAAI,mBAAmB;AACrB,UAAM,OAAO,cAAc,EAAE,YAAY,EAAE,SAAS,IAAO,CAAC;AAAA,EAC9D;AAEA,QAAM,KAAK,UAAU,eAAe,EAAE,MAAM;AAC5C,QAAM,mBAAmB,MAAM;AAAA,IAC7B,KAAK,UAAU,WAAW,EAAE,MAAM,oBAAoB,CAAC,EAAE,MAAM;AAAA,IAC/D;AAAA,IACA,IAAI,OAAO,aAAa,aAAa,GAAG,GAAG;AAAA,EAC7C;AACA,QAAM,kBAAkB,MAAM;AAAA,IAC5B,KAAK,UAAU,WAAW,EAAE,MAAM,oBAAoB,CAAC,EAAE,MAAM;AAAA,IAC/D;AAAA,IACA,IAAI,OAAO,aAAa,YAAY,GAAG,GAAG;AAAA,EAC5C;AACA,MAAI,CAAC,oBAAoB,CAAC,iBAAiB;AACzC,UAAM,QAAQ,MAAM,qBAAqB;AACzC,UAAM,KAAK,MAAM,2BAA2B,MAAM,OAAO,QAAQ,MAAM,eAAe,cAAc,cAAc;AAClH,UAAM,sBAAsB,MAAM,IAAI,QAAQ,IAAI;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,8BAA8B,IAAI;AAExC,QAAM,gBAAgB,MAAM,aAAa,UAAU,EAAE,MAAM,MAAM,KAAK;AACtE,MAAI,CAAC,eAAe;AAClB,UAAM,QAAQ,MAAM,qBAAqB;AACzC,UAAM,KAAK,MAAM,2BAA2B,MAAM,OAAO,QAAQ,MAAM,eAAe,cAAc,cAAc;AAClH,UAAM,sBAAsB,MAAM,IAAI,QAAQ,IAAI;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM;AACzB,QAAM,YAAY,MAAM,KAAK;AAAA,IAC3B,IAAI;AAAA,MACF,oDAAoD,QAAQ,IAAI,IAAI,QAAQ,SAAS,UAAU,WAAW,QAAQ;AAAA,MAClH;AAAA,IACF;AAAA,IACA,EAAE,SAAS,qBAAqB;AAAA,EAClC,EAAE,KAAK,MAAM,IAAI,EAAE,MAAM,MAAM,KAAK;AACpC,MAAI,CAAC,WAAW;AACd,UAAM,QAAQ,MAAM,qBAAqB;AACzC,UAAM,KAAK,MAAM,2BAA2B,MAAM,OAAO,QAAQ,MAAM,eAAe,cAAc,cAAc;AAClH,UAAM,sBAAsB,MAAM,IAAI,QAAQ,IAAI;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,IAAI,EAAE,MAAM,iEAAiE;AAChG,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,2CAA2C,KAAK,IAAI,CAAC,EAAE;AAAA,EACzE;AACA,QAAM,SAAS,MAAM,sBAAsB,MAAM,oBAAoB;AACrE,MAAI,CAAC,QAAQ;AACX,UAAM,sBAAsB,MAAM,MAAM,CAAC,GAAG,QAAQ,IAAI;AAAA,EAC1D;AACA,SAAO,MAAM,CAAC;AAChB;AAEA,SAAS,WAAW,MAAqB;AACvC,SAAO,KAAK,UAAU,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACjE;AAEA,eAAe,kBAAkB,WAAoB,gBAAuC;AAC1F,QAAM,YAAY,UAAU,UAAU,UAAU,EAAE,MAAM,eAAe,CAAC,EAAE,MAAM;AAChF,QAAM,UAAU,QAAQ,EAAE,OAAO,WAAW,SAAS,IAAM,CAAC,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAC5E,MAAK,MAAM,UAAU,MAAM,MAAO,EAAG;AAErC,QAAM,eAAe,UAAU,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC,EAAE,MAAM;AAChF,MAAK,MAAM,aAAa,MAAM,IAAK,GAAG;AACpC,UAAM,aAAa,MAAM;AACzB;AAAA,EACF;AACA,QAAM,UAAU,MAAM;AACxB;AAEA,eAAe,wBAAwB,OAAgB,gBAAuC;AAC5F,QAAM,OAAO,oBAAoB,KAAK;AACtC,QAAM,kBAAkB,IAAI;AAC5B,QAAM,kBAAkB,MAAM,cAAc;AAC9C;AAEA,eAAe,qBAAqB,QAAgC;AAClE,QAAM,sBAAsB,OAAO,iBAAiB,gBAAgB,EAAE,MAAM;AAC5E,MAAK,MAAM,oBAAoB,MAAM,MAAO,EAAG;AAC/C,QAAM,WAAW,MAAM,kBAAkB,qBAAqB,YAAY,uCAAuC;AACjH,MAAI,CAAC,UAAU;AACb,UAAM,wBAAwB,qBAAqB,uCAAuC;AAAA,EAC5F;AACF;AAEA,eAAe,qBAAqB,QAAgC;AAClE,QAAM,cAAc,OAAO,iBAAiB,yBAAyB,EAAE,MAAM;AAC7E,MAAK,MAAM,YAAY,MAAM,IAAK,GAAG;AACnC,UAAM,WAAW,MAAM,kBAAkB,aAAa,WAAW,4BAA4B;AAC7F,QAAI,SAAU;AACd,UAAM,wBAAwB,aAAa,4BAA4B;AACvE;AAAA,EACF;AACF;AAEA,eAAe,sBAAsB,QAAgC;AACnE,QAAM,eAAe,OAAO,iBAAiB,iBAAiB,EAAE,MAAM;AACtE,MAAK,MAAM,aAAa,MAAM,MAAO,EAAG;AACxC,QAAM,eAAe,MAAM,aAAa,WAAW,EAAE,MAAM,MAAM,EAAE;AACnE,MAAI,aAAa,KAAK,EAAE,SAAS,EAAG;AACpC,QAAM,WAAW,MAAM,kBAAkB,cAAc,WAAW,4CAA4C;AAC9G,MAAI,CAAC,UAAU;AACb,UAAM,wBAAwB,cAAc,4CAA4C;AAAA,EAC1F;AACF;AAEA,eAAe,qBAAqB,QAAgC;AAClE,QAAM,iBAAiB,OAAO,UAAU,YAAY;AACpD,QAAM,QAAQ,MAAM,eAAe,MAAM;AACzC,WAAS,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;AAC7C,UAAM,QAAQ,eAAe,IAAI,KAAK;AACtC,UAAM,YAAY,MAAM,MAAM,UAAU,EAAE,MAAM,MAAM,KAAK;AAC3D,UAAM,YAAY,MAAM,MAAM,UAAU,EAAE,MAAM,MAAM,KAAK;AAC3D,QAAI,CAAC,aAAa,CAAC,UAAW;AAC9B,UAAM,MAAM,KAAK,GAAG,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACtC;AACF;AAEA,eAAe,kBAAkB,QAAgC;AAC/D,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,MAAM,OAAO,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AACjD,QAAM,QAAQ,OAAO,IAAI,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACxD,QAAM,OAAO,OAAO,IAAI,YAAY,CAAC;AACrC,QAAM,mBAAmB,GAAG,GAAG,IAAI,KAAK,IAAI,IAAI;AAEhD,QAAM,mBAAmB,OAAO,WAAW,eAAe,EAAE,MAAM;AAClE,MAAK,MAAM,iBAAiB,MAAM,IAAK,GAAG;AACxC,UAAM,eAAe,MAAM,iBAAiB,WAAW,EAAE,MAAM,MAAM,EAAE;AACvE,QAAI,aAAa,KAAK,EAAE,WAAW,GAAG;AACpC,YAAM,iBAAiB,KAAK,gBAAgB,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC9D;AAAA,EACF;AACF;AAEA,eAAe,mBAAmB,QAAiB,gBAAuC;AACxF,QAAM,sBAAsB,OAAO,UAAU,SAAS,EAAE,MAAM;AAC9D,MAAI,CAAE,MAAM,oBAAoB,UAAU,EAAE,MAAM,MAAM,KAAK,KAAO,MAAM,oBAAoB,MAAM,EAAE,MAAM,MAAM,CAAC,MAAO,GAAG;AAC3H;AAAA,EACF;AACA,QAAM,wBAAwB,qBAAqB,GAAK,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACxE,QAAM,oBAAoB,KAAK,cAAc,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAC7D,QAAM,oBAAoB,MAAM,KAAK,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACvD;AAEA,eAAsB,cAAc,MAAY,SAAwC;AACtF,QAAM,yBAAyB,IAAI;AACnC,QAAM,KAAK,UAAU,UAAU,EAAE,MAAM,WAAW,CAAC,EAAE,MAAM;AAC3D,QAAM,gBAAgB,KAAK,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC,EAAE,MAAM;AAC5E,QAAM,OAAO,aAAa,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AACzE,QAAM,OAAO,aAAa,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AACzE,QAAM,cAAc,MAAM;AAE1B,QAAM,SAAS,WAAW,IAAI;AAC9B,QAAM,OAAO,MAAM,EAAE,YAAY;AAEjC,QAAM,mBAAmB,OAAO,UAAU,UAAU,EAAE,MAAM,eAAe,CAAC;AAC5E,QAAM,OAAO,gBAAgB,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AAC5E,QAAM,iBAAiB,MAAM;AAE7B,QAAM,YAAY,OAAO,UAAU,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC7E,QAAM,OAAO,SAAS,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AACrE,QAAM,UAAU,KAAK,QAAQ,IAAI;AACjC,QAAM,OAAO,UAAU,WAAW,EAAE,MAAM,OAAO,CAAC,EAAE,KAAK,OAAO,QAAQ,cAAc,CAAC;AACvF,QAAM,OAAO,UAAU,WAAW,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,OAAO,QAAQ,QAAQ,CAAC;AAE9E,MAAI,QAAQ,cAAc;AAExB,UAAM,kBAAkB,OACrB,QAAQ,mBAAmB,EAC3B,OAAO,EAAE,SAAS,yBAAyB,CAAC,EAC5C,MAAM;AACT,QAAK,MAAM,gBAAgB,MAAM,IAAK,GAAG;AACvC,YAAM,gBAAgB,MAAM;AAC5B,YAAM,MAAM,KAAK,UAAU,UAAU,EAAE,MAAM,QAAQ,cAAc,OAAO,KAAK,CAAC;AAChF,YAAM,IAAI,MAAM,EAAE,QAAQ,EAAE,OAAO,WAAW,SAAS,IAAM,CAAC;AAC9D,YAAM,IAAI,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC;AACrE,QAAM,OAAO,YAAY,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AACxE,QAAM,OAAO,YAAY,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AACxE,QAAM,UAAU,KAAK,UAAU,OAAO,EAAE,MAAM,IAAI,OAAO,aAAa,QAAQ,IAAI,GAAG,GAAG,EAAE,CAAC;AAC3F,WAAS,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;AAC/C,UAAM,aAAa,MAAM;AACzB,UAAM,QAAQ,KAAK;AAAA,MACjB,OAAO,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAM,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,MAClE,QAAQ,QAAQ,EAAE,OAAO,WAAW,SAAS,IAAM,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACtE,CAAC;AACD,QAAI,MAAM,QAAQ,UAAU,EAAE,MAAM,MAAM,KAAK,EAAG;AAClD,QAAI,CAAE,MAAM,OAAO,UAAU,EAAE,MAAM,MAAM,KAAK,EAAI;AAAA,EACtD;AAEA,MAAI,MAAM,OAAO,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AAC/C,UAAM,OAAO,MAAM,EAAE,WAAW,EAAE,SAAS,qBAAqB,CAAC;AAAA,EACnE;AACA,QAAM,KAAK,UAAU,UAAU,EAAE,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAC3E,QAAM,OAAO,OAAO,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AACrE;AAEA,eAAsB,mBAAmB,MAAY,UAAkB,UAAiC;AACtG,QAAM,KAAK,UAAU,UAAU,EAAE,MAAM,WAAW,CAAC,EAAE,MAAM;AAC3D,QAAM,MAAM,KAAK,UAAU,OAAO,EAAE,MAAM,IAAI,OAAO,aAAa,QAAQ,GAAG,GAAG,EAAE,CAAC;AACnF,QAAM,IAAI,MAAM;AAEhB,QAAM,SAAS,KAAK,UAAU,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,QAAM,OAAO,MAAM,EAAE,YAAY;AACjC,QAAM,OAAO,UAAU,WAAW,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,OAAO,QAAQ,CAAC;AACtE,QAAM,OAAO,UAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC,EAAE,MAAM;AAElE,QAAM,OAAO,KAAK,UAAU,OAAO,EAAE,MAAM,IAAI,OAAO,GAAG,aAAa,QAAQ,CAAC,QAAQ,QAAQ,OAAO,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY;AAC7H;AAEA,eAAsB,WAAW,MAAY,UAAiC;AAC5E,QAAM,KAAK,UAAU,UAAU,EAAE,MAAM,WAAW,CAAC,EAAE,MAAM;AAC3D,QAAM,MAAM,KAAK,UAAU,OAAO,EAAE,MAAM,IAAI,OAAO,aAAa,QAAQ,GAAG,GAAG,EAAE,CAAC;AACnF,QAAM,OAAO,GAAG,EAAE,YAAY;AAC9B,QAAM,IAAI,QAAQ,QAAQ,EAAE,KAAK,EAAE,MAAM;AAEzC,QAAM,gBAAgB,KAAK,UAAU,aAAa;AAClD,MAAI,MAAM,cAAc,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AACtD,UAAM,cAAc,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM;AAC7E,UAAM,OAAO,aAAa,EAAE,WAAW;AAAA,EACzC;AAEA,QAAM,OAAO,KAAK,UAAU,OAAO,EAAE,MAAM,IAAI,OAAO,aAAa,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC;AACtG;AAEA,eAAsB,cAAc,MAAY,SAA8C;AAC5F,QAAM,iBAAiB,KAAK,UAAU,UAAU,EAAE,MAAM,iBAAiB,CAAC,EAAE,MAAM;AAClF,QAAM,wBAAwB,gBAAgB,oBAAoB;AAClE,QAAM,eAAe,MAAM;AAC3B,QAAM,sBAAsB,KAAK,UAAU,UAAU,EAAE,MAAM,kBAAkB,CAAC,EAAE,MAAM;AACxF,QAAM,wBAAwB,qBAAqB,oBAAoB;AACvE,QAAM,oBAAoB,MAAM;AAEhC,QAAM,SAAS,KAAK,UAAU,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnE,QAAM,OAAO,MAAM,EAAE,YAAY;AACjC,QAAM,gBAAgB,KAAK,UAAU,OAAO,EAAE,MAAM,IAAI,OAAO,aAAa,QAAQ,KAAK,GAAG,GAAG,EAAE,CAAC;AAClG,QAAM,qBAAqB,YAA2B;AACpD,UAAM,OAAO,UAAU,sBAAsB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAM,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAE1G,UAAM,cAAc,OAAO,QAAQ,+CAA+C,EAAE,MAAM;AAC1F,UAAM,OAAO,WAAW,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AAEvE,UAAM,aAAa,OAAO,iBAAiB,sBAAsB,EAAE,MAAM;AACzE,UAAM,OAAO,UAAU,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AACtE,UAAM,oBAAoB,YAAY,QAAQ,KAAK;AAEnD,QAAK,MAAM,YAAY,MAAM,IAAK,GAAG;AACnC,YAAM,oBAAoB,6BAA6B,QAAQ,aAAa,WAAW;AACvF,YAAM,YAAY,QAAQ,aAAa;AACvC,YAAM,YAAY,MAAM;AACxB,YAAM,SAAS,KAAK,UAAU,UAAU,EAAE,MAAM,IAAI,OAAO,IAAI,aAAa,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,MAAM;AACzG,YAAM,gBAAgB,MAAM,OAAO,QAAQ,EAAE,OAAO,WAAW,SAAS,IAAM,CAAC,EAAE;AAAA,QAC/E,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AACA,UAAI,eAAe;AACjB,cAAM,OAAO,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,MACpC,OAAO;AACL,cAAM,KAAK,SAAS,KAAK,UAAU,OAAO,CAAC,CAAC;AAC5C,cAAM,KAAK,eAAe,GAAG;AAC7B,cAAM,KAAK,SAAS,MAAM,OAAO;AAAA,MACnC;AACA,WAAK;AAAA,IACP;AAEA,UAAM,oBAAoB,OAAO,UAAU,UAAU,EAAE,MAAM,kBAAkB,CAAC,EAAE,MAAM;AACxF,QAAK,MAAM,kBAAkB,MAAM,IAAK,GAAG;AACzC,YAAM,kBAAkB,MAAM,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAChD;AAEA,UAAM,sBAAsB,OAAO,QAAQ,2CAA2C;AACtF,UAAM,OAAO,oBAAoB,MAAM,CAAC,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AACvF,QAAK,MAAM,oBAAoB,MAAM,IAAK,GAAG;AAC3C,YAAM,oBAAoB,oBAAoB,MAAM,GAAG,OAAO,QAAQ,SAAS,CAAC;AAAA,IAClF;AAAA,EACF;AAEA,MAAI,QAAQ;AACZ,WAAS,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;AAC/C,UAAM,mBAAmB;AACzB,UAAM,eAAe,OAAO,UAAU,UAAU,EAAE,MAAM,kBAAkB,CAAC,EAAE,MAAM;AACnF,UAAM,wBAAwB,cAAc,GAAK,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACjE,UAAM,aAAa,MAAM;AACzB,UAAM,QAAQ,KAAK;AAAA,MACjB,OAAO,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAM,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,MAClE,cAAc,QAAQ,EAAE,OAAO,WAAW,SAAS,IAAM,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC5E,CAAC;AACD,YACE,CAAE,MAAM,OAAO,UAAU,EAAE,MAAM,MAAM,KAAK,KAC3C,MAAM,cAAc,UAAU,EAAE,MAAM,MAAM,KAAK;AACpD,QAAI,MAAO;AAAA,EACb;AAEA,MAAI,MAAM,OAAO,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AAC/C,UAAM,OAAO,MAAM,EAAE,WAAW,EAAE,SAAS,IAAM,CAAC;AAAA,EACpD;AACA,MAAI,CAAE,MAAM,cAAc,UAAU,EAAE,MAAM,MAAM,KAAK,GAAI;AACzD,UAAM,eAAe,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC3C,UAAM,OAAO,aAAa,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AAAA,EAC3E;AACF;AAEA,eAAsB,WAAW,MAAY,QAAkE;AAC7G,QAAM,yBAAyB,IAAI;AACnC,QAAM,cAAc,KAAK,UAAU,UAAU,EAAE,MAAM,cAAc,CAAC,EAAE,MAAM;AAC5E,QAAM,wBAAwB,aAAa,oBAAoB;AAC/D,QAAM,YAAY,MAAM;AACxB,QAAM,cAAc,OAAO,QAAQ,CAAC;AACpC,QAAM,mBAAmB,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC,CAAC;AAC/D,QAAM,mBAAmB,KAAK,UAAU,UAAU,EAAE,MAAM,eAAe,CAAC,EAAE,MAAM;AAClF,QAAM,wBAAwB,kBAAkB,oBAAoB;AACpE,QAAM,OAAO,gBAAgB,EAAE,YAAY,EAAE,SAAS,qBAAqB,CAAC;AAC5E,QAAM,iBAAiB,MAAM;AAE7B,QAAM,SAAS,KAAK,UAAU,UAAU,EAAE,MAAM,eAAe,CAAC;AAChE,QAAM,cAAc,OAAO,QAAQ,2BAA2B,EAAE,MAAM;AACtE,QAAM,wBAAwB,QAAQ,aAAa,yDAAyD;AAC5G,QAAM,YAAY,YAA2B;AAC3C,UAAM,uBAAuB,OAAO,QAAQ,2BAA2B,EAAE,MAAM;AAC/E,UAAM,wBAAwB,sBAAsB,GAAK,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACzE,UAAM,qBAAqB,KAAK,gBAAgB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAChE,UAAM,qBAAqB,MAAM,KAAK,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACxD;AACA,QAAM,oBAAoB,OAAO,iBAAiB,wBAAwB,EAAE,MAAM;AAClF,QAAM,cAAc,OAAO,iBAAiB,gBAAgB,EAAE,MAAM;AACpE,QAAM,UAAU;AAChB,QAAM,wBAAwB,mBAAmB,GAAK,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACtE,QAAM,kBAAkB,mBAAmB,QAAQ,6CAA6C,EAAE,MAAM,MAAM,KAAK;AACnH,QAAM,wBAAwB,aAAa,GAAK,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAChE,QAAM,kBAAkB,aAAa,WAAW,mBAAmB,EAAE,MAAM,MAAM,KAAK;AACtF,QAAM,aAAa,OAAO,UAAU,UAAU,EAAE,MAAM,QAAQ,CAAC,EAAE,MAAM;AACvE,QAAM,mBAAmB,KAAK,UAAU,mCAAmC,EAAE,MAAM;AACnF,WAAS,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;AAC/C,UAAM,UAAU;AAChB,UAAM,kBAAkB,mBAAmB,QAAQ,6CAA6C,EAAE,MAAM,MAAM,KAAK;AACnH,UAAM,kBAAkB,aAAa,WAAW,mBAAmB,EAAE,MAAM,MAAM,KAAK;AACtF,UAAM,wBAAwB,YAAY,GAAK,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC/D,UAAM,WAAW,MAAM;AACvB,UAAM,QAAQ,KAAK;AAAA,MACjB,OAAO,QAAQ,EAAE,OAAO,UAAU,SAAS,KAAM,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,MAClE,iBAAiB,QAAQ,EAAE,OAAO,WAAW,SAAS,KAAM,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,MAC7E,OAAO,UAAU,yBAAyB,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,WAAW,SAAS,KAAM,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAClH,CAAC;AACD,QAAI,CAAE,MAAM,OAAO,UAAU,EAAE,MAAM,MAAM,KAAK,EAAI;AACpD,QAAI,MAAM,iBAAiB,UAAU,EAAE,MAAM,MAAM,KAAK,EAAG;AAC3D,UAAM,+BAA+B,QAAQ,2DAA2D,GAAK;AAAA,EAC/G;AACA,MAAI,MAAM,OAAO,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AAC/C,UAAM,OAAO,MAAM,QAAQ,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC3C,UAAM,OAAO,QAAQ,EAAE,OAAO,UAAU,SAAS,KAAM,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC1E;AACA,QAAM,iBAAiB,QAAQ,EAAE,OAAO,WAAW,SAAS,KAAM,CAAC,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACnF,MAAI,QAAQ,MAAM,iBAAiB,UAAU,EAAE,MAAM,MAAM,KAAK;AAChE,MAAI,CAAC,OAAO;AACV,YAAQ,MAAM,iBAAiB,MAAM,MAAM;AAAA,EAC7C;AACA,SAAO,EAAE,aAAa,MAAM;AAC9B;AAEA,eAAsB,YAAY,MAAyF;AACzH,QAAM,yBAAyB,IAAI;AACnC,QAAM,4BAA4B,IAAI;AACtC,QAAM,eAAe,KAAK,UAAU,UAAU,EAAE,MAAM,eAAe,CAAC,EAAE,MAAM;AAC9E,QAAM,wBAAwB,cAAc,oBAAoB;AAChE,QAAM,aAAa,MAAM;AACzB,QAAM,iBAAiB,QAAQ,KAAK,IAAI,CAAC;AACzC,QAAM,iBAAiB,OAAO,KAAK,IAAI,CAAC;AACxC,QAAM,SAAS,KAAK,UAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjE,QAAM,qBAAqB,YAA8B;AACvD,UAAM,qBAAqB,KAAK,UAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC7E,UAAM,cAAc,MAAM,mBAAmB,MAAM;AACnD,aAAS,QAAQ,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG;AACxD,YAAM,SAAS,mBAAmB,IAAI,KAAK;AAC3C,UAAI,CAAE,MAAM,OAAO,UAAU,EAAE,MAAM,MAAM,KAAK,EAAI;AACpD,UAAI,CAAE,MAAM,OAAO,UAAU,EAAE,MAAM,MAAM,KAAK,EAAI;AACpD,YAAM,wBAAwB,QAAQ,oBAAoB,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAC1E,YAAM,OAAO,uBAAuB,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACpD,YAAM,OAAO,MAAM,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACnC,YAAM,UAAU,MAAM,OAAO,QAAQ,EAAE,OAAO,WAAW,SAAS,KAAM,CAAC,EAAE,KAAK,MAAM,IAAI,EAAE,MAAM,MAAM,KAAK;AAC7G,UAAI,QAAS,QAAO;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,cAAc;AAClB,WAAS,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;AAC/C,UAAM,SAAS,MAAM,mBAAmB;AACxC,QAAI,CAAC,OAAQ;AACb,UAAM,OACH,UAAU,6CAA6C,EACvD,MAAM,EACN,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAM,CAAC,EAC3C,MAAM,MAAM;AAAA,IAAC,CAAC;AACjB,UAAMC,uBAAsB,OAAO,QAAQ,iBAAiB,EAAE,MAAM;AACpE,QAAI,MAAMA,qBAAoB,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AAC5D,YAAM,wBAAwBA,sBAAqB,oBAAoB,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACvF,oBAAc;AACd;AAAA,IACF;AACA,UAAM,OAAO,UAAU,UAAU,EAAE,MAAM,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACnF,UAAM,OAAO,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAM,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC1E;AACA,MAAI,CAAC,aAAa;AAChB,UAAMC,SAAQ,MAAM,kBAAkB,MAAM,gBAAgB,cAAc;AAC1E,QAAI,CAACA,QAAO;AACV,YAAM,mBAAmB;AACzB,YAAMD,uBAAsB,OAAO,QAAQ,iBAAiB,EAAE,MAAM;AACpE,YAAM,wBAAwB,QAAQA,sBAAqB,6CAA6C;AAAA,IAC1G,OAAO;AACL,YAAME,iBAAgB,KAAK,UAAU,IAAI,OAAO,eAAe,aAAa,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,MAAM;AAC3G,YAAM,UAAU,MAAMA,eACnB,QAAQ,EAAE,OAAO,WAAW,SAAS,qBAAqB,CAAC,EAC3D,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AACpB,aAAO,EAAE,gBAAgB,gBAAgB,OAAO,QAAQ;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,sBAAsB,OAAO,QAAQ,iBAAiB,EAAE,MAAM;AACpE,QAAM,mBAAmB,QAAQ,cAAc;AAC/C,QAAM,gBAAgB,OAAO,iBAAiB,kCAAkC,EAAE,MAAM;AACxF,QAAM,wBAAwB,eAAe,GAAK,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAClE,QAAM,cAAc,KAAK,cAAc,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACvD,QAAM,qBAAqB,MAAM;AACjC,QAAM,qBAAqB,MAAM;AACjC,QAAM,sBAAsB,MAAM;AAClC,QAAM,qBAAqB,MAAM;AACjC,QAAM,kBAAkB,MAAM;AAC9B,QAAM,mBAAmB,QAAQ,cAAc;AAE/C,QAAM,OAAO,UAAU,6BAA6B,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,qBAAqB,CAAC,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACxI,QAAM,aAAa,OAAO,UAAU,UAAU,EAAE,MAAM,WAAW,CAAC,EAAE,MAAM;AAC1E,QAAM,eAAgB,MAAM,WAAW,MAAM,IAAK,KAAM,MAAM,WAAW,UAAU,EAAE,MAAM,MAAM,KAAK;AACtG,MAAI,cAAc;AAChB,UAAM,WAAW,MAAM,EAAE,SAAS,qBAAqB,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC1E,OAAO;AACL,UAAM,OAAO,MAAM,qBAAqB,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC1D;AAEA,MAAI,SAAS,MAAM,OAChB,QAAQ,EAAE,OAAO,UAAU,SAAS,qBAAqB,CAAC,EAC1D,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AAEpB,MAAI,CAAC,QAAQ;AACX,aAAS,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;AAC/C,UAAI,CAAE,MAAM,OAAO,UAAU,EAAE,MAAM,MAAM,KAAK,EAAI;AACpD,YAAM,qBAAqB,MAAM;AACjC,YAAM,sBAAsB,MAAM;AAClC,YAAM,qBAAqB,MAAM;AACjC,YAAM,kBAAkB,MAAM;AAC9B,YAAM,mBAAmB,QAAQ,cAAc;AAC/C,UAAI,cAAc;AAChB,cAAM,WAAW,MAAM,EAAE,SAAS,IAAM,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MAC3D,OAAO;AACL,cAAM,OAAO,MAAM,qBAAqB,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MAC1D;AACA,eAAS,MAAM,OACZ,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAM,CAAC,EAC3C,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AACpB,UAAI,OAAQ;AAAA,IACd;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,gBAAgB,gBAAgB,OAAO,MAAM;AAAA,EACxD;AAEA,QAAM,KAAK,UAAU,UAAU,EAAE,MAAM,eAAe,CAAC,EAAE,MAAM;AAC/D,QAAM,gBAAgB,KAAK,UAAU,IAAI,OAAO,eAAe,aAAa,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,MAAM;AAC3G,QAAM,QAAQ,MAAM,cACjB,QAAQ,EAAE,OAAO,WAAW,SAAS,qBAAqB,CAAC,EAC3D,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AACpB,SAAO,EAAE,gBAAgB,gBAAgB,MAAM;AACjD;AAEA,eAAsB,oBAAoB,MAA6B;AACrE,QAAM,MAAM,KAAK,UAAU,OAAO,EAAE,MAAM,yBAAyB,CAAC,EAAE,MAAM;AAC5E,QAAM,OAAO,GAAG,EAAE,YAAY;AAC9B,QAAM,QAAQ,MAAM,IAAI,UAAU,GAAG,KAAK;AAC1C,SAAO,oBAAoB,IAAI;AACjC;",
6
6
  "names": ["selectedButton", "createButton", "shipmentNumberInput", "added", "shipmentLabel"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/core",
3
- "version": "0.6.1-develop.3174.1.c3822bcdf0",
3
+ "version": "0.6.1-develop.3179.1.9ee0441adc",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "scripts": {
@@ -237,12 +237,12 @@
237
237
  "ts-pattern": "^5.0.0"
238
238
  },
239
239
  "peerDependencies": {
240
- "@open-mercato/ai-assistant": "0.6.1-develop.3174.1.c3822bcdf0",
241
- "@open-mercato/shared": "0.6.1-develop.3174.1.c3822bcdf0"
240
+ "@open-mercato/ai-assistant": "0.6.1-develop.3179.1.9ee0441adc",
241
+ "@open-mercato/shared": "0.6.1-develop.3179.1.9ee0441adc"
242
242
  },
243
243
  "devDependencies": {
244
- "@open-mercato/ai-assistant": "0.6.1-develop.3174.1.c3822bcdf0",
245
- "@open-mercato/shared": "0.6.1-develop.3174.1.c3822bcdf0",
244
+ "@open-mercato/ai-assistant": "0.6.1-develop.3179.1.9ee0441adc",
245
+ "@open-mercato/shared": "0.6.1-develop.3179.1.9ee0441adc",
246
246
  "@testing-library/dom": "^10.4.1",
247
247
  "@testing-library/jest-dom": "^6.9.1",
248
248
  "@testing-library/react": "^16.3.1",
@@ -349,6 +349,21 @@ async function waitForDialogFieldReady(
349
349
  await field.scrollIntoViewIfNeeded().catch(() => {});
350
350
  }
351
351
 
352
+ async function fillControlledInput(input: Locator, value: string, timeout = 2_000): Promise<void> {
353
+ await waitForStableVisibility(input, TEST_WAIT_TIMEOUT_MS);
354
+ await input.fill(value);
355
+ await input.evaluate((element, nextValue) => {
356
+ const control = element as HTMLInputElement | HTMLTextAreaElement;
357
+ const prototype = control instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;
358
+ const valueSetter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set;
359
+ valueSetter?.call(control, nextValue);
360
+ control.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: nextValue }));
361
+ control.dispatchEvent(new Event('change', { bubbles: true }));
362
+ }, value);
363
+ await expect(input).toHaveValue(value, { timeout });
364
+ await input.press('Tab').catch(() => {});
365
+ }
366
+
352
367
  async function recoverGenericErrorPageIfPresent(page: Page): Promise<boolean> {
353
368
  const errorHeading = page.getByRole('heading', { name: /^Something went wrong$/i }).first();
354
369
  if (!(await errorHeading.isVisible().catch(() => false))) return false;
@@ -1081,22 +1096,24 @@ export async function addAdjustment(page: Page, options: AddAdjustmentOptions):
1081
1096
 
1082
1097
  const labelInput = dialog.getByPlaceholder(/e\.g\. Shipping fee/i).first();
1083
1098
  await expect(labelInput).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });
1084
- await labelInput.fill(options.label);
1085
- await expect(labelInput).toHaveValue(options.label, { timeout: 2_000 });
1099
+ await fillControlledInput(labelInput, options.label);
1086
1100
 
1087
1101
  if ((await kindTrigger.count()) > 0) {
1088
1102
  const expectedKindValue = normalizeAdjustmentKindValue(options.kindLabel ?? 'Surcharge');
1089
1103
  const kindLabel = options.kindLabel ?? 'Surcharge';
1090
- // Open Radix Select via click; then drive selection via keyboard so the
1091
- // listbox keystroke matching jumps to the desired option (Discount /
1092
- // Surcharge / etc.). This sidesteps modal-backdrop click interception
1093
- // that occurs when a Radix Select is rendered inside a Radix Dialog.
1094
1104
  await kindTrigger.click();
1095
- await page.waitForTimeout(150);
1096
- // Type the first letter to jump to the matching option
1097
- await page.keyboard.type(kindLabel.charAt(0));
1098
- await page.waitForTimeout(150);
1099
- await page.keyboard.press('Enter');
1105
+ const option = page.getByRole('option', { name: new RegExp(`^${escapeRegExp(kindLabel)}$`, 'i') }).first();
1106
+ const optionVisible = await option.waitFor({ state: 'visible', timeout: 2_000 }).then(
1107
+ () => true,
1108
+ () => false,
1109
+ );
1110
+ if (optionVisible) {
1111
+ await option.click({ force: true });
1112
+ } else {
1113
+ await page.keyboard.type(kindLabel.charAt(0));
1114
+ await page.waitForTimeout(150);
1115
+ await page.keyboard.press('Enter');
1116
+ }
1100
1117
  void expectedKindValue;
1101
1118
  }
1102
1119
 
@@ -1108,8 +1125,7 @@ export async function addAdjustment(page: Page, options: AddAdjustmentOptions):
1108
1125
  const enabledAmountInputs = dialog.locator('input[placeholder="0.00"]:not([disabled])');
1109
1126
  await expect(enabledAmountInputs.first()).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });
1110
1127
  if ((await enabledAmountInputs.count()) > 0) {
1111
- await enabledAmountInputs.first().fill(String(options.netAmount));
1112
- await expect(enabledAmountInputs.first()).toHaveValue(String(options.netAmount), { timeout: 2_000 }).catch(() => {});
1128
+ await fillControlledInput(enabledAmountInputs.first(), String(options.netAmount));
1113
1129
  }
1114
1130
  };
1115
1131
 
@@ -1134,7 +1150,7 @@ export async function addAdjustment(page: Page, options: AddAdjustmentOptions):
1134
1150
  }
1135
1151
  if (!(await adjustmentRow.isVisible().catch(() => false))) {
1136
1152
  await adjustmentsTab.click().catch(() => {});
1137
- await adjustmentRow.waitFor({ state: 'visible', timeout: 2_000 }).catch(() => {});
1153
+ await expect(adjustmentRow).toBeVisible({ timeout: TEST_WAIT_TIMEOUT_MS });
1138
1154
  }
1139
1155
  }
1140
1156