@delopay/sdk 0.19.1 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-QGQR2OBR.js → chunk-4FTI5GO7.js} +21 -1
- package/dist/chunk-4FTI5GO7.js.map +1 -0
- package/dist/index.cjs +20 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +74 -1
- package/dist/index.d.ts +74 -1
- package/dist/index.js +1 -1
- package/dist/internal.cjs +20 -0
- package/dist/internal.cjs.map +1 -1
- package/dist/internal.d.cts +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/internal.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-QGQR2OBR.js.map +0 -1
package/dist/internal.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/internal.ts","../src/error.ts","../src/resources/apiKeys.ts","../src/resources/authentication.ts","../src/resources/billing.ts","../src/resources/blocklist.ts","../src/resources/connectors.ts","../src/resources/customers.ts","../src/resources/disputes.ts","../src/resources/ephemeralKeys.ts","../src/resources/events.ts","../src/resources/fees.ts","../src/resources/mandates.ts","../src/resources/merchantAccounts.ts","../src/resources/paymentLinks.ts","../src/resources/paymentMethods.ts","../src/resources/payments.ts","../src/resources/payouts.ts","../src/resources/poll.ts","../src/resources/profileAcquirers.ts","../src/resources/profiles.ts","../src/resources/projects.ts","../src/resources/refunds.ts","../src/resources/relay.ts","../src/resources/routing.ts","../src/resources/shops.ts","../src/resources/stripeConnect.ts","../src/resources/threeDsRules.ts","../src/resources/users.ts","../src/resources/verification.ts","../src/resources/webhooks.ts","../src/resources/analytics.ts","../src/resources/analyticsDashboard.ts","../src/resources/cards.ts","../src/resources/export.ts","../src/resources/featureMatrix.ts","../src/resources/files.ts","../src/resources/forex.ts","../src/resources/regions.ts","../src/resources/subscriptions.ts","../src/client.ts","../src/branding.ts","../src/internal/resources/admin.ts","../src/internal/resources/adminPortal.ts","../src/internal/resources/auditLogs.ts","../src/internal/resources/cache.ts","../src/internal/resources/cardIssuers.ts","../src/internal/resources/configs.ts","../src/internal/resources/connectorRestrictions.ts","../src/internal/resources/gsm.ts","../src/internal/resources/platformBilling.ts","../src/internal/resources/platformFees.ts","../src/internal/client.ts"],"sourcesContent":["/**\n * Internal SDK entry. For DeloPay staff tooling only; merchants import from\n * `'@delopay/sdk'` and never touch this path.\n *\n * Re-exports the full public surface plus the admin/ops-plane resources\n * and `DelopayInternal`, a subclass of `Delopay` that wires the internal\n * resources onto the client.\n *\n * import { DelopayInternal } from '@delopay/sdk/internal';\n * const sdk = new DelopayInternal('', { baseUrl: '/api' });\n * await sdk.admin.signIn({ email, password });\n * await sdk.adminPortal.listCustomers();\n * await sdk.platformFees.list(merchantId);\n *\n * All internal type-only exports come out of this barrel too — they're not\n * exported from `'@delopay/sdk'` directly.\n */\n\nexport * from './index';\nexport { DelopayInternal } from './internal/client';\nexport { Admin } from './internal/resources/admin';\nexport { AdminPortal } from './internal/resources/adminPortal';\nexport { AuditLogs } from './internal/resources/auditLogs';\nexport { Cache } from './internal/resources/cache';\nexport { CardIssuers } from './internal/resources/cardIssuers';\nexport { Configs } from './internal/resources/configs';\nexport { ConnectorRestrictions } from './internal/resources/connectorRestrictions';\nexport { Gsm } from './internal/resources/gsm';\nexport { PlatformBilling } from './internal/resources/platformBilling';\nexport { PlatformFees } from './internal/resources/platformFees';\nexport type * from './internal/types';\n","/**\n * Error thrown when the Delopay API returns a non-2xx response, or when a\n * timeout or network error occurs.\n *\n * @example\n * ```typescript\n * try {\n * await delopay.payments.create({ amount: 5000, currency: 'EUR' });\n * } catch (e) {\n * if (e instanceof DelopayError) {\n * console.error(e.status, e.code, e.requestId, e.message);\n * }\n * }\n * ```\n */\nexport class DelopayError extends Error {\n /** HTTP status code returned by the API, or `0` for timeout/network errors. */\n readonly status: number;\n /** Machine-readable error code returned by the API (e.g. `'HE_00'`). */\n readonly code: string;\n /** Error category (e.g. `'invalid_request'`, `'timeout_error'`). */\n readonly type: string;\n /** Value of the `x-request-id` response header, when present. Include this when contacting support. */\n readonly requestId?: string;\n /**\n * Raw response body (truncated to ~2 KB). Populated when the server returns a\n * non-JSON error body (e.g. an HTML 502 from an upstream proxy) so debugging\n * still has something to go on.\n */\n readonly rawBody?: string;\n /**\n * Structured error context the API attaches under `error.data` for select\n * codes — e.g. `{ retry_after_secs: 248 }` on rate-limit / max-attempt\n * lockouts. Schema is per-code; consult the API reference for the shape.\n */\n readonly data?: Record<string, unknown>;\n\n constructor(\n message: string,\n options: {\n status: number;\n code: string;\n type: string;\n requestId?: string;\n rawBody?: string;\n data?: Record<string, unknown>;\n },\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = 'DelopayError';\n this.status = options.status;\n this.code = options.code;\n this.type = options.type;\n if (options.requestId !== undefined) this.requestId = options.requestId;\n if (options.rawBody !== undefined) this.rawBody = options.rawBody;\n if (options.data !== undefined) this.data = options.data;\n }\n}\n\n/**\n * Thrown when the API key is missing, invalid, or revoked (HTTP 401).\n *\n * @example\n * ```typescript\n * if (e instanceof DelopayAuthenticationError) {\n * // Prompt user to re-enter their API key.\n * }\n * ```\n */\nexport class DelopayAuthenticationError extends DelopayError {\n constructor(\n message = 'Invalid API key',\n options?: {\n code?: string;\n type?: string;\n requestId?: string;\n rawBody?: string;\n data?: Record<string, unknown>;\n },\n ) {\n super(message, {\n status: 401,\n // Default to the generic \"invalid API key\" code, but let callers pass\n // through the server-reported code (e.g. `UR_05` for unverified-email\n // 401s) so they can differentiate between auth failure reasons.\n code: options?.code || 'AUTH_01',\n type: options?.type || 'authentication_error',\n requestId: options?.requestId,\n rawBody: options?.rawBody,\n data: options?.data,\n });\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = 'DelopayAuthenticationError';\n }\n}\n","import type {\n ApiKeyCreateRequest,\n ApiKeyCreateResponse,\n ApiKeyResponse,\n ApiKeyUpdateRequest,\n ApiKeyRevokeResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage API keys for a merchant account. */\nexport class ApiKeys {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new API key for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Key creation parameters (name, expiry, etc.).\n * @returns The newly created key including the plaintext secret (shown once only).\n *\n * @example\n * ```typescript\n * const { key_value } = await delopay.apiKeys.create('merch_123', { name: 'Production key' });\n * ```\n */\n async create(merchantId: string, params: ApiKeyCreateRequest): Promise<ApiKeyCreateResponse> {\n return this.request('POST', `/api_keys/${encodeURIComponent(merchantId)}`, { body: params });\n }\n\n /**\n * Retrieve metadata about an API key (does not return the plaintext secret).\n *\n * @param merchantId - The merchant account ID.\n * @param keyId - The API key ID.\n * @returns The API key metadata.\n */\n async retrieve(merchantId: string, keyId: string): Promise<ApiKeyResponse> {\n return this.request(\n 'GET',\n `/api_keys/${encodeURIComponent(merchantId)}/${encodeURIComponent(keyId)}`,\n );\n }\n\n /**\n * Update an API key's name or expiry.\n *\n * @param merchantId - The merchant account ID.\n * @param keyId - The API key ID to update.\n * @param params - Fields to update.\n * @returns The updated API key metadata.\n */\n async update(\n merchantId: string,\n keyId: string,\n params: ApiKeyUpdateRequest,\n ): Promise<ApiKeyResponse> {\n return this.request(\n 'POST',\n `/api_keys/${encodeURIComponent(merchantId)}/${encodeURIComponent(keyId)}`,\n { body: params },\n );\n }\n\n /**\n * Revoke an API key, immediately invalidating it.\n *\n * @param merchantId - The merchant account ID.\n * @param keyId - The API key ID to revoke.\n * @returns Revocation confirmation.\n */\n async revoke(merchantId: string, keyId: string): Promise<ApiKeyRevokeResponse> {\n return this.request(\n 'DELETE',\n `/api_keys/${encodeURIComponent(merchantId)}/${encodeURIComponent(keyId)}`,\n );\n }\n\n /**\n * List all API keys for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Array of API key metadata objects.\n */\n async list(merchantId: string): Promise<ApiKeyResponse[]> {\n return this.request('GET', `/api_keys/${encodeURIComponent(merchantId)}/list`);\n }\n}\n","import type { AuthenticationCreateRequest, AuthenticationResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Authentication {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: AuthenticationCreateRequest): Promise<AuthenticationResponse> {\n return this.request('POST', '/authentication', { body: params });\n }\n\n async checkEligibility(authId: string): Promise<AuthenticationResponse> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/eligibility`);\n }\n\n async authenticate(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<AuthenticationResponse> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/authenticate`, {\n body: params,\n });\n }\n\n async sync(authId: string, params?: Record<string, unknown>): Promise<AuthenticationResponse> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/sync`, {\n body: params,\n });\n }\n\n /** Redirect after authentication. `POST /authentication/{authId}/redirect` */\n async redirect(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/redirect`, {\n body: params,\n });\n }\n\n /** Enable authn methods token. `POST /authentication/{authId}/enabled_authn_methods_token` */\n async enabledAuthnMethodsToken(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request(\n 'POST',\n `/authentication/${encodeURIComponent(authId)}/enabled_authn_methods_token`,\n {\n body: params,\n },\n );\n }\n\n /** Submit eligibility check. `POST /authentication/{authId}/eligibility-check` */\n async eligibilityCheck(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/eligibility-check`, {\n body: params,\n });\n }\n}\n","import type {\n BillingProfileResponse,\n BillingSetupRequest,\n BillingSetupResponse,\n BillingCompleteSetupRequest,\n TopupRequest,\n TopupResponse,\n LedgerResponse,\n LedgerListParams,\n AutoRechargeUpdateRequest,\n AllocationTransferRequest,\n AllocationTransferResponse,\n AllocationListResponse,\n AllocationResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Manage per-shop prepaid balance allocations transferred from the host merchant treasury. */\nclass BillingAllocations {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Transfer funds from the host merchant treasury into a shop's allocation.\n *\n * @param merchantId - The host merchant account ID.\n * @param params - Transfer details (amount, target profile/shop ID).\n * @returns The allocation transfer result.\n */\n async transferIn(\n merchantId: string,\n params: AllocationTransferRequest,\n ): Promise<AllocationTransferResponse> {\n return this.request(\n 'POST',\n `/billing/${encodeURIComponent(merchantId)}/allocations/transfer-in`,\n { body: params },\n );\n }\n\n /**\n * Transfer funds from a shop's allocation back to the host merchant treasury.\n *\n * @param merchantId - The host merchant account ID.\n * @param params - Transfer details (amount, source profile/shop ID).\n * @returns The allocation transfer result.\n */\n async transferOut(\n merchantId: string,\n params: AllocationTransferRequest,\n ): Promise<AllocationTransferResponse> {\n return this.request(\n 'POST',\n `/billing/${encodeURIComponent(merchantId)}/allocations/transfer-out`,\n {\n body: params,\n },\n );\n }\n\n /**\n * List all shop balance allocations for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns List of shop allocations.\n */\n async list(merchantId: string): Promise<AllocationListResponse> {\n return this.request('GET', `/billing/${encodeURIComponent(merchantId)}/allocations`);\n }\n\n /**\n * Get the balance allocation for a specific shop.\n *\n * @param merchantId - The merchant account ID.\n * @param profileId - The shop (business profile) ID.\n * @returns The shop's balance allocation.\n */\n async get(merchantId: string, profileId: string): Promise<AllocationResponse> {\n return this.request(\n 'GET',\n `/billing/${encodeURIComponent(merchantId)}/allocations/${encodeURIComponent(profileId)}`,\n );\n }\n}\n\n/**\n * Manage prepaid billing balances — top-ups, card setup, auto-recharge, and the balance ledger.\n *\n * Delopay deducts a platform fee from the merchant's prepaid balance on every successful payment.\n * Use these endpoints to fund and monitor that balance.\n */\nexport class Billing {\n /** Per-shop balance allocation management for host merchants. */\n readonly allocations: BillingAllocations;\n\n constructor(private readonly request: RequestFn) {\n this.allocations = new BillingAllocations(request);\n }\n\n /**\n * Retrieve a merchant's billing profile (balance, status, auto-recharge config).\n *\n * @param merchantId - The merchant account ID.\n * @returns The billing profile.\n *\n * @example\n * ```typescript\n * const profile = await delopay.billing.getProfile('merch_123');\n * console.log(profile.balance, profile.status);\n * ```\n */\n async getProfile(merchantId: string): Promise<BillingProfileResponse> {\n return this.request('GET', `/billing/${encodeURIComponent(merchantId)}`);\n }\n\n /**\n * Start a Stripe SetupIntent flow to collect a payment card for auto-recharge.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Optional setup parameters.\n * @returns The Stripe client secret needed to render the card element.\n */\n async setup(merchantId: string, params?: BillingSetupRequest): Promise<BillingSetupResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/setup`, {\n body: params,\n });\n }\n\n /**\n * Confirm card setup after the Stripe SetupIntent completes on the frontend.\n *\n * @param merchantId - The merchant account ID.\n * @param params - The Stripe SetupIntent ID to confirm.\n * @returns The updated billing profile.\n */\n async completeSetup(\n merchantId: string,\n params: BillingCompleteSetupRequest,\n ): Promise<BillingProfileResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/setup/complete`, {\n body: params,\n });\n }\n\n /**\n * Manually top up a merchant's prepaid balance by charging their saved card.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Top-up amount and currency.\n * @returns The top-up result.\n */\n async topup(merchantId: string, params: TopupRequest): Promise<TopupResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/topup`, {\n body: params,\n });\n }\n\n /**\n * List the balance ledger (credits and debits) for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Optional pagination parameters.\n * @returns The ledger entries.\n */\n async listLedger(merchantId: string, params?: LedgerListParams): Promise<LedgerResponse> {\n return this.request('GET', `/billing/${encodeURIComponent(merchantId)}/ledger`, {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /**\n * Update auto-recharge configuration (threshold, top-up amount, enabled flag).\n *\n * @param merchantId - The merchant account ID.\n * @param params - Auto-recharge settings to update.\n * @returns The updated billing profile.\n */\n async updateAutoRecharge(\n merchantId: string,\n params: AutoRechargeUpdateRequest,\n ): Promise<BillingProfileResponse> {\n return this.request('PATCH', `/billing/${encodeURIComponent(merchantId)}/auto-recharge`, {\n body: params,\n });\n }\n}\n","import type { BlocklistAddRequest, BlocklistResponse, BlocklistDataKind } from '../types';\nimport type { RequestFn } from '../client';\n\nexport interface BlocklistListParams {\n data_kind?: BlocklistDataKind | null;\n limit?: number | null;\n offset?: number | null;\n}\n\nexport interface BlocklistToggleParams {\n status: boolean;\n}\n\nexport class Blocklist {\n constructor(private readonly request: RequestFn) {}\n\n async add(params: BlocklistAddRequest): Promise<BlocklistResponse> {\n return this.request('POST', '/blocklist', { body: params });\n }\n\n async remove(params: BlocklistAddRequest): Promise<BlocklistResponse> {\n return this.request('DELETE', '/blocklist', { body: params });\n }\n\n async list(params?: BlocklistListParams): Promise<BlocklistResponse[]> {\n return this.request('GET', '/blocklist', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n async toggle(params: BlocklistToggleParams): Promise<Record<string, unknown>> {\n return this.request('POST', '/blocklist/toggle', { body: params });\n }\n}\n","import type {\n ConnectorCreateRequest,\n ConnectorResponse,\n ConnectorUpdateRequest,\n ConnectorWebhookListResponse,\n ConnectorWebhookRegisterRequest,\n ConnectorWebhookRegisterResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Connectors {\n constructor(private readonly request: RequestFn) {}\n\n async create(accountId: string, params: ConnectorCreateRequest): Promise<ConnectorResponse> {\n return this.request('POST', `/account/${encodeURIComponent(accountId)}/connectors`, {\n body: params,\n });\n }\n\n async retrieve(accountId: string, connectorId: string): Promise<ConnectorResponse> {\n return this.request(\n 'GET',\n `/account/${encodeURIComponent(accountId)}/connectors/${encodeURIComponent(connectorId)}`,\n );\n }\n\n async list(accountId: string): Promise<ConnectorResponse[]> {\n return this.request('GET', `/account/${encodeURIComponent(accountId)}/connectors`);\n }\n\n async update(\n accountId: string,\n connectorId: string,\n params: ConnectorUpdateRequest,\n ): Promise<ConnectorResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/connectors/${encodeURIComponent(connectorId)}`,\n {\n body: params,\n },\n );\n }\n\n async delete(accountId: string, connectorId: string): Promise<ConnectorResponse> {\n return this.request(\n 'DELETE',\n `/account/${encodeURIComponent(accountId)}/connectors/${encodeURIComponent(connectorId)}`,\n );\n }\n\n // --- Advanced operations (Task 4.8) ---\n\n /** Verify connector credentials. `POST /account/connectors/verify` */\n async verify(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/account/connectors/verify', { body: params });\n }\n\n /**\n * Register a webhook for a connector.\n * `POST /account/{merchantId}/connectors/webhooks/{connectorId}`\n *\n * @param params - Optional event scope. Defaults to `{ event_type: 'all_events' }`\n * on the backend when omitted; pass `{ event_type: { specific_event: '…' } }`\n * to scope to a single event.\n */\n async registerWebhook(\n merchantId: string,\n connectorId: string,\n params?: ConnectorWebhookRegisterRequest,\n ): Promise<ConnectorWebhookRegisterResponse> {\n const path = `/account/${encodeURIComponent(merchantId)}/connectors/webhooks/${encodeURIComponent(connectorId)}`;\n if (params === undefined) return this.request('POST', path);\n return this.request('POST', path, { body: params });\n }\n\n /** Get registered webhooks for a connector. `GET /account/{merchantId}/connectors/webhooks/{connectorId}` */\n async getWebhook(merchantId: string, connectorId: string): Promise<ConnectorWebhookListResponse> {\n return this.request(\n 'GET',\n `/account/${encodeURIComponent(merchantId)}/connectors/webhooks/${encodeURIComponent(connectorId)}`,\n );\n }\n\n /** List available payment methods. `GET /account/payment_methods` */\n async listPaymentMethods(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/account/payment_methods');\n }\n}\n","import type {\n CustomerCreateRequest,\n CustomerResponse,\n CustomerUpdateRequest,\n CustomerListParams,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage customer profiles. */\nexport class Customers {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new customer.\n *\n * @param params - Customer creation parameters (name, email, phone, address, etc.).\n * @returns The created customer.\n *\n * @example\n * ```typescript\n * const customer = await delopay.customers.create({\n * email: 'alice@example.com',\n * name: 'Alice Smith',\n * });\n * ```\n */\n async create(params: CustomerCreateRequest): Promise<CustomerResponse> {\n return this.request('POST', '/customers', { body: params });\n }\n\n /**\n * Retrieve a customer by their ID.\n *\n * @param customerId - The unique customer ID.\n * @returns The customer.\n *\n * @example\n * ```typescript\n * const customer = await delopay.customers.retrieve('cus_abc123');\n * ```\n */\n async retrieve(customerId: string): Promise<CustomerResponse> {\n return this.request('GET', `/customers/${encodeURIComponent(customerId)}`);\n }\n\n /**\n * Update an existing customer's details.\n *\n * @param customerId - The customer ID to update.\n * @param params - Fields to update (name, email, address, metadata, etc.).\n * @returns The updated customer.\n */\n async update(customerId: string, params: CustomerUpdateRequest): Promise<CustomerResponse> {\n return this.request('POST', `/customers/${encodeURIComponent(customerId)}`, { body: params });\n }\n\n /**\n * Delete a customer and all their saved payment methods.\n *\n * @param customerId - The customer ID to delete.\n * @returns The deleted customer object.\n */\n async delete(customerId: string): Promise<CustomerResponse> {\n return this.request('DELETE', `/customers/${encodeURIComponent(customerId)}`);\n }\n\n /**\n * List customers, optionally filtered by email.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Array of customer objects.\n */\n async list(params?: CustomerListParams): Promise<CustomerResponse[]> {\n return this.request('GET', '/customers/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n // --- OLAP extensions (Task 4.6) ---\n\n /** List customers with count. `GET /customers/list_with_count` */\n async listWithCount(\n params?: CustomerListParams,\n ): Promise<{ count: number; total_count: number; data: CustomerResponse[] }> {\n return this.request('GET', '/customers/list_with_count', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n /** List mandates for a customer. `GET /customers/{customerId}/mandates` */\n async listMandates(customerId: string): Promise<Record<string, unknown>[]> {\n return this.request('GET', `/customers/${encodeURIComponent(customerId)}/mandates`);\n }\n}\n","import type { DisputeResponse, DisputeListParams, DisputeEvidenceRequest } from '../types';\nimport type { RequestFn } from '../client';\n\n/** View and respond to payment disputes and chargebacks. */\nexport class Disputes {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Retrieve a dispute by its ID.\n *\n * @param disputeId - The unique dispute ID.\n * @returns The dispute.\n */\n async retrieve(disputeId: string): Promise<DisputeResponse> {\n return this.request('GET', `/disputes/${encodeURIComponent(disputeId)}`);\n }\n\n /**\n * List disputes, optionally filtered by status, stage, or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Array of disputes.\n */\n async list(params?: DisputeListParams): Promise<DisputeResponse[]> {\n return this.request('GET', '/disputes/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /**\n * Accept a dispute, conceding the chargeback to the customer.\n *\n * @param disputeId - The dispute ID to accept.\n * @returns The updated dispute.\n */\n async accept(disputeId: string): Promise<DisputeResponse> {\n return this.request('POST', `/disputes/accept/${encodeURIComponent(disputeId)}`);\n }\n\n /**\n * Submit evidence to challenge a dispute.\n *\n * @param params - Evidence details and the dispute ID to contest.\n * @returns The updated dispute.\n */\n async submitEvidence(params: DisputeEvidenceRequest): Promise<DisputeResponse> {\n return this.request('POST', '/disputes/evidence', { body: params });\n }\n\n /**\n * Attach evidence (e.g. file upload metadata) to a dispute.\n *\n * Uses `PUT /disputes/evidence`.\n */\n async attachEvidence(params: DisputeEvidenceRequest): Promise<DisputeResponse> {\n return this.request('PUT', '/disputes/evidence', { body: params });\n }\n\n /**\n * Retrieve previously submitted evidence for a dispute.\n *\n * @param disputeId - The dispute ID.\n * @returns The submitted evidence.\n */\n async retrieveEvidence(disputeId: string): Promise<DisputeEvidenceRequest> {\n return this.request('GET', `/disputes/evidence/${encodeURIComponent(disputeId)}`);\n }\n\n /**\n * Delete submitted evidence for a dispute.\n *\n * @param params - Evidence request body identifying what to delete.\n * @returns The updated dispute.\n */\n async deleteEvidence(params: DisputeEvidenceRequest): Promise<DisputeResponse> {\n return this.request('DELETE', '/disputes/evidence', { body: params });\n }\n\n // --- OLAP extensions (Task 4.4) ---\n\n /** List disputes (profile-scoped). `GET /disputes/profile/list` */\n async listByProfile(params?: DisputeListParams): Promise<DisputeResponse[]> {\n return this.request('GET', '/disputes/profile/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** Get dispute filter options. `GET /disputes/filter` */\n async getFilters(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/filter', { query: params });\n }\n\n /** Get dispute filters (profile-scoped). `GET /disputes/profile/filter` */\n async getFiltersByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/profile/filter', { query: params });\n }\n\n /** Get dispute aggregates. `GET /disputes/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/aggregate', { query: params });\n }\n\n /** Get dispute aggregates (profile-scoped). `GET /disputes/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/profile/aggregate', { query: params });\n }\n\n /**\n * Fetch the latest dispute state from the connector (gateway).\n * `GET /disputes/{connectorId}/fetch`\n *\n * Note: the path parameter is the **connector dispute id** on the gateway, not the\n * Delopay dispute id. Method is GET (not POST) and this method signature was\n * previously wrong — callers depending on the old `POST /disputes/{id}/fetch_from_connector`\n * path were silently hitting 404s.\n */\n async fetchFromConnector(connectorId: string): Promise<DisputeResponse> {\n return this.request('GET', `/disputes/${encodeURIComponent(connectorId)}/fetch`);\n }\n}\n","import type { EphemeralKeyCreateRequest, EphemeralKeyCreateResponse } from '../types';\nimport type { RequestFn } from '../client';\n\n/**\n * Create short-lived ephemeral keys for secure client-side operations.\n *\n * Ephemeral keys grant a mobile or browser client temporary access to a\n * specific customer's data (e.g. to display saved payment methods) without\n * exposing your secret API key.\n */\nexport class EphemeralKeys {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create an ephemeral key scoped to a specific customer.\n *\n * @param params - Customer ID and optional expiry.\n * @returns The ephemeral key with its plaintext secret and expiry timestamp.\n *\n * @example\n * ```typescript\n * const ephKey = await delopay.ephemeralKeys.create({ customer_id: 'cus_123' });\n * // Pass ephKey.secret to your mobile app.\n * ```\n */\n async create(params: EphemeralKeyCreateRequest): Promise<EphemeralKeyCreateResponse> {\n return this.request('POST', '/ephemeral_keys', { body: params });\n }\n\n /**\n * Invalidate an ephemeral key before it expires.\n *\n * @param keyId - The ephemeral key ID to delete.\n * @returns The deleted key object.\n */\n async delete(keyId: string): Promise<EphemeralKeyCreateResponse> {\n return this.request('DELETE', `/ephemeral_keys/${encodeURIComponent(keyId)}`);\n }\n}\n","import type {\n EventListParams,\n EventListResponse,\n EventDeliveryAttemptResponse,\n EventDetailResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Events {\n constructor(private readonly request: RequestFn) {}\n\n async list(merchantId: string, params?: EventListParams): Promise<EventListResponse> {\n return this.request('POST', `/events/${encodeURIComponent(merchantId)}`, { body: params });\n }\n\n async listDeliveryAttempts(\n merchantId: string,\n eventId: string,\n ): Promise<EventDeliveryAttemptResponse[]> {\n return this.request(\n 'GET',\n `/events/${encodeURIComponent(merchantId)}/${encodeURIComponent(eventId)}/attempts`,\n );\n }\n\n async retryDelivery(merchantId: string, eventId: string): Promise<EventDetailResponse> {\n return this.request(\n 'POST',\n `/events/${encodeURIComponent(merchantId)}/${encodeURIComponent(eventId)}/retry`,\n );\n }\n\n // --- Profile-scoped listing (Task 4.12) ---\n\n /** List events (profile-scoped). `POST /events/profile/list` */\n async listByProfile(params?: Record<string, unknown>): Promise<EventListResponse> {\n return this.request('POST', '/events/profile/list', { body: params });\n }\n}\n","import type {\n FeeScheduleCreateRequest,\n FeeScheduleResponse,\n FeeScheduleUpdateRequest,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/**\n * Merchant-scoped fee schedules. Each schedule optionally targets a\n * specific shop (via `shop_id`). Merchants can CRUD their own fee\n * overrides; platform-wide fee programs are administered by Delopay and\n * not exposed here.\n */\nexport class Fees {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a merchant-scoped fee schedule (optionally per-shop).\n *\n * @param params - Fee schedule parameters.\n * @param merchantId - The merchant account ID.\n */\n async create(params: FeeScheduleCreateRequest, merchantId: string): Promise<FeeScheduleResponse> {\n return this.request('POST', '/merchant_fees', {\n body: params,\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * List the merchant's own fee schedules.\n *\n * @param merchantId - The merchant account ID.\n */\n async list(merchantId: string): Promise<FeeScheduleResponse[]> {\n return this.request('GET', '/merchant_fees/list', {\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Update a merchant-scoped fee schedule.\n *\n * @param feeId - The fee schedule ID.\n * @param params - Fields to update.\n */\n async update(feeId: string, params: FeeScheduleUpdateRequest): Promise<FeeScheduleResponse> {\n return this.request('PUT', `/merchant_fees/${encodeURIComponent(feeId)}`, { body: params });\n }\n\n /**\n * Delete a merchant-scoped fee schedule.\n *\n * @param feeId - The fee schedule ID.\n */\n async delete(feeId: string): Promise<FeeScheduleResponse> {\n return this.request('DELETE', `/merchant_fees/${encodeURIComponent(feeId)}`);\n }\n}\n","import type { MandateResponse, MandateRevokedResponse, MandateListParams } from '../types';\nimport type { RequestFn } from '../client';\n\n/** View and revoke recurring payment mandates. */\nexport class Mandates {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Retrieve a mandate by its ID.\n *\n * @param mandateId - The unique mandate ID.\n * @returns The mandate.\n */\n async retrieve(mandateId: string): Promise<MandateResponse> {\n return this.request('GET', `/mandates/${encodeURIComponent(mandateId)}`);\n }\n\n /**\n * Revoke an active mandate, preventing future charges.\n *\n * @param mandateId - The mandate ID to revoke.\n * @returns Revocation confirmation.\n */\n async revoke(mandateId: string): Promise<MandateRevokedResponse> {\n return this.request('POST', `/mandates/revoke/${encodeURIComponent(mandateId)}`);\n }\n\n /**\n * List mandates, optionally filtered by customer or status.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Array of mandates.\n */\n async list(params?: MandateListParams): Promise<MandateResponse[]> {\n return this.request('GET', '/mandates/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n}\n","import type {\n MerchantAccountCreateRequest,\n MerchantAccountResponse,\n MerchantAccountUpdateRequest,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class MerchantAccounts {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: MerchantAccountCreateRequest): Promise<MerchantAccountResponse> {\n return this.request('POST', '/accounts', { body: params });\n }\n\n async retrieve(accountId: string): Promise<MerchantAccountResponse> {\n return this.request('GET', `/accounts/${encodeURIComponent(accountId)}`);\n }\n\n async update(\n accountId: string,\n params: MerchantAccountUpdateRequest,\n ): Promise<MerchantAccountResponse> {\n return this.request('POST', `/accounts/${encodeURIComponent(accountId)}`, { body: params });\n }\n\n async delete(accountId: string): Promise<MerchantAccountResponse> {\n return this.request('DELETE', `/accounts/${encodeURIComponent(accountId)}`);\n }\n\n // --- Advanced operations (Task 4.9) ---\n\n /** List all merchant accounts. `GET /accounts/list` */\n async list(): Promise<MerchantAccountResponse[]> {\n return this.request('GET', '/accounts/list');\n }\n\n /** Toggle key-value store for a merchant. `POST /accounts/{accountId}/kv` */\n async toggleKv(accountId: string): Promise<Record<string, unknown>> {\n return this.request('POST', `/accounts/${encodeURIComponent(accountId)}/kv`);\n }\n\n /** Get KV status for a merchant. `GET /accounts/{accountId}/kv` */\n async getKvStatus(accountId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/accounts/${encodeURIComponent(accountId)}/kv`);\n }\n\n /** Transfer keys between merchants. `POST /accounts/transfer` */\n async transferKeys(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/accounts/transfer', { body: params });\n }\n}\n","import type { PaymentLinkResponse, PaymentLinkListParams, PaymentLinkListResponse } from '../types';\nimport type { RequestFn } from '../client';\n\n/** Retrieve and list hosted payment links. */\nexport class PaymentLinks {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Retrieve a payment link by its ID.\n *\n * @param linkId - The unique payment link ID.\n * @returns The payment link details.\n */\n async retrieve(linkId: string): Promise<PaymentLinkResponse> {\n return this.request('GET', `/payment_link/${encodeURIComponent(linkId)}`);\n }\n\n /**\n * List payment links, optionally filtered by status or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of payment links.\n */\n async list(params?: PaymentLinkListParams): Promise<PaymentLinkListResponse> {\n return this.request('POST', '/payment_link/list', { body: params });\n }\n\n /** Initiate (render) a payment link page. `GET /payment_link/{merchantId}/{paymentId}` */\n async initiate(merchantId: string, paymentId: string): Promise<Record<string, unknown>> {\n return this.request(\n 'GET',\n `/payment_link/${encodeURIComponent(merchantId)}/${encodeURIComponent(paymentId)}`,\n );\n }\n\n /** Get payment link status. `GET /payment_linkstatus/{merchantId}/{paymentId}` */\n async status(merchantId: string, paymentId: string): Promise<Record<string, unknown>> {\n return this.request(\n 'GET',\n `/payment_linkstatus/${encodeURIComponent(merchantId)}/${encodeURIComponent(paymentId)}`,\n );\n }\n}\n","import type {\n PaymentMethodCreateRequest,\n PaymentMethodResponse,\n PaymentMethodUpdateRequest,\n PaymentMethodListParams,\n PaymentMethodDeleteResponse,\n CustomerPaymentMethodsListParams,\n CustomerPaymentMethodsListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage saved payment methods for customers. */\nexport class PaymentMethods {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Save a new payment method (card, bank account, wallet, etc.).\n *\n * @param params - Payment method data including type and card/bank details.\n * @returns The saved payment method.\n *\n * @example\n * ```typescript\n * const pm = await delopay.paymentMethods.create({\n * payment_method: 'card',\n * customer_id: 'cus_123',\n * client_secret: 'cs_...',\n * });\n * ```\n */\n async create(params: PaymentMethodCreateRequest): Promise<PaymentMethodResponse> {\n return this.request('POST', '/payment_methods', { body: params });\n }\n\n /**\n * Retrieve a saved payment method by its ID.\n *\n * @param methodId - The payment method ID.\n * @returns The payment method.\n */\n async retrieve(methodId: string): Promise<PaymentMethodResponse> {\n return this.request('GET', `/payment_methods/${encodeURIComponent(methodId)}`);\n }\n\n /**\n * Update an existing payment method (e.g. update card expiry).\n *\n * @param methodId - The payment method ID to update.\n * @param params - Fields to update (card expiry, holder name, etc.).\n * @returns The updated payment method.\n */\n async update(\n methodId: string,\n params: PaymentMethodUpdateRequest,\n ): Promise<PaymentMethodResponse> {\n return this.request('POST', `/payment_methods/${encodeURIComponent(methodId)}/update`, {\n body: params,\n });\n }\n\n /**\n * Delete a saved payment method.\n *\n * @param methodId - The payment method ID to delete.\n * @returns Deletion confirmation.\n */\n async delete(methodId: string): Promise<PaymentMethodDeleteResponse> {\n return this.request('DELETE', `/payment_methods/${encodeURIComponent(methodId)}`);\n }\n\n /**\n * List payment methods using a client secret.\n *\n * @param params - Filter by `client_secret`.\n * @returns Array of payment methods.\n */\n async list(params?: PaymentMethodListParams): Promise<PaymentMethodResponse[]> {\n return this.request('GET', '/payment_methods', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /**\n * List all saved payment methods for a customer, optionally filtered.\n *\n * @param customerId - The customer ID.\n * @param params - Optional filters: `client_secret`, `accepted_countries`, `accepted_currencies`,\n * `amount`, `recurring_enabled`, `installment_payment_enabled`, `limit`, `card_networks`.\n * @returns Customer's saved payment methods.\n *\n * @example\n * ```typescript\n * const { customer_payment_methods } = await delopay.paymentMethods.listForCustomer(\n * 'cus_123',\n * { accepted_currencies: ['EUR'], amount: 5000 },\n * );\n * ```\n */\n async listForCustomer(\n customerId: string,\n params?: CustomerPaymentMethodsListParams,\n ): Promise<CustomerPaymentMethodsListResponse> {\n return this.request('GET', `/customers/${encodeURIComponent(customerId)}/payment_methods`, {\n query: params as Record<\n string,\n string | number | boolean | (string | number | boolean)[] | null | undefined\n >,\n });\n }\n\n /**\n * Set a payment method as the default for a customer.\n *\n * @param customerId - The customer ID.\n * @param methodId - The payment method ID to set as default.\n * @returns The updated payment method.\n */\n async setDefault(customerId: string, methodId: string): Promise<PaymentMethodResponse> {\n return this.request(\n 'POST',\n `/customers/${encodeURIComponent(customerId)}/payment_methods/${encodeURIComponent(methodId)}/default`,\n );\n }\n\n // --- Advanced operations (Task 3.3) ---\n\n /** Migrate a payment method. `POST /payment_methods/migrate` */\n async migrate(params: Record<string, unknown>): Promise<PaymentMethodResponse> {\n return this.request('POST', '/payment_methods/migrate', { body: params });\n }\n\n /** Batch migrate payment methods. `POST /payment_methods/migrate-batch` */\n async migrateBatch(params: Record<string, unknown>[]): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/migrate-batch', { body: params });\n }\n\n /** Batch update payment methods. `POST /payment_methods/update-batch` */\n async updateBatch(params: Record<string, unknown>[]): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/update-batch', { body: params });\n }\n\n /** Batch retrieve payment methods. `GET /payment_methods/batch` */\n async batchRetrieve(\n params?: Record<string, string | number | undefined>,\n ): Promise<PaymentMethodResponse[]> {\n return this.request('GET', '/payment_methods/batch', { query: params });\n }\n\n /** Tokenize a card. `POST /payment_methods/tokenize-card` */\n async tokenizeCard(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/tokenize-card', { body: params });\n }\n\n /** Batch tokenize cards. `POST /payment_methods/tokenize-card-batch` */\n async tokenizeCardBatch(params: Record<string, unknown>[]): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/tokenize-card-batch', { body: params });\n }\n\n /** Initiate payment method collect link flow. `POST /payment_methods/collect` */\n async collect(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/collect', { body: params });\n }\n\n /** Save a payment method. `POST /payment_methods/{methodId}/save` */\n async save(methodId: string, params?: Record<string, unknown>): Promise<PaymentMethodResponse> {\n return this.request('POST', `/payment_methods/${encodeURIComponent(methodId)}/save`, {\n body: params,\n });\n }\n\n /** Create payment method auth link token. `POST /payment_methods/auth/link` */\n async createAuthLink(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/auth/link', { body: params });\n }\n\n /** Exchange payment method auth token. `POST /payment_methods/auth/exchange` */\n async exchangeAuthToken(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/auth/exchange', { body: params });\n }\n\n /** Tokenize card using existing PM. `POST /payment_methods/{methodId}/tokenize-card` */\n async tokenizeCardForMethod(\n methodId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/payment_methods/${encodeURIComponent(methodId)}/tokenize-card`, {\n body: params,\n });\n }\n}\n","import type {\n PaymentCreateRequest,\n PaymentListResponse,\n PaymentResponse,\n PaymentRetrieveOptions,\n PaymentUpdateRequest,\n PaymentConfirmRequest,\n PaymentCaptureRequest,\n PaymentCancelRequest,\n PaymentListParams,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Manage payment intents — create, confirm, capture, cancel, and list payments. */\nexport class Payments {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new payment intent.\n *\n * @param params - Payment creation parameters including amount and currency.\n * @returns The created payment intent.\n *\n * @example\n * ```typescript\n * const payment = await delopay.payments.create({\n * amount: 5000,\n * currency: 'EUR',\n * customer_id: 'cus_123',\n * });\n * ```\n */\n async create(params: PaymentCreateRequest): Promise<PaymentResponse> {\n return this.request('POST', '/payments', { body: params });\n }\n\n /**\n * Retrieve a payment by its ID.\n *\n * @param paymentId - The unique payment intent ID.\n * @param options - Optional query flags. `force_sync` asks the backend to\n * reconcile state with the connector before returning (used to recover a\n * stuck intent when a webhook was lost). `all_keys_required` lifts the\n * backend's `should_call_connector` gate so a `requires_payment_method`\n * intent can still trigger a sync — without it the backend short-circuits\n * and returns the local snapshot. Both flags are JWT-authenticated dashboard\n * helpers; API-key callers can use them too where the backend allows.\n * @returns The payment intent.\n *\n * @example\n * ```typescript\n * const payment = await delopay.payments.retrieve('pay_abc123');\n * const synced = await delopay.payments.retrieve('pay_abc123', {\n * force_sync: true,\n * all_keys_required: true,\n * });\n * ```\n */\n async retrieve(paymentId: string, options?: PaymentRetrieveOptions): Promise<PaymentResponse> {\n const path = `/payments/${encodeURIComponent(paymentId)}`;\n if (options === undefined) return this.request('GET', path);\n const query: Record<string, boolean> = {};\n if (options.force_sync !== undefined) query['force_sync'] = options.force_sync;\n if (options.all_keys_required !== undefined) {\n query['all_keys_required'] = options.all_keys_required;\n }\n if (Object.keys(query).length === 0) return this.request('GET', path);\n return this.request('GET', path, { query });\n }\n\n /**\n * Update an existing payment intent before it is confirmed.\n *\n * @param paymentId - The payment intent ID to update.\n * @param params - Fields to update (amount, currency, metadata, etc.).\n * @returns The updated payment intent.\n */\n async update(paymentId: string, params: PaymentUpdateRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}`, { body: params });\n }\n\n /**\n * Confirm a payment intent, triggering authorisation with the selected gateway.\n *\n * @param paymentId - The payment intent ID to confirm.\n * @param params - Confirmation parameters (payment method data, return URL, etc.).\n * @returns The updated payment intent.\n */\n async confirm(paymentId: string, params: PaymentConfirmRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/confirm`, {\n body: params,\n });\n }\n\n /**\n * Capture a previously authorised payment.\n *\n * @param paymentId - The payment intent ID to capture.\n * @param params - Optional capture parameters (partial capture amount, etc.).\n * @returns The updated payment intent.\n */\n async capture(paymentId: string, params?: PaymentCaptureRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/capture`, {\n body: params,\n });\n }\n\n /**\n * Cancel a payment intent that has not yet been captured.\n *\n * @param paymentId - The payment intent ID to cancel.\n * @param params - Optional cancellation reason.\n * @returns The updated payment intent.\n */\n async cancel(paymentId: string, params?: PaymentCancelRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/cancel`, {\n body: params,\n });\n }\n\n /**\n * List payment intents, optionally filtered by customer or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of payment intents.\n *\n * @example\n * ```typescript\n * const { data } = await delopay.payments.list({ customer_id: 'cus_123', limit: 25 });\n * ```\n */\n async list(params?: PaymentListParams): Promise<PaymentListResponse> {\n return this.request('GET', '/payments/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n // --- Advanced operations (Task 3.2) ---\n\n /** Generate session tokens. `POST /payments/session_tokens` */\n async sessionTokens(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payments/session_tokens', { body: params });\n }\n\n /** Retrieve payment with gateway credentials. `POST /payments/sync` */\n async sync(params: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('POST', '/payments/sync', { body: params });\n }\n\n /** Cancel after partial capture. `POST /payments/{paymentId}/cancel_post_capture` */\n async cancelPostCapture(\n paymentId: string,\n params?: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/cancel_post_capture`, {\n body: params,\n });\n }\n\n /** Incrementally authorize more funds. `POST /payments/{paymentId}/incremental_authorization` */\n async incrementalAuthorization(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request(\n 'POST',\n `/payments/${encodeURIComponent(paymentId)}/incremental_authorization`,\n {\n body: params,\n },\n );\n }\n\n /** Extend authorization window. `POST /payments/{paymentId}/extend_authorization` */\n async extendAuthorization(\n paymentId: string,\n params?: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/extend_authorization`, {\n body: params,\n });\n }\n\n /** Complete authorization. `POST /payments/{paymentId}/complete_authorize` */\n async completeAuthorize(\n paymentId: string,\n params?: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/complete_authorize`, {\n body: params,\n });\n }\n\n /** Dynamic tax calculation. `POST /payments/{paymentId}/calculate_tax` */\n async calculateTax(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/calculate_tax`, {\n body: params,\n });\n }\n\n /** Update payment metadata. `POST /payments/{paymentId}/update_metadata` */\n async updateMetadata(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/update_metadata`, {\n body: params,\n });\n }\n\n /** Retrieve extended card info. `GET /payments/{paymentId}/extended_card_info` */\n async extendedCardInfo(paymentId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/payments/${encodeURIComponent(paymentId)}/extended_card_info`);\n }\n\n // --- OLAP extensions (Task 4.2) ---\n\n /** List payments (profile-scoped). `GET /payments/profile/list` */\n async listByProfile(params?: PaymentListParams): Promise<PaymentListResponse> {\n return this.request('GET', '/payments/profile/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** List payments across all shops. `GET /payments/list-all-shops` */\n async listAllShops(params?: PaymentListParams): Promise<PaymentListResponse> {\n return this.request('GET', '/payments/list-all-shops', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** List payments by filter (POST body). `POST /payments/list` */\n async listByFilter(params: Record<string, unknown>): Promise<PaymentListResponse> {\n return this.request('POST', '/payments/list', { body: params });\n }\n\n /** Get payment filter options. `POST /payments/filter` */\n async getFilters(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payments/filter', { body: params });\n }\n\n /** Get payment filters (v2). `GET /payments/v2/filter` */\n async getFiltersV2(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payments/v2/filter', { query: params });\n }\n\n /** Get payment aggregates. `GET /payments/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payments/aggregate', { query: params });\n }\n\n /** Get payment aggregates (profile-scoped). `GET /payments/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payments/profile/aggregate', { query: params });\n }\n\n /** Manually update payment status. `PUT /payments/{paymentId}/manual-update` */\n async manualUpdate(paymentId: string, params: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('PUT', `/payments/${encodeURIComponent(paymentId)}/manual-update`, {\n body: params,\n });\n }\n\n /** Approve a payment waiting for review. `POST /payments/{paymentId}/approve` */\n async approve(paymentId: string, params?: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/approve`, {\n body: params,\n });\n }\n\n /** Reject a payment waiting for review. `POST /payments/{paymentId}/reject` */\n async reject(paymentId: string, params?: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/reject`, {\n body: params,\n });\n }\n\n /** Initiate external 3DS authentication. `POST /payments/{paymentId}/3ds/authentication` */\n async threeDsAuthentication(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/3ds/authentication`, {\n body: params,\n });\n }\n}\n","import type {\n PayoutCreateRequest,\n PayoutResponse,\n PayoutUpdateRequest,\n PayoutListParams,\n PayoutListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage payouts — fund transfers from merchant to a recipient bank account. */\nexport class Payouts {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new payout.\n *\n * @param params - Payout parameters including amount, currency, and destination.\n * @returns The created payout.\n *\n * @example\n * ```typescript\n * const payout = await delopay.payouts.create({\n * amount: 10000,\n * currency: 'EUR',\n * customer_id: 'cus_123',\n * });\n * ```\n */\n async create(params: PayoutCreateRequest): Promise<PayoutResponse> {\n return this.request('POST', '/payouts/create', { body: params });\n }\n\n /**\n * Retrieve a payout by its ID.\n *\n * @param payoutId - The unique payout ID.\n * @returns The payout.\n */\n async retrieve(payoutId: string): Promise<PayoutResponse> {\n return this.request('GET', `/payouts/${encodeURIComponent(payoutId)}`);\n }\n\n /**\n * Update a payout before it is confirmed.\n *\n * @param payoutId - The payout ID to update.\n * @param params - Fields to update.\n * @returns The updated payout.\n */\n async update(payoutId: string, params: PayoutUpdateRequest): Promise<PayoutResponse> {\n return this.request('PUT', `/payouts/${encodeURIComponent(payoutId)}`, { body: params });\n }\n\n /**\n * Confirm a payout, triggering the actual transfer.\n *\n * @param payoutId - The payout ID to confirm.\n * @param params - Optional confirmation parameters.\n * @returns The updated payout.\n */\n async confirm(payoutId: string, params?: PayoutUpdateRequest): Promise<PayoutResponse> {\n return this.request('POST', `/payouts/${encodeURIComponent(payoutId)}/confirm`, {\n body: params,\n });\n }\n\n /**\n * Cancel a payout before it is fulfilled.\n *\n * @param payoutId - The payout ID to cancel.\n * @returns The cancelled payout.\n */\n async cancel(payoutId: string): Promise<PayoutResponse> {\n return this.request('POST', `/payouts/${encodeURIComponent(payoutId)}/cancel`);\n }\n\n /**\n * Mark a payout as fulfilled (manual confirmation of successful transfer).\n *\n * @param payoutId - The payout ID to fulfil.\n * @returns The fulfilled payout.\n */\n async fulfill(payoutId: string): Promise<PayoutResponse> {\n return this.request('POST', `/payouts/${encodeURIComponent(payoutId)}/fulfill`);\n }\n\n /**\n * List payouts, optionally filtered by status or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of payouts.\n */\n async list(params?: PayoutListParams): Promise<PayoutListResponse> {\n return this.request('GET', '/payouts/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n // --- OLAP extensions (Task 4.5) ---\n\n /** List payouts (profile-scoped). `GET /payouts/profile/list` */\n async listByProfile(params?: PayoutListParams): Promise<PayoutListResponse> {\n return this.request('GET', '/payouts/profile/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** List payouts by filter (POST body). `POST /payouts/list` */\n async listByFilter(params: Record<string, unknown>): Promise<PayoutListResponse> {\n return this.request('POST', '/payouts/list', { body: params });\n }\n\n /** Get payout filter options. `POST /payouts/filter` */\n async getFilters(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payouts/filter', { body: params });\n }\n\n /** Get payout filters (profile-scoped). `POST /payouts/profile/filter` */\n async getFiltersByProfile(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payouts/profile/filter', { body: params });\n }\n\n /** Get payout aggregates. `GET /payouts/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payouts/aggregate', { query: params });\n }\n\n /** Get payout aggregates (profile-scoped). `GET /payouts/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payouts/profile/aggregate', { query: params });\n }\n\n /** Manually update payout status. `PUT /payouts/{payoutId}/manual-update` */\n async manualUpdate(payoutId: string, params: Record<string, unknown>): Promise<PayoutResponse> {\n return this.request('PUT', `/payouts/${encodeURIComponent(payoutId)}/manual-update`, {\n body: params,\n });\n }\n}\n","import type { PollStatusResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Poll {\n constructor(private readonly request: RequestFn) {}\n\n async getStatus(pollId: string): Promise<PollStatusResponse> {\n return this.request('GET', `/poll/status/${encodeURIComponent(pollId)}`);\n }\n}\n","import type {\n ProfileAcquirerCreateRequest,\n ProfileAcquirerResponse,\n ProfileAcquirerUpdateRequest,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class ProfileAcquirers {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: ProfileAcquirerCreateRequest): Promise<ProfileAcquirerResponse> {\n return this.request('POST', '/profile_acquirer', { body: params });\n }\n\n async update(\n profileId: string,\n profileAcquirerId: string,\n params: ProfileAcquirerUpdateRequest,\n ): Promise<ProfileAcquirerResponse> {\n return this.request(\n 'POST',\n `/profile_acquirer/${encodeURIComponent(profileId)}/${encodeURIComponent(profileAcquirerId)}`,\n {\n body: params,\n },\n );\n }\n}\n","import type { ProfileCreateRequest, ProfileResponse, ProfileUpdateRequest } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Profiles {\n constructor(private readonly request: RequestFn) {}\n\n async create(accountId: string, params: ProfileCreateRequest): Promise<ProfileResponse> {\n return this.request('POST', `/account/${encodeURIComponent(accountId)}/business_profile`, {\n body: params,\n });\n }\n\n async retrieve(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'GET',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}`,\n );\n }\n\n async list(accountId: string): Promise<ProfileResponse[]> {\n return this.request('GET', `/account/${encodeURIComponent(accountId)}/business_profile`);\n }\n\n async update(\n accountId: string,\n profileId: string,\n params: ProfileUpdateRequest,\n ): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}`,\n {\n body: params,\n },\n );\n }\n\n async delete(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'DELETE',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}`,\n );\n }\n\n // --- Advanced operations (Task 4.8) ---\n\n /** Toggle extended card info for a profile. `POST /account/{accountId}/business_profile/{profileId}/toggle_extended_card_info` */\n async toggleExtendedCardInfo(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}/toggle_extended_card_info`,\n );\n }\n\n /** Toggle connector agnostic MIT. `POST /account/{accountId}/business_profile/{profileId}/toggle_connector_agnostic_mit` */\n async toggleConnectorAgnosticMit(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}/toggle_connector_agnostic_mit`,\n );\n }\n}\n","import type {\n ProjectCreateRequest,\n ProjectResponse,\n ProjectUpdateRequest,\n ProjectStatsResponse,\n MerchantOverviewResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage projects — optional grouping layers that contain one or more shops. */\nexport class Projects {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new project under a merchant account.\n *\n * @param params - Project creation parameters (name, description, etc.).\n * @param merchantId - The merchant account ID that owns this project.\n * @returns The created project.\n *\n * @example\n * ```typescript\n * const project = await delopay.projects.create({ name: 'EU Stores' }, 'merch_123');\n * ```\n */\n async create(params: ProjectCreateRequest, merchantId: string): Promise<ProjectResponse> {\n return this.request('POST', '/projects', {\n body: params,\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Retrieve a project by its ID.\n *\n * @param projectId - The unique project ID.\n * @param merchantId - Optional merchant scope. When provided, sent as\n * `?merchant_id=…` — required by dashboards that authenticate with a JWT\n * spanning multiple merchants and need to disambiguate which one this\n * call applies to. API-key callers can omit it.\n * @returns The project.\n */\n async retrieve(projectId: string, merchantId?: string): Promise<ProjectResponse> {\n const path = `/projects/${encodeURIComponent(projectId)}`;\n if (merchantId === undefined) return this.request('GET', path);\n return this.request('GET', path, { query: { merchant_id: merchantId } });\n }\n\n /**\n * Update a project's details.\n *\n * @param projectId - The project ID to update.\n * @param params - Fields to update.\n * @param merchantId - Optional merchant scope. See {@link Projects.retrieve}.\n * @returns The updated project.\n */\n async update(\n projectId: string,\n params: ProjectUpdateRequest,\n merchantId?: string,\n ): Promise<ProjectResponse> {\n const path = `/projects/${encodeURIComponent(projectId)}`;\n if (merchantId === undefined) return this.request('PUT', path, { body: params });\n return this.request('PUT', path, { body: params, query: { merchant_id: merchantId } });\n }\n\n /**\n * Delete a project.\n *\n * @param projectId - The project ID to delete.\n * @param merchantId - Optional merchant scope. See {@link Projects.retrieve}.\n * @returns The deleted project object.\n */\n async delete(projectId: string, merchantId?: string): Promise<ProjectResponse> {\n const path = `/projects/${encodeURIComponent(projectId)}`;\n if (merchantId === undefined) return this.request('DELETE', path);\n return this.request('DELETE', path, { query: { merchant_id: merchantId } });\n }\n\n /**\n * List all projects for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Array of projects.\n */\n async list(merchantId: string): Promise<ProjectResponse[]> {\n return this.request('GET', '/projects/list', {\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Get aggregate payment statistics across all projects for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Project statistics.\n */\n async stats(merchantId: string): Promise<ProjectStatsResponse> {\n return this.request('GET', '/projects/stats', {\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Get a high-level overview (volume, counts, top connectors) for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Merchant overview data.\n */\n async overview(merchantId: string): Promise<MerchantOverviewResponse> {\n return this.request('GET', '/projects/overview', {\n query: { merchant_id: merchantId },\n });\n }\n}\n","import type {\n RefundCreateRequest,\n RefundResponse,\n RefundUpdateRequest,\n RefundListParams,\n RefundListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage refunds for completed payments. */\nexport class Refunds {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a refund for a payment.\n *\n * @param params - Refund parameters, including the required `payment_id` and optional amount.\n * @returns The created refund.\n *\n * @example\n * ```typescript\n * const refund = await delopay.refunds.create({\n * payment_id: 'pay_abc123',\n * amount: 2500, // partial refund of 25.00 EUR\n * });\n * ```\n */\n async create(params: RefundCreateRequest): Promise<RefundResponse> {\n return this.request('POST', '/refunds', { body: params });\n }\n\n /**\n * Retrieve a refund by its ID.\n *\n * @param refundId - The unique refund ID.\n * @returns The refund.\n *\n * @example\n * ```typescript\n * const refund = await delopay.refunds.retrieve('ref_abc123');\n * ```\n */\n async retrieve(refundId: string): Promise<RefundResponse> {\n return this.request('GET', `/refunds/${encodeURIComponent(refundId)}`);\n }\n\n /**\n * Update the reason or metadata on an existing refund.\n *\n * @param refundId - The refund ID to update.\n * @param params - Fields to update (reason, metadata).\n * @returns The updated refund.\n */\n async update(refundId: string, params: RefundUpdateRequest): Promise<RefundResponse> {\n return this.request('POST', `/refunds/${encodeURIComponent(refundId)}`, { body: params });\n }\n\n /**\n * List refunds, optionally filtered by payment, status, or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of refunds.\n */\n async list(params?: RefundListParams): Promise<RefundListResponse> {\n return this.request('POST', '/refunds/list', { body: params });\n }\n\n // --- OLAP extensions (Task 4.3) ---\n\n /** List refunds (profile-scoped). `POST /refunds/profile/list` */\n async listByProfile(params?: RefundListParams): Promise<RefundListResponse> {\n return this.request('POST', '/refunds/profile/list', { body: params });\n }\n\n /** Get refund filter options. `POST /refunds/filter` */\n async getFilters(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/refunds/filter', { body: params });\n }\n\n /** Get refund filters (v2). `GET /refunds/v2/filter` */\n async getFiltersV2(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/refunds/v2/filter', { query: params });\n }\n\n /** Get refund aggregates. `GET /refunds/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/refunds/aggregate', { query: params });\n }\n\n /** Get refund aggregates (profile-scoped). `GET /refunds/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/refunds/profile/aggregate', { query: params });\n }\n\n /** Manually update refund status. `PUT /refunds/{refundId}/manual-update` */\n async manualUpdate(refundId: string, params: Record<string, unknown>): Promise<RefundResponse> {\n return this.request('PUT', `/refunds/${encodeURIComponent(refundId)}/manual-update`, {\n body: params,\n });\n }\n}\n","import type { RelayRequest, RelayResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Relay {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: RelayRequest): Promise<RelayResponse> {\n return this.request('POST', '/relay', { body: params });\n }\n\n async retrieve(relayId: string): Promise<RelayResponse> {\n return this.request('GET', `/relay/${encodeURIComponent(relayId)}`);\n }\n}\n","import type {\n LinkedRoutingConfigRetrieveResponse,\n MerchantRoutingAlgorithm,\n ProfileDefaultRoutingConfig,\n RoutableConnectorChoice,\n RoutingActivatePayload,\n RoutingConfigCreateRequest,\n RoutingDeactivateRequest,\n RoutingDictionary,\n RoutingDictionaryRecord,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/**\n * Create and manage payment routing algorithms.\n *\n * Routing rules determine which gateway connector handles each payment based on\n * card type, currency, amount, or custom conditions.\n */\nexport class Routing {\n readonly decision: RoutingDecisionManager;\n\n constructor(private readonly request: RequestFn) {\n this.decision = new RoutingDecisionManager(request);\n }\n\n /**\n * Create a new routing algorithm.\n *\n * @param params - Routing algorithm definition (rule-based, priority, or volume-based).\n * @returns Metadata record for the created routing configuration. The full\n * algorithm body is not echoed back — use `retrieve(id)` if you need it.\n *\n * @example\n * ```typescript\n * const config = await delopay.routing.create({\n * name: 'EU Priority',\n * algorithm: { type: 'priority', data: [{ connector: 'stripe' }] },\n * });\n * ```\n */\n async create(params: RoutingConfigCreateRequest): Promise<RoutingDictionaryRecord> {\n return this.request('POST', '/routing', { body: params });\n }\n\n /**\n * Retrieve a routing algorithm by its ID.\n *\n * @param algorithmId - The routing algorithm ID.\n * @returns The full routing configuration including the algorithm body.\n */\n async retrieve(algorithmId: string): Promise<MerchantRoutingAlgorithm> {\n return this.request('GET', `/routing/${encodeURIComponent(algorithmId)}`);\n }\n\n /**\n * Activate a routing algorithm, making it the active routing strategy.\n *\n * Always sends a JSON body (default `{}`) so the request carries the\n * `Content-Type: application/json` header that the server requires.\n *\n * @param algorithmId - The routing algorithm ID to activate.\n * @param params - Optional activation payload (e.g. `transaction_type`).\n */\n async activate(\n algorithmId: string,\n params: RoutingActivatePayload = {},\n ): Promise<RoutingDictionaryRecord> {\n return this.request('POST', `/routing/${encodeURIComponent(algorithmId)}/activate`, {\n body: params,\n });\n }\n\n /**\n * Deactivate the currently active routing algorithm (falls back to default routing).\n *\n * Always sends a JSON body (default `{}`) so the request carries the\n * `Content-Type: application/json` header that the server requires.\n *\n * @param params - Optional deactivation payload.\n */\n async deactivate(params: RoutingDeactivateRequest = {}): Promise<RoutingDictionaryRecord> {\n return this.request('POST', '/routing/deactivate', { body: params });\n }\n\n /**\n * List all routing algorithms for the current merchant.\n *\n * @returns The routing dictionary (records + currently active id).\n */\n async list(): Promise<RoutingDictionary> {\n return this.request('GET', '/routing');\n }\n\n // --- Advanced operations (Task 3.4) ---\n\n /** Get active routing config. `GET /routing/active` */\n async getActive(): Promise<LinkedRoutingConfigRetrieveResponse> {\n return this.request('GET', '/routing/active');\n }\n\n /** Update default routing config. `POST /routing/default` */\n async updateDefault(params: Record<string, unknown>): Promise<RoutableConnectorChoice[]> {\n return this.request('POST', '/routing/default', { body: params });\n }\n\n /** Retrieve default config for profiles. `GET /routing/default/profile` */\n async getDefaultProfile(): Promise<RoutableConnectorChoice[] | ProfileDefaultRoutingConfig[]> {\n return this.request('GET', '/routing/default/profile');\n }\n\n /** Update default config for a profile. `POST /routing/default/profile/{profileId}` */\n async updateDefaultProfile(\n profileId: string,\n params: Record<string, unknown>,\n ): Promise<ProfileDefaultRoutingConfig> {\n return this.request('POST', `/routing/default/profile/${encodeURIComponent(profileId)}`, {\n body: params,\n });\n }\n\n /** List routing configs for profile. `GET /routing/list/profile` */\n async listForProfile(): Promise<RoutingDictionary> {\n return this.request('GET', '/routing/list/profile');\n }\n\n /** Evaluate a routing rule. `POST /routing/rule/evaluate` */\n async evaluateRule(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/rule/evaluate', { body: params });\n }\n\n /** Migrate routing rules for profile. `POST /routing/rule/migrate` */\n async migrateRule(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/rule/migrate', { body: params });\n }\n\n /** Evaluate routing for a payment. `POST /routing/evaluate` */\n async evaluate(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/evaluate', { body: params });\n }\n\n /** Update gateway scores for dynamic routing. `POST /routing/feedback` */\n async feedback(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/feedback', { body: params });\n }\n}\n\nclass RoutingDecisionManager {\n constructor(private readonly request: RequestFn) {}\n\n /** Upsert decision manager config. `PUT /routing/decision` */\n async upsert(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', '/routing/decision', { body: params });\n }\n\n /** Retrieve decision manager config. `GET /routing/decision` */\n async retrieve(): Promise<Record<string, unknown>> {\n return this.request('GET', '/routing/decision');\n }\n\n /** Delete decision manager config. `DELETE /routing/decision` */\n async delete(): Promise<Record<string, unknown>> {\n return this.request('DELETE', '/routing/decision');\n }\n\n /** Upsert surcharge decision config. `PUT /routing/decision/surcharge` */\n async upsertSurcharge(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', '/routing/decision/surcharge', { body: params });\n }\n\n /** Retrieve surcharge decision config. `GET /routing/decision/surcharge` */\n async retrieveSurcharge(): Promise<Record<string, unknown>> {\n return this.request('GET', '/routing/decision/surcharge');\n }\n\n /** Delete surcharge decision config. `DELETE /routing/decision/surcharge` */\n async deleteSurcharge(): Promise<Record<string, unknown>> {\n return this.request('DELETE', '/routing/decision/surcharge');\n }\n}\n","import type {\n ShopCreateRequest,\n ShopResponse,\n ShopUpdateRequest,\n GatewayConnectRequest,\n GatewayResponse,\n ProfileLogoUploadResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Manage gateway connections for a specific shop. */\nclass ShopGateways {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Connect a payment gateway to a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop (business profile) ID.\n * @param params - Gateway connector credentials and configuration.\n * @returns The created gateway connection.\n */\n async connect(\n merchantId: string,\n shopId: string,\n params: GatewayConnectRequest,\n ): Promise<GatewayResponse> {\n return this.request(\n 'POST',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/gateways`,\n { body: params },\n );\n }\n\n /**\n * List all gateway connections for a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID.\n * @returns Array of gateway connections.\n */\n async list(merchantId: string, shopId: string): Promise<GatewayResponse[]> {\n return this.request(\n 'GET',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/gateways`,\n );\n }\n\n /**\n * Disconnect a gateway from a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID.\n * @param gatewayId - The gateway connector ID to remove.\n * @returns The removed gateway connection.\n */\n async disconnect(\n merchantId: string,\n shopId: string,\n gatewayId: string,\n ): Promise<GatewayResponse> {\n return this.request(\n 'DELETE',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/gateways/${encodeURIComponent(gatewayId)}`,\n );\n }\n}\n\n/**\n * Create and manage shops (business profiles) within a merchant account.\n *\n * Each shop can have its own gateway connections, routing rules, and fee schedules.\n */\nexport class Shops {\n /** Gateway connection management for shops. */\n readonly gateways: ShopGateways;\n\n constructor(private readonly request: RequestFn) {\n this.gateways = new ShopGateways(request);\n }\n\n /**\n * Create a new shop under a merchant account.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Shop creation parameters (name, etc.).\n * @returns The created shop.\n *\n * @example\n * ```typescript\n * const shop = await delopay.shops.create('merch_123', { profile_name: 'EU Store' });\n * ```\n */\n async create(merchantId: string, params: ShopCreateRequest): Promise<ShopResponse> {\n return this.request('POST', `/shops/${encodeURIComponent(merchantId)}`, { body: params });\n }\n\n /**\n * Retrieve a shop by its ID.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID.\n * @returns The shop.\n */\n async retrieve(merchantId: string, shopId: string): Promise<ShopResponse> {\n return this.request(\n 'GET',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}`,\n );\n }\n\n /**\n * Update a shop's configuration.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID to update.\n * @param params - Fields to update.\n * @returns The updated shop.\n */\n async update(\n merchantId: string,\n shopId: string,\n params: ShopUpdateRequest,\n ): Promise<ShopResponse> {\n return this.request(\n 'PUT',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}`,\n { body: params },\n );\n }\n\n /**\n * Delete a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID to delete.\n * @returns The deleted shop object.\n */\n async delete(merchantId: string, shopId: string): Promise<ShopResponse> {\n return this.request(\n 'DELETE',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}`,\n );\n }\n\n /**\n * List all shops under a merchant account.\n *\n * @param merchantId - The merchant account ID.\n * @returns Array of shops.\n */\n async list(merchantId: string): Promise<ShopResponse[]> {\n return this.request('GET', `/shops/${encodeURIComponent(merchantId)}`);\n }\n\n /**\n * Upload a logo file for a shop. The file is stored in Delopay's configured\n * object store and a public HTTPS URL is returned. This method does NOT write\n * the URL into the shop's `payment_link_config.default_config.logo` — call\n * `shops.update` afterwards with the returned `logo_url` to persist the change.\n *\n * Accepts PNG, JPEG, WebP or SVG. The file must be ≤ 1 MiB.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop (business profile) ID.\n * @param file - The logo file (Blob / File in browsers).\n * @returns The publicly-reachable URL of the uploaded logo.\n *\n * @example\n * ```typescript\n * const { logo_url } = await delopay.shops.uploadLogo('merch_1', 'pro_1', file);\n * await delopay.shops.update('merch_1', 'pro_1', {\n * payment_link_config: { default_config: { logo: logo_url } },\n * });\n * ```\n */\n async uploadLogo(\n merchantId: string,\n shopId: string,\n file: Blob,\n ): Promise<ProfileLogoUploadResponse> {\n const form = new FormData();\n form.append('file', file);\n return this.request(\n 'POST',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/logo`,\n { body: form },\n );\n }\n}\n","import type {\n StripeConnectAccountRequest,\n StripeConnectAccountResponse,\n StripeConnectLinkRequest,\n StripeConnectLinkResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class StripeConnect {\n constructor(private readonly request: RequestFn) {}\n\n async createAccount(params: StripeConnectAccountRequest): Promise<StripeConnectAccountResponse> {\n return this.request('POST', '/connector_onboarding/stripe/accounts', { body: params });\n }\n\n async createAccountLink(params: StripeConnectLinkRequest): Promise<StripeConnectLinkResponse> {\n return this.request('POST', '/connector_onboarding/stripe/account_links', { body: params });\n }\n\n // --- Generic connector onboarding (Task 4.11) ---\n\n /** Get onboarding action URL. `POST /connector_onboarding/action_url` */\n async getActionUrl(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/connector_onboarding/action_url', { body: params });\n }\n\n /** Sync onboarding status. `POST /connector_onboarding/sync` */\n async syncOnboarding(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/connector_onboarding/sync', { body: params });\n }\n\n /** Reset tracking ID. `POST /connector_onboarding/reset_tracking_id` */\n async resetTrackingId(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/connector_onboarding/reset_tracking_id', { body: params });\n }\n}\n","import type { ThreeDsRuleExecuteRequest, ThreeDsRuleResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class ThreeDsRules {\n constructor(private readonly request: RequestFn) {}\n\n async execute(params: ThreeDsRuleExecuteRequest): Promise<ThreeDsRuleResponse> {\n return this.request('POST', '/three_ds_decision/execute', { body: params });\n }\n}\n","import type {\n SignUpRequest,\n SignUpWithMerchantRequest,\n SignInRequest,\n AuthResponse,\n UserResponse,\n ChangePasswordRequest,\n ForgotPasswordRequest,\n ResetPasswordRequest,\n SwitchMerchantRequest,\n SwitchProfileRequest,\n InviteUsersRequest,\n InviteUsersResponse,\n TotpResponse,\n RecoveryCodesResponse,\n PhoneOtpRequest,\n PhoneOtpResponse,\n PhoneOtpVerifyRequest,\n PhoneOtpVerifyResponse,\n UpdateUserDetailsRequest,\n FromEmailRequest,\n TokenResponse,\n VerifyTotpRequest,\n Terminate2faQueryParams,\n ListInvitableRolesParams,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Users {\n constructor(private readonly request: RequestFn) {}\n\n async signUp(params: SignUpRequest | SignUpWithMerchantRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/signup', { body: params });\n }\n\n async signIn(params: SignInRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/signin', { body: params });\n }\n\n async signOut(): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/signout');\n }\n\n async getDetails(): Promise<UserResponse> {\n return this.request('GET', '/user');\n }\n\n async update(params: UpdateUserDetailsRequest): Promise<UserResponse> {\n return this.request('POST', '/user/update', { body: params });\n }\n\n async changePassword(params: ChangePasswordRequest): Promise<UserResponse> {\n return this.request('POST', '/user/change_password', { body: params });\n }\n\n async rotatePassword(params: ResetPasswordRequest): Promise<UserResponse> {\n return this.request('POST', '/user/rotate_password', { body: params });\n }\n\n async forgotPassword(params: ForgotPasswordRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/forgot_password', { body: params });\n }\n\n /**\n * Commit a password reset.\n *\n * The caller is responsible for obtaining a `SinglePurposeToken` with\n * `purpose: reset_password` via the email-token exchange + TOTP flow\n * (see `fromEmail`, `beginTotp`, `updateTotp`/`verifyTotp`,\n * `generateRecoveryCodes`, `terminate2fa`) and setting it on the client\n * via `setJwtToken` before calling this method. `body.token` must still\n * be the original `EmailToken` from the reset-link URL — the handler\n * decodes it a second time to find the user.\n */\n async resetPassword(params: ResetPasswordRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/reset_password', { body: params });\n }\n\n /**\n * Exchange an email-link token (`EmailToken`) for a single-purpose JWT\n * that drives the next step of the flow (TOTP, verify email, accept\n * invitation, etc.). No authentication required.\n *\n * The `token_type` in the response tells you which step to run next.\n */\n async fromEmail(params: FromEmailRequest): Promise<TokenResponse> {\n return this.request('POST', '/user/from_email', { body: params });\n }\n\n async verifyEmail(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/verify_email', { body: params });\n }\n\n async sendVerificationEmail(params: ForgotPasswordRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/verify_email_request', { body: params });\n }\n\n async createMerchant(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/create_merchant', { body: params });\n }\n\n async switchMerchant(params: SwitchMerchantRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/switch/merchant', { body: params });\n }\n\n async switchProfile(params: SwitchProfileRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/switch/profile', { body: params });\n }\n\n async listMerchants(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/list/merchant');\n }\n\n async listProfiles(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/list/profile');\n }\n\n async inviteUsers(params: InviteUsersRequest[]): Promise<InviteUsersResponse[]> {\n return this.request('POST', '/user/user/invite_multiple', { body: params });\n }\n\n async acceptInvitation(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/user/invite/accept', { body: params });\n }\n\n /**\n * Start TOTP setup (or no-op if already set).\n *\n * Returns the QR-code payload when the user has no TOTP configured yet;\n * returns `{ secret: null }` when the user is already set up (caller\n * should then prompt for a 6-digit code and call `verifyTotp`).\n *\n * Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async beginTotp(): Promise<TotpResponse> {\n return this.request('GET', '/user/2fa/totp/begin');\n }\n\n /**\n * Verify a 6-digit TOTP code for a user whose TOTP is already set up.\n * Marks the code as used in Redis so subsequent flow steps can advance.\n *\n * Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async verifyTotp(params: VerifyTotpRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/2fa/totp/verify', { body: params });\n }\n\n async resetTotp(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/2fa/totp/reset');\n }\n\n async generateRecoveryCodes(): Promise<RecoveryCodesResponse> {\n return this.request('GET', '/user/2fa/recovery_code/generate');\n }\n\n async verifyRecoveryCode(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/2fa/recovery_code/verify', { body: params });\n }\n\n async sendPhoneOtp(params: PhoneOtpRequest): Promise<PhoneOtpResponse> {\n return this.request('POST', '/user/phone/send-otp', { body: params });\n }\n\n async verifyPhoneOtp(params: PhoneOtpVerifyRequest): Promise<PhoneOtpVerifyResponse> {\n return this.request('POST', '/user/phone/verify-otp', { body: params });\n }\n\n async getRoleFromToken(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/role');\n }\n\n async listRoles(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/role/list');\n }\n\n async listUserRoles(params?: Record<string, unknown>): Promise<Record<string, unknown>[]> {\n return this.request('POST', '/user/user', { body: params });\n }\n\n async updateUserRole(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/user/update_role', { body: params });\n }\n\n async deleteUserRole(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('DELETE', '/user/user/delete', { body: params });\n }\n\n // --- Advanced methods (Task 4.7) ---\n\n /** Sign in (v2). `POST /user/v2/signin` */\n async signInV2(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/v2/signin', { body: params });\n }\n\n /** Sign in via OIDC. `POST /user/oidc` */\n async signInOidc(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/oidc', { body: params });\n }\n\n /** Transfer key. `POST /user/key/transfer` */\n async transferKey(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/key/transfer', { body: params });\n }\n\n /** List invitations. `GET /user/list/invitation` */\n async listInvitations(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/list/invitation');\n }\n\n /** Check 2FA status. `GET /user/2fa` */\n async check2faStatus(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/2fa');\n }\n\n /** Check 2FA status (v2). `GET /user/2fa/v2` */\n async check2faStatusV2(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/2fa/v2');\n }\n\n /**\n * Finish first-time TOTP setup: commit the secret generated by `beginTotp`\n * against a 6-digit code from the user's authenticator app.\n *\n * `PUT /user/2fa/totp/verify`. Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async updateTotp(params: VerifyTotpRequest): Promise<Record<string, unknown>> {\n return this.request('PUT', '/user/2fa/totp/verify', { body: params });\n }\n\n /**\n * Complete the TOTP step and advance to the next flow stage (e.g.\n * `reset_password`). Returns a fresh single-purpose token with the\n * next `token_type`.\n *\n * `GET /user/2fa/terminate`. Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async terminate2fa(query?: Terminate2faQueryParams): Promise<TokenResponse> {\n if (query === undefined) {\n return this.request('GET', '/user/2fa/terminate');\n }\n return this.request('GET', '/user/2fa/terminate', {\n query: query as Record<string, boolean | undefined>,\n });\n }\n\n /** Create auth method. `POST /user/auth` */\n async createAuthMethod(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/auth', { body: params });\n }\n\n /** Update auth method. `PUT /user/auth` */\n async updateAuthMethod(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', '/user/auth', { body: params });\n }\n\n /** List auth methods. `GET /user/auth/list` */\n async listAuthMethods(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/auth/list');\n }\n\n /** Get auth URL. `GET /user/auth/url` */\n async getAuthUrl(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/auth/url');\n }\n\n /** Select auth method. `POST /user/auth/select` */\n async selectAuth(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/auth/select', { body: params });\n }\n\n /** List user roles (v2). `POST /user/user/v2` */\n async listUserRolesV2(params?: Record<string, unknown>): Promise<Record<string, unknown>[]> {\n return this.request('POST', '/user/user/v2', { body: params });\n }\n\n /** List users in lineage. `GET /user/user/list` */\n async listUsersInLineage(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/user/list');\n }\n\n /** List users in lineage (v2). `GET /user/user/v2/list` */\n async listUsersInLineageV2(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/user/v2/list');\n }\n\n /** Accept invitation (v2). `POST /user/user/invite/accept/v2` */\n async acceptInvitationV2(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/user/invite/accept/v2', { body: params });\n }\n\n /** Resend invite. `POST /user/user/resend_invite` */\n async resendInvite(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/user/resend_invite', { body: params });\n }\n\n /** Get role (v2). `GET /user/role/v2` */\n async getRoleV2(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/role/v2');\n }\n\n /** Get role (v3). `GET /user/role/v3` */\n async getRoleV3(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/role/v3');\n }\n\n /** List roles (v2). `GET /user/role/v2/list` */\n async listRolesV2(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/role/v2/list');\n }\n\n /**\n * List invitable roles. `GET /user/role/list/invite`\n *\n * @param params - Optional query. `entity_type` scopes the role list to a\n * particular entity (e.g. `'merchant'` to list only merchant-scoped roles\n * when inviting employees from the merchant dashboard).\n */\n async listInvitableRoles(params?: ListInvitableRolesParams): Promise<Record<string, unknown>[]> {\n if (params === undefined || params.entity_type === undefined) {\n return this.request('GET', '/user/role/list/invite');\n }\n return this.request('GET', '/user/role/list/invite', {\n query: { entity_type: params.entity_type },\n });\n }\n\n /** List updatable roles. `GET /user/role/list/update` */\n async listUpdatableRoles(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/role/list/update');\n }\n\n /** Get permission info. `GET /user/permission_info` */\n async getPermissionInfo(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/permission_info');\n }\n\n /** Get module list. `GET /user/module/list` */\n async getModuleList(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/module/list');\n }\n\n /** Get parent list. `GET /user/parent/list` */\n async getParentList(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/parent/list');\n }\n\n /** Create a role. `POST /user/role` */\n async createRole(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/role', { body: params });\n }\n\n /** Get role by ID. `GET /user/role/{roleId}` */\n async getRoleById(roleId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/user/role/${encodeURIComponent(roleId)}`);\n }\n\n /** Update role by ID. `PUT /user/role/{roleId}` */\n async updateRole(\n roleId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('PUT', `/user/role/${encodeURIComponent(roleId)}`, { body: params });\n }\n}\n","import type {\n ApplePayVerificationRequest,\n ApplePayVerificationResponse,\n ApplePayVerifiedDomainsResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Verification {\n constructor(private readonly request: RequestFn) {}\n\n async registerApplePayDomains(\n merchantId: string,\n params: ApplePayVerificationRequest,\n ): Promise<ApplePayVerificationResponse> {\n return this.request('POST', `/verify/apple_pay/${encodeURIComponent(merchantId)}`, {\n body: params,\n });\n }\n\n async getApplePayVerifiedDomains(\n params: Record<string, string>,\n ): Promise<ApplePayVerifiedDomainsResponse> {\n return this.request('GET', '/verify/applepay_verified_domains', {\n query: params,\n });\n }\n}\n","/**\n * A parsed and verified Delopay webhook event.\n *\n * The `type` field identifies the event (e.g. `'payment_succeeded'`).\n * Specific event payload shapes are nested under `data`.\n */\nexport interface WebhookEvent {\n /** Event type identifier, e.g. `'payment_succeeded'` or `'refund_succeeded'`. */\n type: string;\n /** Event payload. Shape depends on `type`. */\n data: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nfunction hexToBytes(hex: string): Uint8Array | null {\n if (hex.length === 0 || hex.length % 2 !== 0) return null;\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n const byte = Number.parseInt(hex.slice(i, i + 2), 16);\n if (Number.isNaN(byte)) return null;\n bytes[i / 2] = byte;\n }\n return bytes;\n}\n\nexport const Webhooks = {\n /**\n * Verify the signature of an incoming Delopay webhook and return the parsed event.\n *\n * Delopay signs each outgoing webhook with HMAC-SHA512 over the raw request body,\n * using your shop's webhook secret (the *payment response hash key* configured on\n * the shop). The hex-encoded digest is delivered in the `X-Webhook-Signature-512`\n * HTTP header.\n *\n * Uses the Web Crypto API (`globalThis.crypto.subtle`), so it runs unchanged in\n * Node 18+, modern browsers, Deno, Bun, and edge runtimes (Cloudflare Workers, Vercel Edge).\n *\n * Available as a static property on the `Delopay` class\n * (`Delopay.webhooks.verify`) and does not require a client instance.\n *\n * @param rawBody - The raw request body. Pass the original bytes (`Uint8Array` /\n * `Buffer`) when possible; if you pass a string, it must be the unmodified UTF-8\n * text of the request body. Do **not** parse it before passing.\n * @param signatureHeader - The value of the `X-Webhook-Signature-512` HTTP header.\n * @param secret - Your shop's webhook signing secret.\n * @returns Promise that resolves to the parsed webhook event.\n * @throws {Error} When the signature header is malformed or does not match the body.\n *\n * @example\n * ```typescript\n * // Express example\n * app.post('/webhook', express.raw({ type: 'application/json' }), async (req, res) => {\n * try {\n * const event = await Delopay.webhooks.verify(\n * req.body, // Buffer from express.raw()\n * req.header('x-webhook-signature-512') ?? '',\n * process.env.DELOPAY_WEBHOOK_SECRET!,\n * );\n * console.log(event.type, event.data);\n * res.sendStatus(200);\n * } catch {\n * res.status(400).send('Invalid signature');\n * }\n * });\n * ```\n */\n async verify(\n rawBody: string | Uint8Array,\n signatureHeader: string,\n secret: string,\n ): Promise<WebhookEvent> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) {\n throw new Error(\n 'Web Crypto unavailable: Delopay.webhooks.verify requires globalThis.crypto.subtle (Node 18+, modern browsers, Workers, Deno)',\n );\n }\n\n const signatureBytes = hexToBytes(signatureHeader.trim());\n if (!signatureBytes) {\n throw new Error('Invalid webhook signature format');\n }\n\n const encoder = new TextEncoder();\n const bodyBytes = typeof rawBody === 'string' ? encoder.encode(rawBody) : rawBody;\n\n // `TextEncoder.encode` returns `Uint8Array<ArrayBufferLike>` in current lib.dom.d.ts,\n // but `crypto.subtle.*` wants `BufferSource` (backed by `ArrayBuffer`). At runtime the\n // underlying buffer is always an `ArrayBuffer` — cast to quiet the type checker.\n const asBufferSource = (bytes: Uint8Array): BufferSource => bytes as unknown as BufferSource;\n const key = await subtle.importKey(\n 'raw',\n asBufferSource(encoder.encode(secret)),\n { name: 'HMAC', hash: 'SHA-512' },\n false,\n ['verify'],\n );\n\n const valid = await subtle.verify(\n 'HMAC',\n key,\n asBufferSource(signatureBytes),\n asBufferSource(bodyBytes),\n );\n\n if (!valid) {\n throw new Error('Invalid webhook signature');\n }\n\n const bodyText =\n typeof rawBody === 'string' ? rawBody : new TextDecoder('utf-8').decode(rawBody);\n return JSON.parse(bodyText) as WebhookEvent;\n },\n};\n","import type { RequestFn } from '../client';\n\ntype AnalyticsScope = 'merchant' | 'org' | 'profile';\n\nclass AnalyticsDomain {\n constructor(\n private readonly request: RequestFn,\n private readonly domain: string,\n ) {}\n\n /** Get metrics. `POST /analytics/v1/metrics/{domain}` */\n async metrics(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n // Metrics handlers on the backend take `web::Json<[T; 1]>` — i.e. a one-element array.\n // filters/report/sankey/search take `web::Json<T>`. Don't unify without re-checking the Rust side.\n return this.request('POST', `${prefix}/metrics/${encodeURIComponent(this.domain)}`, {\n body: [params],\n });\n }\n\n /** Get filters. `POST /analytics/v1/filters/{domain}` */\n async filters(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n return this.request('POST', `${prefix}/filters/${encodeURIComponent(this.domain)}`, {\n body: params,\n });\n }\n\n /** Generate report. `POST /analytics/v1/report/{domain}` */\n async report(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n return this.request('POST', `${prefix}/report/${encodeURIComponent(this.domain)}`, {\n body: params,\n });\n }\n\n /** Sankey chart data. `POST /analytics/v1/metrics/{domain}/sankey` */\n async sankey(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n return this.request('POST', `${prefix}/metrics/${encodeURIComponent(this.domain)}/sankey`, {\n body: params,\n });\n }\n}\n\nexport class Analytics {\n readonly payments: AnalyticsDomain;\n readonly refunds: AnalyticsDomain;\n readonly disputes: AnalyticsDomain;\n readonly authEvents: AnalyticsDomain;\n readonly sdkEvents: AnalyticsDomain;\n readonly frm: AnalyticsDomain;\n readonly apiEvents: AnalyticsDomain;\n readonly routing: AnalyticsDomain;\n\n constructor(private readonly request: RequestFn) {\n this.payments = new AnalyticsDomain(request, 'payments');\n this.refunds = new AnalyticsDomain(request, 'refunds');\n this.disputes = new AnalyticsDomain(request, 'disputes');\n this.authEvents = new AnalyticsDomain(request, 'auth_events');\n this.sdkEvents = new AnalyticsDomain(request, 'sdk_events');\n this.frm = new AnalyticsDomain(request, 'frm');\n this.apiEvents = new AnalyticsDomain(request, 'api_events');\n this.routing = new AnalyticsDomain(request, 'routing');\n }\n\n /** Global search. `POST /analytics/v1/search` */\n async search(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/analytics/v1/search', { body: params });\n }\n\n /** Domain-specific search. `POST /analytics/v1/search/{domain}` */\n async searchDomain(\n domain: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/analytics/v1/search/${encodeURIComponent(domain)}`, {\n body: params,\n });\n }\n\n /** Get analytics info. `GET /analytics/v1/{domain}/info` */\n async getInfo(domain: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/analytics/v1/${encodeURIComponent(domain)}/info`);\n }\n\n /** Get API event logs. `GET /analytics/v1/api_event_logs` */\n async apiEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/api_event_logs', { query: params });\n }\n\n /** Get SDK event logs. `POST /analytics/v1/sdk_event_logs` */\n async sdkEventLogs(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/analytics/v1/sdk_event_logs', { body: params });\n }\n\n /** Get connector event logs. `GET /analytics/v1/connector_event_logs` */\n async connectorEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/connector_event_logs', { query: params });\n }\n\n /** Get routing event logs. `GET /analytics/v1/routing_event_logs` */\n async routingEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/routing_event_logs', { query: params });\n }\n\n /** Get outgoing webhook event logs. `GET /analytics/v1/outgoing_webhook_event_logs` */\n async outgoingWebhookEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/outgoing_webhook_event_logs', { query: params });\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class AnalyticsDashboard {\n constructor(private readonly request: RequestFn) {}\n\n /** Get analytics dashboard data. `GET /analytics-dashboard` */\n async retrieve(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics-dashboard', { query: params });\n }\n\n /** Generate analytics dashboard report. `POST /analytics-dashboard` */\n async generate(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/analytics-dashboard', { body: params });\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Cards {\n constructor(private readonly request: RequestFn) {}\n\n /** Create a card. `POST /cards/create` */\n async create(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/cards/create', { body: params });\n }\n\n /** Update a card. `POST /cards/update` */\n async update(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/cards/update', { body: params });\n }\n\n /** Retrieve card info by BIN. `GET /cards/{bin}` */\n async retrieve(bin: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/cards/${encodeURIComponent(bin)}`);\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Export {\n constructor(private readonly request: RequestFn) {}\n\n /** Export transactions. `POST /export/transactions` */\n async transactions(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/export/transactions', { body: params });\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class FeatureMatrix {\n constructor(private readonly request: RequestFn) {}\n\n /** Retrieve the feature matrix. `GET /feature_matrix` */\n async retrieve(): Promise<Record<string, unknown>> {\n return this.request('GET', '/feature_matrix');\n }\n\n /**\n * Retrieve the feature matrix scoped to a merchant. Beta connectors\n * are filtered against the merchant's allowlist so the dashboard only\n * surfaces connectors the merchant can actually attach.\n * `GET /feature_matrix/{merchantId}`\n */\n async retrieveForMerchant(merchantId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/feature_matrix/${encodeURIComponent(merchantId)}`);\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Files {\n constructor(private readonly request: RequestFn) {}\n\n /** Upload a file. `POST /files` */\n async create(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/files', { body: params });\n }\n\n /** Retrieve/download a file. `GET /files/{fileId}` */\n async retrieve(fileId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/files/${encodeURIComponent(fileId)}`);\n }\n\n /** Delete a file. `DELETE /files/{fileId}` */\n async delete(fileId: string): Promise<Record<string, unknown>> {\n return this.request('DELETE', `/files/${encodeURIComponent(fileId)}`);\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Forex {\n constructor(private readonly request: RequestFn) {}\n\n /** Retrieve forex rates. `GET /forex/rates` */\n async getRates(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/forex/rates', { query: params });\n }\n\n /** Convert from minor currency. `GET /forex/convert_from_minor` */\n async convertFromMinor(\n params: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/forex/convert_from_minor', { query: params });\n }\n}\n","import type { RegionCreateRequest, RegionUpdateRequest, RegionResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Regions {\n constructor(private readonly request: RequestFn) {}\n\n /** Create a region. `POST /regions` */\n async create(params: RegionCreateRequest): Promise<RegionResponse> {\n return this.request('POST', '/regions', { body: params });\n }\n\n /** Retrieve a region by ID. `GET /regions/{regionId}` */\n async retrieve(regionId: string): Promise<RegionResponse> {\n return this.request('GET', `/regions/${encodeURIComponent(regionId)}`);\n }\n\n /** Update a region. `PUT /regions/{regionId}` */\n async update(regionId: string, params: RegionUpdateRequest): Promise<RegionResponse> {\n return this.request('PUT', `/regions/${encodeURIComponent(regionId)}`, { body: params });\n }\n\n /** Delete a region. `DELETE /regions/{regionId}` */\n async delete(regionId: string): Promise<RegionResponse> {\n return this.request('DELETE', `/regions/${encodeURIComponent(regionId)}`);\n }\n\n /** List all regions. `GET /regions/list` */\n async list(): Promise<RegionResponse[]> {\n return this.request('GET', '/regions/list');\n }\n}\n","import type {\n SubscriptionCreateRequest,\n SubscriptionUpdateRequest,\n SubscriptionResponse,\n SubscriptionListParams,\n SubscriptionListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Subscriptions {\n constructor(private readonly request: RequestFn) {}\n\n /** Create and immediately confirm a subscription. `POST /subscriptions` */\n async createAndConfirm(params: SubscriptionCreateRequest): Promise<SubscriptionResponse> {\n return this.request('POST', '/subscriptions', { body: params });\n }\n\n /** Create a subscription (without confirming). `POST /subscriptions/create` */\n async create(params: SubscriptionCreateRequest): Promise<SubscriptionResponse> {\n return this.request('POST', '/subscriptions/create', { body: params });\n }\n\n /** Retrieve a subscription by ID. `GET /subscriptions/{subscriptionId}` */\n async retrieve(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('GET', `/subscriptions/${encodeURIComponent(subscriptionId)}`);\n }\n\n /** Confirm a subscription. `POST /subscriptions/{subscriptionId}/confirm` */\n async confirm(\n subscriptionId: string,\n params?: Record<string, unknown>,\n ): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/confirm`, {\n body: params,\n });\n }\n\n /** Update a subscription. `PUT /subscriptions/{subscriptionId}/update` */\n async update(\n subscriptionId: string,\n params: SubscriptionUpdateRequest,\n ): Promise<SubscriptionResponse> {\n return this.request('PUT', `/subscriptions/${encodeURIComponent(subscriptionId)}/update`, {\n body: params,\n });\n }\n\n /** List subscriptions. `GET /subscriptions/list` */\n async list(params?: SubscriptionListParams): Promise<SubscriptionListResponse> {\n return this.request('GET', '/subscriptions/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** Get subscription estimate. `GET /subscriptions/estimate` */\n async getEstimate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/subscriptions/estimate', { query: params });\n }\n\n /** Get subscription items. `GET /subscriptions/items` */\n async getItems(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/subscriptions/items', { query: params });\n }\n\n /** Pause a subscription. `POST /subscriptions/{subscriptionId}/pause` */\n async pause(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/pause`);\n }\n\n /** Resume a subscription. `POST /subscriptions/{subscriptionId}/resume` */\n async resume(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/resume`);\n }\n\n /** Cancel a subscription. `POST /subscriptions/{subscriptionId}/cancel` */\n async cancel(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/cancel`);\n }\n}\n","import { DelopayError, DelopayAuthenticationError } from './error';\nimport { ApiKeys } from './resources/apiKeys';\nimport { Authentication } from './resources/authentication';\nimport { Billing } from './resources/billing';\nimport { Blocklist } from './resources/blocklist';\nimport { Connectors } from './resources/connectors';\nimport { Customers } from './resources/customers';\nimport { Disputes } from './resources/disputes';\nimport { EphemeralKeys } from './resources/ephemeralKeys';\nimport { Events } from './resources/events';\nimport { Fees } from './resources/fees';\nimport { Mandates } from './resources/mandates';\nimport { MerchantAccounts } from './resources/merchantAccounts';\nimport { PaymentLinks } from './resources/paymentLinks';\nimport { PaymentMethods } from './resources/paymentMethods';\nimport { Payments } from './resources/payments';\nimport { Payouts } from './resources/payouts';\nimport { Poll } from './resources/poll';\nimport { ProfileAcquirers } from './resources/profileAcquirers';\nimport { Profiles } from './resources/profiles';\nimport { Projects } from './resources/projects';\nimport { Refunds } from './resources/refunds';\nimport { Relay } from './resources/relay';\nimport { Routing } from './resources/routing';\nimport { Shops } from './resources/shops';\nimport { StripeConnect } from './resources/stripeConnect';\nimport { ThreeDsRules } from './resources/threeDsRules';\nimport { Users } from './resources/users';\nimport { Verification } from './resources/verification';\nimport { Webhooks } from './resources/webhooks';\nimport { Analytics } from './resources/analytics';\nimport { AnalyticsDashboard } from './resources/analyticsDashboard';\nimport { Cards } from './resources/cards';\nimport { Export } from './resources/export';\nimport { FeatureMatrix } from './resources/featureMatrix';\nimport { Files } from './resources/files';\nimport { Forex } from './resources/forex';\nimport { Regions } from './resources/regions';\nimport { Subscriptions } from './resources/subscriptions';\n\nconst PRODUCTION_URL = 'https://api.delopay.net';\nconst SANDBOX_URL = 'https://sandbox.delopay.net';\n\nconst MAX_RAW_BODY_BYTES = 2048;\nconst MAX_RETRY_AFTER_MS = 30_000;\n\nfunction parseRetryAfter(header: string | null): number | null {\n if (!header) return null;\n const trimmed = header.trim();\n const seconds = Number(trimmed);\n if (Number.isFinite(seconds) && seconds >= 0) {\n return Math.min(seconds * 1000, MAX_RETRY_AFTER_MS);\n }\n const date = Date.parse(trimmed);\n if (Number.isFinite(date)) {\n const delta = date - Date.now();\n return delta > 0 ? Math.min(delta, MAX_RETRY_AFTER_MS) : 0;\n }\n return null;\n}\n\nfunction truncateRawBody(raw: string): string | undefined {\n if (!raw) return undefined;\n return raw.length > MAX_RAW_BODY_BYTES ? raw.slice(0, MAX_RAW_BODY_BYTES) + '…' : raw;\n}\n\nfunction findIdempotencyKey(headers: Record<string, string>): string | undefined {\n for (const [k, v] of Object.entries(headers)) {\n if (k.toLowerCase() === 'idempotency-key') return v;\n }\n return undefined;\n}\n\ninterface CombinedSignal {\n signal: AbortSignal;\n dispose: () => void;\n}\n\nfunction noop(): void {\n // Intentionally empty: no listeners registered, nothing to clean up.\n}\n\nfunction combineSignals(signals: AbortSignal[]): CombinedSignal {\n const controller = new AbortController();\n const listeners: { signal: AbortSignal; handler: () => void }[] = [];\n const dispose = () => {\n for (const { signal, handler } of listeners) {\n signal.removeEventListener('abort', handler);\n }\n listeners.length = 0;\n };\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n dispose();\n return { signal: controller.signal, dispose: noop };\n }\n const handler = () => {\n controller.abort(signal.reason);\n dispose();\n };\n signal.addEventListener('abort', handler, { once: true });\n listeners.push({ signal, handler });\n }\n return { signal: controller.signal, dispose };\n}\n\n/**\n * Events emitted by the debug logger.\n * - `request` — about to send a request (`method`, `url`, `path`)\n * - `response` — response received (`status`, `method`, `path`, `requestId?`)\n * - `retry` — about to retry after a transient failure (`attempt`, `maxRetries`, `method`, `path`)\n */\nexport type DelopayLogger = (\n event: 'request' | 'response' | 'retry',\n data: Record<string, unknown>,\n) => void;\n\n/**\n * Configuration options for the Delopay client.\n */\nexport interface DelopayOptions {\n /** Use the sandbox environment (`https://sandbox.delopay.net`). Defaults to `false` (production). */\n sandbox?: boolean;\n /** Override the base URL entirely. Takes precedence over `sandbox`. */\n baseUrl?: string;\n /** Request timeout in milliseconds. Defaults to `30000` (30 seconds). */\n timeout?: number;\n /**\n * Maximum number of automatic retries for transient failures (5xx, timeout, network errors).\n * Retries use exponential backoff. Set to `0` to disable. Defaults to `2`.\n * Only idempotent-safe requests (GET, DELETE, and requests with an `Idempotency-Key` header) are retried.\n */\n maxRetries?: number;\n /** Enable debug logging of requests and responses. Defaults to `false`. */\n debug?: boolean;\n /**\n * Custom logger for debug events (`request`, `response`, `retry`). When omitted,\n * debug output is written to `console.log`. Has no effect unless `debug` is `true`.\n * Useful for routing SDK logs through pino, winston, or similar structured loggers.\n */\n logger?: DelopayLogger;\n}\n\nconst SENSITIVE_QUERY_KEYS = new Set([\n 'client_secret',\n 'ephemeral_key',\n 'api_key',\n 'publishable_key',\n]);\n\n/**\n * Return a copy of `url` with the values of known-sensitive query parameters\n * replaced by `REDACTED`, leaving the rest of the query string intact.\n * Used only to sanitize URLs before they hit debug logs.\n */\nfunction redactUrlForLogging(url: string): string {\n const qIdx = url.indexOf('?');\n if (qIdx === -1) return url;\n const base = url.slice(0, qIdx);\n const query = url.slice(qIdx + 1);\n const parts = query.split('&').map((pair) => {\n const eqIdx = pair.indexOf('=');\n if (eqIdx === -1) return pair;\n const key = pair.slice(0, eqIdx);\n if (SENSITIVE_QUERY_KEYS.has(decodeURIComponent(key).toLowerCase())) {\n return `${key}=REDACTED`;\n }\n return pair;\n });\n return `${base}?${parts.join('&')}`;\n}\n\n/**\n * Low-level options forwarded to a single HTTP request.\n */\nexport interface RequestOptions {\n /** Request body, serialised as JSON. */\n body?: unknown;\n /**\n * Query-string parameters. `undefined` and `null` values are omitted.\n * Array values are emitted as repeated keys (`?tag=a&tag=b`) — not comma-joined.\n */\n query?: Record<\n string,\n string | number | boolean | null | undefined | (string | number | boolean)[]\n >;\n /** Additional HTTP headers merged with the default `api-key` header. */\n headers?: Record<string, string>;\n /** Override the client-level timeout for this request, in milliseconds. */\n timeout?: number;\n /**\n * Caller-provided `AbortSignal`. Aborting it cancels the in-flight request and rejects\n * with a `DelopayError` carrying code `'ABORTED'`. Combined with the per-request timeout.\n */\n signal?: AbortSignal;\n}\n\nexport type RequestFn = <T>(method: string, path: string, options?: RequestOptions) => Promise<T>;\n\n/**\n * Delopay API client.\n *\n * Instantiate once with your API key and reuse across your application.\n * All resource sub-clients (payments, refunds, customers, …) are exposed\n * as properties on the instance.\n *\n * @example\n * ```typescript\n * const delopay = new Delopay('sk_live_...', { sandbox: false });\n * const payment = await delopay.payments.create({ amount: 5000, currency: 'EUR' });\n * ```\n */\nexport class Delopay {\n /** Utility for verifying incoming webhook signatures (static, no instance needed). */\n static webhooks = Webhooks;\n\n /** The resolved base URL used for all API requests. */\n readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly debug: boolean;\n private readonly logger?: DelopayLogger;\n private jwtToken?: string;\n\n // Merchant-facing\n readonly payments: Payments;\n readonly refunds: Refunds;\n readonly customers: Customers;\n readonly paymentMethods: PaymentMethods;\n readonly paymentLinks: PaymentLinks;\n readonly mandates: Mandates;\n readonly disputes: Disputes;\n readonly payouts: Payouts;\n readonly ephemeralKeys: EphemeralKeys;\n readonly events: Events;\n readonly poll: Poll;\n\n // Connector / routing\n readonly connectors: Connectors;\n readonly routing: Routing;\n readonly profiles: Profiles;\n readonly shops: Shops;\n readonly profileAcquirers: ProfileAcquirers;\n\n // Authentication & verification\n readonly authentication: Authentication;\n readonly verification: Verification;\n\n // Dashboard / internal\n readonly users: Users;\n readonly apiKeys: ApiKeys;\n readonly billing: Billing;\n readonly blocklist: Blocklist;\n readonly fees: Fees;\n readonly merchantAccounts: MerchantAccounts;\n readonly projects: Projects;\n readonly relay: Relay;\n readonly stripeConnect: StripeConnect;\n readonly threeDsRules: ThreeDsRules;\n\n // New resources (Phases 3-4)\n readonly subscriptions: Subscriptions;\n readonly files: Files;\n readonly export: Export;\n readonly forex: Forex;\n readonly regions: Regions;\n readonly analytics: Analytics;\n readonly analyticsDashboard: AnalyticsDashboard;\n readonly featureMatrix: FeatureMatrix;\n readonly cards: Cards;\n\n /**\n * Create a new Delopay client.\n *\n * @param apiKey - Your Delopay API key (e.g. `sk_live_...` or `sk_test_...`).\n * Pass an empty string or omit for JWT-only usage (e.g. dashboard apps).\n * @param options - Optional configuration (sandbox mode, base URL override, timeout).\n */\n constructor(apiKey?: string, options?: DelopayOptions) {\n this.apiKey = apiKey ?? '';\n this.timeout = options?.timeout ?? 30_000;\n this.maxRetries = options?.maxRetries ?? 2;\n this.debug = options?.debug ?? false;\n if (options?.logger !== undefined) this.logger = options.logger;\n\n if (options?.baseUrl !== undefined) {\n this.baseUrl = options.baseUrl;\n } else if (options?.sandbox) {\n this.baseUrl = SANDBOX_URL;\n } else {\n this.baseUrl = PRODUCTION_URL;\n }\n\n const request = this.request.bind(this) as RequestFn;\n\n // JWT auth methods are defined below (setJwtToken / clearJwtToken)\n\n // Merchant-facing\n this.payments = new Payments(request);\n this.refunds = new Refunds(request);\n this.customers = new Customers(request);\n this.paymentMethods = new PaymentMethods(request);\n this.paymentLinks = new PaymentLinks(request);\n this.mandates = new Mandates(request);\n this.disputes = new Disputes(request);\n this.payouts = new Payouts(request);\n this.ephemeralKeys = new EphemeralKeys(request);\n this.events = new Events(request);\n this.poll = new Poll(request);\n\n // Connector / routing\n this.connectors = new Connectors(request);\n this.routing = new Routing(request);\n this.profiles = new Profiles(request);\n this.shops = new Shops(request);\n this.profileAcquirers = new ProfileAcquirers(request);\n\n // Authentication & verification\n this.authentication = new Authentication(request);\n this.verification = new Verification(request);\n\n // Dashboard / internal\n this.users = new Users(request);\n this.apiKeys = new ApiKeys(request);\n this.billing = new Billing(request);\n this.blocklist = new Blocklist(request);\n this.fees = new Fees(request);\n this.merchantAccounts = new MerchantAccounts(request);\n this.projects = new Projects(request);\n this.relay = new Relay(request);\n this.stripeConnect = new StripeConnect(request);\n this.threeDsRules = new ThreeDsRules(request);\n\n // New resources (Phases 3-4)\n this.subscriptions = new Subscriptions(request);\n this.files = new Files(request);\n this.export = new Export(request);\n this.forex = new Forex(request);\n this.regions = new Regions(request);\n this.analytics = new Analytics(request);\n this.analyticsDashboard = new AnalyticsDashboard(request);\n this.featureMatrix = new FeatureMatrix(request);\n this.cards = new Cards(request);\n }\n\n /**\n * Set a JWT token for subsequent requests.\n * When set, requests use `Authorization: Bearer <token>` instead of `api-key`.\n * Useful after `users.signIn()` returns a JWT for dashboard operations.\n */\n setJwtToken(token: string): void {\n this.jwtToken = token;\n }\n\n /**\n * Clear the JWT token, reverting to API key authentication.\n */\n clearJwtToken(): void {\n this.jwtToken = undefined;\n }\n\n /**\n * Make a raw HTTP request to the Delopay API.\n *\n * You rarely need to call this directly — prefer the typed resource methods.\n * Use it only for endpoints not yet covered by a resource class.\n *\n * @param method - HTTP method (`GET`, `POST`, `PUT`, `PATCH`, `DELETE`).\n * @param path - API path starting with `/` (e.g. `/payments`).\n * @param options - Optional body, query parameters, and headers.\n * @returns Parsed JSON response body typed as `T`.\n * @throws {DelopayAuthenticationError} On 401 responses.\n * @throws {DelopayError} On all other non-2xx responses, timeouts, and network errors.\n */\n async request<T>(method: string, path: string, options?: RequestOptions): Promise<T> {\n let url = `${this.baseUrl}${path}`;\n\n if (options?.query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const v of value) {\n if (v !== undefined && v !== null) params.append(key, String(v));\n }\n } else {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n url += `?${qs}`;\n }\n }\n\n const headers: Record<string, string> = {\n ...(this.jwtToken\n ? { Authorization: `Bearer ${this.jwtToken}` }\n : this.apiKey\n ? { 'api-key': this.apiKey }\n : {}),\n ...options?.headers,\n };\n\n // FormData / Blob / ArrayBuffer / URLSearchParams pass through unchanged so callers\n // can send multipart uploads. The runtime (browser or Node 18+ fetch) sets the\n // appropriate Content-Type including the multipart boundary, so we don't touch it.\n const isRawBody =\n options?.body !== undefined &&\n options?.body !== null &&\n (options.body instanceof FormData ||\n options.body instanceof Blob ||\n options.body instanceof ArrayBuffer ||\n options.body instanceof URLSearchParams);\n\n if (options?.body && !isRawBody) {\n headers['Content-Type'] = 'application/json';\n }\n\n const idempotencyKey = findIdempotencyKey(headers)?.trim();\n const isRetryable =\n method === 'GET' ||\n method === 'DELETE' ||\n (idempotencyKey !== undefined && idempotencyKey !== '');\n\n // Serialize body once so circular-reference errors surface immediately and big payloads\n // aren't re-stringified on every retry attempt. Raw bodies pass through untouched.\n let serializedBody: BodyInit | undefined;\n if (isRawBody) {\n serializedBody = options?.body as BodyInit;\n } else if (options?.body) {\n serializedBody = JSON.stringify(options.body);\n }\n\n const callerSignal = options?.signal;\n if (callerSignal?.aborted) {\n throw new DelopayError('Request aborted', {\n status: 0,\n code: 'ABORTED',\n type: 'abort_error',\n });\n }\n\n const timeoutMs = options?.timeout ?? this.timeout;\n\n let lastError: unknown;\n let retryAfterOverrideMs: number | null = null;\n\n const safeUrl = () => redactUrlForLogging(url);\n const emit = (event: 'request' | 'response' | 'retry', data: Record<string, unknown>) => {\n if (!this.debug) return;\n if (this.logger) {\n this.logger(event, data);\n return;\n }\n if (event === 'request')\n console.log(`[delopay] ${data.method as string} ${data.url as string}`);\n else if (event === 'response')\n console.log(\n `[delopay] ${data.status as number} ${data.method as string} ${data.path as string}`,\n );\n else\n console.log(\n `[delopay] retry ${data.attempt as number}/${data.maxRetries as number} ${data.method as string} ${data.path as string}`,\n );\n };\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const base = Math.min(500 * 2 ** (attempt - 1), 5000);\n // Full jitter: pick uniformly in [0, base) to avoid synchronized retry storms.\n const jittered = Math.random() * base;\n const delay = Math.max(retryAfterOverrideMs ?? 0, jittered);\n retryAfterOverrideMs = null;\n await new Promise((resolve) => setTimeout(resolve, delay));\n emit('retry', { attempt, maxRetries: this.maxRetries, method, path });\n }\n\n const timeoutCtrl = new AbortController();\n const timeoutId = setTimeout(() => timeoutCtrl.abort(), timeoutMs);\n const combined = combineSignals(\n callerSignal ? [timeoutCtrl.signal, callerSignal] : [timeoutCtrl.signal],\n );\n\n try {\n emit('request', { method, url: safeUrl(), path });\n\n const response = await fetch(url, {\n method,\n headers,\n body: serializedBody,\n signal: combined.signal,\n });\n\n const requestId =\n response.headers?.get('x-request-id') ?? response.headers?.get('x-trace-id') ?? undefined;\n\n emit('response', { status: response.status, method, path, requestId });\n\n if (!response.ok) {\n const rawBody = await response.text().catch(() => '');\n let parsed: Record<string, unknown> = {};\n if (rawBody) {\n try {\n parsed = JSON.parse(rawBody) as Record<string, unknown>;\n } catch {\n // non-JSON error body (HTML from a proxy, truncated stream, etc.) — keep raw\n }\n }\n // API wraps errors as { error: { message, code, type, data? } } — unwrap if present\n const err = (parsed.error as Record<string, unknown>) ?? parsed;\n const message =\n (err.message as string) ?? `Request failed with status ${response.status}`;\n const code = (err.code as string) ?? '';\n const type = (err.error_type as string) ?? (err.type as string) ?? '';\n const data =\n err.data && typeof err.data === 'object' && !Array.isArray(err.data)\n ? (err.data as Record<string, unknown>)\n : undefined;\n const truncatedRaw = truncateRawBody(rawBody);\n\n if (response.status === 401) {\n throw new DelopayAuthenticationError(message, {\n code,\n type,\n requestId,\n rawBody: truncatedRaw,\n data,\n });\n }\n\n const error = new DelopayError(message, {\n status: response.status,\n code,\n type,\n requestId,\n rawBody: truncatedRaw,\n data,\n });\n\n // Retry on 5xx and 429 (rate limit). 4xx other than 429 are not transient.\n const isTransientStatus = response.status >= 500 || response.status === 429;\n if (isTransientStatus && isRetryable && attempt < this.maxRetries) {\n if (response.status === 429) {\n retryAfterOverrideMs = parseRetryAfter(response.headers?.get('retry-after') ?? null);\n }\n lastError = error;\n continue;\n }\n\n throw error;\n }\n\n const text = await response.text();\n return (text ? JSON.parse(text) : undefined) as T;\n } catch (err) {\n if (err instanceof DelopayError || err instanceof DelopayAuthenticationError) {\n throw err;\n }\n if (err instanceof Error && err.name === 'AbortError') {\n if (callerSignal?.aborted) {\n throw new DelopayError('Request aborted', {\n status: 0,\n code: 'ABORTED',\n type: 'abort_error',\n });\n }\n lastError = new DelopayError('Request timed out', {\n status: 0,\n code: 'TIMEOUT',\n type: 'timeout_error',\n });\n if (isRetryable && attempt < this.maxRetries) continue;\n throw lastError;\n }\n if (err instanceof TypeError) {\n lastError = new DelopayError(`Network error: ${err.message}`, {\n status: 0,\n code: 'NETWORK',\n type: 'network_error',\n });\n if (isRetryable && attempt < this.maxRetries) continue;\n throw lastError;\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n combined.dispose();\n }\n }\n\n throw lastError;\n }\n\n /**\n * Auto-paginate a list endpoint. Yields items one by one, fetching\n * the next page automatically when the current one is exhausted.\n *\n * @param listFn - A function that takes `{ limit, offset }` and returns `{ data: T[] }` or `T[]`.\n * @param params - Additional parameters to pass to every page request.\n * @param pageSize - Number of items per page. Defaults to `50`.\n *\n * @example\n * ```typescript\n * for await (const payment of delopay.paginate(\n * (p) => delopay.payments.list(p),\n * )) {\n * console.log(payment.payment_id);\n * }\n * ```\n */\n async *paginate<T, P extends Record<string, unknown>>(\n listFn: (params: P & { limit: number; offset: number }) => Promise<{ data: T[] } | T[]>,\n params?: P,\n pageSize = 50,\n ): AsyncGenerator<T> {\n let offset = 0;\n while (true) {\n const result = await listFn({\n ...((params ?? {}) as P),\n limit: pageSize,\n offset,\n });\n const items = Array.isArray(result) ? result : result.data;\n if (items.length === 0) break;\n for (const item of items) {\n yield item;\n }\n if (items.length < pageSize) break;\n offset += items.length;\n }\n }\n}\n","// Checkout branding — single source of truth for the merchant-editable\n// look of the buyer-facing checkout. Hosts:\n// - the typed `CheckoutBranding` shape and every enum it references\n// - the design-token maps (radius, font, spacing scales)\n// - light & dark default palettes\n// - the persistence codec — decode from a backend payment-link config or\n// a public CheckoutDetails response, encode back to the request shape\n// - the import/export envelope used by the merchant-control-center's\n// \"Import / Export\" buttons\n// - the custom-CSS sanitizer\n// - DOM helpers to apply the resolved branding as `--dp-*` CSS variables\n//\n// Both `delopay-checkout` (the SvelteKit buyer-facing app) and\n// `delopay-control-center` (the merchant Angular dashboard) consume this\n// module. Keeping it here is what stops the form from saving something the\n// checkout can't read back, and vice versa.\n//\n// Persistence layout:\n// - flat backend columns own the \"loud\" tokens (logo, theme,\n// payment_button_*, background_colour, payment_form_header_text,\n// branding_visibility, sdk_layout, payment_form_label_type,\n// custom_message_for_card_terms, seller_name).\n// - everything else lives inside `sdk_ui_rules.branding` as a string-keyed\n// bag — the Hyperswitch struct types `sdk_ui_rules` as\n// `HashMap<String, HashMap<String, String>>`, so:\n// - booleans round-trip as \"true\"/\"false\"\n// - numbers round-trip as decimal strings\n// - the trust-badge list round-trips as a JSON-stringified value\n// under the key \"trustBadges\"\n\n// --- Types --------------------------------------------------------------\n\nexport type CornerRadius = 'square' | 'small' | 'medium' | 'large' | 'pill';\n\n// Surfaces and inputs never make sense pill-shaped (a pill input ends up with\n// half-circle ends crammed against text). The form picker only exposes these\n// four; if a stale 'pill' value lands here from older saved data, decode\n// drops it back to 'medium'. Buttons and badges still allow 'pill'.\nexport type NonPillRadius = Exclude<CornerRadius, 'pill'>;\n\n// Spacing scales — split apart so the merchant can independently tune\n// surface padding, vertical rhythm, input height and pay-button height. Used\n// to live as a single `density` enum but that conflated four dimensions.\nexport type SpacingScale = 'compact' | 'comfortable' | 'spacious';\nexport type SizeScale = 'sm' | 'md' | 'lg';\nexport type SurfaceStyle = 'flat' | 'outlined' | 'elevated';\n\nexport type FontFamily =\n | 'inter'\n | 'system'\n | 'serif'\n | 'mono'\n | 'roboto'\n | 'poppins'\n | 'manrope'\n | 'dm-sans'\n | 'space-grotesk'\n | 'plex-sans'\n | 'work-sans'\n | 'open-sans'\n | 'lora'\n | 'playfair'\n | 'plex-mono'\n | 'jetbrains-mono';\n\nexport type FontWeight = 'regular' | 'medium' | 'semibold' | 'bold';\nexport type LayoutStyle = 'compact' | 'split';\nexport type SummaryPosition = 'left' | 'right';\n\n// Stripe Elements only supports two label modes (\"above\" or hidden via the\n// .Label-collapse hack); a \"floating\" label is not a Stripe concept and\n// would only render in our own mock — preview was lying about it. Persisted\n// `'floating'` is silently decoded to `'above'` for back-compat.\nexport type LabelStyle = 'above' | 'hidden';\n\n// Stripe Elements layout. Honored inside the StripeCardPane only — other\n// connector panes stack vertically regardless of this setting.\nexport type PaymentLayout = 'tabs' | 'accordion' | 'spaced_accordion';\n\nexport type LogoShape = 'square' | 'rounded' | 'circle';\nexport type LogoSize = 'sm' | 'md' | 'lg';\n\nexport interface TrustBadge {\n id: string;\n label: string;\n textColor: string;\n backgroundColor: string;\n borderColor: string | null;\n}\n\nexport interface CheckoutBranding {\n // Brand identity\n displayName: string;\n logoUrl: string;\n tagline: string;\n showLogo: boolean;\n logoShape: LogoShape;\n logoSize: LogoSize;\n\n // Color tokens\n primary: string;\n background: string;\n surface: string;\n text: string;\n heading: string;\n muted: string;\n border: string;\n accentText: string;\n buttonBackground: string;\n buttonText: string;\n\n // Typography\n fontFamily: FontFamily;\n headingWeight: FontWeight;\n\n // Shape — granular per-element. Surfaces & inputs use a narrower union\n // (no pill) because pill cards/inputs are always wrong; button and badge\n // keep the full `CornerRadius` since pill is a legitimate look there.\n radiusSurface: NonPillRadius;\n radiusInput: NonPillRadius;\n radiusButton: CornerRadius;\n radiusBadge: CornerRadius;\n surfaceStyle: SurfaceStyle;\n\n // Spacing — four independent dimensions.\n surfacePadding: SpacingScale;\n verticalGap: SpacingScale;\n inputSize: SizeScale;\n buttonSize: SizeScale;\n\n // Layout\n layout: LayoutStyle;\n summaryPosition: SummaryPosition;\n showOrderSummary: boolean;\n summaryGradient: boolean;\n showTotal: boolean;\n totalLabel: string;\n showCurrencyCode: boolean;\n showOrderItems: boolean;\n\n // Trust badges (fully customizable; empty = hide row).\n trustBadges: TrustBadge[];\n\n // Copy. All of these are optional in the persisted form: empty string\n // means \"unset\" and consumers should fall back (e.g. payButtonLabel falls\n // back to a localized \"Pay $X\" string).\n headerText: string;\n payButtonLabel: string;\n cardTermsMessage: string;\n footerText: string;\n supportEmail: string;\n\n // Stripe Elements behavior. `paymentLayout` only affects what's painted\n // inside Stripe's iframe; non-Stripe connector panes stack vertically\n // regardless. `labelStyle` is also Stripe-iframe scope.\n paymentLayout: PaymentLayout;\n labelStyle: LabelStyle;\n\n // Footer\n showPoweredBy: boolean;\n\n // Advanced — raw CSS appended after brand-token CSS variables are\n // applied, so its declarations win cascade order. Sanitized at render\n // time (see `sanitizeCustomCss`); persisted as-typed under\n // `sdk_ui_rules.branding.customCss`.\n customCss: string;\n}\n\n// --- Token maps ---------------------------------------------------------\n\n// Self-hostable font stacks. The buyer-facing checkout bundles these via\n// @fontsource* packages; the variable-font names ('Inter Variable', …) are\n// listed first so the smaller variable file is preferred when bundled.\nconst FONT_STACKS: Record<FontFamily, string> = {\n inter: \"'Inter Variable', 'Inter', system-ui, -apple-system, sans-serif\",\n system:\n \"system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif\",\n serif: \"Georgia, 'Times New Roman', serif\",\n mono: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n roboto: \"'Roboto', system-ui, sans-serif\",\n poppins: \"'Poppins', system-ui, sans-serif\",\n manrope: \"'Manrope Variable', 'Manrope', system-ui, sans-serif\",\n 'dm-sans': \"'DM Sans Variable', 'DM Sans', system-ui, sans-serif\",\n 'space-grotesk': \"'Space Grotesk Variable', 'Space Grotesk', system-ui, sans-serif\",\n 'plex-sans': \"'IBM Plex Sans', system-ui, sans-serif\",\n 'work-sans': \"'Work Sans Variable', 'Work Sans', system-ui, sans-serif\",\n 'open-sans': \"'Open Sans Variable', 'Open Sans', system-ui, sans-serif\",\n lora: \"'Lora Variable', 'Lora', Georgia, serif\",\n playfair: \"'Playfair Display Variable', 'Playfair Display', Georgia, serif\",\n 'plex-mono': \"'IBM Plex Mono', ui-monospace, monospace\",\n 'jetbrains-mono': \"'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, monospace\",\n};\n\nconst RADIUS_PX: Record<CornerRadius, string> = {\n square: '0px',\n small: '6px',\n medium: '12px',\n large: '20px',\n pill: '999px',\n};\n\nconst FONT_WEIGHT_NUMERIC: Record<FontWeight, string> = {\n regular: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n};\n\nconst SURFACE_PAD: Record<SpacingScale, string> = {\n compact: '1rem',\n comfortable: '1.5rem',\n spacious: '2rem',\n};\n\nconst VERTICAL_GAP: Record<SpacingScale, string> = {\n compact: '0.75rem',\n comfortable: '1rem',\n spacious: '1.5rem',\n};\n\nconst INPUT_PAD: Record<SizeScale, string> = {\n sm: '0.5rem 0.75rem',\n md: '0.625rem 0.75rem',\n lg: '0.875rem 0.875rem',\n};\n\nconst BUTTON_PAD: Record<SizeScale, string> = {\n sm: '0.625rem 1rem',\n md: '0.875rem 1.25rem',\n lg: '1.125rem 1.5rem',\n};\n\nexport function fontStack(family: FontFamily): string {\n return FONT_STACKS[family] ?? FONT_STACKS.inter;\n}\n\nexport function radiusValue(radius: CornerRadius): string {\n return RADIUS_PX[radius] ?? RADIUS_PX.medium;\n}\n\nexport function fontWeightValue(weight: FontWeight): string {\n return FONT_WEIGHT_NUMERIC[weight] ?? '600';\n}\n\nexport function surfacePadValue(scale: SpacingScale): string {\n return SURFACE_PAD[scale] ?? SURFACE_PAD.comfortable;\n}\n\nexport function verticalGapValue(scale: SpacingScale): string {\n return VERTICAL_GAP[scale] ?? VERTICAL_GAP.comfortable;\n}\n\nexport function inputPadValue(size: SizeScale): string {\n return INPUT_PAD[size] ?? INPUT_PAD.md;\n}\n\nexport function buttonPadValue(size: SizeScale): string {\n return BUTTON_PAD[size] ?? BUTTON_PAD.md;\n}\n\nexport function logoDimensions(size: LogoSize): { px: number; radius: number } {\n switch (size) {\n case 'sm':\n return { px: 36, radius: 8 };\n case 'lg':\n return { px: 64, radius: 16 };\n case 'md':\n default:\n return { px: 48, radius: 12 };\n }\n}\n\nconst HEX_RE = /^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/;\n\nexport function isHexColor(value: string): boolean {\n return HEX_RE.test(value.trim());\n}\n\n// Crude perceived-luminance check — picks the right Stripe Elements preset\n// (`'night'` vs `'stripe'`) when the merchant has a dark surface. Inputs we\n// don't recognize as a 6-/3-digit hex fall through to \"light\" since that's\n// the safer assumption for the default palette.\nexport function isDarkSurface(color: string): boolean {\n const m = color.replace('#', '').trim();\n if (m.length !== 3 && m.length !== 6) return false;\n const full =\n m.length === 3\n ? m\n .split('')\n .map((c) => c + c)\n .join('')\n : m;\n const r = parseInt(full.slice(0, 2), 16);\n const g = parseInt(full.slice(2, 4), 16);\n const b = parseInt(full.slice(4, 6), 16);\n if ([r, g, b].some(Number.isNaN)) return false;\n const luma = (r * 299 + g * 587 + b * 114) / 1000;\n return luma < 128;\n}\n\n// --- Defaults -----------------------------------------------------------\n\n// Light-mode DeloPay-branded baseline. Hex values come straight from\n// `design-guidelines/colors.md`:\n// - #1E4FEB is `--color-dp-blue`, the wordmark/icon brand blue\n// - #0A1130 is `--color-dp-blue-dark`, the wordmark navy\n// - the rest are slate-50 / slate-200 / slate-500 / slate-800 from the\n// design system's neutral ramp.\n// Picked for: high contrast, neutral surroundings, brand-blue accents,\n// confident navy CTA. Reads \"fintech\" without feeling cold.\nconst LIGHT_PALETTE = {\n primary: '#1E4FEB',\n background: '#f8fafc',\n surface: '#ffffff',\n text: '#1e293b',\n heading: '#0A1130',\n muted: '#64748b',\n border: '#e2e8f0',\n accentText: '#1E4FEB',\n buttonBackground: '#0A1130',\n buttonText: '#ffffff',\n} as const;\n\nexport const DEFAULT_BADGES: TrustBadge[] = [\n {\n id: 'secure',\n label: 'Secure',\n textColor: '#047857',\n backgroundColor: '#ecfdf5',\n borderColor: '#a7f3d0',\n },\n {\n id: 'ssl',\n label: '256-bit SSL',\n textColor: '#1E4FEB',\n backgroundColor: '#eff6ff',\n borderColor: '#bfdbfe',\n },\n];\n\n// Dark-mode equivalents of DEFAULT_BADGES. Dark trust chips need solid hex\n// (the form's color picker only accepts hex), so we pick the design system's\n// success-900 / info-900 backdrops paired with their *-400 foreground tokens.\nexport const DEFAULT_BADGES_DARK: TrustBadge[] = [\n {\n id: 'secure',\n label: 'Secure',\n textColor: '#34d399',\n backgroundColor: '#064e3b',\n borderColor: '#065f46',\n },\n {\n id: 'ssl',\n label: '256-bit SSL',\n textColor: '#60a5fa',\n backgroundColor: '#172554',\n borderColor: '#1e40af',\n },\n];\n\nconst DEFAULT_BRANDING_BASE: Omit<CheckoutBranding, keyof typeof LIGHT_PALETTE | 'trustBadges'> = {\n displayName: '',\n logoUrl: '',\n tagline: '',\n // Logo + summary gradient OFF by default — an unconfigured DeloPay\n // checkout reads cleaner without a placeholder logo block, and the\n // gradient implies a primary tint the merchant hasn't yet picked.\n showLogo: false,\n logoShape: 'rounded',\n logoSize: 'md',\n\n fontFamily: 'inter',\n headingWeight: 'semibold',\n\n radiusSurface: 'medium',\n radiusInput: 'medium',\n radiusButton: 'medium',\n radiusBadge: 'pill',\n surfaceStyle: 'elevated',\n surfacePadding: 'comfortable',\n verticalGap: 'comfortable',\n inputSize: 'md',\n buttonSize: 'md',\n\n layout: 'split',\n summaryPosition: 'left',\n showOrderSummary: true,\n summaryGradient: false,\n showTotal: true,\n totalLabel: 'Total',\n showCurrencyCode: false,\n showOrderItems: true,\n\n headerText: '',\n payButtonLabel: '',\n cardTermsMessage: '',\n footerText: '',\n supportEmail: '',\n\n paymentLayout: 'tabs',\n labelStyle: 'above',\n showPoweredBy: true,\n\n customCss: '',\n};\n\nexport const DEFAULT_BRANDING: CheckoutBranding = {\n ...DEFAULT_BRANDING_BASE,\n ...LIGHT_PALETTE,\n trustBadges: DEFAULT_BADGES.map((b) => ({ ...b })),\n};\n\n// Dark counterpart to DEFAULT_BRANDING. Same form-only fields stay empty\n// (logo / display name / tagline / copy) — only visual tokens diverge.\n// Palette mirrors the design-guidelines dark ramp:\n// - background = slate-950, surface = slate-900 → soft contrast.\n// - text = slate-200, heading = slate-50 → AA+ contrast on the surface.\n// - muted = slate-400, border = slate-800 → chrome that fades into the bg.\n// - accentText = primary-400, button bg = brand blue → brand pops on dark\n// where the light theme's near-black navy CTA would disappear.\n// - surfaceStyle = 'flat' because soft drop-shadows don't read on dark\n// surfaces; the existing 'elevated' shadow tokens are tuned for light.\nexport const DEFAULT_BRANDING_DARK: CheckoutBranding = {\n ...DEFAULT_BRANDING_BASE,\n primary: '#1E4FEB',\n background: '#020617',\n surface: '#0f172a',\n text: '#e2e8f0',\n heading: '#f8fafc',\n muted: '#94a3b8',\n border: '#1e293b',\n accentText: '#60a5fa',\n buttonBackground: '#1E4FEB',\n buttonText: '#ffffff',\n surfaceStyle: 'flat',\n trustBadges: DEFAULT_BADGES_DARK.map((b) => ({ ...b })),\n};\n\n// Back-compat alias. Prefer `DEFAULT_BRANDING` directly.\nexport function defaultBranding(): CheckoutBranding {\n return cloneBranding(DEFAULT_BRANDING);\n}\n\n// Deep-ish clone — needed because the form mutates state reactively and we\n// don't want shared TrustBadge object refs across the loaded/edit/default\n// snapshots. Spread is shallow; trustBadges array elements would otherwise\n// be shared between snapshots, breaking reset.\nexport function cloneBranding(b: CheckoutBranding): CheckoutBranding {\n return { ...b, trustBadges: b.trustBadges.map((badge) => ({ ...badge })) };\n}\n\n// --- Sanitizer ----------------------------------------------------------\n\n// Hard cap on the persisted custom CSS payload. Mirrors the editor's\n// validation; oversized input is dropped to null rather than truncated,\n// since a half-truncated rule is worse than no rule.\nexport const CUSTOM_CSS_MAX_LENGTH = 50_000;\n\n// Strip CSS tokens that turn a stylesheet into a delivery vector before\n// handing the merchant's input to the renderer. The list isn't exhaustive\n// — it's the everyday surface area:\n//\n// - `</style` would let injected text break out of the <style> block and\n// parse as HTML/JS. Replaced with a benign token (not removed) so\n// `</styled-tag` (unlikely but possible inside a content: string)\n// doesn't silently merge into surrounding text.\n// - `@import` would let the merchant pull in a remote stylesheet on\n// every buyer page-load (analytics by side-channel; possible buyer-IP\n// leak).\n// - `expression(…)` was a legacy IE construct that ran JS from CSS.\n// - `behavior:` and `-moz-binding:` ditto for IE/old-Gecko.\n// - `javascript:` URLs in url(...) execute on resource load in some\n// browsers/contexts.\n//\n// Anything else passes through. The merchant can still write whatever\n// declarations they like (background images, gradients, transforms,\n// keyframes, container queries, …).\nexport function sanitizeCustomCss(raw: string | null | undefined): string | null {\n if (typeof raw !== 'string') return null;\n const trimmed = raw.trim();\n if (trimmed.length === 0) return null;\n if (trimmed.length > CUSTOM_CSS_MAX_LENGTH) return null;\n\n let out = trimmed;\n out = out.replace(/<\\/style/gi, '<\\\\/style');\n out = out.replace(/@import\\b[^;]*;?/gi, '');\n out = out.replace(/expression\\s*\\(/gi, '/* expression( */');\n out = out.replace(/(^|[^a-z-])behavior\\s*:/gi, '$1/* behavior: */');\n out = out.replace(/-moz-binding\\s*:/gi, '/* -moz-binding: */');\n out = out.replace(/url\\s*\\(\\s*[\"']?\\s*javascript:/gi, 'url(invalid:');\n return out;\n}\n\n// --- Codec --------------------------------------------------------------\n\n// Structural shape the decoder reads. Both `CheckoutDetails` (public buyer\n// payload) and `BusinessPaymentLinkConfig` (merchant config request shape)\n// satisfy this via duck typing — they each fill some of these and leave the\n// rest undefined. `merchant_*` and `seller_*`/`logo` are aliases for the\n// same backend field, surfaced under different names by the two payloads.\nexport interface BrandingSource {\n // Identity (one or the other, depending on payload shape)\n merchant_name?: string | null;\n seller_name?: string | null;\n merchant_logo?: string | null;\n logo?: string | null;\n merchant_description?: string | null;\n\n // Visual\n theme?: string | null;\n background_colour?: string | null;\n payment_button_colour?: string | null;\n payment_button_text_colour?: string | null;\n\n // Copy\n payment_form_header_text?: string | null;\n payment_button_text?: string | null;\n custom_message_for_card_terms?: string | null;\n\n // Footer\n branding_visibility?: boolean | null;\n\n // Stripe\n sdk_layout?: string | null;\n payment_form_label_type?: string | null;\n\n // The bag for everything else\n sdk_ui_rules?: Record<string, Record<string, string> | null | undefined> | null;\n}\n\nconst BRANDING_GROUP_KEY = 'branding';\n\nconst ALL_FONT_FAMILIES: readonly FontFamily[] = [\n 'inter',\n 'system',\n 'serif',\n 'mono',\n 'roboto',\n 'poppins',\n 'manrope',\n 'dm-sans',\n 'space-grotesk',\n 'plex-sans',\n 'work-sans',\n 'open-sans',\n 'lora',\n 'playfair',\n 'plex-mono',\n 'jetbrains-mono',\n];\n\nconst ALL_RADII: readonly CornerRadius[] = ['square', 'small', 'medium', 'large', 'pill'];\nconst NON_PILL_RADII: readonly NonPillRadius[] = ['square', 'small', 'medium', 'large'];\n\nfunction pickEnum<T extends string>(value: unknown, allowed: readonly T[], fallback: T): T {\n if (typeof value !== 'string') return fallback;\n return (allowed as readonly string[]).includes(value) ? (value as T) : fallback;\n}\n\nfunction parseBool(value: unknown, fallback: boolean): boolean {\n if (typeof value === 'boolean') return value;\n if (value === 'true') return true;\n if (value === 'false') return false;\n return fallback;\n}\n\nfunction s(value: string | null | undefined): string {\n return typeof value === 'string' ? value : '';\n}\n\n// Decode the JSON-encoded trust badges stored under\n// `sdk_ui_rules.branding.trustBadges`. Tolerant: a malformed payload,\n// missing fields, or wrong types fall through to null so the caller can\n// substitute the default badge set. An explicit empty array means \"no\n// badges\" (we honor it — merchants who hide the row need a way to express\n// that).\nexport function decodeBadges(raw: string | undefined): TrustBadge[] | null {\n if (raw === undefined) return null;\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!Array.isArray(parsed)) return null;\n return parsed\n .filter((b): b is Record<string, unknown> => !!b && typeof b === 'object')\n .map((b, i) => ({\n id: typeof b['id'] === 'string' && b['id'] ? (b['id'] as string) : `badge-${i}`,\n label: typeof b['label'] === 'string' ? (b['label'] as string) : '',\n textColor: typeof b['textColor'] === 'string' ? (b['textColor'] as string) : '#0f172a',\n backgroundColor:\n typeof b['backgroundColor'] === 'string' ? (b['backgroundColor'] as string) : '#f1f5f9',\n borderColor:\n typeof b['borderColor'] === 'string' && b['borderColor']\n ? (b['borderColor'] as string)\n : null,\n }))\n .filter((b) => b.label.length > 0);\n } catch {\n return null;\n }\n}\n\nexport function encodeBadges(badges: TrustBadge[]): string {\n return JSON.stringify(\n badges.map((b) => ({\n id: b.id,\n label: b.label,\n textColor: b.textColor,\n backgroundColor: b.backgroundColor,\n ...(b.borderColor ? { borderColor: b.borderColor } : {}),\n })),\n );\n}\n\n// Read a backend branding source into a fully-resolved CheckoutBranding.\n// Flat fields are authoritative when set; the bag fills in everything not\n// reachable via flat columns. Persisted `labelStyle: 'floating'` (legacy\n// \"floating\" mock) decodes to `'above'`.\nexport function decodeBranding(source: BrandingSource | null | undefined): CheckoutBranding {\n if (!source) return cloneBranding(DEFAULT_BRANDING);\n\n const extras: Record<string, string> = (source.sdk_ui_rules?.[BRANDING_GROUP_KEY] ??\n {}) as Record<string, string>;\n\n const decodedBadges = decodeBadges(extras['trustBadges']);\n\n // Identity name: public payloads call it `merchant_name`, request payloads\n // call it `seller_name`. Same backend field; pick whichever is present.\n const displayName = s(source.merchant_name) || s(source.seller_name);\n const logoUrl = s(source.merchant_logo) || s(source.logo);\n\n // Tagline lives in the bag, but `merchant_description` is its public\n // surface. Either may fill it; bag wins if both are set.\n const tagline = s(extras['tagline']) || s(source.merchant_description);\n\n // Stripe label style: the bag's `labelStyle` is the new source of truth;\n // the legacy flat `payment_form_label_type` is consulted only when the\n // bag is empty. `'floating'` (a legacy preview-only value that Stripe\n // Elements never honored) decodes to `'above'`. `'never'` (legacy backend\n // wording) decodes to `'hidden'`.\n const labelStyle: LabelStyle = (() => {\n const fromBag = extras['labelStyle'];\n if (fromBag === 'above' || fromBag === 'hidden') return fromBag;\n if (fromBag === 'floating') return 'above';\n const legacy = source.payment_form_label_type;\n if (legacy === 'above' || legacy === 'floating') return 'above';\n if (legacy === 'hidden' || legacy === 'never') return 'hidden';\n return DEFAULT_BRANDING.labelStyle;\n })();\n\n return {\n displayName,\n logoUrl,\n tagline,\n showLogo: parseBool(extras['showLogo'], DEFAULT_BRANDING.showLogo),\n logoShape: pickEnum<LogoShape>(\n extras['logoShape'],\n ['square', 'rounded', 'circle'],\n DEFAULT_BRANDING.logoShape,\n ),\n logoSize: pickEnum<LogoSize>(extras['logoSize'], ['sm', 'md', 'lg'], DEFAULT_BRANDING.logoSize),\n\n primary: s(source.theme) || DEFAULT_BRANDING.primary,\n background: s(source.background_colour) || DEFAULT_BRANDING.background,\n surface: s(extras['surface']) || DEFAULT_BRANDING.surface,\n text: s(extras['text']) || DEFAULT_BRANDING.text,\n heading: s(extras['heading']) || s(extras['text']) || DEFAULT_BRANDING.heading,\n muted: s(extras['muted']) || DEFAULT_BRANDING.muted,\n border: s(extras['border']) || DEFAULT_BRANDING.border,\n accentText: s(extras['accentText']) || s(source.theme) || DEFAULT_BRANDING.accentText,\n buttonBackground:\n s(source.payment_button_colour) || s(source.theme) || DEFAULT_BRANDING.buttonBackground,\n buttonText: s(source.payment_button_text_colour) || DEFAULT_BRANDING.buttonText,\n\n fontFamily: pickEnum<FontFamily>(\n extras['fontFamily'],\n ALL_FONT_FAMILIES,\n DEFAULT_BRANDING.fontFamily,\n ),\n headingWeight: pickEnum<FontWeight>(\n extras['headingWeight'],\n ['regular', 'medium', 'semibold', 'bold'],\n DEFAULT_BRANDING.headingWeight,\n ),\n\n radiusSurface: pickEnum<NonPillRadius>(\n extras['radiusSurface'],\n NON_PILL_RADII,\n DEFAULT_BRANDING.radiusSurface,\n ),\n radiusInput: pickEnum<NonPillRadius>(\n extras['radiusInput'],\n NON_PILL_RADII,\n DEFAULT_BRANDING.radiusInput,\n ),\n radiusButton: pickEnum<CornerRadius>(\n extras['radiusButton'],\n ALL_RADII,\n DEFAULT_BRANDING.radiusButton,\n ),\n radiusBadge: pickEnum<CornerRadius>(\n extras['radiusBadge'],\n ALL_RADII,\n DEFAULT_BRANDING.radiusBadge,\n ),\n surfaceStyle: pickEnum<SurfaceStyle>(\n extras['surfaceStyle'],\n ['flat', 'outlined', 'elevated'],\n DEFAULT_BRANDING.surfaceStyle,\n ),\n surfacePadding: pickEnum<SpacingScale>(\n extras['surfacePadding'],\n ['compact', 'comfortable', 'spacious'],\n DEFAULT_BRANDING.surfacePadding,\n ),\n verticalGap: pickEnum<SpacingScale>(\n extras['verticalGap'],\n ['compact', 'comfortable', 'spacious'],\n DEFAULT_BRANDING.verticalGap,\n ),\n inputSize: pickEnum<SizeScale>(\n extras['inputSize'],\n ['sm', 'md', 'lg'],\n DEFAULT_BRANDING.inputSize,\n ),\n buttonSize: pickEnum<SizeScale>(\n extras['buttonSize'],\n ['sm', 'md', 'lg'],\n DEFAULT_BRANDING.buttonSize,\n ),\n\n layout: pickEnum<LayoutStyle>(extras['layout'], ['compact', 'split'], DEFAULT_BRANDING.layout),\n summaryPosition: pickEnum<SummaryPosition>(\n extras['summaryPosition'],\n ['left', 'right'],\n DEFAULT_BRANDING.summaryPosition,\n ),\n showOrderSummary: parseBool(extras['showOrderSummary'], DEFAULT_BRANDING.showOrderSummary),\n summaryGradient: parseBool(extras['summaryGradient'], DEFAULT_BRANDING.summaryGradient),\n showTotal: parseBool(extras['showTotal'], DEFAULT_BRANDING.showTotal),\n totalLabel: s(extras['totalLabel']) || DEFAULT_BRANDING.totalLabel,\n showCurrencyCode: parseBool(extras['showCurrencyCode'], DEFAULT_BRANDING.showCurrencyCode),\n showOrderItems: parseBool(extras['showOrderItems'], DEFAULT_BRANDING.showOrderItems),\n\n trustBadges: decodedBadges ?? DEFAULT_BRANDING.trustBadges.map((b) => ({ ...b })),\n\n headerText: s(source.payment_form_header_text),\n payButtonLabel: s(source.payment_button_text),\n cardTermsMessage: s(source.custom_message_for_card_terms),\n footerText: s(extras['footerText']),\n supportEmail: s(extras['supportEmail']),\n\n paymentLayout: pickEnum<PaymentLayout>(\n source.sdk_layout,\n ['tabs', 'accordion', 'spaced_accordion'],\n DEFAULT_BRANDING.paymentLayout,\n ),\n labelStyle,\n showPoweredBy: source.branding_visibility !== false,\n\n customCss: s(extras['customCss']),\n };\n}\n\n// Encoded request shape — the union of fields the encoder fills. Compatible\n// with `BusinessPaymentLinkConfig` / `PaymentLinkConfigRequest` via\n// structural typing on the consumer side.\nexport interface EncodedBranding {\n theme: string;\n logo: string | null;\n seller_name: string | null;\n sdk_layout: PaymentLayout;\n payment_button_text: string | null;\n payment_button_colour: string;\n payment_button_text_colour: string;\n background_colour: string;\n payment_form_header_text: string | null;\n payment_form_label_type: 'above' | 'never';\n custom_message_for_card_terms: string | null;\n sdk_ui_rules: Record<string, Record<string, string>>;\n branding_visibility: boolean;\n}\n\n// Encode a CheckoutBranding into the backend request shape. `base` is the\n// existing config (if any) — preserves bag entries the form doesn't surface\n// (other sdk_ui_rules groups, business_specific_configs, etc.) by spreading\n// it through.\n//\n// `TBase` is constrained to `object | null | undefined` (not\n// `Record<string, unknown>`) so consumers can pass interface-typed values\n// directly. TS interfaces don't get an implicit string index signature, so\n// they don't structurally satisfy `Record<string, unknown>` even when their\n// property values would all unify to `unknown` — `object` admits them\n// without forcing a cast at every call site. We only spread the value, so\n// no index-signature semantics are needed at runtime.\nexport function encodeBranding<TBase extends object | null | undefined>(\n branding: CheckoutBranding,\n base?: TBase,\n): EncodedBranding & (TBase extends object ? TBase : Record<string, never>) {\n const trim = (v: string): string | null => {\n const t = v.trim();\n return t.length > 0 ? t : null;\n };\n\n // We only read one property off `base` and structural typing on `object`\n // doesn't permit index access, so go through `unknown` here.\n const existingRules = ((base as unknown as Record<string, unknown> | undefined)?.[\n 'sdk_ui_rules'\n ] ?? {}) as Record<string, Record<string, string>>;\n const extras: Record<string, string> = {\n surface: branding.surface,\n text: branding.text,\n heading: branding.heading,\n muted: branding.muted,\n border: branding.border,\n accentText: branding.accentText,\n fontFamily: branding.fontFamily,\n headingWeight: branding.headingWeight,\n radiusSurface: branding.radiusSurface,\n radiusInput: branding.radiusInput,\n radiusButton: branding.radiusButton,\n radiusBadge: branding.radiusBadge,\n surfaceStyle: branding.surfaceStyle,\n surfacePadding: branding.surfacePadding,\n verticalGap: branding.verticalGap,\n inputSize: branding.inputSize,\n buttonSize: branding.buttonSize,\n layout: branding.layout,\n summaryPosition: branding.summaryPosition,\n showOrderSummary: String(branding.showOrderSummary),\n summaryGradient: String(branding.summaryGradient),\n showTotal: String(branding.showTotal),\n totalLabel: branding.totalLabel,\n showCurrencyCode: String(branding.showCurrencyCode),\n showOrderItems: String(branding.showOrderItems),\n showLogo: String(branding.showLogo),\n logoShape: branding.logoShape,\n logoSize: branding.logoSize,\n labelStyle: branding.labelStyle,\n trustBadges: encodeBadges(branding.trustBadges),\n };\n const tagline = trim(branding.tagline);\n if (tagline) extras['tagline'] = tagline;\n const footer = trim(branding.footerText);\n if (footer) extras['footerText'] = footer;\n const support = trim(branding.supportEmail);\n if (support) extras['supportEmail'] = support;\n // Persist raw — sanitization runs at render time so we keep the merchant's\n // input as-typed (preserves comments, whitespace) and let the checkout\n // strip dangerous tokens consistently across all readers.\n const css = trim(branding.customCss);\n if (css) extras['customCss'] = css;\n\n const nextRules: Record<string, Record<string, string>> = {\n ...existingRules,\n [BRANDING_GROUP_KEY]: extras,\n };\n\n // Map `hidden` back to the legacy `never` token the backend's\n // PaymentLinkSdkLabelType enum understands. `floating` no longer exists.\n const legacyLabel: 'above' | 'never' = branding.labelStyle === 'hidden' ? 'never' : 'above';\n\n const flatFields: EncodedBranding = {\n theme: branding.primary,\n logo: trim(branding.logoUrl),\n seller_name: trim(branding.displayName),\n sdk_layout: branding.paymentLayout,\n payment_button_text: trim(branding.payButtonLabel),\n payment_button_colour: branding.buttonBackground,\n payment_button_text_colour: branding.buttonText,\n background_colour: branding.background,\n payment_form_header_text: trim(branding.headerText),\n payment_form_label_type: legacyLabel,\n custom_message_for_card_terms: trim(branding.cardTermsMessage),\n sdk_ui_rules: nextRules,\n branding_visibility: branding.showPoweredBy,\n };\n\n // Spread `base` first to preserve fields the encoder doesn't surface\n // (show_card_terms, show_card_form_by_default, hide_card_nickname_field,\n // enable_button_only_on_form_ready, skip_status_screen,\n // transaction_details, background_image, details_layout,\n // custom_message_for_payment_method_types, payment_link_ui_rules,\n // color_icon_card_cvc_error, is_setup_mandate_flow,\n // enabled_saved_payment_method, display_sdk_only,\n // business_specific_configs, domain_name, allowed_domains).\n return {\n ...base,\n ...flatFields,\n } as EncodedBranding & (TBase extends object ? TBase : Record<string, never>);\n}\n\n// --- Import / Export envelope ------------------------------------------\n\n// Versioned envelope used by the merchant control-center's \"Import /\n// Export\" buttons. Bumping `version` is informational; the importer is\n// graceful and accepts any version (or no envelope at all).\nexport const BRANDING_EXPORT_FORMAT = 'delopay-checkout-branding';\nexport const BRANDING_EXPORT_VERSION = 1;\n\nexport interface BrandingExport {\n format: typeof BRANDING_EXPORT_FORMAT;\n version: number;\n exported_at: string;\n branding: CheckoutBranding;\n}\n\nexport function buildBrandingExport(branding: CheckoutBranding): BrandingExport {\n return {\n format: BRANDING_EXPORT_FORMAT,\n version: BRANDING_EXPORT_VERSION,\n exported_at: new Date().toISOString(),\n branding: cloneBranding(branding),\n };\n}\n\n// Resolve arbitrary JSON into a fully-typed CheckoutBranding. Designed to\n// never throw — every field is independently validated against its type\n// and silently falls back to the light-mode default if missing or\n// malformed:\n// - extra fields the form doesn't know about are ignored,\n// - missing fields inherit defaults,\n// - hex colors that fail the regex stay at the default,\n// - enums outside the allowed set fall back,\n// - a payload with no recognizable shape produces DEFAULT_BRANDING.\n//\n// Accepts either a bare CheckoutBranding object or an envelope produced by\n// `buildBrandingExport()`. The caller (the import handler) only needs to\n// catch JSON.parse errors; everything past that point is total.\nexport function parseImportedBranding(raw: unknown): CheckoutBranding {\n // Unwrap the envelope if present. Don't gate on version — bumping it is\n // informational; this function is the migration layer.\n const root: Record<string, unknown> | null =\n isObject(raw) && isObject(raw['branding'])\n ? (raw['branding'] as Record<string, unknown>)\n : isObject(raw)\n ? raw\n : null;\n\n if (!root) return cloneBranding(DEFAULT_BRANDING);\n\n const dflt = DEFAULT_BRANDING;\n const sStr = (v: unknown, fallback: string): string => (typeof v === 'string' ? v : fallback);\n const sHex = (v: unknown, fallback: string): string =>\n typeof v === 'string' && isHexColor(v) ? v : fallback;\n\n const trustBadges =\n parseTrustBadgesLoose(root['trustBadges']) ?? dflt.trustBadges.map((b) => ({ ...b }));\n\n // `floating` from older exports normalizes to `above`; see decodeBranding.\n const labelStyle: LabelStyle = (() => {\n const v = root['labelStyle'];\n if (v === 'above' || v === 'hidden') return v;\n return dflt.labelStyle;\n })();\n\n return {\n displayName: sStr(root['displayName'], dflt.displayName),\n logoUrl: sStr(root['logoUrl'], dflt.logoUrl),\n tagline: sStr(root['tagline'], dflt.tagline),\n showLogo: parseBool(root['showLogo'], dflt.showLogo),\n logoShape: pickEnum<LogoShape>(\n root['logoShape'],\n ['square', 'rounded', 'circle'],\n dflt.logoShape,\n ),\n logoSize: pickEnum<LogoSize>(root['logoSize'], ['sm', 'md', 'lg'], dflt.logoSize),\n\n primary: sHex(root['primary'], dflt.primary),\n background: sHex(root['background'], dflt.background),\n surface: sHex(root['surface'], dflt.surface),\n text: sHex(root['text'], dflt.text),\n heading: sHex(root['heading'], dflt.heading),\n muted: sHex(root['muted'], dflt.muted),\n border: sHex(root['border'], dflt.border),\n accentText: sHex(root['accentText'], dflt.accentText),\n buttonBackground: sHex(root['buttonBackground'], dflt.buttonBackground),\n buttonText: sHex(root['buttonText'], dflt.buttonText),\n\n fontFamily: pickEnum<FontFamily>(root['fontFamily'], ALL_FONT_FAMILIES, dflt.fontFamily),\n headingWeight: pickEnum<FontWeight>(\n root['headingWeight'],\n ['regular', 'medium', 'semibold', 'bold'],\n dflt.headingWeight,\n ),\n\n radiusSurface: pickEnum<NonPillRadius>(\n root['radiusSurface'],\n NON_PILL_RADII,\n dflt.radiusSurface,\n ),\n radiusInput: pickEnum<NonPillRadius>(root['radiusInput'], NON_PILL_RADII, dflt.radiusInput),\n radiusButton: pickEnum<CornerRadius>(root['radiusButton'], ALL_RADII, dflt.radiusButton),\n radiusBadge: pickEnum<CornerRadius>(root['radiusBadge'], ALL_RADII, dflt.radiusBadge),\n surfaceStyle: pickEnum<SurfaceStyle>(\n root['surfaceStyle'],\n ['flat', 'outlined', 'elevated'],\n dflt.surfaceStyle,\n ),\n surfacePadding: pickEnum<SpacingScale>(\n root['surfacePadding'],\n ['compact', 'comfortable', 'spacious'],\n dflt.surfacePadding,\n ),\n verticalGap: pickEnum<SpacingScale>(\n root['verticalGap'],\n ['compact', 'comfortable', 'spacious'],\n dflt.verticalGap,\n ),\n inputSize: pickEnum<SizeScale>(root['inputSize'], ['sm', 'md', 'lg'], dflt.inputSize),\n buttonSize: pickEnum<SizeScale>(root['buttonSize'], ['sm', 'md', 'lg'], dflt.buttonSize),\n\n layout: pickEnum<LayoutStyle>(root['layout'], ['compact', 'split'], dflt.layout),\n summaryPosition: pickEnum<SummaryPosition>(\n root['summaryPosition'],\n ['left', 'right'],\n dflt.summaryPosition,\n ),\n showOrderSummary: parseBool(root['showOrderSummary'], dflt.showOrderSummary),\n summaryGradient: parseBool(root['summaryGradient'], dflt.summaryGradient),\n showTotal: parseBool(root['showTotal'], dflt.showTotal),\n totalLabel: sStr(root['totalLabel'], dflt.totalLabel),\n showCurrencyCode: parseBool(root['showCurrencyCode'], dflt.showCurrencyCode),\n showOrderItems: parseBool(root['showOrderItems'], dflt.showOrderItems),\n\n trustBadges,\n\n headerText: sStr(root['headerText'], dflt.headerText),\n payButtonLabel: sStr(root['payButtonLabel'], dflt.payButtonLabel),\n cardTermsMessage: sStr(root['cardTermsMessage'], dflt.cardTermsMessage),\n footerText: sStr(root['footerText'], dflt.footerText),\n supportEmail: sStr(root['supportEmail'], dflt.supportEmail),\n\n paymentLayout: pickEnum<PaymentLayout>(\n root['paymentLayout'],\n ['tabs', 'accordion', 'spaced_accordion'],\n dflt.paymentLayout,\n ),\n labelStyle,\n showPoweredBy: parseBool(root['showPoweredBy'], dflt.showPoweredBy),\n\n customCss: sStr(root['customCss'], dflt.customCss).slice(0, CUSTOM_CSS_MAX_LENGTH),\n };\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n// Loose trust-badge parser used by the importer. Unlike `decodeBadges`\n// (which reads the JSON-stringified backend bag), this accepts an array of\n// objects directly. Returns null when the input isn't an array — the\n// caller falls back to the default badge set; an explicit empty array is\n// honored.\nfunction parseTrustBadgesLoose(raw: unknown): TrustBadge[] | null {\n if (!Array.isArray(raw)) return null;\n return raw\n .filter(isObject)\n .map((b, i) => ({\n id: typeof b['id'] === 'string' && b['id'] ? (b['id'] as string) : `badge-${i}`,\n label: typeof b['label'] === 'string' ? (b['label'] as string) : '',\n textColor:\n typeof b['textColor'] === 'string' && isHexColor(b['textColor'] as string)\n ? (b['textColor'] as string)\n : '#0f172a',\n backgroundColor:\n typeof b['backgroundColor'] === 'string' && isHexColor(b['backgroundColor'] as string)\n ? (b['backgroundColor'] as string)\n : '#f1f5f9',\n borderColor:\n typeof b['borderColor'] === 'string' && isHexColor(b['borderColor'] as string)\n ? (b['borderColor'] as string)\n : null,\n }))\n .filter((b) => b.label.length > 0);\n}\n\n// --- DOM helpers --------------------------------------------------------\n\n// Write branding tokens onto a target element as CSS custom properties.\n// The buyer-facing checkout sets these on `<html>` so every component sees\n// the same set, including Stripe Elements (indirectly via\n// appearance.variables). The merchant control-center's preview component\n// uses an analogous `--p-*` set with `var(--dp-*, fallback)` indirection so\n// a custom-CSS rule like `:root{--dp-primary:red}` overrides the preview\n// without re-typing the whole brand.\nexport function applyBrandingVariables(el: HTMLElement, b: CheckoutBranding): void {\n const set = (k: string, v: string) => {\n el.style.setProperty(k, v);\n };\n\n set('--dp-primary', b.primary);\n set('--dp-bg', b.background);\n set('--dp-surface', b.surface);\n set('--dp-text', b.text);\n set('--dp-heading', b.heading);\n set('--dp-muted', b.muted);\n set('--dp-border', b.border);\n set('--dp-accent-text', b.accentText);\n set('--dp-btn-bg', b.buttonBackground);\n set('--dp-btn-fg', b.buttonText);\n\n set('--dp-radius-surface', radiusValue(b.radiusSurface));\n set('--dp-radius-input', radiusValue(b.radiusInput));\n set('--dp-radius-button', radiusValue(b.radiusButton));\n set('--dp-radius-badge', radiusValue(b.radiusBadge));\n\n set('--dp-font', fontStack(b.fontFamily));\n set('--dp-heading-weight', fontWeightValue(b.headingWeight));\n\n set('--dp-pad-surface', SURFACE_PAD[b.surfacePadding]);\n set('--dp-gap-vertical', VERTICAL_GAP[b.verticalGap]);\n set('--dp-input-pad', INPUT_PAD[b.inputSize]);\n set('--dp-button-pad', BUTTON_PAD[b.buttonSize]);\n\n set('--dp-shadow', shadowFor(b.surfaceStyle));\n set(\n '--dp-surface-border',\n b.surfaceStyle === 'outlined' ? `1px solid ${b.border}` : '1px solid transparent',\n );\n}\n\nexport function shadowFor(style: SurfaceStyle): string {\n switch (style) {\n case 'elevated':\n return '0 1px 2px rgba(15, 23, 42, 0.04), 0 8px 32px -12px rgba(15, 23, 42, 0.08)';\n case 'outlined':\n case 'flat':\n default:\n return 'none';\n }\n}\n","import type { AuthResponse, SignUpWithMerchantIdRequest } from '../../types';\nimport type {\n AdminSignInRequest,\n AuthorizeResponse,\n CreateInternalUserRequest,\n CreateTenantUserRequest,\n OnboardMerchantRequest,\n OnboardMerchantResponse,\n SignupToggleRequest,\n SignupToggleResponse,\n} from '../types';\nimport type { RequestFn } from '../../client';\n\nexport class Admin {\n constructor(private readonly request: RequestFn) {}\n\n async signIn(params: AdminSignInRequest): Promise<AuthResponse> {\n return this.request('POST', '/admin/signin', { body: params });\n }\n\n async createInternalUser(params: CreateInternalUserRequest): Promise<AuthorizeResponse> {\n return this.request('POST', '/admin/internal_signup', { body: params });\n }\n\n async createTenant(params: CreateTenantUserRequest): Promise<AuthorizeResponse> {\n return this.request('POST', '/admin/tenant_signup', { body: params });\n }\n\n /**\n * Create a new merchant admin user and merchant account atomically.\n *\n * This is the correct endpoint for bootstrapping the first admin user in a\n * fresh deployment — `internal_signup`/`tenant_signup` both require\n * pre-existing merchant records that don't exist on a clean database.\n *\n * `POST /admin/signup_with_merchant_id`\n */\n async signupWithMerchantId(params: SignUpWithMerchantIdRequest): Promise<AuthorizeResponse> {\n return this.request('POST', '/admin/signup_with_merchant_id', { body: params });\n }\n\n /** Toggle public signup on/off. `POST /admin/settings/signup` */\n async setSignupSettings(params: SignupToggleRequest): Promise<SignupToggleResponse> {\n return this.request('POST', '/admin/settings/signup', { body: params });\n }\n\n /** Read current public-signup status. `GET /admin/settings/signup` */\n async getSignupSettings(): Promise<SignupToggleResponse> {\n return this.request('GET', '/admin/settings/signup');\n }\n\n /** Full merchant bootstrap — user + merchant + project + profile + keys. `POST /admin/onboard_merchant` */\n async onboardMerchant(params: OnboardMerchantRequest): Promise<OnboardMerchantResponse> {\n return this.request('POST', '/admin/onboard_merchant', { body: params });\n }\n}\n","import type {\n MerchantAccountResponse,\n MerchantAccountUpdateRequest,\n ProfileResponse,\n} from '../../types';\nimport type {\n AdminCustomerListParams,\n AdminCustomerListResponse,\n AdminCustomerDetail,\n AdminTransactionListParams,\n AdminTransactionListResponse,\n AdminAnalyticsRequest,\n PlatformAnalyticsResponse,\n OverviewStatsResponse,\n PaymentAnalyticsRequest,\n PaymentAnalyticsResponse,\n AdminCreateUserForMerchantRequest,\n AdminUpdateUserRequest,\n AdminUserResponse,\n} from '../types';\nimport type { RequestFn } from '../../client';\n\nexport class AdminPortal {\n constructor(private readonly request: RequestFn) {}\n\n async listCustomers(params?: AdminCustomerListParams): Promise<AdminCustomerListResponse> {\n return this.request('GET', '/admin-portal/customers', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n async getCustomer(customerId: string): Promise<AdminCustomerDetail> {\n return this.request('GET', `/admin-portal/customers/${encodeURIComponent(customerId)}`);\n }\n\n async listTransactions(\n params?: AdminTransactionListParams,\n ): Promise<AdminTransactionListResponse> {\n return this.request('GET', '/admin-portal/transactions', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n async analytics(params: AdminAnalyticsRequest): Promise<PlatformAnalyticsResponse> {\n return this.request('GET', '/admin-portal/analytics', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n async overviewStats(): Promise<OverviewStatsResponse> {\n return this.request('GET', '/admin-portal/overview-stats');\n }\n\n async paymentAnalytics(params: PaymentAnalyticsRequest): Promise<PaymentAnalyticsResponse> {\n return this.request('GET', '/admin-portal/payment-analytics', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n /**\n * Retrieve a merchant account via the admin portal. Unlike\n * `merchantAccounts.retrieve`, this route accepts an admin JWT (or admin API\n * key) and does not require the JWT to be scoped to the target merchant.\n */\n async retrieveAccount(merchantId: string): Promise<MerchantAccountResponse> {\n return this.request('GET', `/admin-portal/accounts/${encodeURIComponent(merchantId)}`);\n }\n\n /**\n * Update a merchant account via the admin portal. Authenticated via admin JWT\n * or admin API key.\n */\n async updateAccount(\n merchantId: string,\n params: MerchantAccountUpdateRequest,\n ): Promise<MerchantAccountResponse> {\n return this.request('POST', `/admin-portal/accounts/${encodeURIComponent(merchantId)}`, {\n body: params,\n });\n }\n\n /**\n * Delete a merchant account via the admin portal. Authenticated via admin JWT\n * or admin API key.\n */\n async deleteAccount(merchantId: string): Promise<MerchantAccountResponse> {\n return this.request('DELETE', `/admin-portal/accounts/${encodeURIComponent(merchantId)}`);\n }\n\n /**\n * Create a brand-new user attached to the given merchant. The user is\n * marked `is_verified = true` so the admin can hand off credentials\n * immediately — no email round-trip is sent.\n */\n async createUserForMerchant(\n customerId: string,\n body: AdminCreateUserForMerchantRequest,\n ): Promise<AdminUserResponse> {\n return this.request('POST', `/admin-portal/customers/${encodeURIComponent(customerId)}/users`, {\n body,\n });\n }\n\n /**\n * Edit a user record. Any subset of fields may be supplied. `role_id`\n * requires `merchant_id`. `password` triggers a password reset (validated\n * against signup policy + JWT blacklist). `reset_2fa` clears TOTP state\n * so the user re-enrolls on next login. `is_active` supports both\n * directions: false soft-disables, true reactivates a soft-disabled user.\n */\n async updateUser(userId: string, body: AdminUpdateUserRequest): Promise<AdminUserResponse> {\n return this.request('PATCH', `/admin-portal/users/${encodeURIComponent(userId)}`, { body });\n }\n\n /**\n * Soft-delete a user globally: deactivates the row, blacklists existing\n * JWTs, and wipes credentials. Distinct from `deleteUserRole`, which\n * removes a single role binding while leaving the user signed-in elsewhere.\n */\n async deleteUser(userId: string): Promise<void> {\n return this.request('DELETE', `/admin-portal/users/${encodeURIComponent(userId)}`);\n }\n\n /**\n * Set a target merchant's shop iframe-allowed origins. Internal-admin\n * route — accepts an admin JWT or admin API key without requiring the\n * caller to be scoped to the target merchant. Pass `null` (or an empty\n * array) to clear the allowlist back to same-origin only.\n *\n * Server validates each origin: full origin (scheme + host[:port]),\n * no path/query/fragment, no wildcards.\n */\n async updateShopIframeOrigins(\n merchantId: string,\n profileId: string,\n origins: string[] | null,\n ): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/admin-portal/accounts/${encodeURIComponent(merchantId)}/business_profile/${encodeURIComponent(profileId)}/iframe-origins`,\n { body: { iframe_allowed_origins: origins } },\n );\n }\n}\n","import type { AuditLogListParams, AuditLogListResponse, AuditLogResponse } from '../types';\nimport type { RequestFn } from '../../client';\n\nexport class AuditLogs {\n constructor(private readonly request: RequestFn) {}\n\n async list(params?: AuditLogListParams): Promise<AuditLogListResponse> {\n return this.request('GET', '/admin-portal/audit', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n async retrieve(logId: string): Promise<AuditLogResponse> {\n return this.request('GET', `/admin-portal/audit/${encodeURIComponent(logId)}`);\n }\n}\n","import type { RequestFn } from '../../client';\n\nexport class Cache {\n constructor(private readonly request: RequestFn) {}\n\n /** Invalidate a cache entry by key. `POST /cache/invalidate/{key}` */\n async invalidate(key: string): Promise<Record<string, unknown>> {\n return this.request('POST', `/cache/invalidate/${encodeURIComponent(key)}`);\n }\n}\n","import type {\n CardIssuerCreateRequest,\n CardIssuerResponse,\n CardIssuerUpdateRequest,\n CardIssuerListResponse,\n} from '../types';\nimport type { RequestFn } from '../../client';\n\nexport class CardIssuers {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: CardIssuerCreateRequest): Promise<CardIssuerResponse> {\n return this.request('POST', '/card_issuers', { body: params });\n }\n\n async update(issuerId: string, params: CardIssuerUpdateRequest): Promise<CardIssuerResponse> {\n return this.request('PUT', `/card_issuers/${encodeURIComponent(issuerId)}`, { body: params });\n }\n\n async list(): Promise<CardIssuerListResponse> {\n return this.request('GET', '/card_issuers');\n }\n}\n","import type { RequestFn } from '../../client';\n\nexport class Configs {\n constructor(private readonly request: RequestFn) {}\n\n /** Create a config. `POST /configs` */\n async create(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/configs', { body: params });\n }\n\n /** Retrieve a config by key. `GET /configs/{key}` */\n async retrieve(key: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/configs/${encodeURIComponent(key)}`);\n }\n\n /** Update a config. `PUT /configs/{key}` */\n async update(key: string, params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', `/configs/${encodeURIComponent(key)}`, { body: params });\n }\n\n /** Delete a config. `DELETE /configs/{key}` */\n async delete(key: string): Promise<Record<string, unknown>> {\n return this.request('DELETE', `/configs/${encodeURIComponent(key)}`);\n }\n}\n","import type { ConnectorRestrictionResponse, UpsertConnectorRestrictionRequest } from '../types';\nimport type { RequestFn } from '../../client';\n\n/**\n * Admin-only allowlist for phased connector rollouts.\n *\n * Default-open semantics: a connector with no restriction row is\n * usable by every merchant (current behavior). A connector with a\n * row is gated — only merchants in `allowed_merchant_ids` can attach\n * a connector account. Enforced server-side at MCA-create time.\n */\nexport class ConnectorRestrictions {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Idempotent upsert. If a row exists for `connector_name`, its\n * allowlist + reason are replaced. To open the connector to\n * everyone again, call `delete()`.\n */\n async upsert(body: UpsertConnectorRestrictionRequest): Promise<ConnectorRestrictionResponse> {\n return this.request('POST', '/admin/connector_restrictions', { body });\n }\n\n async list(): Promise<ConnectorRestrictionResponse[]> {\n return this.request('GET', '/admin/connector_restrictions');\n }\n\n async retrieve(connectorName: string): Promise<ConnectorRestrictionResponse> {\n return this.request(\n 'GET',\n `/admin/connector_restrictions/${encodeURIComponent(connectorName)}`,\n );\n }\n\n /** Removing the row makes the connector public again. */\n async delete(connectorName: string): Promise<{ connector_name: string; deleted: boolean }> {\n return this.request(\n 'DELETE',\n `/admin/connector_restrictions/${encodeURIComponent(connectorName)}`,\n );\n }\n}\n","import type { GsmRuleCreateRequest, GsmRuleResponse, GsmRuleUpdateRequest } from '../types';\nimport type { RequestFn } from '../../client';\n\nexport class Gsm {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: GsmRuleCreateRequest): Promise<GsmRuleResponse> {\n return this.request('POST', '/gsm', { body: params });\n }\n\n async retrieve(params: Record<string, unknown>): Promise<GsmRuleResponse> {\n return this.request('POST', '/gsm/get', { body: params });\n }\n\n async update(params: GsmRuleUpdateRequest): Promise<GsmRuleResponse> {\n return this.request('POST', '/gsm/update', { body: params });\n }\n\n async delete(params: Record<string, unknown>): Promise<GsmRuleResponse> {\n return this.request('POST', '/gsm/delete', { body: params });\n }\n}\n","import type { AdminAdjustmentRequest, AdminAdjustmentResponse } from '../types';\nimport type { RequestFn } from '../../client';\n\n/**\n * Platform-level ledger adjustments on a merchant's balance. Admin-only\n * routes under `/billing/{merchantId}/admin/credit|debit`. Exposed only\n * via `'@delopay/sdk/internal'` so the public merchant SDK doesn't\n * advertise the admin adjustment path in autocomplete.\n */\nexport class PlatformBilling {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Manually credit a merchant's balance (e.g. promotional credit,\n * dispute reversal, manual correction).\n *\n * @param merchantId - The merchant account ID.\n * @param params - Credit amount and reason.\n */\n async credit(\n merchantId: string,\n params: AdminAdjustmentRequest,\n ): Promise<AdminAdjustmentResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/admin/credit`, {\n body: params,\n });\n }\n\n /**\n * Manually debit a merchant's balance.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Debit amount and reason.\n */\n async debit(\n merchantId: string,\n params: AdminAdjustmentRequest,\n ): Promise<AdminAdjustmentResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/admin/debit`, {\n body: params,\n });\n }\n}\n","import type {\n FeeScheduleCreateRequest,\n FeeScheduleResponse,\n FeeScheduleUpdateRequest,\n} from '../../types';\nimport type { RequestFn } from '../../client';\n\n/**\n * Platform-wide fee schedule management. Admin-only routes under\n * `/admin/fees/*`. Exposed only via `'@delopay/sdk/internal'`.\n */\nexport class PlatformFees {\n constructor(private readonly request: RequestFn) {}\n\n /** Create a platform fee schedule for a specific merchant. */\n async create(params: FeeScheduleCreateRequest, merchantId: string): Promise<FeeScheduleResponse> {\n return this.request('POST', '/admin/fees', {\n body: params,\n query: { merchant_id: merchantId },\n });\n }\n\n /** List every platform fee schedule assigned to a merchant. */\n async list(merchantId: string): Promise<FeeScheduleResponse[]> {\n return this.request('GET', '/admin/fees/list', {\n query: { merchant_id: merchantId },\n });\n }\n\n /** Retrieve a single platform fee schedule by ID. */\n async retrieve(feeId: string): Promise<FeeScheduleResponse> {\n return this.request('GET', `/admin/fees/${encodeURIComponent(feeId)}`);\n }\n\n /** Update a platform fee schedule. */\n async update(feeId: string, params: FeeScheduleUpdateRequest): Promise<FeeScheduleResponse> {\n return this.request('PUT', `/admin/fees/${encodeURIComponent(feeId)}`, { body: params });\n }\n\n /** Delete a platform fee schedule. */\n async delete(feeId: string): Promise<FeeScheduleResponse> {\n return this.request('DELETE', `/admin/fees/${encodeURIComponent(feeId)}`);\n }\n}\n","import type { RequestFn } from '../client';\nimport { Delopay } from '../client';\nimport { Admin } from './resources/admin';\nimport { AdminPortal } from './resources/adminPortal';\nimport { AuditLogs } from './resources/auditLogs';\nimport { Cache } from './resources/cache';\nimport { CardIssuers } from './resources/cardIssuers';\nimport { Configs } from './resources/configs';\nimport { ConnectorRestrictions } from './resources/connectorRestrictions';\nimport { Gsm } from './resources/gsm';\nimport { PlatformBilling } from './resources/platformBilling';\nimport { PlatformFees } from './resources/platformFees';\n\n/**\n * Internal-only Delopay client for DeloPay staff tooling (the admin\n * control-center, audit UIs, etc.). Extends the public `Delopay` surface\n * with admin-plane resources that must **not** be discoverable from the\n * merchant-facing package entry.\n *\n * Import path: `import { DelopayInternal } from '@delopay/sdk/internal'`.\n * The merchant-facing `import { Delopay } from '@delopay/sdk'` never\n * surfaces these.\n */\nexport class DelopayInternal extends Delopay {\n /** Bootstrap admin endpoints — signup, signin, onboarding. */\n readonly admin: Admin;\n /** Platform-wide customer, transaction, analytics, merchant-account ops. */\n readonly adminPortal: AdminPortal;\n /** Audit log reads. */\n readonly auditLogs: AuditLogs;\n /** Backend cache invalidation. */\n readonly cache: Cache;\n /** Platform card-issuer program management. */\n readonly cardIssuers: CardIssuers;\n /** Generic platform config store. */\n readonly configs: Configs;\n /** Per-merchant connector allowlist for phased rollouts. */\n readonly connectorRestrictions: ConnectorRestrictions;\n /** GSM (Gateway Status Mapping) routing rules. */\n readonly gsm: Gsm;\n /** Admin-only ledger credits/debits against a merchant's balance. */\n readonly platformBilling: PlatformBilling;\n /** Platform-wide fee schedules assigned to merchants. */\n readonly platformFees: PlatformFees;\n\n constructor(...args: ConstructorParameters<typeof Delopay>) {\n super(...args);\n const request = this.request.bind(this) as RequestFn;\n this.admin = new Admin(request);\n this.adminPortal = new AdminPortal(request);\n this.auditLogs = new AuditLogs(request);\n this.cache = new Cache(request);\n this.cardIssuers = new CardIssuers(request);\n this.configs = new Configs(request);\n this.connectorRestrictions = new ConnectorRestrictions(request);\n this.gsm = new Gsm(request);\n this.platformBilling = new PlatformBilling(request);\n this.platformFees = new PlatformFees(request);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACeO,IAAM,eAAN,cAA2B,MAAM;AAAA,EAsBtC,YACE,SACA,SAQA;AACA,UAAM,OAAO;AACb,WAAO,eAAe,MAAM,WAAW,SAAS;AAChD,SAAK,OAAO;AACZ,SAAK,SAAS,QAAQ;AACtB,SAAK,OAAO,QAAQ;AACpB,SAAK,OAAO,QAAQ;AACpB,QAAI,QAAQ,cAAc,OAAW,MAAK,YAAY,QAAQ;AAC9D,QAAI,QAAQ,YAAY,OAAW,MAAK,UAAU,QAAQ;AAC1D,QAAI,QAAQ,SAAS,OAAW,MAAK,OAAO,QAAQ;AAAA,EACtD;AACF;AAYO,IAAM,6BAAN,cAAyC,aAAa;AAAA,EAC3D,YACE,UAAU,mBACV,SAOA;AACA,UAAM,SAAS;AAAA,MACb,QAAQ;AAAA;AAAA;AAAA;AAAA,MAIR,MAAM,SAAS,QAAQ;AAAA,MACvB,MAAM,SAAS,QAAQ;AAAA,MACvB,WAAW,SAAS;AAAA,MACpB,SAAS,SAAS;AAAA,MAClB,MAAM,SAAS;AAAA,IACjB,CAAC;AACD,WAAO,eAAe,MAAM,WAAW,SAAS;AAChD,SAAK,OAAO;AAAA,EACd;AACF;;;ACrFO,IAAM,UAAN,MAAc;AAAA,EACnB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAclD,MAAM,OAAO,YAAoB,QAA4D;AAC3F,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,UAAU,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EAC7F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAS,YAAoB,OAAwC;AACzE,WAAO,KAAK;AAAA,MACV;AAAA,MACA,aAAa,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,KAAK,CAAC;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,OACJ,YACA,OACA,QACyB;AACzB,WAAO,KAAK;AAAA,MACV;AAAA,MACA,aAAa,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,KAAK,CAAC;AAAA,MACxE,EAAE,MAAM,OAAO;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAO,YAAoB,OAA8C;AAC7E,WAAO,KAAK;AAAA,MACV;AAAA,MACA,aAAa,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,KAAK,CAAC;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,YAA+C;AACxD,WAAO,KAAK,QAAQ,OAAO,aAAa,mBAAmB,UAAU,CAAC,OAAO;AAAA,EAC/E;AACF;;;ACnFO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,OAAO,QAAsE;AACjF,WAAO,KAAK,QAAQ,QAAQ,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAAA,EACjE;AAAA,EAEA,MAAM,iBAAiB,QAAiD;AACtE,WAAO,KAAK,QAAQ,QAAQ,mBAAmB,mBAAmB,MAAM,CAAC,cAAc;AAAA,EACzF;AAAA,EAEA,MAAM,aACJ,QACA,QACiC;AACjC,WAAO,KAAK,QAAQ,QAAQ,mBAAmB,mBAAmB,MAAM,CAAC,iBAAiB;AAAA,MACxF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,QAAgB,QAAmE;AAC5F,WAAO,KAAK,QAAQ,QAAQ,mBAAmB,mBAAmB,MAAM,CAAC,SAAS;AAAA,MAChF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,SACJ,QACA,QACkC;AAClC,WAAO,KAAK,QAAQ,QAAQ,mBAAmB,mBAAmB,MAAM,CAAC,aAAa;AAAA,MACpF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,yBACJ,QACA,QACkC;AAClC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,mBAAmB,mBAAmB,MAAM,CAAC;AAAA,MAC7C;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,iBACJ,QACA,QACkC;AAClC,WAAO,KAAK,QAAQ,QAAQ,mBAAmB,mBAAmB,MAAM,CAAC,sBAAsB;AAAA,MAC7F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;;;AC5CA,IAAM,qBAAN,MAAyB;AAAA,EACvB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASlD,MAAM,WACJ,YACA,QACqC;AACrC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,mBAAmB,UAAU,CAAC;AAAA,MAC1C,EAAE,MAAM,OAAO;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YACJ,YACA,QACqC;AACrC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,mBAAmB,UAAU,CAAC;AAAA,MAC1C;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,YAAqD;AAC9D,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,UAAU,CAAC,cAAc;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,IAAI,YAAoB,WAAgD;AAC5E,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,mBAAmB,UAAU,CAAC,gBAAgB,mBAAmB,SAAS,CAAC;AAAA,IACzF;AAAA,EACF;AACF;AAQO,IAAM,UAAN,MAAc;AAAA,EAInB,YAA6B,SAAoB;AAApB;AAC3B,SAAK,cAAc,IAAI,mBAAmB,OAAO;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,WAAW,YAAqD;AACpE,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,UAAU,CAAC,EAAE;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAM,YAAoB,QAA6D;AAC3F,WAAO,KAAK,QAAQ,QAAQ,YAAY,mBAAmB,UAAU,CAAC,UAAU;AAAA,MAC9E,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cACJ,YACA,QACiC;AACjC,WAAO,KAAK,QAAQ,QAAQ,YAAY,mBAAmB,UAAU,CAAC,mBAAmB;AAAA,MACvF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAM,YAAoB,QAA8C;AAC5E,WAAO,KAAK,QAAQ,QAAQ,YAAY,mBAAmB,UAAU,CAAC,UAAU;AAAA,MAC9E,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAW,YAAoB,QAAoD;AACvF,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,UAAU,CAAC,WAAW;AAAA,MAC9E,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,mBACJ,YACA,QACiC;AACjC,WAAO,KAAK,QAAQ,SAAS,YAAY,mBAAmB,UAAU,CAAC,kBAAkB;AAAA,MACvF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;;;AC3KO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,IAAI,QAAyD;AACjE,WAAO,KAAK,QAAQ,QAAQ,cAAc,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,OAAO,QAAyD;AACpE,WAAO,KAAK,QAAQ,UAAU,cAAc,EAAE,MAAM,OAAO,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,KAAK,QAA4D;AACrE,WAAO,KAAK,QAAQ,OAAO,cAAc;AAAA,MACvC,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,QAAiE;AAC5E,WAAO,KAAK,QAAQ,QAAQ,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAAA,EACnE;AACF;;;ACvBO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,OAAO,WAAmB,QAA4D;AAC1F,WAAO,KAAK,QAAQ,QAAQ,YAAY,mBAAmB,SAAS,CAAC,eAAe;AAAA,MAClF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,WAAmB,aAAiD;AACjF,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,mBAAmB,SAAS,CAAC,eAAe,mBAAmB,WAAW,CAAC;AAAA,IACzF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,WAAiD;AAC1D,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,SAAS,CAAC,aAAa;AAAA,EACnF;AAAA,EAEA,MAAM,OACJ,WACA,aACA,QAC4B;AAC5B,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,mBAAmB,SAAS,CAAC,eAAe,mBAAmB,WAAW,CAAC;AAAA,MACvF;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,WAAmB,aAAiD;AAC/E,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,mBAAmB,SAAS,CAAC,eAAe,mBAAmB,WAAW,CAAC;AAAA,IACzF;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAAmE;AAC9E,WAAO,KAAK,QAAQ,QAAQ,8BAA8B,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,gBACJ,YACA,aACA,QAC2C;AAC3C,UAAM,OAAO,YAAY,mBAAmB,UAAU,CAAC,wBAAwB,mBAAmB,WAAW,CAAC;AAC9G,QAAI,WAAW,OAAW,QAAO,KAAK,QAAQ,QAAQ,IAAI;AAC1D,WAAO,KAAK,QAAQ,QAAQ,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,WAAW,YAAoB,aAA4D;AAC/F,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,mBAAmB,UAAU,CAAC,wBAAwB,mBAAmB,WAAW,CAAC;AAAA,IACnG;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,qBAAyD;AAC7D,WAAO,KAAK,QAAQ,OAAO,0BAA0B;AAAA,EACvD;AACF;;;AC/EO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBlD,MAAM,OAAO,QAA0D;AACrE,WAAO,KAAK,QAAQ,QAAQ,cAAc,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,SAAS,YAA+C;AAC5D,WAAO,KAAK,QAAQ,OAAO,cAAc,mBAAmB,UAAU,CAAC,EAAE;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAO,YAAoB,QAA0D;AACzF,WAAO,KAAK,QAAQ,QAAQ,cAAc,mBAAmB,UAAU,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,YAA+C;AAC1D,WAAO,KAAK,QAAQ,UAAU,cAAc,mBAAmB,UAAU,CAAC,EAAE;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,QAA0D;AACnE,WAAO,KAAK,QAAQ,OAAO,mBAAmB;AAAA,MAC5C,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,MAAM,cACJ,QAC2E;AAC3E,WAAO,KAAK,QAAQ,OAAO,8BAA8B;AAAA,MACvD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,aAAa,YAAwD;AACzE,WAAO,KAAK,QAAQ,OAAO,cAAc,mBAAmB,UAAU,CAAC,WAAW;AAAA,EACpF;AACF;;;ACzFO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlD,MAAM,SAAS,WAA6C;AAC1D,WAAO,KAAK,QAAQ,OAAO,aAAa,mBAAmB,SAAS,CAAC,EAAE;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,QAAwD;AACjE,WAAO,KAAK,QAAQ,OAAO,kBAAkB;AAAA,MAC3C,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,WAA6C;AACxD,WAAO,KAAK,QAAQ,QAAQ,oBAAoB,mBAAmB,SAAS,CAAC,EAAE;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAe,QAA0D;AAC7E,WAAO,KAAK,QAAQ,QAAQ,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,QAA0D;AAC7E,WAAO,KAAK,QAAQ,OAAO,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAiB,WAAoD;AACzE,WAAO,KAAK,QAAQ,OAAO,sBAAsB,mBAAmB,SAAS,CAAC,EAAE;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAe,QAA0D;AAC7E,WAAO,KAAK,QAAQ,UAAU,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAAA,EACtE;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAAwD;AAC1E,WAAO,KAAK,QAAQ,OAAO,0BAA0B;AAAA,MACnD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,WACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,oBAAoB,EAAE,OAAO,OAAO,CAAC;AAAA,EAClE;AAAA;AAAA,EAGA,MAAM,oBACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,4BAA4B,EAAE,OAAO,OAAO,CAAC;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAM,UACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,uBAAuB,EAAE,OAAO,OAAO,CAAC;AAAA,EACrE;AAAA;AAAA,EAGA,MAAM,mBACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,+BAA+B,EAAE,OAAO,OAAO,CAAC;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,mBAAmB,aAA+C;AACtE,WAAO,KAAK,QAAQ,OAAO,aAAa,mBAAmB,WAAW,CAAC,QAAQ;AAAA,EACjF;AACF;;;ACrHO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAclD,MAAM,OAAO,QAAwE;AACnF,WAAO,KAAK,QAAQ,QAAQ,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,OAAoD;AAC/D,WAAO,KAAK,QAAQ,UAAU,mBAAmB,mBAAmB,KAAK,CAAC,EAAE;AAAA,EAC9E;AACF;;;AC9BO,IAAM,SAAN,MAAa;AAAA,EAClB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,KAAK,YAAoB,QAAsD;AACnF,WAAO,KAAK,QAAQ,QAAQ,WAAW,mBAAmB,UAAU,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EAC3F;AAAA,EAEA,MAAM,qBACJ,YACA,SACyC;AACzC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,WAAW,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC;AAAA,IAC1E;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,YAAoB,SAA+C;AACrF,WAAO,KAAK;AAAA,MACV;AAAA,MACA,WAAW,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,OAAO,CAAC;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAA8D;AAChF,WAAO,KAAK,QAAQ,QAAQ,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAAA,EACtE;AACF;;;ACzBO,IAAM,OAAN,MAAW;AAAA,EAChB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlD,MAAM,OAAO,QAAkC,YAAkD;AAC/F,WAAO,KAAK,QAAQ,QAAQ,kBAAkB;AAAA,MAC5C,MAAM;AAAA,MACN,OAAO,EAAE,aAAa,WAAW;AAAA,IACnC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAK,YAAoD;AAC7D,WAAO,KAAK,QAAQ,OAAO,uBAAuB;AAAA,MAChD,OAAO,EAAE,aAAa,WAAW;AAAA,IACnC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,OAAe,QAAgE;AAC1F,WAAO,KAAK,QAAQ,OAAO,kBAAkB,mBAAmB,KAAK,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,OAA6C;AACxD,WAAO,KAAK,QAAQ,UAAU,kBAAkB,mBAAmB,KAAK,CAAC,EAAE;AAAA,EAC7E;AACF;;;ACtDO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlD,MAAM,SAAS,WAA6C;AAC1D,WAAO,KAAK,QAAQ,OAAO,aAAa,mBAAmB,SAAS,CAAC,EAAE;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,WAAoD;AAC/D,WAAO,KAAK,QAAQ,QAAQ,oBAAoB,mBAAmB,SAAS,CAAC,EAAE;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,QAAwD;AACjE,WAAO,KAAK,QAAQ,OAAO,kBAAkB;AAAA,MAC3C,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;;;AC/BO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,OAAO,QAAwE;AACnF,WAAO,KAAK,QAAQ,QAAQ,aAAa,EAAE,MAAM,OAAO,CAAC;AAAA,EAC3D;AAAA,EAEA,MAAM,SAAS,WAAqD;AAClE,WAAO,KAAK,QAAQ,OAAO,aAAa,mBAAmB,SAAS,CAAC,EAAE;AAAA,EACzE;AAAA,EAEA,MAAM,OACJ,WACA,QACkC;AAClC,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5F;AAAA,EAEA,MAAM,OAAO,WAAqD;AAChE,WAAO,KAAK,QAAQ,UAAU,aAAa,mBAAmB,SAAS,CAAC,EAAE;AAAA,EAC5E;AAAA;AAAA;AAAA,EAKA,MAAM,OAA2C;AAC/C,WAAO,KAAK,QAAQ,OAAO,gBAAgB;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,SAAS,WAAqD;AAClE,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,KAAK;AAAA,EAC7E;AAAA;AAAA,EAGA,MAAM,YAAY,WAAqD;AACrE,WAAO,KAAK,QAAQ,OAAO,aAAa,mBAAmB,SAAS,CAAC,KAAK;AAAA,EAC5E;AAAA;AAAA,EAGA,MAAM,aAAa,QAAmE;AACpF,WAAO,KAAK,QAAQ,QAAQ,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAAA,EACpE;AACF;;;AC9CO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlD,MAAM,SAAS,QAA8C;AAC3D,WAAO,KAAK,QAAQ,OAAO,iBAAiB,mBAAmB,MAAM,CAAC,EAAE;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,QAAkE;AAC3E,WAAO,KAAK,QAAQ,QAAQ,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAAA,EACpE;AAAA;AAAA,EAGA,MAAM,SAAS,YAAoB,WAAqD;AACtF,WAAO,KAAK;AAAA,MACV;AAAA,MACA,iBAAiB,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,SAAS,CAAC;AAAA,IAClF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,YAAoB,WAAqD;AACpF,WAAO,KAAK;AAAA,MACV;AAAA,MACA,uBAAuB,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,SAAS,CAAC;AAAA,IACxF;AAAA,EACF;AACF;;;AC9BO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBlD,MAAM,OAAO,QAAoE;AAC/E,WAAO,KAAK,QAAQ,QAAQ,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS,UAAkD;AAC/D,WAAO,KAAK,QAAQ,OAAO,oBAAoB,mBAAmB,QAAQ,CAAC,EAAE;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OACJ,UACA,QACgC;AAChC,WAAO,KAAK,QAAQ,QAAQ,oBAAoB,mBAAmB,QAAQ,CAAC,WAAW;AAAA,MACrF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,UAAwD;AACnE,WAAO,KAAK,QAAQ,UAAU,oBAAoB,mBAAmB,QAAQ,CAAC,EAAE;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,QAAoE;AAC7E,WAAO,KAAK,QAAQ,OAAO,oBAAoB;AAAA,MAC7C,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,gBACJ,YACA,QAC6C;AAC7C,WAAO,KAAK,QAAQ,OAAO,cAAc,mBAAmB,UAAU,CAAC,oBAAoB;AAAA,MACzF,OAAO;AAAA,IAIT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAW,YAAoB,UAAkD;AACrF,WAAO,KAAK;AAAA,MACV;AAAA,MACA,cAAc,mBAAmB,UAAU,CAAC,oBAAoB,mBAAmB,QAAQ,CAAC;AAAA,IAC9F;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,QAAiE;AAC7E,WAAO,KAAK,QAAQ,QAAQ,4BAA4B,EAAE,MAAM,OAAO,CAAC;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAM,aAAa,QAAqE;AACtF,WAAO,KAAK,QAAQ,QAAQ,kCAAkC,EAAE,MAAM,OAAO,CAAC;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,YAAY,QAAqE;AACrF,WAAO,KAAK,QAAQ,QAAQ,iCAAiC,EAAE,MAAM,OAAO,CAAC;AAAA,EAC/E;AAAA;AAAA,EAGA,MAAM,cACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,0BAA0B,EAAE,OAAO,OAAO,CAAC;AAAA,EACxE;AAAA;AAAA,EAGA,MAAM,aAAa,QAAmE;AACpF,WAAO,KAAK,QAAQ,QAAQ,kCAAkC,EAAE,MAAM,OAAO,CAAC;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,kBAAkB,QAAqE;AAC3F,WAAO,KAAK,QAAQ,QAAQ,wCAAwC,EAAE,MAAM,OAAO,CAAC;AAAA,EACtF;AAAA;AAAA,EAGA,MAAM,QAAQ,QAAmE;AAC/E,WAAO,KAAK,QAAQ,QAAQ,4BAA4B,EAAE,MAAM,OAAO,CAAC;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAM,KAAK,UAAkB,QAAkE;AAC7F,WAAO,KAAK,QAAQ,QAAQ,oBAAoB,mBAAmB,QAAQ,CAAC,SAAS;AAAA,MACnF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,eAAe,QAAmE;AACtF,WAAO,KAAK,QAAQ,QAAQ,8BAA8B,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5E;AAAA;AAAA,EAGA,MAAM,kBAAkB,QAAmE;AACzF,WAAO,KAAK,QAAQ,QAAQ,kCAAkC,EAAE,MAAM,OAAO,CAAC;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,sBACJ,UACA,QACkC;AAClC,WAAO,KAAK,QAAQ,QAAQ,oBAAoB,mBAAmB,QAAQ,CAAC,kBAAkB;AAAA,MAC5F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;;;AC/KO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBlD,MAAM,OAAO,QAAwD;AACnE,WAAO,KAAK,QAAQ,QAAQ,aAAa,EAAE,MAAM,OAAO,CAAC;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAM,SAAS,WAAmB,SAA4D;AAC5F,UAAM,OAAO,aAAa,mBAAmB,SAAS,CAAC;AACvD,QAAI,YAAY,OAAW,QAAO,KAAK,QAAQ,OAAO,IAAI;AAC1D,UAAM,QAAiC,CAAC;AACxC,QAAI,QAAQ,eAAe,OAAW,OAAM,YAAY,IAAI,QAAQ;AACpE,QAAI,QAAQ,sBAAsB,QAAW;AAC3C,YAAM,mBAAmB,IAAI,QAAQ;AAAA,IACvC;AACA,QAAI,OAAO,KAAK,KAAK,EAAE,WAAW,EAAG,QAAO,KAAK,QAAQ,OAAO,IAAI;AACpE,WAAO,KAAK,QAAQ,OAAO,MAAM,EAAE,MAAM,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAO,WAAmB,QAAwD;AACtF,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAQ,WAAmB,QAAyD;AACxF,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,YAAY;AAAA,MAChF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAQ,WAAmB,QAA0D;AACzF,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,YAAY;AAAA,MAChF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAO,WAAmB,QAAyD;AACvF,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,WAAW;AAAA,MAC/E,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,KAAK,QAA0D;AACnE,WAAO,KAAK,QAAQ,OAAO,kBAAkB;AAAA,MAC3C,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAAmE;AACrF,WAAO,KAAK,QAAQ,QAAQ,4BAA4B,EAAE,MAAM,OAAO,CAAC;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAM,KAAK,QAA2D;AACpE,WAAO,KAAK,QAAQ,QAAQ,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,kBACJ,WACA,QAC0B;AAC1B,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,wBAAwB;AAAA,MAC5F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,yBACJ,WACA,QAC0B;AAC1B,WAAO,KAAK;AAAA,MACV;AAAA,MACA,aAAa,mBAAmB,SAAS,CAAC;AAAA,MAC1C;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,oBACJ,WACA,QAC0B;AAC1B,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,yBAAyB;AAAA,MAC7F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,kBACJ,WACA,QAC0B;AAC1B,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,uBAAuB;AAAA,MAC3F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,aACJ,WACA,QACkC;AAClC,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,kBAAkB;AAAA,MACtF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,eACJ,WACA,QAC0B;AAC1B,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,oBAAoB;AAAA,MACxF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,iBAAiB,WAAqD;AAC1E,WAAO,KAAK,QAAQ,OAAO,aAAa,mBAAmB,SAAS,CAAC,qBAAqB;AAAA,EAC5F;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAA0D;AAC5E,WAAO,KAAK,QAAQ,OAAO,0BAA0B;AAAA,MACnD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,aAAa,QAA0D;AAC3E,WAAO,KAAK,QAAQ,OAAO,4BAA4B;AAAA,MACrD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,aAAa,QAA+D;AAChF,WAAO,KAAK,QAAQ,QAAQ,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,WAAW,QAAoE;AACnF,WAAO,KAAK,QAAQ,QAAQ,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAAA,EAClE;AAAA;AAAA,EAGA,MAAM,aACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,uBAAuB,EAAE,OAAO,OAAO,CAAC;AAAA,EACrE;AAAA;AAAA,EAGA,MAAM,UACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,uBAAuB,EAAE,OAAO,OAAO,CAAC;AAAA,EACrE;AAAA;AAAA,EAGA,MAAM,mBACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,+BAA+B,EAAE,OAAO,OAAO,CAAC;AAAA,EAC7E;AAAA;AAAA,EAGA,MAAM,aAAa,WAAmB,QAA2D;AAC/F,WAAO,KAAK,QAAQ,OAAO,aAAa,mBAAmB,SAAS,CAAC,kBAAkB;AAAA,MACrF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAQ,WAAmB,QAA4D;AAC3F,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,YAAY;AAAA,MAChF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAO,WAAmB,QAA4D;AAC1F,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,WAAW;AAAA,MAC/E,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,sBACJ,WACA,QACkC;AAClC,WAAO,KAAK,QAAQ,QAAQ,aAAa,mBAAmB,SAAS,CAAC,uBAAuB;AAAA,MAC3F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;;;AC7RO,IAAM,UAAN,MAAc;AAAA,EACnB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBlD,MAAM,OAAO,QAAsD;AACjE,WAAO,KAAK,QAAQ,QAAQ,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS,UAA2C;AACxD,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,QAAQ,CAAC,EAAE;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAO,UAAkB,QAAsD;AACnF,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAQ,UAAkB,QAAuD;AACrF,WAAO,KAAK,QAAQ,QAAQ,YAAY,mBAAmB,QAAQ,CAAC,YAAY;AAAA,MAC9E,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,UAA2C;AACtD,WAAO,KAAK,QAAQ,QAAQ,YAAY,mBAAmB,QAAQ,CAAC,SAAS;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAQ,UAA2C;AACvD,WAAO,KAAK,QAAQ,QAAQ,YAAY,mBAAmB,QAAQ,CAAC,UAAU;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,QAAwD;AACjE,WAAO,KAAK,QAAQ,OAAO,iBAAiB;AAAA,MAC1C,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAAwD;AAC1E,WAAO,KAAK,QAAQ,OAAO,yBAAyB;AAAA,MAClD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,aAAa,QAA8D;AAC/E,WAAO,KAAK,QAAQ,QAAQ,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAAA,EAC/D;AAAA;AAAA,EAGA,MAAM,WAAW,QAAoE;AACnF,WAAO,KAAK,QAAQ,QAAQ,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAAA,EACjE;AAAA;AAAA,EAGA,MAAM,oBAAoB,QAAoE;AAC5F,WAAO,KAAK,QAAQ,QAAQ,2BAA2B,EAAE,MAAM,OAAO,CAAC;AAAA,EACzE;AAAA;AAAA,EAGA,MAAM,UACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,sBAAsB,EAAE,OAAO,OAAO,CAAC;AAAA,EACpE;AAAA;AAAA,EAGA,MAAM,mBACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,8BAA8B,EAAE,OAAO,OAAO,CAAC;AAAA,EAC5E;AAAA;AAAA,EAGA,MAAM,aAAa,UAAkB,QAA0D;AAC7F,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,QAAQ,CAAC,kBAAkB;AAAA,MACnF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;;;AC3IO,IAAM,OAAN,MAAW;AAAA,EAChB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,UAAU,QAA6C;AAC3D,WAAO,KAAK,QAAQ,OAAO,gBAAgB,mBAAmB,MAAM,CAAC,EAAE;AAAA,EACzE;AACF;;;ACFO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,OAAO,QAAwE;AACnF,WAAO,KAAK,QAAQ,QAAQ,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAAA,EACnE;AAAA,EAEA,MAAM,OACJ,WACA,mBACA,QACkC;AAClC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,qBAAqB,mBAAmB,SAAS,CAAC,IAAI,mBAAmB,iBAAiB,CAAC;AAAA,MAC3F;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;ACxBO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,OAAO,WAAmB,QAAwD;AACtF,WAAO,KAAK,QAAQ,QAAQ,YAAY,mBAAmB,SAAS,CAAC,qBAAqB;AAAA,MACxF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,WAAmB,WAA6C;AAC7E,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,mBAAmB,SAAS,CAAC,qBAAqB,mBAAmB,SAAS,CAAC;AAAA,IAC7F;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,WAA+C;AACxD,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,SAAS,CAAC,mBAAmB;AAAA,EACzF;AAAA,EAEA,MAAM,OACJ,WACA,WACA,QAC0B;AAC1B,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,mBAAmB,SAAS,CAAC,qBAAqB,mBAAmB,SAAS,CAAC;AAAA,MAC3F;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,WAAmB,WAA6C;AAC3E,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,mBAAmB,SAAS,CAAC,qBAAqB,mBAAmB,SAAS,CAAC;AAAA,IAC7F;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,WAAmB,WAA6C;AAC3F,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,mBAAmB,SAAS,CAAC,qBAAqB,mBAAmB,SAAS,CAAC;AAAA,IAC7F;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,2BAA2B,WAAmB,WAA6C;AAC/F,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,mBAAmB,SAAS,CAAC,qBAAqB,mBAAmB,SAAS,CAAC;AAAA,IAC7F;AAAA,EACF;AACF;;;ACnDO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAclD,MAAM,OAAO,QAA8B,YAA8C;AACvF,WAAO,KAAK,QAAQ,QAAQ,aAAa;AAAA,MACvC,MAAM;AAAA,MACN,OAAO,EAAE,aAAa,WAAW;AAAA,IACnC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,SAAS,WAAmB,YAA+C;AAC/E,UAAM,OAAO,aAAa,mBAAmB,SAAS,CAAC;AACvD,QAAI,eAAe,OAAW,QAAO,KAAK,QAAQ,OAAO,IAAI;AAC7D,WAAO,KAAK,QAAQ,OAAO,MAAM,EAAE,OAAO,EAAE,aAAa,WAAW,EAAE,CAAC;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,OACJ,WACA,QACA,YAC0B;AAC1B,UAAM,OAAO,aAAa,mBAAmB,SAAS,CAAC;AACvD,QAAI,eAAe,OAAW,QAAO,KAAK,QAAQ,OAAO,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/E,WAAO,KAAK,QAAQ,OAAO,MAAM,EAAE,MAAM,QAAQ,OAAO,EAAE,aAAa,WAAW,EAAE,CAAC;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAO,WAAmB,YAA+C;AAC7E,UAAM,OAAO,aAAa,mBAAmB,SAAS,CAAC;AACvD,QAAI,eAAe,OAAW,QAAO,KAAK,QAAQ,UAAU,IAAI;AAChE,WAAO,KAAK,QAAQ,UAAU,MAAM,EAAE,OAAO,EAAE,aAAa,WAAW,EAAE,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,YAAgD;AACzD,WAAO,KAAK,QAAQ,OAAO,kBAAkB;AAAA,MAC3C,OAAO,EAAE,aAAa,WAAW;AAAA,IACnC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAM,YAAmD;AAC7D,WAAO,KAAK,QAAQ,OAAO,mBAAmB;AAAA,MAC5C,OAAO,EAAE,aAAa,WAAW;AAAA,IACnC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS,YAAuD;AACpE,WAAO,KAAK,QAAQ,OAAO,sBAAsB;AAAA,MAC/C,OAAO,EAAE,aAAa,WAAW;AAAA,IACnC,CAAC;AAAA,EACH;AACF;;;ACxGO,IAAM,UAAN,MAAc;AAAA,EACnB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBlD,MAAM,OAAO,QAAsD;AACjE,WAAO,KAAK,QAAQ,QAAQ,YAAY,EAAE,MAAM,OAAO,CAAC;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,SAAS,UAA2C;AACxD,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,QAAQ,CAAC,EAAE;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAO,UAAkB,QAAsD;AACnF,WAAO,KAAK,QAAQ,QAAQ,YAAY,mBAAmB,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,QAAwD;AACjE,WAAO,KAAK,QAAQ,QAAQ,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAAA,EAC/D;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAAwD;AAC1E,WAAO,KAAK,QAAQ,QAAQ,yBAAyB,EAAE,MAAM,OAAO,CAAC;AAAA,EACvE;AAAA;AAAA,EAGA,MAAM,WAAW,QAAoE;AACnF,WAAO,KAAK,QAAQ,QAAQ,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAAA,EACjE;AAAA;AAAA,EAGA,MAAM,aACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,sBAAsB,EAAE,OAAO,OAAO,CAAC;AAAA,EACpE;AAAA;AAAA,EAGA,MAAM,UACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,sBAAsB,EAAE,OAAO,OAAO,CAAC;AAAA,EACpE;AAAA;AAAA,EAGA,MAAM,mBACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,8BAA8B,EAAE,OAAO,OAAO,CAAC;AAAA,EAC5E;AAAA;AAAA,EAGA,MAAM,aAAa,UAAkB,QAA0D;AAC7F,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,QAAQ,CAAC,kBAAkB;AAAA,MACnF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;;;ACvGO,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,OAAO,QAA8C;AACzD,WAAO,KAAK,QAAQ,QAAQ,UAAU,EAAE,MAAM,OAAO,CAAC;AAAA,EACxD;AAAA,EAEA,MAAM,SAAS,SAAyC;AACtD,WAAO,KAAK,QAAQ,OAAO,UAAU,mBAAmB,OAAO,CAAC,EAAE;AAAA,EACpE;AACF;;;ACMO,IAAM,UAAN,MAAc;AAAA,EAGnB,YAA6B,SAAoB;AAApB;AAC3B,SAAK,WAAW,IAAI,uBAAuB,OAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,OAAO,QAAsE;AACjF,WAAO,KAAK,QAAQ,QAAQ,YAAY,EAAE,MAAM,OAAO,CAAC;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS,aAAwD;AACrE,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,WAAW,CAAC,EAAE;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,SACJ,aACA,SAAiC,CAAC,GACA;AAClC,WAAO,KAAK,QAAQ,QAAQ,YAAY,mBAAmB,WAAW,CAAC,aAAa;AAAA,MAClF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAW,SAAmC,CAAC,GAAqC;AACxF,WAAO,KAAK,QAAQ,QAAQ,uBAAuB,EAAE,MAAM,OAAO,CAAC;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAmC;AACvC,WAAO,KAAK,QAAQ,OAAO,UAAU;AAAA,EACvC;AAAA;AAAA;AAAA,EAKA,MAAM,YAA0D;AAC9D,WAAO,KAAK,QAAQ,OAAO,iBAAiB;AAAA,EAC9C;AAAA;AAAA,EAGA,MAAM,cAAc,QAAqE;AACvF,WAAO,KAAK,QAAQ,QAAQ,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAAA,EAClE;AAAA;AAAA,EAGA,MAAM,oBAAwF;AAC5F,WAAO,KAAK,QAAQ,OAAO,0BAA0B;AAAA,EACvD;AAAA;AAAA,EAGA,MAAM,qBACJ,WACA,QACsC;AACtC,WAAO,KAAK,QAAQ,QAAQ,4BAA4B,mBAAmB,SAAS,CAAC,IAAI;AAAA,MACvF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,iBAA6C;AACjD,WAAO,KAAK,QAAQ,OAAO,uBAAuB;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,aAAa,QAAmE;AACpF,WAAO,KAAK,QAAQ,QAAQ,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAAA,EACxE;AAAA;AAAA,EAGA,MAAM,YAAY,QAAmE;AACnF,WAAO,KAAK,QAAQ,QAAQ,yBAAyB,EAAE,MAAM,OAAO,CAAC;AAAA,EACvE;AAAA;AAAA,EAGA,MAAM,SAAS,QAAmE;AAChF,WAAO,KAAK,QAAQ,QAAQ,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAAA,EACnE;AAAA;AAAA,EAGA,MAAM,SAAS,QAAmE;AAChF,WAAO,KAAK,QAAQ,QAAQ,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAAA,EACnE;AACF;AAEA,IAAM,yBAAN,MAA6B;AAAA,EAC3B,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA,EAGlD,MAAM,OAAO,QAAmE;AAC9E,WAAO,KAAK,QAAQ,OAAO,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAAA,EAClE;AAAA;AAAA,EAGA,MAAM,WAA6C;AACjD,WAAO,KAAK,QAAQ,OAAO,mBAAmB;AAAA,EAChD;AAAA;AAAA,EAGA,MAAM,SAA2C;AAC/C,WAAO,KAAK,QAAQ,UAAU,mBAAmB;AAAA,EACnD;AAAA;AAAA,EAGA,MAAM,gBAAgB,QAAmE;AACvF,WAAO,KAAK,QAAQ,OAAO,+BAA+B,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5E;AAAA;AAAA,EAGA,MAAM,oBAAsD;AAC1D,WAAO,KAAK,QAAQ,OAAO,6BAA6B;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,kBAAoD;AACxD,WAAO,KAAK,QAAQ,UAAU,6BAA6B;AAAA,EAC7D;AACF;;;ACxKA,IAAM,eAAN,MAAmB;AAAA,EACjB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUlD,MAAM,QACJ,YACA,QACA,QAC0B;AAC1B,WAAO,KAAK;AAAA,MACV;AAAA,MACA,UAAU,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,MAAM,CAAC;AAAA,MACtE,EAAE,MAAM,OAAO;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KAAK,YAAoB,QAA4C;AACzE,WAAO,KAAK;AAAA,MACV;AAAA,MACA,UAAU,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,MAAM,CAAC;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WACJ,YACA,QACA,WAC0B;AAC1B,WAAO,KAAK;AAAA,MACV;AAAA,MACA,UAAU,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,MAAM,CAAC,aAAa,mBAAmB,SAAS,CAAC;AAAA,IAClH;AAAA,EACF;AACF;AAOO,IAAM,QAAN,MAAY;AAAA,EAIjB,YAA6B,SAAoB;AAApB;AAC3B,SAAK,WAAW,IAAI,aAAa,OAAO;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,OAAO,YAAoB,QAAkD;AACjF,WAAO,KAAK,QAAQ,QAAQ,UAAU,mBAAmB,UAAU,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAS,YAAoB,QAAuC;AACxE,WAAO,KAAK;AAAA,MACV;AAAA,MACA,UAAU,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,MAAM,CAAC;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,OACJ,YACA,QACA,QACuB;AACvB,WAAO,KAAK;AAAA,MACV;AAAA,MACA,UAAU,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,MAAM,CAAC;AAAA,MACtE,EAAE,MAAM,OAAO;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAO,YAAoB,QAAuC;AACtE,WAAO,KAAK;AAAA,MACV;AAAA,MACA,UAAU,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,MAAM,CAAC;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,YAA6C;AACtD,WAAO,KAAK,QAAQ,OAAO,UAAU,mBAAmB,UAAU,CAAC,EAAE;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,WACJ,YACA,QACA,MACoC;AACpC,UAAM,OAAO,IAAI,SAAS;AAC1B,SAAK,OAAO,QAAQ,IAAI;AACxB,WAAO,KAAK;AAAA,MACV;AAAA,MACA,UAAU,mBAAmB,UAAU,CAAC,IAAI,mBAAmB,MAAM,CAAC;AAAA,MACtE,EAAE,MAAM,KAAK;AAAA,IACf;AAAA,EACF;AACF;;;ACrLO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,cAAc,QAA4E;AAC9F,WAAO,KAAK,QAAQ,QAAQ,yCAAyC,EAAE,MAAM,OAAO,CAAC;AAAA,EACvF;AAAA,EAEA,MAAM,kBAAkB,QAAsE;AAC5F,WAAO,KAAK,QAAQ,QAAQ,8CAA8C,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5F;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAAmE;AACpF,WAAO,KAAK,QAAQ,QAAQ,oCAAoC,EAAE,MAAM,OAAO,CAAC;AAAA,EAClF;AAAA;AAAA,EAGA,MAAM,eAAe,QAAmE;AACtF,WAAO,KAAK,QAAQ,QAAQ,8BAA8B,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5E;AAAA;AAAA,EAGA,MAAM,gBAAgB,QAAmE;AACvF,WAAO,KAAK,QAAQ,QAAQ,2CAA2C,EAAE,MAAM,OAAO,CAAC;AAAA,EACzF;AACF;;;AChCO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,QAAQ,QAAiE;AAC7E,WAAO,KAAK,QAAQ,QAAQ,8BAA8B,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5E;AACF;;;ACmBO,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,OAAO,QAA0E;AACrF,WAAO,KAAK,QAAQ,QAAQ,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,OAAO,QAA8C;AACzD,WAAO,KAAK,QAAQ,QAAQ,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,UAA4C;AAChD,WAAO,KAAK,QAAQ,QAAQ,eAAe;AAAA,EAC7C;AAAA,EAEA,MAAM,aAAoC;AACxC,WAAO,KAAK,QAAQ,OAAO,OAAO;AAAA,EACpC;AAAA,EAEA,MAAM,OAAO,QAAyD;AACpE,WAAO,KAAK,QAAQ,QAAQ,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,eAAe,QAAsD;AACzE,WAAO,KAAK,QAAQ,QAAQ,yBAAyB,EAAE,MAAM,OAAO,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,eAAe,QAAqD;AACxE,WAAO,KAAK,QAAQ,QAAQ,yBAAyB,EAAE,MAAM,OAAO,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,eAAe,QAAiE;AACpF,WAAO,KAAK,QAAQ,QAAQ,yBAAyB,EAAE,MAAM,OAAO,CAAC;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,cAAc,QAAgE;AAClF,WAAO,KAAK,QAAQ,QAAQ,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,UAAU,QAAkD;AAChE,WAAO,KAAK,QAAQ,QAAQ,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,YAAY,QAAwD;AACxE,WAAO,KAAK,QAAQ,QAAQ,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAAA,EACpE;AAAA,EAEA,MAAM,sBAAsB,QAAiE;AAC3F,WAAO,KAAK,QAAQ,QAAQ,8BAA8B,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5E;AAAA,EAEA,MAAM,eAAe,QAAwD;AAC3E,WAAO,KAAK,QAAQ,QAAQ,yBAAyB,EAAE,MAAM,OAAO,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,eAAe,QAAsD;AACzE,WAAO,KAAK,QAAQ,QAAQ,yBAAyB,EAAE,MAAM,OAAO,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,cAAc,QAAqD;AACvE,WAAO,KAAK,QAAQ,QAAQ,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAAA,EACtE;AAAA,EAEA,MAAM,gBAAoD;AACxD,WAAO,KAAK,QAAQ,OAAO,qBAAqB;AAAA,EAClD;AAAA,EAEA,MAAM,eAAmD;AACvD,WAAO,KAAK,QAAQ,OAAO,oBAAoB;AAAA,EACjD;AAAA,EAEA,MAAM,YAAY,QAA8D;AAC9E,WAAO,KAAK,QAAQ,QAAQ,8BAA8B,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5E;AAAA,EAEA,MAAM,iBAAiB,QAAwD;AAC7E,WAAO,KAAK,QAAQ,QAAQ,4BAA4B,EAAE,MAAM,OAAO,CAAC;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,YAAmC;AACvC,WAAO,KAAK,QAAQ,OAAO,sBAAsB;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,QAA6D;AAC5E,WAAO,KAAK,QAAQ,QAAQ,yBAAyB,EAAE,MAAM,OAAO,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,YAA8C;AAClD,WAAO,KAAK,QAAQ,OAAO,sBAAsB;AAAA,EACnD;AAAA,EAEA,MAAM,wBAAwD;AAC5D,WAAO,KAAK,QAAQ,OAAO,kCAAkC;AAAA,EAC/D;AAAA,EAEA,MAAM,mBAAmB,QAAwD;AAC/E,WAAO,KAAK,QAAQ,QAAQ,kCAAkC,EAAE,MAAM,OAAO,CAAC;AAAA,EAChF;AAAA,EAEA,MAAM,aAAa,QAAoD;AACrE,WAAO,KAAK,QAAQ,QAAQ,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAAA,EACtE;AAAA,EAEA,MAAM,eAAe,QAAgE;AACnF,WAAO,KAAK,QAAQ,QAAQ,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,mBAAqD;AACzD,WAAO,KAAK,QAAQ,OAAO,YAAY;AAAA,EACzC;AAAA,EAEA,MAAM,YAAgD;AACpD,WAAO,KAAK,QAAQ,OAAO,iBAAiB;AAAA,EAC9C;AAAA,EAEA,MAAM,cAAc,QAAsE;AACxF,WAAO,KAAK,QAAQ,QAAQ,cAAc,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,eAAe,QAAmE;AACtF,WAAO,KAAK,QAAQ,QAAQ,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,eAAe,QAAmE;AACtF,WAAO,KAAK,QAAQ,UAAU,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAAA,EACrE;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,QAAwD;AACrE,WAAO,KAAK,QAAQ,QAAQ,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAAA,EACjE;AAAA;AAAA,EAGA,MAAM,WAAW,QAAwD;AACvE,WAAO,KAAK,QAAQ,QAAQ,cAAc,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAM,YAAY,QAAmE;AACnF,WAAO,KAAK,QAAQ,QAAQ,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAAA,EACpE;AAAA;AAAA,EAGA,MAAM,kBAAsD;AAC1D,WAAO,KAAK,QAAQ,OAAO,uBAAuB;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,iBAAmD;AACvD,WAAO,KAAK,QAAQ,OAAO,WAAW;AAAA,EACxC;AAAA;AAAA,EAGA,MAAM,mBAAqD;AACzD,WAAO,KAAK,QAAQ,OAAO,cAAc;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,QAA6D;AAC5E,WAAO,KAAK,QAAQ,OAAO,yBAAyB,EAAE,MAAM,OAAO,CAAC;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa,OAAyD;AAC1E,QAAI,UAAU,QAAW;AACvB,aAAO,KAAK,QAAQ,OAAO,qBAAqB;AAAA,IAClD;AACA,WAAO,KAAK,QAAQ,OAAO,uBAAuB;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,iBAAiB,QAAmE;AACxF,WAAO,KAAK,QAAQ,QAAQ,cAAc,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAM,iBAAiB,QAAmE;AACxF,WAAO,KAAK,QAAQ,OAAO,cAAc,EAAE,MAAM,OAAO,CAAC;AAAA,EAC3D;AAAA;AAAA,EAGA,MAAM,kBAAsD;AAC1D,WAAO,KAAK,QAAQ,OAAO,iBAAiB;AAAA,EAC9C;AAAA;AAAA,EAGA,MAAM,aAA+C;AACnD,WAAO,KAAK,QAAQ,OAAO,gBAAgB;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,WAAW,QAAmE;AAClF,WAAO,KAAK,QAAQ,QAAQ,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAAA,EACnE;AAAA;AAAA,EAGA,MAAM,gBAAgB,QAAsE;AAC1F,WAAO,KAAK,QAAQ,QAAQ,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAAA,EAC/D;AAAA;AAAA,EAGA,MAAM,qBAAyD;AAC7D,WAAO,KAAK,QAAQ,OAAO,iBAAiB;AAAA,EAC9C;AAAA;AAAA,EAGA,MAAM,uBAA2D;AAC/D,WAAO,KAAK,QAAQ,OAAO,oBAAoB;AAAA,EACjD;AAAA;AAAA,EAGA,MAAM,mBAAmB,QAAwD;AAC/E,WAAO,KAAK,QAAQ,QAAQ,+BAA+B,EAAE,MAAM,OAAO,CAAC;AAAA,EAC7E;AAAA;AAAA,EAGA,MAAM,aAAa,QAAmE;AACpF,WAAO,KAAK,QAAQ,QAAQ,4BAA4B,EAAE,MAAM,OAAO,CAAC;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAM,YAA8C;AAClD,WAAO,KAAK,QAAQ,OAAO,eAAe;AAAA,EAC5C;AAAA;AAAA,EAGA,MAAM,YAA8C;AAClD,WAAO,KAAK,QAAQ,OAAO,eAAe;AAAA,EAC5C;AAAA;AAAA,EAGA,MAAM,cAAkD;AACtD,WAAO,KAAK,QAAQ,OAAO,oBAAoB;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,mBAAmB,QAAuE;AAC9F,QAAI,WAAW,UAAa,OAAO,gBAAgB,QAAW;AAC5D,aAAO,KAAK,QAAQ,OAAO,wBAAwB;AAAA,IACrD;AACA,WAAO,KAAK,QAAQ,OAAO,0BAA0B;AAAA,MACnD,OAAO,EAAE,aAAa,OAAO,YAAY;AAAA,IAC3C,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,qBAAyD;AAC7D,WAAO,KAAK,QAAQ,OAAO,wBAAwB;AAAA,EACrD;AAAA;AAAA,EAGA,MAAM,oBAAsD;AAC1D,WAAO,KAAK,QAAQ,OAAO,uBAAuB;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,gBAAoD;AACxD,WAAO,KAAK,QAAQ,OAAO,mBAAmB;AAAA,EAChD;AAAA;AAAA,EAGA,MAAM,gBAAoD;AACxD,WAAO,KAAK,QAAQ,OAAO,mBAAmB;AAAA,EAChD;AAAA;AAAA,EAGA,MAAM,WAAW,QAAmE;AAClF,WAAO,KAAK,QAAQ,QAAQ,cAAc,EAAE,MAAM,OAAO,CAAC;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAM,YAAY,QAAkD;AAClE,WAAO,KAAK,QAAQ,OAAO,cAAc,mBAAmB,MAAM,CAAC,EAAE;AAAA,EACvE;AAAA;AAAA,EAGA,MAAM,WACJ,QACA,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,cAAc,mBAAmB,MAAM,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EACzF;AACF;;;ACrWO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,wBACJ,YACA,QACuC;AACvC,WAAO,KAAK,QAAQ,QAAQ,qBAAqB,mBAAmB,UAAU,CAAC,IAAI;AAAA,MACjF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,2BACJ,QAC0C;AAC1C,WAAO,KAAK,QAAQ,OAAO,qCAAqC;AAAA,MAC9D,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;;;ACZA,SAAS,WAAW,KAAgC;AAClD,MAAI,IAAI,WAAW,KAAK,IAAI,SAAS,MAAM,EAAG,QAAO;AACrD,QAAM,QAAQ,IAAI,WAAW,IAAI,SAAS,CAAC;AAC3C,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;AACtC,UAAM,OAAO,OAAO,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE;AACpD,QAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,UAAM,IAAI,CAAC,IAAI;AAAA,EACjB;AACA,SAAO;AACT;AAEO,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyCtB,MAAM,OACJ,SACA,iBACA,QACuB;AACvB,UAAM,SAAS,WAAW,QAAQ;AAClC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB,WAAW,gBAAgB,KAAK,CAAC;AACxD,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,UAAM,UAAU,IAAI,YAAY;AAChC,UAAM,YAAY,OAAO,YAAY,WAAW,QAAQ,OAAO,OAAO,IAAI;AAK1E,UAAM,iBAAiB,CAAC,UAAoC;AAC5D,UAAM,MAAM,MAAM,OAAO;AAAA,MACvB;AAAA,MACA,eAAe,QAAQ,OAAO,MAAM,CAAC;AAAA,MACrC,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,MAChC;AAAA,MACA,CAAC,QAAQ;AAAA,IACX;AAEA,UAAM,QAAQ,MAAM,OAAO;AAAA,MACzB;AAAA,MACA;AAAA,MACA,eAAe,cAAc;AAAA,MAC7B,eAAe,SAAS;AAAA,IAC1B;AAEA,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,WACJ,OAAO,YAAY,WAAW,UAAU,IAAI,YAAY,OAAO,EAAE,OAAO,OAAO;AACjF,WAAO,KAAK,MAAM,QAAQ;AAAA,EAC5B;AACF;;;AC7GA,IAAM,kBAAN,MAAsB;AAAA,EACpB,YACmB,SACA,QACjB;AAFiB;AACA;AAAA,EAChB;AAAA;AAAA,EAGH,MAAM,QACJ,QACA,OACkC;AAClC,UAAM,SAAS,QAAQ,iBAAiB,KAAK,KAAK;AAGlD,WAAO,KAAK,QAAQ,QAAQ,GAAG,MAAM,YAAY,mBAAmB,KAAK,MAAM,CAAC,IAAI;AAAA,MAClF,MAAM,CAAC,MAAM;AAAA,IACf,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QACJ,QACA,OACkC;AAClC,UAAM,SAAS,QAAQ,iBAAiB,KAAK,KAAK;AAClD,WAAO,KAAK,QAAQ,QAAQ,GAAG,MAAM,YAAY,mBAAmB,KAAK,MAAM,CAAC,IAAI;AAAA,MAClF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OACJ,QACA,OACkC;AAClC,UAAM,SAAS,QAAQ,iBAAiB,KAAK,KAAK;AAClD,WAAO,KAAK,QAAQ,QAAQ,GAAG,MAAM,WAAW,mBAAmB,KAAK,MAAM,CAAC,IAAI;AAAA,MACjF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OACJ,QACA,OACkC;AAClC,UAAM,SAAS,QAAQ,iBAAiB,KAAK,KAAK;AAClD,WAAO,KAAK,QAAQ,QAAQ,GAAG,MAAM,YAAY,mBAAmB,KAAK,MAAM,CAAC,WAAW;AAAA,MACzF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EAUrB,YAA6B,SAAoB;AAApB;AAC3B,SAAK,WAAW,IAAI,gBAAgB,SAAS,UAAU;AACvD,SAAK,UAAU,IAAI,gBAAgB,SAAS,SAAS;AACrD,SAAK,WAAW,IAAI,gBAAgB,SAAS,UAAU;AACvD,SAAK,aAAa,IAAI,gBAAgB,SAAS,aAAa;AAC5D,SAAK,YAAY,IAAI,gBAAgB,SAAS,YAAY;AAC1D,SAAK,MAAM,IAAI,gBAAgB,SAAS,KAAK;AAC7C,SAAK,YAAY,IAAI,gBAAgB,SAAS,YAAY;AAC1D,SAAK,UAAU,IAAI,gBAAgB,SAAS,SAAS;AAAA,EACvD;AAAA;AAAA,EAGA,MAAM,OAAO,QAAmE;AAC9E,WAAO,KAAK,QAAQ,QAAQ,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAAA,EACtE;AAAA;AAAA,EAGA,MAAM,aACJ,QACA,QACkC;AAClC,WAAO,KAAK,QAAQ,QAAQ,wBAAwB,mBAAmB,MAAM,CAAC,IAAI;AAAA,MAChF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAQ,QAAkD;AAC9D,WAAO,KAAK,QAAQ,OAAO,iBAAiB,mBAAmB,MAAM,CAAC,OAAO;AAAA,EAC/E;AAAA;AAAA,EAGA,MAAM,aACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,gCAAgC,EAAE,OAAO,OAAO,CAAC;AAAA,EAC9E;AAAA;AAAA,EAGA,MAAM,aAAa,QAAmE;AACpF,WAAO,KAAK,QAAQ,QAAQ,gCAAgC,EAAE,MAAM,OAAO,CAAC;AAAA,EAC9E;AAAA;AAAA,EAGA,MAAM,mBACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,sCAAsC,EAAE,OAAO,OAAO,CAAC;AAAA,EACpF;AAAA;AAAA,EAGA,MAAM,iBACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,oCAAoC,EAAE,OAAO,OAAO,CAAC;AAAA,EAClF;AAAA;AAAA,EAGA,MAAM,yBACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,6CAA6C,EAAE,OAAO,OAAO,CAAC;AAAA,EAC3F;AACF;;;AChIO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA,EAGlD,MAAM,SACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,wBAAwB,EAAE,OAAO,OAAO,CAAC;AAAA,EACtE;AAAA;AAAA,EAGA,MAAM,SAAS,QAAmE;AAChF,WAAO,KAAK,QAAQ,QAAQ,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAAA,EACtE;AACF;;;ACdO,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA,EAGlD,MAAM,OAAO,QAAmE;AAC9E,WAAO,KAAK,QAAQ,QAAQ,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAAA,EAC/D;AAAA;AAAA,EAGA,MAAM,OAAO,QAAmE;AAC9E,WAAO,KAAK,QAAQ,QAAQ,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAAA,EAC/D;AAAA;AAAA,EAGA,MAAM,SAAS,KAA+C;AAC5D,WAAO,KAAK,QAAQ,OAAO,UAAU,mBAAmB,GAAG,CAAC,EAAE;AAAA,EAChE;AACF;;;ACjBO,IAAM,SAAN,MAAa;AAAA,EAClB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA,EAGlD,MAAM,aAAa,QAAmE;AACpF,WAAO,KAAK,QAAQ,QAAQ,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAAA,EACtE;AACF;;;ACPO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA,EAGlD,MAAM,WAA6C;AACjD,WAAO,KAAK,QAAQ,OAAO,iBAAiB;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,oBAAoB,YAAsD;AAC9E,WAAO,KAAK,QAAQ,OAAO,mBAAmB,mBAAmB,UAAU,CAAC,EAAE;AAAA,EAChF;AACF;;;ACjBO,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA,EAGlD,MAAM,OAAO,QAAmE;AAC9E,WAAO,KAAK,QAAQ,QAAQ,UAAU,EAAE,MAAM,OAAO,CAAC;AAAA,EACxD;AAAA;AAAA,EAGA,MAAM,SAAS,QAAkD;AAC/D,WAAO,KAAK,QAAQ,OAAO,UAAU,mBAAmB,MAAM,CAAC,EAAE;AAAA,EACnE;AAAA;AAAA,EAGA,MAAM,OAAO,QAAkD;AAC7D,WAAO,KAAK,QAAQ,UAAU,UAAU,mBAAmB,MAAM,CAAC,EAAE;AAAA,EACtE;AACF;;;ACjBO,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA,EAGlD,MAAM,SACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,gBAAgB,EAAE,OAAO,OAAO,CAAC;AAAA,EAC9D;AAAA;AAAA,EAGA,MAAM,iBACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,6BAA6B,EAAE,OAAO,OAAO,CAAC;AAAA,EAC3E;AACF;;;ACfO,IAAM,UAAN,MAAc;AAAA,EACnB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA,EAGlD,MAAM,OAAO,QAAsD;AACjE,WAAO,KAAK,QAAQ,QAAQ,YAAY,EAAE,MAAM,OAAO,CAAC;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,SAAS,UAA2C;AACxD,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,QAAQ,CAAC,EAAE;AAAA,EACvE;AAAA;AAAA,EAGA,MAAM,OAAO,UAAkB,QAAsD;AACnF,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EACzF;AAAA;AAAA,EAGA,MAAM,OAAO,UAA2C;AACtD,WAAO,KAAK,QAAQ,UAAU,YAAY,mBAAmB,QAAQ,CAAC,EAAE;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAM,OAAkC;AACtC,WAAO,KAAK,QAAQ,OAAO,eAAe;AAAA,EAC5C;AACF;;;ACrBO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA,EAGlD,MAAM,iBAAiB,QAAkE;AACvF,WAAO,KAAK,QAAQ,QAAQ,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,OAAO,QAAkE;AAC7E,WAAO,KAAK,QAAQ,QAAQ,yBAAyB,EAAE,MAAM,OAAO,CAAC;AAAA,EACvE;AAAA;AAAA,EAGA,MAAM,SAAS,gBAAuD;AACpE,WAAO,KAAK,QAAQ,OAAO,kBAAkB,mBAAmB,cAAc,CAAC,EAAE;AAAA,EACnF;AAAA;AAAA,EAGA,MAAM,QACJ,gBACA,QAC+B;AAC/B,WAAO,KAAK,QAAQ,QAAQ,kBAAkB,mBAAmB,cAAc,CAAC,YAAY;AAAA,MAC1F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OACJ,gBACA,QAC+B;AAC/B,WAAO,KAAK,QAAQ,OAAO,kBAAkB,mBAAmB,cAAc,CAAC,WAAW;AAAA,MACxF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,KAAK,QAAoE;AAC7E,WAAO,KAAK,QAAQ,OAAO,uBAAuB;AAAA,MAChD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,YACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,2BAA2B,EAAE,OAAO,OAAO,CAAC;AAAA,EACzE;AAAA;AAAA,EAGA,MAAM,SACJ,QACkC;AAClC,WAAO,KAAK,QAAQ,OAAO,wBAAwB,EAAE,OAAO,OAAO,CAAC;AAAA,EACtE;AAAA;AAAA,EAGA,MAAM,MAAM,gBAAuD;AACjE,WAAO,KAAK,QAAQ,QAAQ,kBAAkB,mBAAmB,cAAc,CAAC,QAAQ;AAAA,EAC1F;AAAA;AAAA,EAGA,MAAM,OAAO,gBAAuD;AAClE,WAAO,KAAK,QAAQ,QAAQ,kBAAkB,mBAAmB,cAAc,CAAC,SAAS;AAAA,EAC3F;AAAA;AAAA,EAGA,MAAM,OAAO,gBAAuD;AAClE,WAAO,KAAK,QAAQ,QAAQ,kBAAkB,mBAAmB,cAAc,CAAC,SAAS;AAAA,EAC3F;AACF;;;AC1CA,IAAM,iBAAiB;AACvB,IAAM,cAAc;AAEpB,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAE3B,SAAS,gBAAgB,QAAsC;AAC7D,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,UAAU,OAAO,KAAK;AAC5B,QAAM,UAAU,OAAO,OAAO;AAC9B,MAAI,OAAO,SAAS,OAAO,KAAK,WAAW,GAAG;AAC5C,WAAO,KAAK,IAAI,UAAU,KAAM,kBAAkB;AAAA,EACpD;AACA,QAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,MAAI,OAAO,SAAS,IAAI,GAAG;AACzB,UAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,WAAO,QAAQ,IAAI,KAAK,IAAI,OAAO,kBAAkB,IAAI;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,KAAiC;AACxD,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,IAAI,SAAS,qBAAqB,IAAI,MAAM,GAAG,kBAAkB,IAAI,WAAM;AACpF;AAEA,SAAS,mBAAmB,SAAqD;AAC/E,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC5C,QAAI,EAAE,YAAY,MAAM,kBAAmB,QAAO;AAAA,EACpD;AACA,SAAO;AACT;AAOA,SAAS,OAAa;AAEtB;AAEA,SAAS,eAAe,SAAwC;AAC9D,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,YAA4D,CAAC;AACnE,QAAM,UAAU,MAAM;AACpB,eAAW,EAAE,QAAQ,QAAQ,KAAK,WAAW;AAC3C,aAAO,oBAAoB,SAAS,OAAO;AAAA,IAC7C;AACA,cAAU,SAAS;AAAA,EACrB;AACA,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,SAAS;AAClB,iBAAW,MAAM,OAAO,MAAM;AAC9B,cAAQ;AACR,aAAO,EAAE,QAAQ,WAAW,QAAQ,SAAS,KAAK;AAAA,IACpD;AACA,UAAM,UAAU,MAAM;AACpB,iBAAW,MAAM,OAAO,MAAM;AAC9B,cAAQ;AAAA,IACV;AACA,WAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACxD,cAAU,KAAK,EAAE,QAAQ,QAAQ,CAAC;AAAA,EACpC;AACA,SAAO,EAAE,QAAQ,WAAW,QAAQ,QAAQ;AAC9C;AAuCA,IAAM,uBAAuB,oBAAI,IAAI;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOD,SAAS,oBAAoB,KAAqB;AAChD,QAAM,OAAO,IAAI,QAAQ,GAAG;AAC5B,MAAI,SAAS,GAAI,QAAO;AACxB,QAAM,OAAO,IAAI,MAAM,GAAG,IAAI;AAC9B,QAAM,QAAQ,IAAI,MAAM,OAAO,CAAC;AAChC,QAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS;AAC3C,UAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,QAAI,UAAU,GAAI,QAAO;AACzB,UAAM,MAAM,KAAK,MAAM,GAAG,KAAK;AAC/B,QAAI,qBAAqB,IAAI,mBAAmB,GAAG,EAAE,YAAY,CAAC,GAAG;AACnE,aAAO,GAAG,GAAG;AAAA,IACf;AACA,WAAO;AAAA,EACT,CAAC;AACD,SAAO,GAAG,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC;AACnC;AA0CO,IAAM,UAAN,MAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmEnB,YAAY,QAAiB,SAA0B;AACrD,SAAK,SAAS,UAAU;AACxB,SAAK,UAAU,SAAS,WAAW;AACnC,SAAK,aAAa,SAAS,cAAc;AACzC,SAAK,QAAQ,SAAS,SAAS;AAC/B,QAAI,SAAS,WAAW,OAAW,MAAK,SAAS,QAAQ;AAEzD,QAAI,SAAS,YAAY,QAAW;AAClC,WAAK,UAAU,QAAQ;AAAA,IACzB,WAAW,SAAS,SAAS;AAC3B,WAAK,UAAU;AAAA,IACjB,OAAO;AACL,WAAK,UAAU;AAAA,IACjB;AAEA,UAAM,UAAU,KAAK,QAAQ,KAAK,IAAI;AAKtC,SAAK,WAAW,IAAI,SAAS,OAAO;AACpC,SAAK,UAAU,IAAI,QAAQ,OAAO;AAClC,SAAK,YAAY,IAAI,UAAU,OAAO;AACtC,SAAK,iBAAiB,IAAI,eAAe,OAAO;AAChD,SAAK,eAAe,IAAI,aAAa,OAAO;AAC5C,SAAK,WAAW,IAAI,SAAS,OAAO;AACpC,SAAK,WAAW,IAAI,SAAS,OAAO;AACpC,SAAK,UAAU,IAAI,QAAQ,OAAO;AAClC,SAAK,gBAAgB,IAAI,cAAc,OAAO;AAC9C,SAAK,SAAS,IAAI,OAAO,OAAO;AAChC,SAAK,OAAO,IAAI,KAAK,OAAO;AAG5B,SAAK,aAAa,IAAI,WAAW,OAAO;AACxC,SAAK,UAAU,IAAI,QAAQ,OAAO;AAClC,SAAK,WAAW,IAAI,SAAS,OAAO;AACpC,SAAK,QAAQ,IAAI,MAAM,OAAO;AAC9B,SAAK,mBAAmB,IAAI,iBAAiB,OAAO;AAGpD,SAAK,iBAAiB,IAAI,eAAe,OAAO;AAChD,SAAK,eAAe,IAAI,aAAa,OAAO;AAG5C,SAAK,QAAQ,IAAI,MAAM,OAAO;AAC9B,SAAK,UAAU,IAAI,QAAQ,OAAO;AAClC,SAAK,UAAU,IAAI,QAAQ,OAAO;AAClC,SAAK,YAAY,IAAI,UAAU,OAAO;AACtC,SAAK,OAAO,IAAI,KAAK,OAAO;AAC5B,SAAK,mBAAmB,IAAI,iBAAiB,OAAO;AACpD,SAAK,WAAW,IAAI,SAAS,OAAO;AACpC,SAAK,QAAQ,IAAI,MAAM,OAAO;AAC9B,SAAK,gBAAgB,IAAI,cAAc,OAAO;AAC9C,SAAK,eAAe,IAAI,aAAa,OAAO;AAG5C,SAAK,gBAAgB,IAAI,cAAc,OAAO;AAC9C,SAAK,QAAQ,IAAI,MAAM,OAAO;AAC9B,SAAK,SAAS,IAAI,OAAO,OAAO;AAChC,SAAK,QAAQ,IAAI,MAAM,OAAO;AAC9B,SAAK,UAAU,IAAI,QAAQ,OAAO;AAClC,SAAK,YAAY,IAAI,UAAU,OAAO;AACtC,SAAK,qBAAqB,IAAI,mBAAmB,OAAO;AACxD,SAAK,gBAAgB,IAAI,cAAc,OAAO;AAC9C,SAAK,QAAQ,IAAI,MAAM,OAAO;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,OAAqB;AAC/B,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAsB;AACpB,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,QAAW,QAAgB,MAAc,SAAsC;AACnF,QAAI,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI;AAEhC,QAAI,SAAS,OAAO;AAClB,YAAM,SAAS,IAAI,gBAAgB;AACnC,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAK,GAAG;AACxD,YAAI,UAAU,UAAa,UAAU,KAAM;AAC3C,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,qBAAW,KAAK,OAAO;AACrB,gBAAI,MAAM,UAAa,MAAM,KAAM,QAAO,OAAO,KAAK,OAAO,CAAC,CAAC;AAAA,UACjE;AAAA,QACF,OAAO;AACL,iBAAO,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,QAC/B;AAAA,MACF;AACA,YAAM,KAAK,OAAO,SAAS;AAC3B,UAAI,IAAI;AACN,eAAO,IAAI,EAAE;AAAA,MACf;AAAA,IACF;AAEA,UAAM,UAAkC;AAAA,MACtC,GAAI,KAAK,WACL,EAAE,eAAe,UAAU,KAAK,QAAQ,GAAG,IAC3C,KAAK,SACH,EAAE,WAAW,KAAK,OAAO,IACzB,CAAC;AAAA,MACP,GAAG,SAAS;AAAA,IACd;AAKA,UAAM,YACJ,SAAS,SAAS,UAClB,SAAS,SAAS,SACjB,QAAQ,gBAAgB,YACvB,QAAQ,gBAAgB,QACxB,QAAQ,gBAAgB,eACxB,QAAQ,gBAAgB;AAE5B,QAAI,SAAS,QAAQ,CAAC,WAAW;AAC/B,cAAQ,cAAc,IAAI;AAAA,IAC5B;AAEA,UAAM,iBAAiB,mBAAmB,OAAO,GAAG,KAAK;AACzD,UAAM,cACJ,WAAW,SACX,WAAW,YACV,mBAAmB,UAAa,mBAAmB;AAItD,QAAI;AACJ,QAAI,WAAW;AACb,uBAAiB,SAAS;AAAA,IAC5B,WAAW,SAAS,MAAM;AACxB,uBAAiB,KAAK,UAAU,QAAQ,IAAI;AAAA,IAC9C;AAEA,UAAM,eAAe,SAAS;AAC9B,QAAI,cAAc,SAAS;AACzB,YAAM,IAAI,aAAa,mBAAmB;AAAA,QACxC,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,UAAM,YAAY,SAAS,WAAW,KAAK;AAE3C,QAAI;AACJ,QAAI,uBAAsC;AAE1C,UAAM,UAAU,MAAM,oBAAoB,GAAG;AAC7C,UAAM,OAAO,CAAC,OAAyC,SAAkC;AACvF,UAAI,CAAC,KAAK,MAAO;AACjB,UAAI,KAAK,QAAQ;AACf,aAAK,OAAO,OAAO,IAAI;AACvB;AAAA,MACF;AACA,UAAI,UAAU;AACZ,gBAAQ,IAAI,aAAa,KAAK,MAAgB,IAAI,KAAK,GAAa,EAAE;AAAA,eAC/D,UAAU;AACjB,gBAAQ;AAAA,UACN,aAAa,KAAK,MAAgB,IAAI,KAAK,MAAgB,IAAI,KAAK,IAAc;AAAA,QACpF;AAAA;AAEA,gBAAQ;AAAA,UACN,mBAAmB,KAAK,OAAiB,IAAI,KAAK,UAAoB,IAAI,KAAK,MAAgB,IAAI,KAAK,IAAc;AAAA,QACxH;AAAA,IACJ;AAEA,aAAS,UAAU,GAAG,WAAW,KAAK,YAAY,WAAW;AAC3D,UAAI,UAAU,GAAG;AACf,cAAM,OAAO,KAAK,IAAI,MAAM,MAAM,UAAU,IAAI,GAAI;AAEpD,cAAM,WAAW,KAAK,OAAO,IAAI;AACjC,cAAM,QAAQ,KAAK,IAAI,wBAAwB,GAAG,QAAQ;AAC1D,+BAAuB;AACvB,cAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,KAAK,CAAC;AACzD,aAAK,SAAS,EAAE,SAAS,YAAY,KAAK,YAAY,QAAQ,KAAK,CAAC;AAAA,MACtE;AAEA,YAAM,cAAc,IAAI,gBAAgB;AACxC,YAAM,YAAY,WAAW,MAAM,YAAY,MAAM,GAAG,SAAS;AACjE,YAAM,WAAW;AAAA,QACf,eAAe,CAAC,YAAY,QAAQ,YAAY,IAAI,CAAC,YAAY,MAAM;AAAA,MACzE;AAEA,UAAI;AACF,aAAK,WAAW,EAAE,QAAQ,KAAK,QAAQ,GAAG,KAAK,CAAC;AAEhD,cAAM,WAAW,MAAM,MAAM,KAAK;AAAA,UAChC;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN,QAAQ,SAAS;AAAA,QACnB,CAAC;AAED,cAAM,YACJ,SAAS,SAAS,IAAI,cAAc,KAAK,SAAS,SAAS,IAAI,YAAY,KAAK;AAElF,aAAK,YAAY,EAAE,QAAQ,SAAS,QAAQ,QAAQ,MAAM,UAAU,CAAC;AAErE,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,UAAU,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACpD,cAAI,SAAkC,CAAC;AACvC,cAAI,SAAS;AACX,gBAAI;AACF,uBAAS,KAAK,MAAM,OAAO;AAAA,YAC7B,QAAQ;AAAA,YAER;AAAA,UACF;AAEA,gBAAM,MAAO,OAAO,SAAqC;AACzD,gBAAM,UACH,IAAI,WAAsB,8BAA8B,SAAS,MAAM;AAC1E,gBAAM,OAAQ,IAAI,QAAmB;AACrC,gBAAM,OAAQ,IAAI,cAA0B,IAAI,QAAmB;AACnE,gBAAM,OACJ,IAAI,QAAQ,OAAO,IAAI,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,IAAI,IAC9D,IAAI,OACL;AACN,gBAAM,eAAe,gBAAgB,OAAO;AAE5C,cAAI,SAAS,WAAW,KAAK;AAC3B,kBAAM,IAAI,2BAA2B,SAAS;AAAA,cAC5C;AAAA,cACA;AAAA,cACA;AAAA,cACA,SAAS;AAAA,cACT;AAAA,YACF,CAAC;AAAA,UACH;AAEA,gBAAM,QAAQ,IAAI,aAAa,SAAS;AAAA,YACtC,QAAQ,SAAS;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA,SAAS;AAAA,YACT;AAAA,UACF,CAAC;AAGD,gBAAM,oBAAoB,SAAS,UAAU,OAAO,SAAS,WAAW;AACxE,cAAI,qBAAqB,eAAe,UAAU,KAAK,YAAY;AACjE,gBAAI,SAAS,WAAW,KAAK;AAC3B,qCAAuB,gBAAgB,SAAS,SAAS,IAAI,aAAa,KAAK,IAAI;AAAA,YACrF;AACA,wBAAY;AACZ;AAAA,UACF;AAEA,gBAAM;AAAA,QACR;AAEA,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,eAAQ,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA,MACpC,SAAS,KAAK;AACZ,YAAI,eAAe,gBAAgB,eAAe,4BAA4B;AAC5E,gBAAM;AAAA,QACR;AACA,YAAI,eAAe,SAAS,IAAI,SAAS,cAAc;AACrD,cAAI,cAAc,SAAS;AACzB,kBAAM,IAAI,aAAa,mBAAmB;AAAA,cACxC,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AACA,sBAAY,IAAI,aAAa,qBAAqB;AAAA,YAChD,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,UACR,CAAC;AACD,cAAI,eAAe,UAAU,KAAK,WAAY;AAC9C,gBAAM;AAAA,QACR;AACA,YAAI,eAAe,WAAW;AAC5B,sBAAY,IAAI,aAAa,kBAAkB,IAAI,OAAO,IAAI;AAAA,YAC5D,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,UACR,CAAC;AACD,cAAI,eAAe,UAAU,KAAK,WAAY;AAC9C,gBAAM;AAAA,QACR;AACA,cAAM;AAAA,MACR,UAAE;AACA,qBAAa,SAAS;AACtB,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAEA,UAAM;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,SACL,QACA,QACA,WAAW,IACQ;AACnB,QAAI,SAAS;AACb,WAAO,MAAM;AACX,YAAM,SAAS,MAAM,OAAO;AAAA,QAC1B,GAAK,UAAU,CAAC;AAAA,QAChB,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AACD,YAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,SAAS,OAAO;AACtD,UAAI,MAAM,WAAW,EAAG;AACxB,iBAAW,QAAQ,OAAO;AACxB,cAAM;AAAA,MACR;AACA,UAAI,MAAM,SAAS,SAAU;AAC7B,gBAAU,MAAM;AAAA,IAClB;AAAA,EACF;AACF;AAAA;AAraa,QAEJ,WAAW;;;AC1CpB,IAAM,cAA0C;AAAA,EAC9C,OAAO;AAAA,EACP,QACE;AAAA,EACF,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,MAAM;AAAA,EACN,UAAU;AAAA,EACV,aAAa;AAAA,EACb,kBAAkB;AACpB;AAEA,IAAM,YAA0C;AAAA,EAC9C,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,sBAAkD;AAAA,EACtD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AACR;AAEA,IAAM,cAA4C;AAAA,EAChD,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AACZ;AAEA,IAAM,eAA6C;AAAA,EACjD,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AACZ;AAEA,IAAM,YAAuC;AAAA,EAC3C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,aAAwC;AAAA,EAC5C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,SAAS,UAAU,QAA4B;AACpD,SAAO,YAAY,MAAM,KAAK,YAAY;AAC5C;AAEO,SAAS,YAAY,QAA8B;AACxD,SAAO,UAAU,MAAM,KAAK,UAAU;AACxC;AAEO,SAAS,gBAAgB,QAA4B;AAC1D,SAAO,oBAAoB,MAAM,KAAK;AACxC;AAEO,SAAS,gBAAgB,OAA6B;AAC3D,SAAO,YAAY,KAAK,KAAK,YAAY;AAC3C;AAEO,SAAS,iBAAiB,OAA6B;AAC5D,SAAO,aAAa,KAAK,KAAK,aAAa;AAC7C;AAEO,SAAS,cAAc,MAAyB;AACrD,SAAO,UAAU,IAAI,KAAK,UAAU;AACtC;AAEO,SAAS,eAAe,MAAyB;AACtD,SAAO,WAAW,IAAI,KAAK,WAAW;AACxC;AAEO,SAAS,eAAe,MAAgD;AAC7E,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,EAAE,IAAI,IAAI,QAAQ,EAAE;AAAA,IAC7B,KAAK;AACH,aAAO,EAAE,IAAI,IAAI,QAAQ,GAAG;AAAA,IAC9B,KAAK;AAAA,IACL;AACE,aAAO,EAAE,IAAI,IAAI,QAAQ,GAAG;AAAA,EAChC;AACF;AAEA,IAAM,SAAS;AAER,SAAS,WAAW,OAAwB;AACjD,SAAO,OAAO,KAAK,MAAM,KAAK,CAAC;AACjC;AAMO,SAAS,cAAc,OAAwB;AACpD,QAAM,IAAI,MAAM,QAAQ,KAAK,EAAE,EAAE,KAAK;AACtC,MAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EAAG,QAAO;AAC7C,QAAM,OACJ,EAAE,WAAW,IACT,EACG,MAAM,EAAE,EACR,IAAI,CAAC,MAAM,IAAI,CAAC,EAChB,KAAK,EAAE,IACV;AACN,QAAM,IAAI,SAAS,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE;AACvC,QAAM,IAAI,SAAS,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE;AACvC,QAAM,IAAI,SAAS,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE;AACvC,MAAI,CAAC,GAAG,GAAG,CAAC,EAAE,KAAK,OAAO,KAAK,EAAG,QAAO;AACzC,QAAM,QAAQ,IAAI,MAAM,IAAI,MAAM,IAAI,OAAO;AAC7C,SAAO,OAAO;AAChB;AAYA,IAAM,gBAAgB;AAAA,EACpB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,YAAY;AACd;AAEO,IAAM,iBAA+B;AAAA,EAC1C;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AACF;AAKO,IAAM,sBAAoC;AAAA,EAC/C;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AACF;AAEA,IAAM,wBAA4F;AAAA,EAChG,aAAa;AAAA,EACb,SAAS;AAAA,EACT,SAAS;AAAA;AAAA;AAAA;AAAA,EAIT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EAEV,YAAY;AAAA,EACZ,eAAe;AAAA,EAEf,eAAe;AAAA,EACf,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,YAAY;AAAA,EAEZ,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAEhB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,cAAc;AAAA,EAEd,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,eAAe;AAAA,EAEf,WAAW;AACb;AAEO,IAAM,mBAAqC;AAAA,EAChD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,aAAa,eAAe,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;AACnD;AAYO,IAAM,wBAA0C;AAAA,EACrD,GAAG;AAAA,EACH,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa,oBAAoB,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;AACxD;AAGO,SAAS,kBAAoC;AAClD,SAAO,cAAc,gBAAgB;AACvC;AAMO,SAAS,cAAc,GAAuC;AACnE,SAAO,EAAE,GAAG,GAAG,aAAa,EAAE,YAAY,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE,EAAE;AAC3E;AAOO,IAAM,wBAAwB;AAqB9B,SAAS,kBAAkB,KAA+C;AAC/E,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,MAAI,QAAQ,SAAS,sBAAuB,QAAO;AAEnD,MAAI,MAAM;AACV,QAAM,IAAI,QAAQ,cAAc,WAAW;AAC3C,QAAM,IAAI,QAAQ,sBAAsB,EAAE;AAC1C,QAAM,IAAI,QAAQ,qBAAqB,mBAAmB;AAC1D,QAAM,IAAI,QAAQ,6BAA6B,mBAAmB;AAClE,QAAM,IAAI,QAAQ,sBAAsB,qBAAqB;AAC7D,QAAM,IAAI,QAAQ,oCAAoC,cAAc;AACpE,SAAO;AACT;AAuCA,IAAM,qBAAqB;AAE3B,IAAM,oBAA2C;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,YAAqC,CAAC,UAAU,SAAS,UAAU,SAAS,MAAM;AACxF,IAAM,iBAA2C,CAAC,UAAU,SAAS,UAAU,OAAO;AAEtF,SAAS,SAA2B,OAAgB,SAAuB,UAAgB;AACzF,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAQ,QAA8B,SAAS,KAAK,IAAK,QAAc;AACzE;AAEA,SAAS,UAAU,OAAgB,UAA4B;AAC7D,MAAI,OAAO,UAAU,UAAW,QAAO;AACvC,MAAI,UAAU,OAAQ,QAAO;AAC7B,MAAI,UAAU,QAAS,QAAO;AAC9B,SAAO;AACT;AAEA,SAAS,EAAE,OAA0C;AACnD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAQO,SAAS,aAAa,KAA8C;AACzE,MAAI,QAAQ,OAAW,QAAO;AAC9B,MAAI;AACF,UAAM,SAAkB,KAAK,MAAM,GAAG;AACtC,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO;AACnC,WAAO,OACJ,OAAO,CAAC,MAAoC,CAAC,CAAC,KAAK,OAAO,MAAM,QAAQ,EACxE,IAAI,CAAC,GAAG,OAAO;AAAA,MACd,IAAI,OAAO,EAAE,IAAI,MAAM,YAAY,EAAE,IAAI,IAAK,EAAE,IAAI,IAAe,SAAS,CAAC;AAAA,MAC7E,OAAO,OAAO,EAAE,OAAO,MAAM,WAAY,EAAE,OAAO,IAAe;AAAA,MACjE,WAAW,OAAO,EAAE,WAAW,MAAM,WAAY,EAAE,WAAW,IAAe;AAAA,MAC7E,iBACE,OAAO,EAAE,iBAAiB,MAAM,WAAY,EAAE,iBAAiB,IAAe;AAAA,MAChF,aACE,OAAO,EAAE,aAAa,MAAM,YAAY,EAAE,aAAa,IAClD,EAAE,aAAa,IAChB;AAAA,IACR,EAAE,EACD,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,CAAC;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa,QAA8B;AACzD,SAAO,KAAK;AAAA,IACV,OAAO,IAAI,CAAC,OAAO;AAAA,MACjB,IAAI,EAAE;AAAA,MACN,OAAO,EAAE;AAAA,MACT,WAAW,EAAE;AAAA,MACb,iBAAiB,EAAE;AAAA,MACnB,GAAI,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,IAAI,CAAC;AAAA,IACxD,EAAE;AAAA,EACJ;AACF;AAMO,SAAS,eAAe,QAA6D;AAC1F,MAAI,CAAC,OAAQ,QAAO,cAAc,gBAAgB;AAElD,QAAM,SAAkC,OAAO,eAAe,kBAAkB,KAC9E,CAAC;AAEH,QAAM,gBAAgB,aAAa,OAAO,aAAa,CAAC;AAIxD,QAAM,cAAc,EAAE,OAAO,aAAa,KAAK,EAAE,OAAO,WAAW;AACnE,QAAM,UAAU,EAAE,OAAO,aAAa,KAAK,EAAE,OAAO,IAAI;AAIxD,QAAM,UAAU,EAAE,OAAO,SAAS,CAAC,KAAK,EAAE,OAAO,oBAAoB;AAOrE,QAAM,cAA0B,MAAM;AACpC,UAAM,UAAU,OAAO,YAAY;AACnC,QAAI,YAAY,WAAW,YAAY,SAAU,QAAO;AACxD,QAAI,YAAY,WAAY,QAAO;AACnC,UAAM,SAAS,OAAO;AACtB,QAAI,WAAW,WAAW,WAAW,WAAY,QAAO;AACxD,QAAI,WAAW,YAAY,WAAW,QAAS,QAAO;AACtD,WAAO,iBAAiB;AAAA,EAC1B,GAAG;AAEH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,UAAU,OAAO,UAAU,GAAG,iBAAiB,QAAQ;AAAA,IACjE,WAAW;AAAA,MACT,OAAO,WAAW;AAAA,MAClB,CAAC,UAAU,WAAW,QAAQ;AAAA,MAC9B,iBAAiB;AAAA,IACnB;AAAA,IACA,UAAU,SAAmB,OAAO,UAAU,GAAG,CAAC,MAAM,MAAM,IAAI,GAAG,iBAAiB,QAAQ;AAAA,IAE9F,SAAS,EAAE,OAAO,KAAK,KAAK,iBAAiB;AAAA,IAC7C,YAAY,EAAE,OAAO,iBAAiB,KAAK,iBAAiB;AAAA,IAC5D,SAAS,EAAE,OAAO,SAAS,CAAC,KAAK,iBAAiB;AAAA,IAClD,MAAM,EAAE,OAAO,MAAM,CAAC,KAAK,iBAAiB;AAAA,IAC5C,SAAS,EAAE,OAAO,SAAS,CAAC,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,iBAAiB;AAAA,IACvE,OAAO,EAAE,OAAO,OAAO,CAAC,KAAK,iBAAiB;AAAA,IAC9C,QAAQ,EAAE,OAAO,QAAQ,CAAC,KAAK,iBAAiB;AAAA,IAChD,YAAY,EAAE,OAAO,YAAY,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,iBAAiB;AAAA,IAC3E,kBACE,EAAE,OAAO,qBAAqB,KAAK,EAAE,OAAO,KAAK,KAAK,iBAAiB;AAAA,IACzE,YAAY,EAAE,OAAO,0BAA0B,KAAK,iBAAiB;AAAA,IAErE,YAAY;AAAA,MACV,OAAO,YAAY;AAAA,MACnB;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA,eAAe;AAAA,MACb,OAAO,eAAe;AAAA,MACtB,CAAC,WAAW,UAAU,YAAY,MAAM;AAAA,MACxC,iBAAiB;AAAA,IACnB;AAAA,IAEA,eAAe;AAAA,MACb,OAAO,eAAe;AAAA,MACtB;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA,aAAa;AAAA,MACX,OAAO,aAAa;AAAA,MACpB;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA,cAAc;AAAA,MACZ,OAAO,cAAc;AAAA,MACrB;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA,aAAa;AAAA,MACX,OAAO,aAAa;AAAA,MACpB;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA,cAAc;AAAA,MACZ,OAAO,cAAc;AAAA,MACrB,CAAC,QAAQ,YAAY,UAAU;AAAA,MAC/B,iBAAiB;AAAA,IACnB;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO,gBAAgB;AAAA,MACvB,CAAC,WAAW,eAAe,UAAU;AAAA,MACrC,iBAAiB;AAAA,IACnB;AAAA,IACA,aAAa;AAAA,MACX,OAAO,aAAa;AAAA,MACpB,CAAC,WAAW,eAAe,UAAU;AAAA,MACrC,iBAAiB;AAAA,IACnB;AAAA,IACA,WAAW;AAAA,MACT,OAAO,WAAW;AAAA,MAClB,CAAC,MAAM,MAAM,IAAI;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IACA,YAAY;AAAA,MACV,OAAO,YAAY;AAAA,MACnB,CAAC,MAAM,MAAM,IAAI;AAAA,MACjB,iBAAiB;AAAA,IACnB;AAAA,IAEA,QAAQ,SAAsB,OAAO,QAAQ,GAAG,CAAC,WAAW,OAAO,GAAG,iBAAiB,MAAM;AAAA,IAC7F,iBAAiB;AAAA,MACf,OAAO,iBAAiB;AAAA,MACxB,CAAC,QAAQ,OAAO;AAAA,MAChB,iBAAiB;AAAA,IACnB;AAAA,IACA,kBAAkB,UAAU,OAAO,kBAAkB,GAAG,iBAAiB,gBAAgB;AAAA,IACzF,iBAAiB,UAAU,OAAO,iBAAiB,GAAG,iBAAiB,eAAe;AAAA,IACtF,WAAW,UAAU,OAAO,WAAW,GAAG,iBAAiB,SAAS;AAAA,IACpE,YAAY,EAAE,OAAO,YAAY,CAAC,KAAK,iBAAiB;AAAA,IACxD,kBAAkB,UAAU,OAAO,kBAAkB,GAAG,iBAAiB,gBAAgB;AAAA,IACzF,gBAAgB,UAAU,OAAO,gBAAgB,GAAG,iBAAiB,cAAc;AAAA,IAEnF,aAAa,iBAAiB,iBAAiB,YAAY,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;AAAA,IAEhF,YAAY,EAAE,OAAO,wBAAwB;AAAA,IAC7C,gBAAgB,EAAE,OAAO,mBAAmB;AAAA,IAC5C,kBAAkB,EAAE,OAAO,6BAA6B;AAAA,IACxD,YAAY,EAAE,OAAO,YAAY,CAAC;AAAA,IAClC,cAAc,EAAE,OAAO,cAAc,CAAC;AAAA,IAEtC,eAAe;AAAA,MACb,OAAO;AAAA,MACP,CAAC,QAAQ,aAAa,kBAAkB;AAAA,MACxC,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,IACA,eAAe,OAAO,wBAAwB;AAAA,IAE9C,WAAW,EAAE,OAAO,WAAW,CAAC;AAAA,EAClC;AACF;AAiCO,SAAS,eACd,UACA,MAC0E;AAC1E,QAAM,OAAO,CAAC,MAA6B;AACzC,UAAM,IAAI,EAAE,KAAK;AACjB,WAAO,EAAE,SAAS,IAAI,IAAI;AAAA,EAC5B;AAIA,QAAM,gBAAkB,OACtB,cACF,KAAK,CAAC;AACN,QAAM,SAAiC;AAAA,IACrC,SAAS,SAAS;AAAA,IAClB,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB,OAAO,SAAS;AAAA,IAChB,QAAQ,SAAS;AAAA,IACjB,YAAY,SAAS;AAAA,IACrB,YAAY,SAAS;AAAA,IACrB,eAAe,SAAS;AAAA,IACxB,eAAe,SAAS;AAAA,IACxB,aAAa,SAAS;AAAA,IACtB,cAAc,SAAS;AAAA,IACvB,aAAa,SAAS;AAAA,IACtB,cAAc,SAAS;AAAA,IACvB,gBAAgB,SAAS;AAAA,IACzB,aAAa,SAAS;AAAA,IACtB,WAAW,SAAS;AAAA,IACpB,YAAY,SAAS;AAAA,IACrB,QAAQ,SAAS;AAAA,IACjB,iBAAiB,SAAS;AAAA,IAC1B,kBAAkB,OAAO,SAAS,gBAAgB;AAAA,IAClD,iBAAiB,OAAO,SAAS,eAAe;AAAA,IAChD,WAAW,OAAO,SAAS,SAAS;AAAA,IACpC,YAAY,SAAS;AAAA,IACrB,kBAAkB,OAAO,SAAS,gBAAgB;AAAA,IAClD,gBAAgB,OAAO,SAAS,cAAc;AAAA,IAC9C,UAAU,OAAO,SAAS,QAAQ;AAAA,IAClC,WAAW,SAAS;AAAA,IACpB,UAAU,SAAS;AAAA,IACnB,YAAY,SAAS;AAAA,IACrB,aAAa,aAAa,SAAS,WAAW;AAAA,EAChD;AACA,QAAM,UAAU,KAAK,SAAS,OAAO;AACrC,MAAI,QAAS,QAAO,SAAS,IAAI;AACjC,QAAM,SAAS,KAAK,SAAS,UAAU;AACvC,MAAI,OAAQ,QAAO,YAAY,IAAI;AACnC,QAAM,UAAU,KAAK,SAAS,YAAY;AAC1C,MAAI,QAAS,QAAO,cAAc,IAAI;AAItC,QAAM,MAAM,KAAK,SAAS,SAAS;AACnC,MAAI,IAAK,QAAO,WAAW,IAAI;AAE/B,QAAM,YAAoD;AAAA,IACxD,GAAG;AAAA,IACH,CAAC,kBAAkB,GAAG;AAAA,EACxB;AAIA,QAAM,cAAiC,SAAS,eAAe,WAAW,UAAU;AAEpF,QAAM,aAA8B;AAAA,IAClC,OAAO,SAAS;AAAA,IAChB,MAAM,KAAK,SAAS,OAAO;AAAA,IAC3B,aAAa,KAAK,SAAS,WAAW;AAAA,IACtC,YAAY,SAAS;AAAA,IACrB,qBAAqB,KAAK,SAAS,cAAc;AAAA,IACjD,uBAAuB,SAAS;AAAA,IAChC,4BAA4B,SAAS;AAAA,IACrC,mBAAmB,SAAS;AAAA,IAC5B,0BAA0B,KAAK,SAAS,UAAU;AAAA,IAClD,yBAAyB;AAAA,IACzB,+BAA+B,KAAK,SAAS,gBAAgB;AAAA,IAC7D,cAAc;AAAA,IACd,qBAAqB,SAAS;AAAA,EAChC;AAUA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAOO,IAAM,yBAAyB;AAC/B,IAAM,0BAA0B;AAShC,SAAS,oBAAoB,UAA4C;AAC9E,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,UAAU,cAAc,QAAQ;AAAA,EAClC;AACF;AAeO,SAAS,sBAAsB,KAAgC;AAGpE,QAAM,OACJ,SAAS,GAAG,KAAK,SAAS,IAAI,UAAU,CAAC,IACpC,IAAI,UAAU,IACf,SAAS,GAAG,IACV,MACA;AAER,MAAI,CAAC,KAAM,QAAO,cAAc,gBAAgB;AAEhD,QAAM,OAAO;AACb,QAAM,OAAO,CAAC,GAAY,aAA8B,OAAO,MAAM,WAAW,IAAI;AACpF,QAAM,OAAO,CAAC,GAAY,aACxB,OAAO,MAAM,YAAY,WAAW,CAAC,IAAI,IAAI;AAE/C,QAAM,cACJ,sBAAsB,KAAK,aAAa,CAAC,KAAK,KAAK,YAAY,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;AAGtF,QAAM,cAA0B,MAAM;AACpC,UAAM,IAAI,KAAK,YAAY;AAC3B,QAAI,MAAM,WAAW,MAAM,SAAU,QAAO;AAC5C,WAAO,KAAK;AAAA,EACd,GAAG;AAEH,SAAO;AAAA,IACL,aAAa,KAAK,KAAK,aAAa,GAAG,KAAK,WAAW;AAAA,IACvD,SAAS,KAAK,KAAK,SAAS,GAAG,KAAK,OAAO;AAAA,IAC3C,SAAS,KAAK,KAAK,SAAS,GAAG,KAAK,OAAO;AAAA,IAC3C,UAAU,UAAU,KAAK,UAAU,GAAG,KAAK,QAAQ;AAAA,IACnD,WAAW;AAAA,MACT,KAAK,WAAW;AAAA,MAChB,CAAC,UAAU,WAAW,QAAQ;AAAA,MAC9B,KAAK;AAAA,IACP;AAAA,IACA,UAAU,SAAmB,KAAK,UAAU,GAAG,CAAC,MAAM,MAAM,IAAI,GAAG,KAAK,QAAQ;AAAA,IAEhF,SAAS,KAAK,KAAK,SAAS,GAAG,KAAK,OAAO;AAAA,IAC3C,YAAY,KAAK,KAAK,YAAY,GAAG,KAAK,UAAU;AAAA,IACpD,SAAS,KAAK,KAAK,SAAS,GAAG,KAAK,OAAO;AAAA,IAC3C,MAAM,KAAK,KAAK,MAAM,GAAG,KAAK,IAAI;AAAA,IAClC,SAAS,KAAK,KAAK,SAAS,GAAG,KAAK,OAAO;AAAA,IAC3C,OAAO,KAAK,KAAK,OAAO,GAAG,KAAK,KAAK;AAAA,IACrC,QAAQ,KAAK,KAAK,QAAQ,GAAG,KAAK,MAAM;AAAA,IACxC,YAAY,KAAK,KAAK,YAAY,GAAG,KAAK,UAAU;AAAA,IACpD,kBAAkB,KAAK,KAAK,kBAAkB,GAAG,KAAK,gBAAgB;AAAA,IACtE,YAAY,KAAK,KAAK,YAAY,GAAG,KAAK,UAAU;AAAA,IAEpD,YAAY,SAAqB,KAAK,YAAY,GAAG,mBAAmB,KAAK,UAAU;AAAA,IACvF,eAAe;AAAA,MACb,KAAK,eAAe;AAAA,MACpB,CAAC,WAAW,UAAU,YAAY,MAAM;AAAA,MACxC,KAAK;AAAA,IACP;AAAA,IAEA,eAAe;AAAA,MACb,KAAK,eAAe;AAAA,MACpB;AAAA,MACA,KAAK;AAAA,IACP;AAAA,IACA,aAAa,SAAwB,KAAK,aAAa,GAAG,gBAAgB,KAAK,WAAW;AAAA,IAC1F,cAAc,SAAuB,KAAK,cAAc,GAAG,WAAW,KAAK,YAAY;AAAA,IACvF,aAAa,SAAuB,KAAK,aAAa,GAAG,WAAW,KAAK,WAAW;AAAA,IACpF,cAAc;AAAA,MACZ,KAAK,cAAc;AAAA,MACnB,CAAC,QAAQ,YAAY,UAAU;AAAA,MAC/B,KAAK;AAAA,IACP;AAAA,IACA,gBAAgB;AAAA,MACd,KAAK,gBAAgB;AAAA,MACrB,CAAC,WAAW,eAAe,UAAU;AAAA,MACrC,KAAK;AAAA,IACP;AAAA,IACA,aAAa;AAAA,MACX,KAAK,aAAa;AAAA,MAClB,CAAC,WAAW,eAAe,UAAU;AAAA,MACrC,KAAK;AAAA,IACP;AAAA,IACA,WAAW,SAAoB,KAAK,WAAW,GAAG,CAAC,MAAM,MAAM,IAAI,GAAG,KAAK,SAAS;AAAA,IACpF,YAAY,SAAoB,KAAK,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,GAAG,KAAK,UAAU;AAAA,IAEvF,QAAQ,SAAsB,KAAK,QAAQ,GAAG,CAAC,WAAW,OAAO,GAAG,KAAK,MAAM;AAAA,IAC/E,iBAAiB;AAAA,MACf,KAAK,iBAAiB;AAAA,MACtB,CAAC,QAAQ,OAAO;AAAA,MAChB,KAAK;AAAA,IACP;AAAA,IACA,kBAAkB,UAAU,KAAK,kBAAkB,GAAG,KAAK,gBAAgB;AAAA,IAC3E,iBAAiB,UAAU,KAAK,iBAAiB,GAAG,KAAK,eAAe;AAAA,IACxE,WAAW,UAAU,KAAK,WAAW,GAAG,KAAK,SAAS;AAAA,IACtD,YAAY,KAAK,KAAK,YAAY,GAAG,KAAK,UAAU;AAAA,IACpD,kBAAkB,UAAU,KAAK,kBAAkB,GAAG,KAAK,gBAAgB;AAAA,IAC3E,gBAAgB,UAAU,KAAK,gBAAgB,GAAG,KAAK,cAAc;AAAA,IAErE;AAAA,IAEA,YAAY,KAAK,KAAK,YAAY,GAAG,KAAK,UAAU;AAAA,IACpD,gBAAgB,KAAK,KAAK,gBAAgB,GAAG,KAAK,cAAc;AAAA,IAChE,kBAAkB,KAAK,KAAK,kBAAkB,GAAG,KAAK,gBAAgB;AAAA,IACtE,YAAY,KAAK,KAAK,YAAY,GAAG,KAAK,UAAU;AAAA,IACpD,cAAc,KAAK,KAAK,cAAc,GAAG,KAAK,YAAY;AAAA,IAE1D,eAAe;AAAA,MACb,KAAK,eAAe;AAAA,MACpB,CAAC,QAAQ,aAAa,kBAAkB;AAAA,MACxC,KAAK;AAAA,IACP;AAAA,IACA;AAAA,IACA,eAAe,UAAU,KAAK,eAAe,GAAG,KAAK,aAAa;AAAA,IAElE,WAAW,KAAK,KAAK,WAAW,GAAG,KAAK,SAAS,EAAE,MAAM,GAAG,qBAAqB;AAAA,EACnF;AACF;AAEA,SAAS,SAAS,GAA0C;AAC1D,SAAO,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAChE;AAOA,SAAS,sBAAsB,KAAmC;AAChE,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO;AAChC,SAAO,IACJ,OAAO,QAAQ,EACf,IAAI,CAAC,GAAG,OAAO;AAAA,IACd,IAAI,OAAO,EAAE,IAAI,MAAM,YAAY,EAAE,IAAI,IAAK,EAAE,IAAI,IAAe,SAAS,CAAC;AAAA,IAC7E,OAAO,OAAO,EAAE,OAAO,MAAM,WAAY,EAAE,OAAO,IAAe;AAAA,IACjE,WACE,OAAO,EAAE,WAAW,MAAM,YAAY,WAAW,EAAE,WAAW,CAAW,IACpE,EAAE,WAAW,IACd;AAAA,IACN,iBACE,OAAO,EAAE,iBAAiB,MAAM,YAAY,WAAW,EAAE,iBAAiB,CAAW,IAChF,EAAE,iBAAiB,IACpB;AAAA,IACN,aACE,OAAO,EAAE,aAAa,MAAM,YAAY,WAAW,EAAE,aAAa,CAAW,IACxE,EAAE,aAAa,IAChB;AAAA,EACR,EAAE,EACD,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,CAAC;AACrC;AAWO,SAAS,uBAAuB,IAAiB,GAA2B;AACjF,QAAM,MAAM,CAAC,GAAW,MAAc;AACpC,OAAG,MAAM,YAAY,GAAG,CAAC;AAAA,EAC3B;AAEA,MAAI,gBAAgB,EAAE,OAAO;AAC7B,MAAI,WAAW,EAAE,UAAU;AAC3B,MAAI,gBAAgB,EAAE,OAAO;AAC7B,MAAI,aAAa,EAAE,IAAI;AACvB,MAAI,gBAAgB,EAAE,OAAO;AAC7B,MAAI,cAAc,EAAE,KAAK;AACzB,MAAI,eAAe,EAAE,MAAM;AAC3B,MAAI,oBAAoB,EAAE,UAAU;AACpC,MAAI,eAAe,EAAE,gBAAgB;AACrC,MAAI,eAAe,EAAE,UAAU;AAE/B,MAAI,uBAAuB,YAAY,EAAE,aAAa,CAAC;AACvD,MAAI,qBAAqB,YAAY,EAAE,WAAW,CAAC;AACnD,MAAI,sBAAsB,YAAY,EAAE,YAAY,CAAC;AACrD,MAAI,qBAAqB,YAAY,EAAE,WAAW,CAAC;AAEnD,MAAI,aAAa,UAAU,EAAE,UAAU,CAAC;AACxC,MAAI,uBAAuB,gBAAgB,EAAE,aAAa,CAAC;AAE3D,MAAI,oBAAoB,YAAY,EAAE,cAAc,CAAC;AACrD,MAAI,qBAAqB,aAAa,EAAE,WAAW,CAAC;AACpD,MAAI,kBAAkB,UAAU,EAAE,SAAS,CAAC;AAC5C,MAAI,mBAAmB,WAAW,EAAE,UAAU,CAAC;AAE/C,MAAI,eAAe,UAAU,EAAE,YAAY,CAAC;AAC5C;AAAA,IACE;AAAA,IACA,EAAE,iBAAiB,aAAa,aAAa,EAAE,MAAM,KAAK;AAAA,EAC5D;AACF;AAEO,SAAS,UAAU,OAA6B;AACrD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aAAO;AAAA,EACX;AACF;;;AC5lCO,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,OAAO,QAAmD;AAC9D,WAAO,KAAK,QAAQ,QAAQ,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAAA,EAC/D;AAAA,EAEA,MAAM,mBAAmB,QAA+D;AACtF,WAAO,KAAK,QAAQ,QAAQ,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,aAAa,QAA6D;AAC9E,WAAO,KAAK,QAAQ,QAAQ,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,qBAAqB,QAAiE;AAC1F,WAAO,KAAK,QAAQ,QAAQ,kCAAkC,EAAE,MAAM,OAAO,CAAC;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,kBAAkB,QAA4D;AAClF,WAAO,KAAK,QAAQ,QAAQ,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAAA,EACxE;AAAA;AAAA,EAGA,MAAM,oBAAmD;AACvD,WAAO,KAAK,QAAQ,OAAO,wBAAwB;AAAA,EACrD;AAAA;AAAA,EAGA,MAAM,gBAAgB,QAAkE;AACtF,WAAO,KAAK,QAAQ,QAAQ,2BAA2B,EAAE,MAAM,OAAO,CAAC;AAAA,EACzE;AACF;;;ACjCO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,cAAc,QAAsE;AACxF,WAAO,KAAK,QAAQ,OAAO,2BAA2B;AAAA,MACpD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,YAAkD;AAClE,WAAO,KAAK,QAAQ,OAAO,2BAA2B,mBAAmB,UAAU,CAAC,EAAE;AAAA,EACxF;AAAA,EAEA,MAAM,iBACJ,QACuC;AACvC,WAAO,KAAK,QAAQ,OAAO,8BAA8B;AAAA,MACvD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,QAAmE;AACjF,WAAO,KAAK,QAAQ,OAAO,2BAA2B;AAAA,MACpD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgD;AACpD,WAAO,KAAK,QAAQ,OAAO,8BAA8B;AAAA,EAC3D;AAAA,EAEA,MAAM,iBAAiB,QAAoE;AACzF,WAAO,KAAK,QAAQ,OAAO,mCAAmC;AAAA,MAC5D,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,YAAsD;AAC1E,WAAO,KAAK,QAAQ,OAAO,0BAA0B,mBAAmB,UAAU,CAAC,EAAE;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cACJ,YACA,QACkC;AAClC,WAAO,KAAK,QAAQ,QAAQ,0BAA0B,mBAAmB,UAAU,CAAC,IAAI;AAAA,MACtF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,YAAsD;AACxE,WAAO,KAAK,QAAQ,UAAU,0BAA0B,mBAAmB,UAAU,CAAC,EAAE;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBACJ,YACA,MAC4B;AAC5B,WAAO,KAAK,QAAQ,QAAQ,2BAA2B,mBAAmB,UAAU,CAAC,UAAU;AAAA,MAC7F;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAW,QAAgB,MAA0D;AACzF,WAAO,KAAK,QAAQ,SAAS,uBAAuB,mBAAmB,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW,QAA+B;AAC9C,WAAO,KAAK,QAAQ,UAAU,uBAAuB,mBAAmB,MAAM,CAAC,EAAE;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,wBACJ,YACA,WACA,SAC0B;AAC1B,WAAO,KAAK;AAAA,MACV;AAAA,MACA,0BAA0B,mBAAmB,UAAU,CAAC,qBAAqB,mBAAmB,SAAS,CAAC;AAAA,MAC1G,EAAE,MAAM,EAAE,wBAAwB,QAAQ,EAAE;AAAA,IAC9C;AAAA,EACF;AACF;;;AC5IO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,KAAK,QAA4D;AACrE,WAAO,KAAK,QAAQ,OAAO,uBAAuB;AAAA,MAChD,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,OAA0C;AACvD,WAAO,KAAK,QAAQ,OAAO,uBAAuB,mBAAmB,KAAK,CAAC,EAAE;AAAA,EAC/E;AACF;;;ACbO,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA,EAGlD,MAAM,WAAW,KAA+C;AAC9D,WAAO,KAAK,QAAQ,QAAQ,qBAAqB,mBAAmB,GAAG,CAAC,EAAE;AAAA,EAC5E;AACF;;;ACDO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,OAAO,QAA8D;AACzE,WAAO,KAAK,QAAQ,QAAQ,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAAA,EAC/D;AAAA,EAEA,MAAM,OAAO,UAAkB,QAA8D;AAC3F,WAAO,KAAK,QAAQ,OAAO,iBAAiB,mBAAmB,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EAC9F;AAAA,EAEA,MAAM,OAAwC;AAC5C,WAAO,KAAK,QAAQ,OAAO,eAAe;AAAA,EAC5C;AACF;;;ACpBO,IAAM,UAAN,MAAc;AAAA,EACnB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA,EAGlD,MAAM,OAAO,QAAmE;AAC9E,WAAO,KAAK,QAAQ,QAAQ,YAAY,EAAE,MAAM,OAAO,CAAC;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,SAAS,KAA+C;AAC5D,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,GAAG,CAAC,EAAE;AAAA,EAClE;AAAA;AAAA,EAGA,MAAM,OAAO,KAAa,QAAmE;AAC3F,WAAO,KAAK,QAAQ,OAAO,YAAY,mBAAmB,GAAG,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EACpF;AAAA;AAAA,EAGA,MAAM,OAAO,KAA+C;AAC1D,WAAO,KAAK,QAAQ,UAAU,YAAY,mBAAmB,GAAG,CAAC,EAAE;AAAA,EACrE;AACF;;;ACbO,IAAM,wBAAN,MAA4B;AAAA,EACjC,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlD,MAAM,OAAO,MAAgF;AAC3F,WAAO,KAAK,QAAQ,QAAQ,iCAAiC,EAAE,KAAK,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,OAAgD;AACpD,WAAO,KAAK,QAAQ,OAAO,+BAA+B;AAAA,EAC5D;AAAA,EAEA,MAAM,SAAS,eAA8D;AAC3E,WAAO,KAAK;AAAA,MACV;AAAA,MACA,iCAAiC,mBAAmB,aAAa,CAAC;AAAA,IACpE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,eAA8E;AACzF,WAAO,KAAK;AAAA,MACV;AAAA,MACA,iCAAiC,mBAAmB,aAAa,CAAC;AAAA,IACpE;AAAA,EACF;AACF;;;ACtCO,IAAM,MAAN,MAAU;AAAA,EACf,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,MAAM,OAAO,QAAwD;AACnE,WAAO,KAAK,QAAQ,QAAQ,QAAQ,EAAE,MAAM,OAAO,CAAC;AAAA,EACtD;AAAA,EAEA,MAAM,SAAS,QAA2D;AACxE,WAAO,KAAK,QAAQ,QAAQ,YAAY,EAAE,MAAM,OAAO,CAAC;AAAA,EAC1D;AAAA,EAEA,MAAM,OAAO,QAAwD;AACnE,WAAO,KAAK,QAAQ,QAAQ,eAAe,EAAE,MAAM,OAAO,CAAC;AAAA,EAC7D;AAAA,EAEA,MAAM,OAAO,QAA2D;AACtE,WAAO,KAAK,QAAQ,QAAQ,eAAe,EAAE,MAAM,OAAO,CAAC;AAAA,EAC7D;AACF;;;ACZO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASlD,MAAM,OACJ,YACA,QACkC;AAClC,WAAO,KAAK,QAAQ,QAAQ,YAAY,mBAAmB,UAAU,CAAC,iBAAiB;AAAA,MACrF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MACJ,YACA,QACkC;AAClC,WAAO,KAAK,QAAQ,QAAQ,YAAY,mBAAmB,UAAU,CAAC,gBAAgB;AAAA,MACpF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;;;AC/BO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,SAAoB;AAApB;AAAA,EAAqB;AAAA;AAAA,EAGlD,MAAM,OAAO,QAAkC,YAAkD;AAC/F,WAAO,KAAK,QAAQ,QAAQ,eAAe;AAAA,MACzC,MAAM;AAAA,MACN,OAAO,EAAE,aAAa,WAAW;AAAA,IACnC,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,KAAK,YAAoD;AAC7D,WAAO,KAAK,QAAQ,OAAO,oBAAoB;AAAA,MAC7C,OAAO,EAAE,aAAa,WAAW;AAAA,IACnC,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,SAAS,OAA6C;AAC1D,WAAO,KAAK,QAAQ,OAAO,eAAe,mBAAmB,KAAK,CAAC,EAAE;AAAA,EACvE;AAAA;AAAA,EAGA,MAAM,OAAO,OAAe,QAAgE;AAC1F,WAAO,KAAK,QAAQ,OAAO,eAAe,mBAAmB,KAAK,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC;AAAA,EACzF;AAAA;AAAA,EAGA,MAAM,OAAO,OAA6C;AACxD,WAAO,KAAK,QAAQ,UAAU,eAAe,mBAAmB,KAAK,CAAC,EAAE;AAAA,EAC1E;AACF;;;ACpBO,IAAM,kBAAN,cAA8B,QAAQ;AAAA,EAsB3C,eAAe,MAA6C;AAC1D,UAAM,GAAG,IAAI;AACb,UAAM,UAAU,KAAK,QAAQ,KAAK,IAAI;AACtC,SAAK,QAAQ,IAAI,MAAM,OAAO;AAC9B,SAAK,cAAc,IAAI,YAAY,OAAO;AAC1C,SAAK,YAAY,IAAI,UAAU,OAAO;AACtC,SAAK,QAAQ,IAAI,MAAM,OAAO;AAC9B,SAAK,cAAc,IAAI,YAAY,OAAO;AAC1C,SAAK,UAAU,IAAI,QAAQ,OAAO;AAClC,SAAK,wBAAwB,IAAI,sBAAsB,OAAO;AAC9D,SAAK,MAAM,IAAI,IAAI,OAAO;AAC1B,SAAK,kBAAkB,IAAI,gBAAgB,OAAO;AAClD,SAAK,eAAe,IAAI,aAAa,OAAO;AAAA,EAC9C;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/internal.ts","../src/error.ts","../src/resources/apiKeys.ts","../src/resources/authentication.ts","../src/resources/billing.ts","../src/resources/blocklist.ts","../src/resources/connectors.ts","../src/resources/customers.ts","../src/resources/disputes.ts","../src/resources/ephemeralKeys.ts","../src/resources/events.ts","../src/resources/fees.ts","../src/resources/mandates.ts","../src/resources/merchantAccounts.ts","../src/resources/paymentLinks.ts","../src/resources/paymentMethods.ts","../src/resources/payments.ts","../src/resources/payouts.ts","../src/resources/poll.ts","../src/resources/profileAcquirers.ts","../src/resources/profiles.ts","../src/resources/projects.ts","../src/resources/refunds.ts","../src/resources/relay.ts","../src/resources/routing.ts","../src/resources/shops.ts","../src/resources/stripeConnect.ts","../src/resources/threeDsRules.ts","../src/resources/users.ts","../src/resources/verification.ts","../src/resources/webhooks.ts","../src/resources/analytics.ts","../src/resources/analyticsDashboard.ts","../src/resources/cards.ts","../src/resources/export.ts","../src/resources/featureMatrix.ts","../src/resources/files.ts","../src/resources/forex.ts","../src/resources/regions.ts","../src/resources/subscriptions.ts","../src/client.ts","../src/branding.ts","../src/internal/resources/admin.ts","../src/internal/resources/adminPortal.ts","../src/internal/resources/auditLogs.ts","../src/internal/resources/cache.ts","../src/internal/resources/cardIssuers.ts","../src/internal/resources/configs.ts","../src/internal/resources/connectorRestrictions.ts","../src/internal/resources/gsm.ts","../src/internal/resources/platformBilling.ts","../src/internal/resources/platformFees.ts","../src/internal/client.ts"],"sourcesContent":["/**\n * Internal SDK entry. For DeloPay staff tooling only; merchants import from\n * `'@delopay/sdk'` and never touch this path.\n *\n * Re-exports the full public surface plus the admin/ops-plane resources\n * and `DelopayInternal`, a subclass of `Delopay` that wires the internal\n * resources onto the client.\n *\n * import { DelopayInternal } from '@delopay/sdk/internal';\n * const sdk = new DelopayInternal('', { baseUrl: '/api' });\n * await sdk.admin.signIn({ email, password });\n * await sdk.adminPortal.listCustomers();\n * await sdk.platformFees.list(merchantId);\n *\n * All internal type-only exports come out of this barrel too — they're not\n * exported from `'@delopay/sdk'` directly.\n */\n\nexport * from './index';\nexport { DelopayInternal } from './internal/client';\nexport { Admin } from './internal/resources/admin';\nexport { AdminPortal } from './internal/resources/adminPortal';\nexport { AuditLogs } from './internal/resources/auditLogs';\nexport { Cache } from './internal/resources/cache';\nexport { CardIssuers } from './internal/resources/cardIssuers';\nexport { Configs } from './internal/resources/configs';\nexport { ConnectorRestrictions } from './internal/resources/connectorRestrictions';\nexport { Gsm } from './internal/resources/gsm';\nexport { PlatformBilling } from './internal/resources/platformBilling';\nexport { PlatformFees } from './internal/resources/platformFees';\nexport type * from './internal/types';\n","/**\n * Error thrown when the Delopay API returns a non-2xx response, or when a\n * timeout or network error occurs.\n *\n * @example\n * ```typescript\n * try {\n * await delopay.payments.create({ amount: 5000, currency: 'EUR' });\n * } catch (e) {\n * if (e instanceof DelopayError) {\n * console.error(e.status, e.code, e.requestId, e.message);\n * }\n * }\n * ```\n */\nexport class DelopayError extends Error {\n /** HTTP status code returned by the API, or `0` for timeout/network errors. */\n readonly status: number;\n /** Machine-readable error code returned by the API (e.g. `'HE_00'`). */\n readonly code: string;\n /** Error category (e.g. `'invalid_request'`, `'timeout_error'`). */\n readonly type: string;\n /** Value of the `x-request-id` response header, when present. Include this when contacting support. */\n readonly requestId?: string;\n /**\n * Raw response body (truncated to ~2 KB). Populated when the server returns a\n * non-JSON error body (e.g. an HTML 502 from an upstream proxy) so debugging\n * still has something to go on.\n */\n readonly rawBody?: string;\n /**\n * Structured error context the API attaches under `error.data` for select\n * codes — e.g. `{ retry_after_secs: 248 }` on rate-limit / max-attempt\n * lockouts. Schema is per-code; consult the API reference for the shape.\n */\n readonly data?: Record<string, unknown>;\n\n constructor(\n message: string,\n options: {\n status: number;\n code: string;\n type: string;\n requestId?: string;\n rawBody?: string;\n data?: Record<string, unknown>;\n },\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = 'DelopayError';\n this.status = options.status;\n this.code = options.code;\n this.type = options.type;\n if (options.requestId !== undefined) this.requestId = options.requestId;\n if (options.rawBody !== undefined) this.rawBody = options.rawBody;\n if (options.data !== undefined) this.data = options.data;\n }\n}\n\n/**\n * Thrown when the API key is missing, invalid, or revoked (HTTP 401).\n *\n * @example\n * ```typescript\n * if (e instanceof DelopayAuthenticationError) {\n * // Prompt user to re-enter their API key.\n * }\n * ```\n */\nexport class DelopayAuthenticationError extends DelopayError {\n constructor(\n message = 'Invalid API key',\n options?: {\n code?: string;\n type?: string;\n requestId?: string;\n rawBody?: string;\n data?: Record<string, unknown>;\n },\n ) {\n super(message, {\n status: 401,\n // Default to the generic \"invalid API key\" code, but let callers pass\n // through the server-reported code (e.g. `UR_05` for unverified-email\n // 401s) so they can differentiate between auth failure reasons.\n code: options?.code || 'AUTH_01',\n type: options?.type || 'authentication_error',\n requestId: options?.requestId,\n rawBody: options?.rawBody,\n data: options?.data,\n });\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = 'DelopayAuthenticationError';\n }\n}\n","import type {\n ApiKeyCreateRequest,\n ApiKeyCreateResponse,\n ApiKeyResponse,\n ApiKeyUpdateRequest,\n ApiKeyRevokeResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage API keys for a merchant account. */\nexport class ApiKeys {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new API key for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Key creation parameters (name, expiry, etc.).\n * @returns The newly created key including the plaintext secret (shown once only).\n *\n * @example\n * ```typescript\n * const { key_value } = await delopay.apiKeys.create('merch_123', { name: 'Production key' });\n * ```\n */\n async create(merchantId: string, params: ApiKeyCreateRequest): Promise<ApiKeyCreateResponse> {\n return this.request('POST', `/api_keys/${encodeURIComponent(merchantId)}`, { body: params });\n }\n\n /**\n * Retrieve metadata about an API key (does not return the plaintext secret).\n *\n * @param merchantId - The merchant account ID.\n * @param keyId - The API key ID.\n * @returns The API key metadata.\n */\n async retrieve(merchantId: string, keyId: string): Promise<ApiKeyResponse> {\n return this.request(\n 'GET',\n `/api_keys/${encodeURIComponent(merchantId)}/${encodeURIComponent(keyId)}`,\n );\n }\n\n /**\n * Update an API key's name or expiry.\n *\n * @param merchantId - The merchant account ID.\n * @param keyId - The API key ID to update.\n * @param params - Fields to update.\n * @returns The updated API key metadata.\n */\n async update(\n merchantId: string,\n keyId: string,\n params: ApiKeyUpdateRequest,\n ): Promise<ApiKeyResponse> {\n return this.request(\n 'POST',\n `/api_keys/${encodeURIComponent(merchantId)}/${encodeURIComponent(keyId)}`,\n { body: params },\n );\n }\n\n /**\n * Revoke an API key, immediately invalidating it.\n *\n * @param merchantId - The merchant account ID.\n * @param keyId - The API key ID to revoke.\n * @returns Revocation confirmation.\n */\n async revoke(merchantId: string, keyId: string): Promise<ApiKeyRevokeResponse> {\n return this.request(\n 'DELETE',\n `/api_keys/${encodeURIComponent(merchantId)}/${encodeURIComponent(keyId)}`,\n );\n }\n\n /**\n * List all API keys for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Array of API key metadata objects.\n */\n async list(merchantId: string): Promise<ApiKeyResponse[]> {\n return this.request('GET', `/api_keys/${encodeURIComponent(merchantId)}/list`);\n }\n}\n","import type { AuthenticationCreateRequest, AuthenticationResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Authentication {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: AuthenticationCreateRequest): Promise<AuthenticationResponse> {\n return this.request('POST', '/authentication', { body: params });\n }\n\n async checkEligibility(authId: string): Promise<AuthenticationResponse> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/eligibility`);\n }\n\n async authenticate(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<AuthenticationResponse> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/authenticate`, {\n body: params,\n });\n }\n\n async sync(authId: string, params?: Record<string, unknown>): Promise<AuthenticationResponse> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/sync`, {\n body: params,\n });\n }\n\n /** Redirect after authentication. `POST /authentication/{authId}/redirect` */\n async redirect(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/redirect`, {\n body: params,\n });\n }\n\n /** Enable authn methods token. `POST /authentication/{authId}/enabled_authn_methods_token` */\n async enabledAuthnMethodsToken(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request(\n 'POST',\n `/authentication/${encodeURIComponent(authId)}/enabled_authn_methods_token`,\n {\n body: params,\n },\n );\n }\n\n /** Submit eligibility check. `POST /authentication/{authId}/eligibility-check` */\n async eligibilityCheck(\n authId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/authentication/${encodeURIComponent(authId)}/eligibility-check`, {\n body: params,\n });\n }\n}\n","import type {\n BillingProfileResponse,\n BillingSetupRequest,\n BillingSetupResponse,\n BillingCompleteSetupRequest,\n TopupRequest,\n TopupResponse,\n LedgerResponse,\n LedgerListParams,\n AutoRechargeUpdateRequest,\n AllocationTransferRequest,\n AllocationTransferResponse,\n AllocationListResponse,\n AllocationResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Manage per-shop prepaid balance allocations transferred from the host merchant treasury. */\nclass BillingAllocations {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Transfer funds from the host merchant treasury into a shop's allocation.\n *\n * @param merchantId - The host merchant account ID.\n * @param params - Transfer details (amount, target profile/shop ID).\n * @returns The allocation transfer result.\n */\n async transferIn(\n merchantId: string,\n params: AllocationTransferRequest,\n ): Promise<AllocationTransferResponse> {\n return this.request(\n 'POST',\n `/billing/${encodeURIComponent(merchantId)}/allocations/transfer-in`,\n { body: params },\n );\n }\n\n /**\n * Transfer funds from a shop's allocation back to the host merchant treasury.\n *\n * @param merchantId - The host merchant account ID.\n * @param params - Transfer details (amount, source profile/shop ID).\n * @returns The allocation transfer result.\n */\n async transferOut(\n merchantId: string,\n params: AllocationTransferRequest,\n ): Promise<AllocationTransferResponse> {\n return this.request(\n 'POST',\n `/billing/${encodeURIComponent(merchantId)}/allocations/transfer-out`,\n {\n body: params,\n },\n );\n }\n\n /**\n * List all shop balance allocations for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns List of shop allocations.\n */\n async list(merchantId: string): Promise<AllocationListResponse> {\n return this.request('GET', `/billing/${encodeURIComponent(merchantId)}/allocations`);\n }\n\n /**\n * Get the balance allocation for a specific shop.\n *\n * @param merchantId - The merchant account ID.\n * @param profileId - The shop (business profile) ID.\n * @returns The shop's balance allocation.\n */\n async get(merchantId: string, profileId: string): Promise<AllocationResponse> {\n return this.request(\n 'GET',\n `/billing/${encodeURIComponent(merchantId)}/allocations/${encodeURIComponent(profileId)}`,\n );\n }\n}\n\n/**\n * Manage prepaid billing balances — top-ups, card setup, auto-recharge, and the balance ledger.\n *\n * Delopay deducts a platform fee from the merchant's prepaid balance on every successful payment.\n * Use these endpoints to fund and monitor that balance.\n */\nexport class Billing {\n /** Per-shop balance allocation management for host merchants. */\n readonly allocations: BillingAllocations;\n\n constructor(private readonly request: RequestFn) {\n this.allocations = new BillingAllocations(request);\n }\n\n /**\n * Retrieve a merchant's billing profile (balance, status, auto-recharge config).\n *\n * @param merchantId - The merchant account ID.\n * @returns The billing profile.\n *\n * @example\n * ```typescript\n * const profile = await delopay.billing.getProfile('merch_123');\n * console.log(profile.balance, profile.status);\n * ```\n */\n async getProfile(merchantId: string): Promise<BillingProfileResponse> {\n return this.request('GET', `/billing/${encodeURIComponent(merchantId)}`);\n }\n\n /**\n * Start a Stripe SetupIntent flow to collect a payment card for auto-recharge.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Optional setup parameters.\n * @returns The Stripe client secret needed to render the card element.\n */\n async setup(merchantId: string, params?: BillingSetupRequest): Promise<BillingSetupResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/setup`, {\n body: params,\n });\n }\n\n /**\n * Confirm card setup after the Stripe SetupIntent completes on the frontend.\n *\n * @param merchantId - The merchant account ID.\n * @param params - The Stripe SetupIntent ID to confirm.\n * @returns The updated billing profile.\n */\n async completeSetup(\n merchantId: string,\n params: BillingCompleteSetupRequest,\n ): Promise<BillingProfileResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/setup/complete`, {\n body: params,\n });\n }\n\n /**\n * Manually top up a merchant's prepaid balance by charging their saved card.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Top-up amount and currency.\n * @returns The top-up result.\n */\n async topup(merchantId: string, params: TopupRequest): Promise<TopupResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/topup`, {\n body: params,\n });\n }\n\n /**\n * List the balance ledger (credits and debits) for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Optional pagination parameters.\n * @returns The ledger entries.\n */\n async listLedger(merchantId: string, params?: LedgerListParams): Promise<LedgerResponse> {\n return this.request('GET', `/billing/${encodeURIComponent(merchantId)}/ledger`, {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /**\n * Update auto-recharge configuration (threshold, top-up amount, enabled flag).\n *\n * @param merchantId - The merchant account ID.\n * @param params - Auto-recharge settings to update.\n * @returns The updated billing profile.\n */\n async updateAutoRecharge(\n merchantId: string,\n params: AutoRechargeUpdateRequest,\n ): Promise<BillingProfileResponse> {\n return this.request('PATCH', `/billing/${encodeURIComponent(merchantId)}/auto-recharge`, {\n body: params,\n });\n }\n}\n","import type { BlocklistAddRequest, BlocklistResponse, BlocklistDataKind } from '../types';\nimport type { RequestFn } from '../client';\n\nexport interface BlocklistListParams {\n data_kind?: BlocklistDataKind | null;\n limit?: number | null;\n offset?: number | null;\n}\n\nexport interface BlocklistToggleParams {\n status: boolean;\n}\n\nexport class Blocklist {\n constructor(private readonly request: RequestFn) {}\n\n async add(params: BlocklistAddRequest): Promise<BlocklistResponse> {\n return this.request('POST', '/blocklist', { body: params });\n }\n\n async remove(params: BlocklistAddRequest): Promise<BlocklistResponse> {\n return this.request('DELETE', '/blocklist', { body: params });\n }\n\n async list(params?: BlocklistListParams): Promise<BlocklistResponse[]> {\n return this.request('GET', '/blocklist', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n async toggle(params: BlocklistToggleParams): Promise<Record<string, unknown>> {\n return this.request('POST', '/blocklist/toggle', { body: params });\n }\n}\n","import type {\n ConnectorCreateRequest,\n ConnectorResponse,\n ConnectorUpdateRequest,\n ConnectorWebhookListResponse,\n ConnectorWebhookRegisterRequest,\n ConnectorWebhookRegisterResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Connectors {\n constructor(private readonly request: RequestFn) {}\n\n async create(accountId: string, params: ConnectorCreateRequest): Promise<ConnectorResponse> {\n return this.request('POST', `/account/${encodeURIComponent(accountId)}/connectors`, {\n body: params,\n });\n }\n\n async retrieve(accountId: string, connectorId: string): Promise<ConnectorResponse> {\n return this.request(\n 'GET',\n `/account/${encodeURIComponent(accountId)}/connectors/${encodeURIComponent(connectorId)}`,\n );\n }\n\n async list(accountId: string): Promise<ConnectorResponse[]> {\n return this.request('GET', `/account/${encodeURIComponent(accountId)}/connectors`);\n }\n\n async update(\n accountId: string,\n connectorId: string,\n params: ConnectorUpdateRequest,\n ): Promise<ConnectorResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/connectors/${encodeURIComponent(connectorId)}`,\n {\n body: params,\n },\n );\n }\n\n async delete(accountId: string, connectorId: string): Promise<ConnectorResponse> {\n return this.request(\n 'DELETE',\n `/account/${encodeURIComponent(accountId)}/connectors/${encodeURIComponent(connectorId)}`,\n );\n }\n\n // --- Advanced operations (Task 4.8) ---\n\n /** Verify connector credentials. `POST /account/connectors/verify` */\n async verify(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/account/connectors/verify', { body: params });\n }\n\n /**\n * Register a webhook for a connector.\n * `POST /account/{merchantId}/connectors/webhooks/{connectorId}`\n *\n * @param params - Optional event scope. Defaults to `{ event_type: 'all_events' }`\n * on the backend when omitted; pass `{ event_type: { specific_event: '…' } }`\n * to scope to a single event.\n */\n async registerWebhook(\n merchantId: string,\n connectorId: string,\n params?: ConnectorWebhookRegisterRequest,\n ): Promise<ConnectorWebhookRegisterResponse> {\n const path = `/account/${encodeURIComponent(merchantId)}/connectors/webhooks/${encodeURIComponent(connectorId)}`;\n if (params === undefined) return this.request('POST', path);\n return this.request('POST', path, { body: params });\n }\n\n /** Get registered webhooks for a connector. `GET /account/{merchantId}/connectors/webhooks/{connectorId}` */\n async getWebhook(merchantId: string, connectorId: string): Promise<ConnectorWebhookListResponse> {\n return this.request(\n 'GET',\n `/account/${encodeURIComponent(merchantId)}/connectors/webhooks/${encodeURIComponent(connectorId)}`,\n );\n }\n\n /** List available payment methods. `GET /account/payment_methods` */\n async listPaymentMethods(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/account/payment_methods');\n }\n}\n","import type {\n CustomerCreateRequest,\n CustomerResponse,\n CustomerUpdateRequest,\n CustomerListParams,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage customer profiles. */\nexport class Customers {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new customer.\n *\n * @param params - Customer creation parameters (name, email, phone, address, etc.).\n * @returns The created customer.\n *\n * @example\n * ```typescript\n * const customer = await delopay.customers.create({\n * email: 'alice@example.com',\n * name: 'Alice Smith',\n * });\n * ```\n */\n async create(params: CustomerCreateRequest): Promise<CustomerResponse> {\n return this.request('POST', '/customers', { body: params });\n }\n\n /**\n * Retrieve a customer by their ID.\n *\n * @param customerId - The unique customer ID.\n * @returns The customer.\n *\n * @example\n * ```typescript\n * const customer = await delopay.customers.retrieve('cus_abc123');\n * ```\n */\n async retrieve(customerId: string): Promise<CustomerResponse> {\n return this.request('GET', `/customers/${encodeURIComponent(customerId)}`);\n }\n\n /**\n * Update an existing customer's details.\n *\n * @param customerId - The customer ID to update.\n * @param params - Fields to update (name, email, address, metadata, etc.).\n * @returns The updated customer.\n */\n async update(customerId: string, params: CustomerUpdateRequest): Promise<CustomerResponse> {\n return this.request('POST', `/customers/${encodeURIComponent(customerId)}`, { body: params });\n }\n\n /**\n * Delete a customer and all their saved payment methods.\n *\n * @param customerId - The customer ID to delete.\n * @returns The deleted customer object.\n */\n async delete(customerId: string): Promise<CustomerResponse> {\n return this.request('DELETE', `/customers/${encodeURIComponent(customerId)}`);\n }\n\n /**\n * List customers, optionally filtered by email.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Array of customer objects.\n */\n async list(params?: CustomerListParams): Promise<CustomerResponse[]> {\n return this.request('GET', '/customers/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n // --- OLAP extensions (Task 4.6) ---\n\n /** List customers with count. `GET /customers/list_with_count` */\n async listWithCount(\n params?: CustomerListParams,\n ): Promise<{ count: number; total_count: number; data: CustomerResponse[] }> {\n return this.request('GET', '/customers/list_with_count', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n /** List mandates for a customer. `GET /customers/{customerId}/mandates` */\n async listMandates(customerId: string): Promise<Record<string, unknown>[]> {\n return this.request('GET', `/customers/${encodeURIComponent(customerId)}/mandates`);\n }\n}\n","import type { DisputeResponse, DisputeListParams, DisputeEvidenceRequest } from '../types';\nimport type { RequestFn } from '../client';\n\n/** View and respond to payment disputes and chargebacks. */\nexport class Disputes {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Retrieve a dispute by its ID.\n *\n * @param disputeId - The unique dispute ID.\n * @returns The dispute.\n */\n async retrieve(disputeId: string): Promise<DisputeResponse> {\n return this.request('GET', `/disputes/${encodeURIComponent(disputeId)}`);\n }\n\n /**\n * List disputes, optionally filtered by status, stage, or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Array of disputes.\n */\n async list(params?: DisputeListParams): Promise<DisputeResponse[]> {\n return this.request('GET', '/disputes/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /**\n * Accept a dispute, conceding the chargeback to the customer.\n *\n * @param disputeId - The dispute ID to accept.\n * @returns The updated dispute.\n */\n async accept(disputeId: string): Promise<DisputeResponse> {\n return this.request('POST', `/disputes/accept/${encodeURIComponent(disputeId)}`);\n }\n\n /**\n * Submit evidence to challenge a dispute.\n *\n * @param params - Evidence details and the dispute ID to contest.\n * @returns The updated dispute.\n */\n async submitEvidence(params: DisputeEvidenceRequest): Promise<DisputeResponse> {\n return this.request('POST', '/disputes/evidence', { body: params });\n }\n\n /**\n * Attach evidence (e.g. file upload metadata) to a dispute.\n *\n * Uses `PUT /disputes/evidence`.\n */\n async attachEvidence(params: DisputeEvidenceRequest): Promise<DisputeResponse> {\n return this.request('PUT', '/disputes/evidence', { body: params });\n }\n\n /**\n * Retrieve previously submitted evidence for a dispute.\n *\n * @param disputeId - The dispute ID.\n * @returns The submitted evidence.\n */\n async retrieveEvidence(disputeId: string): Promise<DisputeEvidenceRequest> {\n return this.request('GET', `/disputes/evidence/${encodeURIComponent(disputeId)}`);\n }\n\n /**\n * Delete submitted evidence for a dispute.\n *\n * @param params - Evidence request body identifying what to delete.\n * @returns The updated dispute.\n */\n async deleteEvidence(params: DisputeEvidenceRequest): Promise<DisputeResponse> {\n return this.request('DELETE', '/disputes/evidence', { body: params });\n }\n\n // --- OLAP extensions (Task 4.4) ---\n\n /** List disputes (profile-scoped). `GET /disputes/profile/list` */\n async listByProfile(params?: DisputeListParams): Promise<DisputeResponse[]> {\n return this.request('GET', '/disputes/profile/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** Get dispute filter options. `GET /disputes/filter` */\n async getFilters(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/filter', { query: params });\n }\n\n /** Get dispute filters (profile-scoped). `GET /disputes/profile/filter` */\n async getFiltersByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/profile/filter', { query: params });\n }\n\n /** Get dispute aggregates. `GET /disputes/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/aggregate', { query: params });\n }\n\n /** Get dispute aggregates (profile-scoped). `GET /disputes/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/disputes/profile/aggregate', { query: params });\n }\n\n /**\n * Fetch the latest dispute state from the connector (gateway).\n * `GET /disputes/{connectorId}/fetch`\n *\n * Note: the path parameter is the **connector dispute id** on the gateway, not the\n * Delopay dispute id. Method is GET (not POST) and this method signature was\n * previously wrong — callers depending on the old `POST /disputes/{id}/fetch_from_connector`\n * path were silently hitting 404s.\n */\n async fetchFromConnector(connectorId: string): Promise<DisputeResponse> {\n return this.request('GET', `/disputes/${encodeURIComponent(connectorId)}/fetch`);\n }\n}\n","import type { EphemeralKeyCreateRequest, EphemeralKeyCreateResponse } from '../types';\nimport type { RequestFn } from '../client';\n\n/**\n * Create short-lived ephemeral keys for secure client-side operations.\n *\n * Ephemeral keys grant a mobile or browser client temporary access to a\n * specific customer's data (e.g. to display saved payment methods) without\n * exposing your secret API key.\n */\nexport class EphemeralKeys {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create an ephemeral key scoped to a specific customer.\n *\n * @param params - Customer ID and optional expiry.\n * @returns The ephemeral key with its plaintext secret and expiry timestamp.\n *\n * @example\n * ```typescript\n * const ephKey = await delopay.ephemeralKeys.create({ customer_id: 'cus_123' });\n * // Pass ephKey.secret to your mobile app.\n * ```\n */\n async create(params: EphemeralKeyCreateRequest): Promise<EphemeralKeyCreateResponse> {\n return this.request('POST', '/ephemeral_keys', { body: params });\n }\n\n /**\n * Invalidate an ephemeral key before it expires.\n *\n * @param keyId - The ephemeral key ID to delete.\n * @returns The deleted key object.\n */\n async delete(keyId: string): Promise<EphemeralKeyCreateResponse> {\n return this.request('DELETE', `/ephemeral_keys/${encodeURIComponent(keyId)}`);\n }\n}\n","import type {\n EventListParams,\n EventListResponse,\n EventDeliveryAttemptResponse,\n EventDetailResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Events {\n constructor(private readonly request: RequestFn) {}\n\n async list(merchantId: string, params?: EventListParams): Promise<EventListResponse> {\n return this.request('POST', `/events/${encodeURIComponent(merchantId)}`, { body: params });\n }\n\n async listDeliveryAttempts(\n merchantId: string,\n eventId: string,\n ): Promise<EventDeliveryAttemptResponse[]> {\n return this.request(\n 'GET',\n `/events/${encodeURIComponent(merchantId)}/${encodeURIComponent(eventId)}/attempts`,\n );\n }\n\n async retryDelivery(merchantId: string, eventId: string): Promise<EventDetailResponse> {\n return this.request(\n 'POST',\n `/events/${encodeURIComponent(merchantId)}/${encodeURIComponent(eventId)}/retry`,\n );\n }\n\n // --- Profile-scoped listing (Task 4.12) ---\n\n /** List events (profile-scoped). `POST /events/profile/list` */\n async listByProfile(params?: Record<string, unknown>): Promise<EventListResponse> {\n return this.request('POST', '/events/profile/list', { body: params });\n }\n}\n","import type {\n FeeScheduleCreateRequest,\n FeeScheduleResponse,\n FeeScheduleUpdateRequest,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/**\n * Merchant-scoped fee schedules. Each schedule optionally targets a\n * specific shop (via `shop_id`). Merchants can CRUD their own fee\n * overrides; platform-wide fee programs are administered by Delopay and\n * not exposed here.\n */\nexport class Fees {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a merchant-scoped fee schedule (optionally per-shop).\n *\n * @param params - Fee schedule parameters.\n * @param merchantId - The merchant account ID.\n */\n async create(params: FeeScheduleCreateRequest, merchantId: string): Promise<FeeScheduleResponse> {\n return this.request('POST', '/merchant_fees', {\n body: params,\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * List the merchant's own fee schedules.\n *\n * @param merchantId - The merchant account ID.\n */\n async list(merchantId: string): Promise<FeeScheduleResponse[]> {\n return this.request('GET', '/merchant_fees/list', {\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Update a merchant-scoped fee schedule.\n *\n * @param feeId - The fee schedule ID.\n * @param params - Fields to update.\n */\n async update(feeId: string, params: FeeScheduleUpdateRequest): Promise<FeeScheduleResponse> {\n return this.request('PUT', `/merchant_fees/${encodeURIComponent(feeId)}`, { body: params });\n }\n\n /**\n * Delete a merchant-scoped fee schedule.\n *\n * @param feeId - The fee schedule ID.\n */\n async delete(feeId: string): Promise<FeeScheduleResponse> {\n return this.request('DELETE', `/merchant_fees/${encodeURIComponent(feeId)}`);\n }\n}\n","import type { MandateResponse, MandateRevokedResponse, MandateListParams } from '../types';\nimport type { RequestFn } from '../client';\n\n/** View and revoke recurring payment mandates. */\nexport class Mandates {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Retrieve a mandate by its ID.\n *\n * @param mandateId - The unique mandate ID.\n * @returns The mandate.\n */\n async retrieve(mandateId: string): Promise<MandateResponse> {\n return this.request('GET', `/mandates/${encodeURIComponent(mandateId)}`);\n }\n\n /**\n * Revoke an active mandate, preventing future charges.\n *\n * @param mandateId - The mandate ID to revoke.\n * @returns Revocation confirmation.\n */\n async revoke(mandateId: string): Promise<MandateRevokedResponse> {\n return this.request('POST', `/mandates/revoke/${encodeURIComponent(mandateId)}`);\n }\n\n /**\n * List mandates, optionally filtered by customer or status.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Array of mandates.\n */\n async list(params?: MandateListParams): Promise<MandateResponse[]> {\n return this.request('GET', '/mandates/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n}\n","import type {\n MerchantAccountCreateRequest,\n MerchantAccountResponse,\n MerchantAccountUpdateRequest,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class MerchantAccounts {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: MerchantAccountCreateRequest): Promise<MerchantAccountResponse> {\n return this.request('POST', '/accounts', { body: params });\n }\n\n async retrieve(accountId: string): Promise<MerchantAccountResponse> {\n return this.request('GET', `/accounts/${encodeURIComponent(accountId)}`);\n }\n\n async update(\n accountId: string,\n params: MerchantAccountUpdateRequest,\n ): Promise<MerchantAccountResponse> {\n return this.request('POST', `/accounts/${encodeURIComponent(accountId)}`, { body: params });\n }\n\n async delete(accountId: string): Promise<MerchantAccountResponse> {\n return this.request('DELETE', `/accounts/${encodeURIComponent(accountId)}`);\n }\n\n // --- Advanced operations (Task 4.9) ---\n\n /** List all merchant accounts. `GET /accounts/list` */\n async list(): Promise<MerchantAccountResponse[]> {\n return this.request('GET', '/accounts/list');\n }\n\n /** Toggle key-value store for a merchant. `POST /accounts/{accountId}/kv` */\n async toggleKv(accountId: string): Promise<Record<string, unknown>> {\n return this.request('POST', `/accounts/${encodeURIComponent(accountId)}/kv`);\n }\n\n /** Get KV status for a merchant. `GET /accounts/{accountId}/kv` */\n async getKvStatus(accountId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/accounts/${encodeURIComponent(accountId)}/kv`);\n }\n\n /** Transfer keys between merchants. `POST /accounts/transfer` */\n async transferKeys(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/accounts/transfer', { body: params });\n }\n}\n","import type { PaymentLinkResponse, PaymentLinkListParams, PaymentLinkListResponse } from '../types';\nimport type { RequestFn } from '../client';\n\n/** Retrieve and list hosted payment links. */\nexport class PaymentLinks {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Retrieve a payment link by its ID.\n *\n * @param linkId - The unique payment link ID.\n * @returns The payment link details.\n */\n async retrieve(linkId: string): Promise<PaymentLinkResponse> {\n return this.request('GET', `/payment_link/${encodeURIComponent(linkId)}`);\n }\n\n /**\n * List payment links, optionally filtered by status or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of payment links.\n */\n async list(params?: PaymentLinkListParams): Promise<PaymentLinkListResponse> {\n return this.request('POST', '/payment_link/list', { body: params });\n }\n\n /** Initiate (render) a payment link page. `GET /payment_link/{merchantId}/{paymentId}` */\n async initiate(merchantId: string, paymentId: string): Promise<Record<string, unknown>> {\n return this.request(\n 'GET',\n `/payment_link/${encodeURIComponent(merchantId)}/${encodeURIComponent(paymentId)}`,\n );\n }\n\n /** Get payment link status. `GET /payment_linkstatus/{merchantId}/{paymentId}` */\n async status(merchantId: string, paymentId: string): Promise<Record<string, unknown>> {\n return this.request(\n 'GET',\n `/payment_linkstatus/${encodeURIComponent(merchantId)}/${encodeURIComponent(paymentId)}`,\n );\n }\n}\n","import type {\n PaymentMethodCreateRequest,\n PaymentMethodResponse,\n PaymentMethodUpdateRequest,\n PaymentMethodListParams,\n PaymentMethodDeleteResponse,\n CustomerPaymentMethodsListParams,\n CustomerPaymentMethodsListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage saved payment methods for customers. */\nexport class PaymentMethods {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Save a new payment method (card, bank account, wallet, etc.).\n *\n * @param params - Payment method data including type and card/bank details.\n * @returns The saved payment method.\n *\n * @example\n * ```typescript\n * const pm = await delopay.paymentMethods.create({\n * payment_method: 'card',\n * customer_id: 'cus_123',\n * client_secret: 'cs_...',\n * });\n * ```\n */\n async create(params: PaymentMethodCreateRequest): Promise<PaymentMethodResponse> {\n return this.request('POST', '/payment_methods', { body: params });\n }\n\n /**\n * Retrieve a saved payment method by its ID.\n *\n * @param methodId - The payment method ID.\n * @returns The payment method.\n */\n async retrieve(methodId: string): Promise<PaymentMethodResponse> {\n return this.request('GET', `/payment_methods/${encodeURIComponent(methodId)}`);\n }\n\n /**\n * Update an existing payment method (e.g. update card expiry).\n *\n * @param methodId - The payment method ID to update.\n * @param params - Fields to update (card expiry, holder name, etc.).\n * @returns The updated payment method.\n */\n async update(\n methodId: string,\n params: PaymentMethodUpdateRequest,\n ): Promise<PaymentMethodResponse> {\n return this.request('POST', `/payment_methods/${encodeURIComponent(methodId)}/update`, {\n body: params,\n });\n }\n\n /**\n * Delete a saved payment method.\n *\n * @param methodId - The payment method ID to delete.\n * @returns Deletion confirmation.\n */\n async delete(methodId: string): Promise<PaymentMethodDeleteResponse> {\n return this.request('DELETE', `/payment_methods/${encodeURIComponent(methodId)}`);\n }\n\n /**\n * List payment methods using a client secret.\n *\n * @param params - Filter by `client_secret`.\n * @returns Array of payment methods.\n */\n async list(params?: PaymentMethodListParams): Promise<PaymentMethodResponse[]> {\n return this.request('GET', '/payment_methods', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /**\n * List all saved payment methods for a customer, optionally filtered.\n *\n * @param customerId - The customer ID.\n * @param params - Optional filters: `client_secret`, `accepted_countries`, `accepted_currencies`,\n * `amount`, `recurring_enabled`, `installment_payment_enabled`, `limit`, `card_networks`.\n * @returns Customer's saved payment methods.\n *\n * @example\n * ```typescript\n * const { customer_payment_methods } = await delopay.paymentMethods.listForCustomer(\n * 'cus_123',\n * { accepted_currencies: ['EUR'], amount: 5000 },\n * );\n * ```\n */\n async listForCustomer(\n customerId: string,\n params?: CustomerPaymentMethodsListParams,\n ): Promise<CustomerPaymentMethodsListResponse> {\n return this.request('GET', `/customers/${encodeURIComponent(customerId)}/payment_methods`, {\n query: params as Record<\n string,\n string | number | boolean | (string | number | boolean)[] | null | undefined\n >,\n });\n }\n\n /**\n * Set a payment method as the default for a customer.\n *\n * @param customerId - The customer ID.\n * @param methodId - The payment method ID to set as default.\n * @returns The updated payment method.\n */\n async setDefault(customerId: string, methodId: string): Promise<PaymentMethodResponse> {\n return this.request(\n 'POST',\n `/customers/${encodeURIComponent(customerId)}/payment_methods/${encodeURIComponent(methodId)}/default`,\n );\n }\n\n // --- Advanced operations (Task 3.3) ---\n\n /** Migrate a payment method. `POST /payment_methods/migrate` */\n async migrate(params: Record<string, unknown>): Promise<PaymentMethodResponse> {\n return this.request('POST', '/payment_methods/migrate', { body: params });\n }\n\n /** Batch migrate payment methods. `POST /payment_methods/migrate-batch` */\n async migrateBatch(params: Record<string, unknown>[]): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/migrate-batch', { body: params });\n }\n\n /** Batch update payment methods. `POST /payment_methods/update-batch` */\n async updateBatch(params: Record<string, unknown>[]): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/update-batch', { body: params });\n }\n\n /** Batch retrieve payment methods. `GET /payment_methods/batch` */\n async batchRetrieve(\n params?: Record<string, string | number | undefined>,\n ): Promise<PaymentMethodResponse[]> {\n return this.request('GET', '/payment_methods/batch', { query: params });\n }\n\n /** Tokenize a card. `POST /payment_methods/tokenize-card` */\n async tokenizeCard(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/tokenize-card', { body: params });\n }\n\n /** Batch tokenize cards. `POST /payment_methods/tokenize-card-batch` */\n async tokenizeCardBatch(params: Record<string, unknown>[]): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/tokenize-card-batch', { body: params });\n }\n\n /** Initiate payment method collect link flow. `POST /payment_methods/collect` */\n async collect(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/collect', { body: params });\n }\n\n /** Save a payment method. `POST /payment_methods/{methodId}/save` */\n async save(methodId: string, params?: Record<string, unknown>): Promise<PaymentMethodResponse> {\n return this.request('POST', `/payment_methods/${encodeURIComponent(methodId)}/save`, {\n body: params,\n });\n }\n\n /** Create payment method auth link token. `POST /payment_methods/auth/link` */\n async createAuthLink(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/auth/link', { body: params });\n }\n\n /** Exchange payment method auth token. `POST /payment_methods/auth/exchange` */\n async exchangeAuthToken(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payment_methods/auth/exchange', { body: params });\n }\n\n /** Tokenize card using existing PM. `POST /payment_methods/{methodId}/tokenize-card` */\n async tokenizeCardForMethod(\n methodId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/payment_methods/${encodeURIComponent(methodId)}/tokenize-card`, {\n body: params,\n });\n }\n}\n","import type {\n PaymentCreateRequest,\n PaymentListResponse,\n PaymentResponse,\n PaymentRetrieveOptions,\n PaymentUpdateRequest,\n PaymentConfirmRequest,\n PaymentCaptureRequest,\n PaymentCancelRequest,\n PaymentListParams,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Manage payment intents — create, confirm, capture, cancel, and list payments. */\nexport class Payments {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new payment intent.\n *\n * @param params - Payment creation parameters including amount and currency.\n * @returns The created payment intent.\n *\n * @example\n * ```typescript\n * const payment = await delopay.payments.create({\n * amount: 5000,\n * currency: 'EUR',\n * customer_id: 'cus_123',\n * });\n * ```\n */\n async create(params: PaymentCreateRequest): Promise<PaymentResponse> {\n return this.request('POST', '/payments', { body: params });\n }\n\n /**\n * Retrieve a payment by its ID.\n *\n * @param paymentId - The unique payment intent ID.\n * @param options - Optional query flags. `force_sync` asks the backend to\n * reconcile state with the connector before returning (used to recover a\n * stuck intent when a webhook was lost). `all_keys_required` lifts the\n * backend's `should_call_connector` gate so a `requires_payment_method`\n * intent can still trigger a sync — without it the backend short-circuits\n * and returns the local snapshot. Both flags are JWT-authenticated dashboard\n * helpers; API-key callers can use them too where the backend allows.\n * @returns The payment intent.\n *\n * @example\n * ```typescript\n * const payment = await delopay.payments.retrieve('pay_abc123');\n * const synced = await delopay.payments.retrieve('pay_abc123', {\n * force_sync: true,\n * all_keys_required: true,\n * });\n * ```\n */\n async retrieve(paymentId: string, options?: PaymentRetrieveOptions): Promise<PaymentResponse> {\n const path = `/payments/${encodeURIComponent(paymentId)}`;\n if (options === undefined) return this.request('GET', path);\n const query: Record<string, boolean> = {};\n if (options.force_sync !== undefined) query['force_sync'] = options.force_sync;\n if (options.all_keys_required !== undefined) {\n query['all_keys_required'] = options.all_keys_required;\n }\n if (Object.keys(query).length === 0) return this.request('GET', path);\n return this.request('GET', path, { query });\n }\n\n /**\n * Update an existing payment intent before it is confirmed.\n *\n * @param paymentId - The payment intent ID to update.\n * @param params - Fields to update (amount, currency, metadata, etc.).\n * @returns The updated payment intent.\n */\n async update(paymentId: string, params: PaymentUpdateRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}`, { body: params });\n }\n\n /**\n * Confirm a payment intent, triggering authorisation with the selected gateway.\n *\n * @param paymentId - The payment intent ID to confirm.\n * @param params - Confirmation parameters (payment method data, return URL, etc.).\n * @returns The updated payment intent.\n */\n async confirm(paymentId: string, params: PaymentConfirmRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/confirm`, {\n body: params,\n });\n }\n\n /**\n * Capture a previously authorised payment.\n *\n * @param paymentId - The payment intent ID to capture.\n * @param params - Optional capture parameters (partial capture amount, etc.).\n * @returns The updated payment intent.\n */\n async capture(paymentId: string, params?: PaymentCaptureRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/capture`, {\n body: params,\n });\n }\n\n /**\n * Cancel a payment intent that has not yet been captured.\n *\n * @param paymentId - The payment intent ID to cancel.\n * @param params - Optional cancellation reason.\n * @returns The updated payment intent.\n */\n async cancel(paymentId: string, params?: PaymentCancelRequest): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/cancel`, {\n body: params,\n });\n }\n\n /**\n * List payment intents, optionally filtered by customer or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of payment intents.\n *\n * @example\n * ```typescript\n * const { data } = await delopay.payments.list({ customer_id: 'cus_123', limit: 25 });\n * ```\n */\n async list(params?: PaymentListParams): Promise<PaymentListResponse> {\n return this.request('GET', '/payments/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n // --- Advanced operations (Task 3.2) ---\n\n /** Generate session tokens. `POST /payments/session_tokens` */\n async sessionTokens(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payments/session_tokens', { body: params });\n }\n\n /** Retrieve payment with gateway credentials. `POST /payments/sync` */\n async sync(params: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('POST', '/payments/sync', { body: params });\n }\n\n /** Cancel after partial capture. `POST /payments/{paymentId}/cancel_post_capture` */\n async cancelPostCapture(\n paymentId: string,\n params?: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/cancel_post_capture`, {\n body: params,\n });\n }\n\n /** Incrementally authorize more funds. `POST /payments/{paymentId}/incremental_authorization` */\n async incrementalAuthorization(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request(\n 'POST',\n `/payments/${encodeURIComponent(paymentId)}/incremental_authorization`,\n {\n body: params,\n },\n );\n }\n\n /** Extend authorization window. `POST /payments/{paymentId}/extend_authorization` */\n async extendAuthorization(\n paymentId: string,\n params?: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/extend_authorization`, {\n body: params,\n });\n }\n\n /** Complete authorization. `POST /payments/{paymentId}/complete_authorize` */\n async completeAuthorize(\n paymentId: string,\n params?: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/complete_authorize`, {\n body: params,\n });\n }\n\n /** Dynamic tax calculation. `POST /payments/{paymentId}/calculate_tax` */\n async calculateTax(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/calculate_tax`, {\n body: params,\n });\n }\n\n /** Update payment metadata. `POST /payments/{paymentId}/update_metadata` */\n async updateMetadata(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/update_metadata`, {\n body: params,\n });\n }\n\n /** Retrieve extended card info. `GET /payments/{paymentId}/extended_card_info` */\n async extendedCardInfo(paymentId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/payments/${encodeURIComponent(paymentId)}/extended_card_info`);\n }\n\n // --- OLAP extensions (Task 4.2) ---\n\n /** List payments (profile-scoped). `GET /payments/profile/list` */\n async listByProfile(params?: PaymentListParams): Promise<PaymentListResponse> {\n return this.request('GET', '/payments/profile/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** List payments across all shops. `GET /payments/list-all-shops` */\n async listAllShops(params?: PaymentListParams): Promise<PaymentListResponse> {\n return this.request('GET', '/payments/list-all-shops', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** List payments by filter (POST body). `POST /payments/list` */\n async listByFilter(params: Record<string, unknown>): Promise<PaymentListResponse> {\n return this.request('POST', '/payments/list', { body: params });\n }\n\n /** Get payment filter options. `POST /payments/filter` */\n async getFilters(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payments/filter', { body: params });\n }\n\n /** Get payment filters (v2). `GET /payments/v2/filter` */\n async getFiltersV2(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payments/v2/filter', { query: params });\n }\n\n /** Get payment aggregates. `GET /payments/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payments/aggregate', { query: params });\n }\n\n /** Get payment aggregates (profile-scoped). `GET /payments/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payments/profile/aggregate', { query: params });\n }\n\n /** Manually update payment status. `PUT /payments/{paymentId}/manual-update` */\n async manualUpdate(paymentId: string, params: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('PUT', `/payments/${encodeURIComponent(paymentId)}/manual-update`, {\n body: params,\n });\n }\n\n /** Approve a payment waiting for review. `POST /payments/{paymentId}/approve` */\n async approve(paymentId: string, params?: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/approve`, {\n body: params,\n });\n }\n\n /** Reject a payment waiting for review. `POST /payments/{paymentId}/reject` */\n async reject(paymentId: string, params?: Record<string, unknown>): Promise<PaymentResponse> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/reject`, {\n body: params,\n });\n }\n\n /** Initiate external 3DS authentication. `POST /payments/{paymentId}/3ds/authentication` */\n async threeDsAuthentication(\n paymentId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/payments/${encodeURIComponent(paymentId)}/3ds/authentication`, {\n body: params,\n });\n }\n}\n","import type {\n PayoutCreateRequest,\n PayoutResponse,\n PayoutUpdateRequest,\n PayoutListParams,\n PayoutListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage payouts — fund transfers from merchant to a recipient bank account. */\nexport class Payouts {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new payout.\n *\n * @param params - Payout parameters including amount, currency, and destination.\n * @returns The created payout.\n *\n * @example\n * ```typescript\n * const payout = await delopay.payouts.create({\n * amount: 10000,\n * currency: 'EUR',\n * customer_id: 'cus_123',\n * });\n * ```\n */\n async create(params: PayoutCreateRequest): Promise<PayoutResponse> {\n return this.request('POST', '/payouts/create', { body: params });\n }\n\n /**\n * Retrieve a payout by its ID.\n *\n * @param payoutId - The unique payout ID.\n * @returns The payout.\n */\n async retrieve(payoutId: string): Promise<PayoutResponse> {\n return this.request('GET', `/payouts/${encodeURIComponent(payoutId)}`);\n }\n\n /**\n * Update a payout before it is confirmed.\n *\n * @param payoutId - The payout ID to update.\n * @param params - Fields to update.\n * @returns The updated payout.\n */\n async update(payoutId: string, params: PayoutUpdateRequest): Promise<PayoutResponse> {\n return this.request('PUT', `/payouts/${encodeURIComponent(payoutId)}`, { body: params });\n }\n\n /**\n * Confirm a payout, triggering the actual transfer.\n *\n * @param payoutId - The payout ID to confirm.\n * @param params - Optional confirmation parameters.\n * @returns The updated payout.\n */\n async confirm(payoutId: string, params?: PayoutUpdateRequest): Promise<PayoutResponse> {\n return this.request('POST', `/payouts/${encodeURIComponent(payoutId)}/confirm`, {\n body: params,\n });\n }\n\n /**\n * Cancel a payout before it is fulfilled.\n *\n * @param payoutId - The payout ID to cancel.\n * @returns The cancelled payout.\n */\n async cancel(payoutId: string): Promise<PayoutResponse> {\n return this.request('POST', `/payouts/${encodeURIComponent(payoutId)}/cancel`);\n }\n\n /**\n * Mark a payout as fulfilled (manual confirmation of successful transfer).\n *\n * @param payoutId - The payout ID to fulfil.\n * @returns The fulfilled payout.\n */\n async fulfill(payoutId: string): Promise<PayoutResponse> {\n return this.request('POST', `/payouts/${encodeURIComponent(payoutId)}/fulfill`);\n }\n\n /**\n * List payouts, optionally filtered by status or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of payouts.\n */\n async list(params?: PayoutListParams): Promise<PayoutListResponse> {\n return this.request('GET', '/payouts/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n // --- OLAP extensions (Task 4.5) ---\n\n /** List payouts (profile-scoped). `GET /payouts/profile/list` */\n async listByProfile(params?: PayoutListParams): Promise<PayoutListResponse> {\n return this.request('GET', '/payouts/profile/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** List payouts by filter (POST body). `POST /payouts/list` */\n async listByFilter(params: Record<string, unknown>): Promise<PayoutListResponse> {\n return this.request('POST', '/payouts/list', { body: params });\n }\n\n /** Get payout filter options. `POST /payouts/filter` */\n async getFilters(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payouts/filter', { body: params });\n }\n\n /** Get payout filters (profile-scoped). `POST /payouts/profile/filter` */\n async getFiltersByProfile(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/payouts/profile/filter', { body: params });\n }\n\n /** Get payout aggregates. `GET /payouts/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payouts/aggregate', { query: params });\n }\n\n /** Get payout aggregates (profile-scoped). `GET /payouts/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/payouts/profile/aggregate', { query: params });\n }\n\n /** Manually update payout status. `PUT /payouts/{payoutId}/manual-update` */\n async manualUpdate(payoutId: string, params: Record<string, unknown>): Promise<PayoutResponse> {\n return this.request('PUT', `/payouts/${encodeURIComponent(payoutId)}/manual-update`, {\n body: params,\n });\n }\n}\n","import type { PollStatusResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Poll {\n constructor(private readonly request: RequestFn) {}\n\n async getStatus(pollId: string): Promise<PollStatusResponse> {\n return this.request('GET', `/poll/status/${encodeURIComponent(pollId)}`);\n }\n}\n","import type {\n ProfileAcquirerCreateRequest,\n ProfileAcquirerResponse,\n ProfileAcquirerUpdateRequest,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class ProfileAcquirers {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: ProfileAcquirerCreateRequest): Promise<ProfileAcquirerResponse> {\n return this.request('POST', '/profile_acquirer', { body: params });\n }\n\n async update(\n profileId: string,\n profileAcquirerId: string,\n params: ProfileAcquirerUpdateRequest,\n ): Promise<ProfileAcquirerResponse> {\n return this.request(\n 'POST',\n `/profile_acquirer/${encodeURIComponent(profileId)}/${encodeURIComponent(profileAcquirerId)}`,\n {\n body: params,\n },\n );\n }\n}\n","import type { ProfileCreateRequest, ProfileResponse, ProfileUpdateRequest } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Profiles {\n constructor(private readonly request: RequestFn) {}\n\n async create(accountId: string, params: ProfileCreateRequest): Promise<ProfileResponse> {\n return this.request('POST', `/account/${encodeURIComponent(accountId)}/business_profile`, {\n body: params,\n });\n }\n\n async retrieve(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'GET',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}`,\n );\n }\n\n async list(accountId: string): Promise<ProfileResponse[]> {\n return this.request('GET', `/account/${encodeURIComponent(accountId)}/business_profile`);\n }\n\n async update(\n accountId: string,\n profileId: string,\n params: ProfileUpdateRequest,\n ): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}`,\n {\n body: params,\n },\n );\n }\n\n async delete(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'DELETE',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}`,\n );\n }\n\n // --- Advanced operations (Task 4.8) ---\n\n /** Toggle extended card info for a profile. `POST /account/{accountId}/business_profile/{profileId}/toggle_extended_card_info` */\n async toggleExtendedCardInfo(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}/toggle_extended_card_info`,\n );\n }\n\n /** Toggle connector agnostic MIT. `POST /account/{accountId}/business_profile/{profileId}/toggle_connector_agnostic_mit` */\n async toggleConnectorAgnosticMit(accountId: string, profileId: string): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/account/${encodeURIComponent(accountId)}/business_profile/${encodeURIComponent(profileId)}/toggle_connector_agnostic_mit`,\n );\n }\n}\n","import type {\n ProjectCreateRequest,\n ProjectResponse,\n ProjectUpdateRequest,\n ProjectStatsResponse,\n MerchantOverviewResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage projects — optional grouping layers that contain one or more shops. */\nexport class Projects {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a new project under a merchant account.\n *\n * @param params - Project creation parameters (name, description, etc.).\n * @param merchantId - The merchant account ID that owns this project.\n * @returns The created project.\n *\n * @example\n * ```typescript\n * const project = await delopay.projects.create({ name: 'EU Stores' }, 'merch_123');\n * ```\n */\n async create(params: ProjectCreateRequest, merchantId: string): Promise<ProjectResponse> {\n return this.request('POST', '/projects', {\n body: params,\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Retrieve a project by its ID.\n *\n * @param projectId - The unique project ID.\n * @param merchantId - Optional merchant scope. When provided, sent as\n * `?merchant_id=…` — required by dashboards that authenticate with a JWT\n * spanning multiple merchants and need to disambiguate which one this\n * call applies to. API-key callers can omit it.\n * @returns The project.\n */\n async retrieve(projectId: string, merchantId?: string): Promise<ProjectResponse> {\n const path = `/projects/${encodeURIComponent(projectId)}`;\n if (merchantId === undefined) return this.request('GET', path);\n return this.request('GET', path, { query: { merchant_id: merchantId } });\n }\n\n /**\n * Update a project's details.\n *\n * @param projectId - The project ID to update.\n * @param params - Fields to update.\n * @param merchantId - Optional merchant scope. See {@link Projects.retrieve}.\n * @returns The updated project.\n */\n async update(\n projectId: string,\n params: ProjectUpdateRequest,\n merchantId?: string,\n ): Promise<ProjectResponse> {\n const path = `/projects/${encodeURIComponent(projectId)}`;\n if (merchantId === undefined) return this.request('PUT', path, { body: params });\n return this.request('PUT', path, { body: params, query: { merchant_id: merchantId } });\n }\n\n /**\n * Delete a project.\n *\n * @param projectId - The project ID to delete.\n * @param merchantId - Optional merchant scope. See {@link Projects.retrieve}.\n * @returns The deleted project object.\n */\n async delete(projectId: string, merchantId?: string): Promise<ProjectResponse> {\n const path = `/projects/${encodeURIComponent(projectId)}`;\n if (merchantId === undefined) return this.request('DELETE', path);\n return this.request('DELETE', path, { query: { merchant_id: merchantId } });\n }\n\n /**\n * List all projects for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Array of projects.\n */\n async list(merchantId: string): Promise<ProjectResponse[]> {\n return this.request('GET', '/projects/list', {\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Get aggregate payment statistics across all projects for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Project statistics.\n */\n async stats(merchantId: string): Promise<ProjectStatsResponse> {\n return this.request('GET', '/projects/stats', {\n query: { merchant_id: merchantId },\n });\n }\n\n /**\n * Get a high-level overview (volume, counts, top connectors) for a merchant.\n *\n * @param merchantId - The merchant account ID.\n * @returns Merchant overview data.\n */\n async overview(merchantId: string): Promise<MerchantOverviewResponse> {\n return this.request('GET', '/projects/overview', {\n query: { merchant_id: merchantId },\n });\n }\n}\n","import type {\n RefundCreateRequest,\n RefundResponse,\n RefundUpdateRequest,\n RefundListParams,\n RefundListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Create and manage refunds for completed payments. */\nexport class Refunds {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Create a refund for a payment.\n *\n * @param params - Refund parameters, including the required `payment_id` and optional amount.\n * @returns The created refund.\n *\n * @example\n * ```typescript\n * const refund = await delopay.refunds.create({\n * payment_id: 'pay_abc123',\n * amount: 2500, // partial refund of 25.00 EUR\n * });\n * ```\n */\n async create(params: RefundCreateRequest): Promise<RefundResponse> {\n return this.request('POST', '/refunds', { body: params });\n }\n\n /**\n * Retrieve a refund by its ID.\n *\n * @param refundId - The unique refund ID.\n * @returns The refund.\n *\n * @example\n * ```typescript\n * const refund = await delopay.refunds.retrieve('ref_abc123');\n * ```\n */\n async retrieve(refundId: string): Promise<RefundResponse> {\n return this.request('GET', `/refunds/${encodeURIComponent(refundId)}`);\n }\n\n /**\n * Update the reason or metadata on an existing refund.\n *\n * @param refundId - The refund ID to update.\n * @param params - Fields to update (reason, metadata).\n * @returns The updated refund.\n */\n async update(refundId: string, params: RefundUpdateRequest): Promise<RefundResponse> {\n return this.request('POST', `/refunds/${encodeURIComponent(refundId)}`, { body: params });\n }\n\n /**\n * List refunds, optionally filtered by payment, status, or date range.\n *\n * @param params - Optional filter and pagination parameters.\n * @returns Paginated list of refunds.\n */\n async list(params?: RefundListParams): Promise<RefundListResponse> {\n return this.request('POST', '/refunds/list', { body: params });\n }\n\n // --- OLAP extensions (Task 4.3) ---\n\n /** List refunds (profile-scoped). `POST /refunds/profile/list` */\n async listByProfile(params?: RefundListParams): Promise<RefundListResponse> {\n return this.request('POST', '/refunds/profile/list', { body: params });\n }\n\n /** Get refund filter options. `POST /refunds/filter` */\n async getFilters(params?: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/refunds/filter', { body: params });\n }\n\n /** Get refund filters (v2). `GET /refunds/v2/filter` */\n async getFiltersV2(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/refunds/v2/filter', { query: params });\n }\n\n /** Get refund aggregates. `GET /refunds/aggregate` */\n async aggregate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/refunds/aggregate', { query: params });\n }\n\n /** Get refund aggregates (profile-scoped). `GET /refunds/profile/aggregate` */\n async aggregateByProfile(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/refunds/profile/aggregate', { query: params });\n }\n\n /** Manually update refund status. `PUT /refunds/{refundId}/manual-update` */\n async manualUpdate(refundId: string, params: Record<string, unknown>): Promise<RefundResponse> {\n return this.request('PUT', `/refunds/${encodeURIComponent(refundId)}/manual-update`, {\n body: params,\n });\n }\n}\n","import type { RelayRequest, RelayResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Relay {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: RelayRequest): Promise<RelayResponse> {\n return this.request('POST', '/relay', { body: params });\n }\n\n async retrieve(relayId: string): Promise<RelayResponse> {\n return this.request('GET', `/relay/${encodeURIComponent(relayId)}`);\n }\n}\n","import type {\n LinkedRoutingConfigRetrieveResponse,\n MerchantRoutingAlgorithm,\n ProfileDefaultRoutingConfig,\n RoutableConnectorChoice,\n RoutingActivatePayload,\n RoutingConfigCreateRequest,\n RoutingDeactivateRequest,\n RoutingDictionary,\n RoutingDictionaryRecord,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/**\n * Create and manage payment routing algorithms.\n *\n * Routing rules determine which gateway connector handles each payment based on\n * card type, currency, amount, or custom conditions.\n */\nexport class Routing {\n readonly decision: RoutingDecisionManager;\n\n constructor(private readonly request: RequestFn) {\n this.decision = new RoutingDecisionManager(request);\n }\n\n /**\n * Create a new routing algorithm.\n *\n * @param params - Routing algorithm definition (rule-based, priority, or volume-based).\n * @returns Metadata record for the created routing configuration. The full\n * algorithm body is not echoed back — use `retrieve(id)` if you need it.\n *\n * @example\n * ```typescript\n * const config = await delopay.routing.create({\n * name: 'EU Priority',\n * algorithm: { type: 'priority', data: [{ connector: 'stripe' }] },\n * });\n * ```\n */\n async create(params: RoutingConfigCreateRequest): Promise<RoutingDictionaryRecord> {\n return this.request('POST', '/routing', { body: params });\n }\n\n /**\n * Retrieve a routing algorithm by its ID.\n *\n * @param algorithmId - The routing algorithm ID.\n * @returns The full routing configuration including the algorithm body.\n */\n async retrieve(algorithmId: string): Promise<MerchantRoutingAlgorithm> {\n return this.request('GET', `/routing/${encodeURIComponent(algorithmId)}`);\n }\n\n /**\n * Activate a routing algorithm, making it the active routing strategy.\n *\n * Always sends a JSON body (default `{}`) so the request carries the\n * `Content-Type: application/json` header that the server requires.\n *\n * @param algorithmId - The routing algorithm ID to activate.\n * @param params - Optional activation payload (e.g. `transaction_type`).\n */\n async activate(\n algorithmId: string,\n params: RoutingActivatePayload = {},\n ): Promise<RoutingDictionaryRecord> {\n return this.request('POST', `/routing/${encodeURIComponent(algorithmId)}/activate`, {\n body: params,\n });\n }\n\n /**\n * Deactivate the currently active routing algorithm (falls back to default routing).\n *\n * Always sends a JSON body (default `{}`) so the request carries the\n * `Content-Type: application/json` header that the server requires.\n *\n * @param params - Optional deactivation payload.\n */\n async deactivate(params: RoutingDeactivateRequest = {}): Promise<RoutingDictionaryRecord> {\n return this.request('POST', '/routing/deactivate', { body: params });\n }\n\n /**\n * List all routing algorithms for the current merchant.\n *\n * @returns The routing dictionary (records + currently active id).\n */\n async list(): Promise<RoutingDictionary> {\n return this.request('GET', '/routing');\n }\n\n // --- Advanced operations (Task 3.4) ---\n\n /** Get active routing config. `GET /routing/active` */\n async getActive(): Promise<LinkedRoutingConfigRetrieveResponse> {\n return this.request('GET', '/routing/active');\n }\n\n /** Update default routing config. `POST /routing/default` */\n async updateDefault(params: Record<string, unknown>): Promise<RoutableConnectorChoice[]> {\n return this.request('POST', '/routing/default', { body: params });\n }\n\n /** Retrieve default config for profiles. `GET /routing/default/profile` */\n async getDefaultProfile(): Promise<RoutableConnectorChoice[] | ProfileDefaultRoutingConfig[]> {\n return this.request('GET', '/routing/default/profile');\n }\n\n /** Update default config for a profile. `POST /routing/default/profile/{profileId}` */\n async updateDefaultProfile(\n profileId: string,\n params: Record<string, unknown>,\n ): Promise<ProfileDefaultRoutingConfig> {\n return this.request('POST', `/routing/default/profile/${encodeURIComponent(profileId)}`, {\n body: params,\n });\n }\n\n /** List routing configs for profile. `GET /routing/list/profile` */\n async listForProfile(): Promise<RoutingDictionary> {\n return this.request('GET', '/routing/list/profile');\n }\n\n /** Evaluate a routing rule. `POST /routing/rule/evaluate` */\n async evaluateRule(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/rule/evaluate', { body: params });\n }\n\n /** Migrate routing rules for profile. `POST /routing/rule/migrate` */\n async migrateRule(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/rule/migrate', { body: params });\n }\n\n /** Evaluate routing for a payment. `POST /routing/evaluate` */\n async evaluate(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/evaluate', { body: params });\n }\n\n /** Update gateway scores for dynamic routing. `POST /routing/feedback` */\n async feedback(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/routing/feedback', { body: params });\n }\n}\n\nclass RoutingDecisionManager {\n constructor(private readonly request: RequestFn) {}\n\n /** Upsert decision manager config. `PUT /routing/decision` */\n async upsert(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', '/routing/decision', { body: params });\n }\n\n /** Retrieve decision manager config. `GET /routing/decision` */\n async retrieve(): Promise<Record<string, unknown>> {\n return this.request('GET', '/routing/decision');\n }\n\n /** Delete decision manager config. `DELETE /routing/decision` */\n async delete(): Promise<Record<string, unknown>> {\n return this.request('DELETE', '/routing/decision');\n }\n\n /** Upsert surcharge decision config. `PUT /routing/decision/surcharge` */\n async upsertSurcharge(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', '/routing/decision/surcharge', { body: params });\n }\n\n /** Retrieve surcharge decision config. `GET /routing/decision/surcharge` */\n async retrieveSurcharge(): Promise<Record<string, unknown>> {\n return this.request('GET', '/routing/decision/surcharge');\n }\n\n /** Delete surcharge decision config. `DELETE /routing/decision/surcharge` */\n async deleteSurcharge(): Promise<Record<string, unknown>> {\n return this.request('DELETE', '/routing/decision/surcharge');\n }\n}\n","import type {\n ShopCreateRequest,\n ShopResponse,\n ShopUpdateRequest,\n GatewayConnectRequest,\n GatewayResponse,\n ProfileLogoUploadResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\n/** Manage gateway connections for a specific shop. */\nclass ShopGateways {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Connect a payment gateway to a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop (business profile) ID.\n * @param params - Gateway connector credentials and configuration.\n * @returns The created gateway connection.\n */\n async connect(\n merchantId: string,\n shopId: string,\n params: GatewayConnectRequest,\n ): Promise<GatewayResponse> {\n return this.request(\n 'POST',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/gateways`,\n { body: params },\n );\n }\n\n /**\n * List all gateway connections for a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID.\n * @returns Array of gateway connections.\n */\n async list(merchantId: string, shopId: string): Promise<GatewayResponse[]> {\n return this.request(\n 'GET',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/gateways`,\n );\n }\n\n /**\n * Disconnect a gateway from a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID.\n * @param gatewayId - The gateway connector ID to remove.\n * @returns The removed gateway connection.\n */\n async disconnect(\n merchantId: string,\n shopId: string,\n gatewayId: string,\n ): Promise<GatewayResponse> {\n return this.request(\n 'DELETE',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/gateways/${encodeURIComponent(gatewayId)}`,\n );\n }\n}\n\n/**\n * Create and manage shops (business profiles) within a merchant account.\n *\n * Each shop can have its own gateway connections, routing rules, and fee schedules.\n */\nexport class Shops {\n /** Gateway connection management for shops. */\n readonly gateways: ShopGateways;\n\n constructor(private readonly request: RequestFn) {\n this.gateways = new ShopGateways(request);\n }\n\n /**\n * Create a new shop under a merchant account.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Shop creation parameters (name, etc.).\n * @returns The created shop.\n *\n * @example\n * ```typescript\n * const shop = await delopay.shops.create('merch_123', { profile_name: 'EU Store' });\n * ```\n */\n async create(merchantId: string, params: ShopCreateRequest): Promise<ShopResponse> {\n return this.request('POST', `/shops/${encodeURIComponent(merchantId)}`, { body: params });\n }\n\n /**\n * Retrieve a shop by its ID.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID.\n * @returns The shop.\n */\n async retrieve(merchantId: string, shopId: string): Promise<ShopResponse> {\n return this.request(\n 'GET',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}`,\n );\n }\n\n /**\n * Update a shop's configuration.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID to update.\n * @param params - Fields to update.\n * @returns The updated shop.\n */\n async update(\n merchantId: string,\n shopId: string,\n params: ShopUpdateRequest,\n ): Promise<ShopResponse> {\n return this.request(\n 'PUT',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}`,\n { body: params },\n );\n }\n\n /**\n * Delete a shop.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop ID to delete.\n * @returns The deleted shop object.\n */\n async delete(merchantId: string, shopId: string): Promise<ShopResponse> {\n return this.request(\n 'DELETE',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}`,\n );\n }\n\n /**\n * List all shops under a merchant account.\n *\n * @param merchantId - The merchant account ID.\n * @returns Array of shops.\n */\n async list(merchantId: string): Promise<ShopResponse[]> {\n return this.request('GET', `/shops/${encodeURIComponent(merchantId)}`);\n }\n\n /**\n * Upload a logo file for a shop. The file is stored in Delopay's configured\n * object store and a public HTTPS URL is returned. This method does NOT write\n * the URL into the shop's `payment_link_config.default_config.logo` — call\n * `shops.update` afterwards with the returned `logo_url` to persist the change.\n *\n * Accepts PNG, JPEG, WebP or SVG. The file must be ≤ 1 MiB.\n *\n * @param merchantId - The merchant account ID.\n * @param shopId - The shop (business profile) ID.\n * @param file - The logo file (Blob / File in browsers).\n * @returns The publicly-reachable URL of the uploaded logo.\n *\n * @example\n * ```typescript\n * const { logo_url } = await delopay.shops.uploadLogo('merch_1', 'pro_1', file);\n * await delopay.shops.update('merch_1', 'pro_1', {\n * payment_link_config: { default_config: { logo: logo_url } },\n * });\n * ```\n */\n async uploadLogo(\n merchantId: string,\n shopId: string,\n file: Blob,\n ): Promise<ProfileLogoUploadResponse> {\n const form = new FormData();\n form.append('file', file);\n return this.request(\n 'POST',\n `/shops/${encodeURIComponent(merchantId)}/${encodeURIComponent(shopId)}/logo`,\n { body: form },\n );\n }\n}\n","import type {\n StripeConnectAccountRequest,\n StripeConnectAccountResponse,\n StripeConnectLinkRequest,\n StripeConnectLinkResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class StripeConnect {\n constructor(private readonly request: RequestFn) {}\n\n async createAccount(params: StripeConnectAccountRequest): Promise<StripeConnectAccountResponse> {\n return this.request('POST', '/connector_onboarding/stripe/accounts', { body: params });\n }\n\n async createAccountLink(params: StripeConnectLinkRequest): Promise<StripeConnectLinkResponse> {\n return this.request('POST', '/connector_onboarding/stripe/account_links', { body: params });\n }\n\n // --- Generic connector onboarding (Task 4.11) ---\n\n /** Get onboarding action URL. `POST /connector_onboarding/action_url` */\n async getActionUrl(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/connector_onboarding/action_url', { body: params });\n }\n\n /** Sync onboarding status. `POST /connector_onboarding/sync` */\n async syncOnboarding(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/connector_onboarding/sync', { body: params });\n }\n\n /** Reset tracking ID. `POST /connector_onboarding/reset_tracking_id` */\n async resetTrackingId(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/connector_onboarding/reset_tracking_id', { body: params });\n }\n}\n","import type { ThreeDsRuleExecuteRequest, ThreeDsRuleResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class ThreeDsRules {\n constructor(private readonly request: RequestFn) {}\n\n async execute(params: ThreeDsRuleExecuteRequest): Promise<ThreeDsRuleResponse> {\n return this.request('POST', '/three_ds_decision/execute', { body: params });\n }\n}\n","import type {\n SignUpRequest,\n SignUpWithMerchantRequest,\n SignInRequest,\n AuthResponse,\n UserResponse,\n ChangePasswordRequest,\n ForgotPasswordRequest,\n ResetPasswordRequest,\n SwitchMerchantRequest,\n SwitchProfileRequest,\n InviteUsersRequest,\n InviteUsersResponse,\n TotpResponse,\n RecoveryCodesResponse,\n PhoneOtpRequest,\n PhoneOtpResponse,\n PhoneOtpVerifyRequest,\n PhoneOtpVerifyResponse,\n UpdateUserDetailsRequest,\n FromEmailRequest,\n TokenResponse,\n VerifyTotpRequest,\n Terminate2faQueryParams,\n ListInvitableRolesParams,\n LoginHistoryParams,\n LoginHistoryResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Users {\n constructor(private readonly request: RequestFn) {}\n\n async signUp(params: SignUpRequest | SignUpWithMerchantRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/signup', { body: params });\n }\n\n async signIn(params: SignInRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/signin', { body: params });\n }\n\n async signOut(): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/signout');\n }\n\n /**\n * Paginated login history for the authenticated user — IP, User-Agent,\n * country / city / lat-lon (when GeoIP is enabled in backend), success\n * and failure events with their reasons. Strictly scoped to the JWT\n * subject; a user can only see their own activity.\n *\n * `GET /user/me/login-activity`. Requires a logged-in JWT.\n *\n * The backend returns an empty page when a Delopay admin is impersonating\n * a non-admin merchant, so the admin's metadata never renders inside the\n * merchant dashboard.\n */\n async listLoginActivity(params?: LoginHistoryParams): Promise<LoginHistoryResponse> {\n if (params === undefined) {\n return this.request('GET', '/user/me/login-activity');\n }\n return this.request('GET', '/user/me/login-activity', {\n query: params as Record<string, number | undefined>,\n });\n }\n\n async getDetails(): Promise<UserResponse> {\n return this.request('GET', '/user');\n }\n\n async update(params: UpdateUserDetailsRequest): Promise<UserResponse> {\n return this.request('POST', '/user/update', { body: params });\n }\n\n async changePassword(params: ChangePasswordRequest): Promise<UserResponse> {\n return this.request('POST', '/user/change_password', { body: params });\n }\n\n async rotatePassword(params: ResetPasswordRequest): Promise<UserResponse> {\n return this.request('POST', '/user/rotate_password', { body: params });\n }\n\n async forgotPassword(params: ForgotPasswordRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/forgot_password', { body: params });\n }\n\n /**\n * Commit a password reset.\n *\n * The caller is responsible for obtaining a `SinglePurposeToken` with\n * `purpose: reset_password` via the email-token exchange + TOTP flow\n * (see `fromEmail`, `beginTotp`, `updateTotp`/`verifyTotp`,\n * `generateRecoveryCodes`, `terminate2fa`) and setting it on the client\n * via `setJwtToken` before calling this method. `body.token` must still\n * be the original `EmailToken` from the reset-link URL — the handler\n * decodes it a second time to find the user.\n */\n async resetPassword(params: ResetPasswordRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/reset_password', { body: params });\n }\n\n /**\n * Exchange an email-link token (`EmailToken`) for a single-purpose JWT\n * that drives the next step of the flow (TOTP, verify email, accept\n * invitation, etc.). No authentication required.\n *\n * The `token_type` in the response tells you which step to run next.\n */\n async fromEmail(params: FromEmailRequest): Promise<TokenResponse> {\n return this.request('POST', '/user/from_email', { body: params });\n }\n\n async verifyEmail(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/verify_email', { body: params });\n }\n\n async sendVerificationEmail(params: ForgotPasswordRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/verify_email_request', { body: params });\n }\n\n async createMerchant(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/create_merchant', { body: params });\n }\n\n async switchMerchant(params: SwitchMerchantRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/switch/merchant', { body: params });\n }\n\n async switchProfile(params: SwitchProfileRequest): Promise<AuthResponse> {\n return this.request('POST', '/user/switch/profile', { body: params });\n }\n\n async listMerchants(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/list/merchant');\n }\n\n async listProfiles(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/list/profile');\n }\n\n async inviteUsers(params: InviteUsersRequest[]): Promise<InviteUsersResponse[]> {\n return this.request('POST', '/user/user/invite_multiple', { body: params });\n }\n\n async acceptInvitation(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/user/invite/accept', { body: params });\n }\n\n /**\n * Start TOTP setup (or no-op if already set).\n *\n * Returns the QR-code payload when the user has no TOTP configured yet;\n * returns `{ secret: null }` when the user is already set up (caller\n * should then prompt for a 6-digit code and call `verifyTotp`).\n *\n * Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async beginTotp(): Promise<TotpResponse> {\n return this.request('GET', '/user/2fa/totp/begin');\n }\n\n /**\n * Verify a 6-digit TOTP code for a user whose TOTP is already set up.\n * Marks the code as used in Redis so subsequent flow steps can advance.\n *\n * Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async verifyTotp(params: VerifyTotpRequest): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/2fa/totp/verify', { body: params });\n }\n\n async resetTotp(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/2fa/totp/reset');\n }\n\n async generateRecoveryCodes(): Promise<RecoveryCodesResponse> {\n return this.request('GET', '/user/2fa/recovery_code/generate');\n }\n\n async verifyRecoveryCode(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/2fa/recovery_code/verify', { body: params });\n }\n\n async sendPhoneOtp(params: PhoneOtpRequest): Promise<PhoneOtpResponse> {\n return this.request('POST', '/user/phone/send-otp', { body: params });\n }\n\n async verifyPhoneOtp(params: PhoneOtpVerifyRequest): Promise<PhoneOtpVerifyResponse> {\n return this.request('POST', '/user/phone/verify-otp', { body: params });\n }\n\n async getRoleFromToken(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/role');\n }\n\n async listRoles(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/role/list');\n }\n\n async listUserRoles(params?: Record<string, unknown>): Promise<Record<string, unknown>[]> {\n return this.request('POST', '/user/user', { body: params });\n }\n\n async updateUserRole(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/user/update_role', { body: params });\n }\n\n async deleteUserRole(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('DELETE', '/user/user/delete', { body: params });\n }\n\n // --- Advanced methods (Task 4.7) ---\n\n /** Sign in (v2). `POST /user/v2/signin` */\n async signInV2(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/v2/signin', { body: params });\n }\n\n /** Sign in via OIDC. `POST /user/oidc` */\n async signInOidc(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/oidc', { body: params });\n }\n\n /** Transfer key. `POST /user/key/transfer` */\n async transferKey(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/key/transfer', { body: params });\n }\n\n /** List invitations. `GET /user/list/invitation` */\n async listInvitations(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/list/invitation');\n }\n\n /** Check 2FA status. `GET /user/2fa` */\n async check2faStatus(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/2fa');\n }\n\n /** Check 2FA status (v2). `GET /user/2fa/v2` */\n async check2faStatusV2(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/2fa/v2');\n }\n\n /**\n * Finish first-time TOTP setup: commit the secret generated by `beginTotp`\n * against a 6-digit code from the user's authenticator app.\n *\n * `PUT /user/2fa/totp/verify`. Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async updateTotp(params: VerifyTotpRequest): Promise<Record<string, unknown>> {\n return this.request('PUT', '/user/2fa/totp/verify', { body: params });\n }\n\n /**\n * Complete the TOTP step and advance to the next flow stage (e.g.\n * `reset_password`). Returns a fresh single-purpose token with the\n * next `token_type`.\n *\n * `GET /user/2fa/terminate`. Requires `Authorization: Bearer <SPT{purpose:totp}>`.\n */\n async terminate2fa(query?: Terminate2faQueryParams): Promise<TokenResponse> {\n if (query === undefined) {\n return this.request('GET', '/user/2fa/terminate');\n }\n return this.request('GET', '/user/2fa/terminate', {\n query: query as Record<string, boolean | undefined>,\n });\n }\n\n /** Create auth method. `POST /user/auth` */\n async createAuthMethod(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/auth', { body: params });\n }\n\n /** Update auth method. `PUT /user/auth` */\n async updateAuthMethod(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', '/user/auth', { body: params });\n }\n\n /** List auth methods. `GET /user/auth/list` */\n async listAuthMethods(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/auth/list');\n }\n\n /** Get auth URL. `GET /user/auth/url` */\n async getAuthUrl(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/auth/url');\n }\n\n /** Select auth method. `POST /user/auth/select` */\n async selectAuth(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/auth/select', { body: params });\n }\n\n /** List user roles (v2). `POST /user/user/v2` */\n async listUserRolesV2(params?: Record<string, unknown>): Promise<Record<string, unknown>[]> {\n return this.request('POST', '/user/user/v2', { body: params });\n }\n\n /** List users in lineage. `GET /user/user/list` */\n async listUsersInLineage(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/user/list');\n }\n\n /** List users in lineage (v2). `GET /user/user/v2/list` */\n async listUsersInLineageV2(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/user/v2/list');\n }\n\n /** Accept invitation (v2). `POST /user/user/invite/accept/v2` */\n async acceptInvitationV2(params: Record<string, unknown>): Promise<AuthResponse> {\n return this.request('POST', '/user/user/invite/accept/v2', { body: params });\n }\n\n /** Resend invite. `POST /user/user/resend_invite` */\n async resendInvite(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/user/resend_invite', { body: params });\n }\n\n /** Get role (v2). `GET /user/role/v2` */\n async getRoleV2(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/role/v2');\n }\n\n /** Get role (v3). `GET /user/role/v3` */\n async getRoleV3(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/role/v3');\n }\n\n /** List roles (v2). `GET /user/role/v2/list` */\n async listRolesV2(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/role/v2/list');\n }\n\n /**\n * List invitable roles. `GET /user/role/list/invite`\n *\n * @param params - Optional query. `entity_type` scopes the role list to a\n * particular entity (e.g. `'merchant'` to list only merchant-scoped roles\n * when inviting employees from the merchant dashboard).\n */\n async listInvitableRoles(params?: ListInvitableRolesParams): Promise<Record<string, unknown>[]> {\n if (params === undefined || params.entity_type === undefined) {\n return this.request('GET', '/user/role/list/invite');\n }\n return this.request('GET', '/user/role/list/invite', {\n query: { entity_type: params.entity_type },\n });\n }\n\n /** List updatable roles. `GET /user/role/list/update` */\n async listUpdatableRoles(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/role/list/update');\n }\n\n /** Get permission info. `GET /user/permission_info` */\n async getPermissionInfo(): Promise<Record<string, unknown>> {\n return this.request('GET', '/user/permission_info');\n }\n\n /** Get module list. `GET /user/module/list` */\n async getModuleList(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/module/list');\n }\n\n /** Get parent list. `GET /user/parent/list` */\n async getParentList(): Promise<Record<string, unknown>[]> {\n return this.request('GET', '/user/parent/list');\n }\n\n /** Create a role. `POST /user/role` */\n async createRole(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/user/role', { body: params });\n }\n\n /** Get role by ID. `GET /user/role/{roleId}` */\n async getRoleById(roleId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/user/role/${encodeURIComponent(roleId)}`);\n }\n\n /** Update role by ID. `PUT /user/role/{roleId}` */\n async updateRole(\n roleId: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('PUT', `/user/role/${encodeURIComponent(roleId)}`, { body: params });\n }\n}\n","import type {\n ApplePayVerificationRequest,\n ApplePayVerificationResponse,\n ApplePayVerifiedDomainsResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Verification {\n constructor(private readonly request: RequestFn) {}\n\n async registerApplePayDomains(\n merchantId: string,\n params: ApplePayVerificationRequest,\n ): Promise<ApplePayVerificationResponse> {\n return this.request('POST', `/verify/apple_pay/${encodeURIComponent(merchantId)}`, {\n body: params,\n });\n }\n\n async getApplePayVerifiedDomains(\n params: Record<string, string>,\n ): Promise<ApplePayVerifiedDomainsResponse> {\n return this.request('GET', '/verify/applepay_verified_domains', {\n query: params,\n });\n }\n}\n","/**\n * A parsed and verified Delopay webhook event.\n *\n * The `type` field identifies the event (e.g. `'payment_succeeded'`).\n * Specific event payload shapes are nested under `data`.\n */\nexport interface WebhookEvent {\n /** Event type identifier, e.g. `'payment_succeeded'` or `'refund_succeeded'`. */\n type: string;\n /** Event payload. Shape depends on `type`. */\n data: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nfunction hexToBytes(hex: string): Uint8Array | null {\n if (hex.length === 0 || hex.length % 2 !== 0) return null;\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n const byte = Number.parseInt(hex.slice(i, i + 2), 16);\n if (Number.isNaN(byte)) return null;\n bytes[i / 2] = byte;\n }\n return bytes;\n}\n\nexport const Webhooks = {\n /**\n * Verify the signature of an incoming Delopay webhook and return the parsed event.\n *\n * Delopay signs each outgoing webhook with HMAC-SHA512 over the raw request body,\n * using your shop's webhook secret (the *payment response hash key* configured on\n * the shop). The hex-encoded digest is delivered in the `X-Webhook-Signature-512`\n * HTTP header.\n *\n * Uses the Web Crypto API (`globalThis.crypto.subtle`), so it runs unchanged in\n * Node 18+, modern browsers, Deno, Bun, and edge runtimes (Cloudflare Workers, Vercel Edge).\n *\n * Available as a static property on the `Delopay` class\n * (`Delopay.webhooks.verify`) and does not require a client instance.\n *\n * @param rawBody - The raw request body. Pass the original bytes (`Uint8Array` /\n * `Buffer`) when possible; if you pass a string, it must be the unmodified UTF-8\n * text of the request body. Do **not** parse it before passing.\n * @param signatureHeader - The value of the `X-Webhook-Signature-512` HTTP header.\n * @param secret - Your shop's webhook signing secret.\n * @returns Promise that resolves to the parsed webhook event.\n * @throws {Error} When the signature header is malformed or does not match the body.\n *\n * @example\n * ```typescript\n * // Express example\n * app.post('/webhook', express.raw({ type: 'application/json' }), async (req, res) => {\n * try {\n * const event = await Delopay.webhooks.verify(\n * req.body, // Buffer from express.raw()\n * req.header('x-webhook-signature-512') ?? '',\n * process.env.DELOPAY_WEBHOOK_SECRET!,\n * );\n * console.log(event.type, event.data);\n * res.sendStatus(200);\n * } catch {\n * res.status(400).send('Invalid signature');\n * }\n * });\n * ```\n */\n async verify(\n rawBody: string | Uint8Array,\n signatureHeader: string,\n secret: string,\n ): Promise<WebhookEvent> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) {\n throw new Error(\n 'Web Crypto unavailable: Delopay.webhooks.verify requires globalThis.crypto.subtle (Node 18+, modern browsers, Workers, Deno)',\n );\n }\n\n const signatureBytes = hexToBytes(signatureHeader.trim());\n if (!signatureBytes) {\n throw new Error('Invalid webhook signature format');\n }\n\n const encoder = new TextEncoder();\n const bodyBytes = typeof rawBody === 'string' ? encoder.encode(rawBody) : rawBody;\n\n // `TextEncoder.encode` returns `Uint8Array<ArrayBufferLike>` in current lib.dom.d.ts,\n // but `crypto.subtle.*` wants `BufferSource` (backed by `ArrayBuffer`). At runtime the\n // underlying buffer is always an `ArrayBuffer` — cast to quiet the type checker.\n const asBufferSource = (bytes: Uint8Array): BufferSource => bytes as unknown as BufferSource;\n const key = await subtle.importKey(\n 'raw',\n asBufferSource(encoder.encode(secret)),\n { name: 'HMAC', hash: 'SHA-512' },\n false,\n ['verify'],\n );\n\n const valid = await subtle.verify(\n 'HMAC',\n key,\n asBufferSource(signatureBytes),\n asBufferSource(bodyBytes),\n );\n\n if (!valid) {\n throw new Error('Invalid webhook signature');\n }\n\n const bodyText =\n typeof rawBody === 'string' ? rawBody : new TextDecoder('utf-8').decode(rawBody);\n return JSON.parse(bodyText) as WebhookEvent;\n },\n};\n","import type { RequestFn } from '../client';\n\ntype AnalyticsScope = 'merchant' | 'org' | 'profile';\n\nclass AnalyticsDomain {\n constructor(\n private readonly request: RequestFn,\n private readonly domain: string,\n ) {}\n\n /** Get metrics. `POST /analytics/v1/metrics/{domain}` */\n async metrics(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n // Metrics handlers on the backend take `web::Json<[T; 1]>` — i.e. a one-element array.\n // filters/report/sankey/search take `web::Json<T>`. Don't unify without re-checking the Rust side.\n return this.request('POST', `${prefix}/metrics/${encodeURIComponent(this.domain)}`, {\n body: [params],\n });\n }\n\n /** Get filters. `POST /analytics/v1/filters/{domain}` */\n async filters(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n return this.request('POST', `${prefix}/filters/${encodeURIComponent(this.domain)}`, {\n body: params,\n });\n }\n\n /** Generate report. `POST /analytics/v1/report/{domain}` */\n async report(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n return this.request('POST', `${prefix}/report/${encodeURIComponent(this.domain)}`, {\n body: params,\n });\n }\n\n /** Sankey chart data. `POST /analytics/v1/metrics/{domain}/sankey` */\n async sankey(\n params: Record<string, unknown>,\n scope?: AnalyticsScope,\n ): Promise<Record<string, unknown>> {\n const prefix = scope ? `/analytics/v1/${scope}` : '/analytics/v1';\n return this.request('POST', `${prefix}/metrics/${encodeURIComponent(this.domain)}/sankey`, {\n body: params,\n });\n }\n}\n\nexport class Analytics {\n readonly payments: AnalyticsDomain;\n readonly refunds: AnalyticsDomain;\n readonly disputes: AnalyticsDomain;\n readonly authEvents: AnalyticsDomain;\n readonly sdkEvents: AnalyticsDomain;\n readonly frm: AnalyticsDomain;\n readonly apiEvents: AnalyticsDomain;\n readonly routing: AnalyticsDomain;\n\n constructor(private readonly request: RequestFn) {\n this.payments = new AnalyticsDomain(request, 'payments');\n this.refunds = new AnalyticsDomain(request, 'refunds');\n this.disputes = new AnalyticsDomain(request, 'disputes');\n this.authEvents = new AnalyticsDomain(request, 'auth_events');\n this.sdkEvents = new AnalyticsDomain(request, 'sdk_events');\n this.frm = new AnalyticsDomain(request, 'frm');\n this.apiEvents = new AnalyticsDomain(request, 'api_events');\n this.routing = new AnalyticsDomain(request, 'routing');\n }\n\n /** Global search. `POST /analytics/v1/search` */\n async search(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/analytics/v1/search', { body: params });\n }\n\n /** Domain-specific search. `POST /analytics/v1/search/{domain}` */\n async searchDomain(\n domain: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n return this.request('POST', `/analytics/v1/search/${encodeURIComponent(domain)}`, {\n body: params,\n });\n }\n\n /** Get analytics info. `GET /analytics/v1/{domain}/info` */\n async getInfo(domain: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/analytics/v1/${encodeURIComponent(domain)}/info`);\n }\n\n /** Get API event logs. `GET /analytics/v1/api_event_logs` */\n async apiEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/api_event_logs', { query: params });\n }\n\n /** Get SDK event logs. `POST /analytics/v1/sdk_event_logs` */\n async sdkEventLogs(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/analytics/v1/sdk_event_logs', { body: params });\n }\n\n /** Get connector event logs. `GET /analytics/v1/connector_event_logs` */\n async connectorEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/connector_event_logs', { query: params });\n }\n\n /** Get routing event logs. `GET /analytics/v1/routing_event_logs` */\n async routingEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/routing_event_logs', { query: params });\n }\n\n /** Get outgoing webhook event logs. `GET /analytics/v1/outgoing_webhook_event_logs` */\n async outgoingWebhookEventLogs(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics/v1/outgoing_webhook_event_logs', { query: params });\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class AnalyticsDashboard {\n constructor(private readonly request: RequestFn) {}\n\n /** Get analytics dashboard data. `GET /analytics-dashboard` */\n async retrieve(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/analytics-dashboard', { query: params });\n }\n\n /** Generate analytics dashboard report. `POST /analytics-dashboard` */\n async generate(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/analytics-dashboard', { body: params });\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Cards {\n constructor(private readonly request: RequestFn) {}\n\n /** Create a card. `POST /cards/create` */\n async create(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/cards/create', { body: params });\n }\n\n /** Update a card. `POST /cards/update` */\n async update(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/cards/update', { body: params });\n }\n\n /** Retrieve card info by BIN. `GET /cards/{bin}` */\n async retrieve(bin: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/cards/${encodeURIComponent(bin)}`);\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Export {\n constructor(private readonly request: RequestFn) {}\n\n /** Export transactions. `POST /export/transactions` */\n async transactions(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/export/transactions', { body: params });\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class FeatureMatrix {\n constructor(private readonly request: RequestFn) {}\n\n /** Retrieve the feature matrix. `GET /feature_matrix` */\n async retrieve(): Promise<Record<string, unknown>> {\n return this.request('GET', '/feature_matrix');\n }\n\n /**\n * Retrieve the feature matrix scoped to a merchant. Beta connectors\n * are filtered against the merchant's allowlist so the dashboard only\n * surfaces connectors the merchant can actually attach.\n * `GET /feature_matrix/{merchantId}`\n */\n async retrieveForMerchant(merchantId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/feature_matrix/${encodeURIComponent(merchantId)}`);\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Files {\n constructor(private readonly request: RequestFn) {}\n\n /** Upload a file. `POST /files` */\n async create(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/files', { body: params });\n }\n\n /** Retrieve/download a file. `GET /files/{fileId}` */\n async retrieve(fileId: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/files/${encodeURIComponent(fileId)}`);\n }\n\n /** Delete a file. `DELETE /files/{fileId}` */\n async delete(fileId: string): Promise<Record<string, unknown>> {\n return this.request('DELETE', `/files/${encodeURIComponent(fileId)}`);\n }\n}\n","import type { RequestFn } from '../client';\n\nexport class Forex {\n constructor(private readonly request: RequestFn) {}\n\n /** Retrieve forex rates. `GET /forex/rates` */\n async getRates(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/forex/rates', { query: params });\n }\n\n /** Convert from minor currency. `GET /forex/convert_from_minor` */\n async convertFromMinor(\n params: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/forex/convert_from_minor', { query: params });\n }\n}\n","import type { RegionCreateRequest, RegionUpdateRequest, RegionResponse } from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Regions {\n constructor(private readonly request: RequestFn) {}\n\n /** Create a region. `POST /regions` */\n async create(params: RegionCreateRequest): Promise<RegionResponse> {\n return this.request('POST', '/regions', { body: params });\n }\n\n /** Retrieve a region by ID. `GET /regions/{regionId}` */\n async retrieve(regionId: string): Promise<RegionResponse> {\n return this.request('GET', `/regions/${encodeURIComponent(regionId)}`);\n }\n\n /** Update a region. `PUT /regions/{regionId}` */\n async update(regionId: string, params: RegionUpdateRequest): Promise<RegionResponse> {\n return this.request('PUT', `/regions/${encodeURIComponent(regionId)}`, { body: params });\n }\n\n /** Delete a region. `DELETE /regions/{regionId}` */\n async delete(regionId: string): Promise<RegionResponse> {\n return this.request('DELETE', `/regions/${encodeURIComponent(regionId)}`);\n }\n\n /** List all regions. `GET /regions/list` */\n async list(): Promise<RegionResponse[]> {\n return this.request('GET', '/regions/list');\n }\n}\n","import type {\n SubscriptionCreateRequest,\n SubscriptionUpdateRequest,\n SubscriptionResponse,\n SubscriptionListParams,\n SubscriptionListResponse,\n} from '../types';\nimport type { RequestFn } from '../client';\n\nexport class Subscriptions {\n constructor(private readonly request: RequestFn) {}\n\n /** Create and immediately confirm a subscription. `POST /subscriptions` */\n async createAndConfirm(params: SubscriptionCreateRequest): Promise<SubscriptionResponse> {\n return this.request('POST', '/subscriptions', { body: params });\n }\n\n /** Create a subscription (without confirming). `POST /subscriptions/create` */\n async create(params: SubscriptionCreateRequest): Promise<SubscriptionResponse> {\n return this.request('POST', '/subscriptions/create', { body: params });\n }\n\n /** Retrieve a subscription by ID. `GET /subscriptions/{subscriptionId}` */\n async retrieve(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('GET', `/subscriptions/${encodeURIComponent(subscriptionId)}`);\n }\n\n /** Confirm a subscription. `POST /subscriptions/{subscriptionId}/confirm` */\n async confirm(\n subscriptionId: string,\n params?: Record<string, unknown>,\n ): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/confirm`, {\n body: params,\n });\n }\n\n /** Update a subscription. `PUT /subscriptions/{subscriptionId}/update` */\n async update(\n subscriptionId: string,\n params: SubscriptionUpdateRequest,\n ): Promise<SubscriptionResponse> {\n return this.request('PUT', `/subscriptions/${encodeURIComponent(subscriptionId)}/update`, {\n body: params,\n });\n }\n\n /** List subscriptions. `GET /subscriptions/list` */\n async list(params?: SubscriptionListParams): Promise<SubscriptionListResponse> {\n return this.request('GET', '/subscriptions/list', {\n query: params as Record<string, string | number | undefined>,\n });\n }\n\n /** Get subscription estimate. `GET /subscriptions/estimate` */\n async getEstimate(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/subscriptions/estimate', { query: params });\n }\n\n /** Get subscription items. `GET /subscriptions/items` */\n async getItems(\n params?: Record<string, string | number | undefined>,\n ): Promise<Record<string, unknown>> {\n return this.request('GET', '/subscriptions/items', { query: params });\n }\n\n /** Pause a subscription. `POST /subscriptions/{subscriptionId}/pause` */\n async pause(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/pause`);\n }\n\n /** Resume a subscription. `POST /subscriptions/{subscriptionId}/resume` */\n async resume(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/resume`);\n }\n\n /** Cancel a subscription. `POST /subscriptions/{subscriptionId}/cancel` */\n async cancel(subscriptionId: string): Promise<SubscriptionResponse> {\n return this.request('POST', `/subscriptions/${encodeURIComponent(subscriptionId)}/cancel`);\n }\n}\n","import { DelopayError, DelopayAuthenticationError } from './error';\nimport { ApiKeys } from './resources/apiKeys';\nimport { Authentication } from './resources/authentication';\nimport { Billing } from './resources/billing';\nimport { Blocklist } from './resources/blocklist';\nimport { Connectors } from './resources/connectors';\nimport { Customers } from './resources/customers';\nimport { Disputes } from './resources/disputes';\nimport { EphemeralKeys } from './resources/ephemeralKeys';\nimport { Events } from './resources/events';\nimport { Fees } from './resources/fees';\nimport { Mandates } from './resources/mandates';\nimport { MerchantAccounts } from './resources/merchantAccounts';\nimport { PaymentLinks } from './resources/paymentLinks';\nimport { PaymentMethods } from './resources/paymentMethods';\nimport { Payments } from './resources/payments';\nimport { Payouts } from './resources/payouts';\nimport { Poll } from './resources/poll';\nimport { ProfileAcquirers } from './resources/profileAcquirers';\nimport { Profiles } from './resources/profiles';\nimport { Projects } from './resources/projects';\nimport { Refunds } from './resources/refunds';\nimport { Relay } from './resources/relay';\nimport { Routing } from './resources/routing';\nimport { Shops } from './resources/shops';\nimport { StripeConnect } from './resources/stripeConnect';\nimport { ThreeDsRules } from './resources/threeDsRules';\nimport { Users } from './resources/users';\nimport { Verification } from './resources/verification';\nimport { Webhooks } from './resources/webhooks';\nimport { Analytics } from './resources/analytics';\nimport { AnalyticsDashboard } from './resources/analyticsDashboard';\nimport { Cards } from './resources/cards';\nimport { Export } from './resources/export';\nimport { FeatureMatrix } from './resources/featureMatrix';\nimport { Files } from './resources/files';\nimport { Forex } from './resources/forex';\nimport { Regions } from './resources/regions';\nimport { Subscriptions } from './resources/subscriptions';\n\nconst PRODUCTION_URL = 'https://api.delopay.net';\nconst SANDBOX_URL = 'https://sandbox.delopay.net';\n\nconst MAX_RAW_BODY_BYTES = 2048;\nconst MAX_RETRY_AFTER_MS = 30_000;\n\nfunction parseRetryAfter(header: string | null): number | null {\n if (!header) return null;\n const trimmed = header.trim();\n const seconds = Number(trimmed);\n if (Number.isFinite(seconds) && seconds >= 0) {\n return Math.min(seconds * 1000, MAX_RETRY_AFTER_MS);\n }\n const date = Date.parse(trimmed);\n if (Number.isFinite(date)) {\n const delta = date - Date.now();\n return delta > 0 ? Math.min(delta, MAX_RETRY_AFTER_MS) : 0;\n }\n return null;\n}\n\nfunction truncateRawBody(raw: string): string | undefined {\n if (!raw) return undefined;\n return raw.length > MAX_RAW_BODY_BYTES ? raw.slice(0, MAX_RAW_BODY_BYTES) + '…' : raw;\n}\n\nfunction findIdempotencyKey(headers: Record<string, string>): string | undefined {\n for (const [k, v] of Object.entries(headers)) {\n if (k.toLowerCase() === 'idempotency-key') return v;\n }\n return undefined;\n}\n\ninterface CombinedSignal {\n signal: AbortSignal;\n dispose: () => void;\n}\n\nfunction noop(): void {\n // Intentionally empty: no listeners registered, nothing to clean up.\n}\n\nfunction combineSignals(signals: AbortSignal[]): CombinedSignal {\n const controller = new AbortController();\n const listeners: { signal: AbortSignal; handler: () => void }[] = [];\n const dispose = () => {\n for (const { signal, handler } of listeners) {\n signal.removeEventListener('abort', handler);\n }\n listeners.length = 0;\n };\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n dispose();\n return { signal: controller.signal, dispose: noop };\n }\n const handler = () => {\n controller.abort(signal.reason);\n dispose();\n };\n signal.addEventListener('abort', handler, { once: true });\n listeners.push({ signal, handler });\n }\n return { signal: controller.signal, dispose };\n}\n\n/**\n * Events emitted by the debug logger.\n * - `request` — about to send a request (`method`, `url`, `path`)\n * - `response` — response received (`status`, `method`, `path`, `requestId?`)\n * - `retry` — about to retry after a transient failure (`attempt`, `maxRetries`, `method`, `path`)\n */\nexport type DelopayLogger = (\n event: 'request' | 'response' | 'retry',\n data: Record<string, unknown>,\n) => void;\n\n/**\n * Configuration options for the Delopay client.\n */\nexport interface DelopayOptions {\n /** Use the sandbox environment (`https://sandbox.delopay.net`). Defaults to `false` (production). */\n sandbox?: boolean;\n /** Override the base URL entirely. Takes precedence over `sandbox`. */\n baseUrl?: string;\n /** Request timeout in milliseconds. Defaults to `30000` (30 seconds). */\n timeout?: number;\n /**\n * Maximum number of automatic retries for transient failures (5xx, timeout, network errors).\n * Retries use exponential backoff. Set to `0` to disable. Defaults to `2`.\n * Only idempotent-safe requests (GET, DELETE, and requests with an `Idempotency-Key` header) are retried.\n */\n maxRetries?: number;\n /** Enable debug logging of requests and responses. Defaults to `false`. */\n debug?: boolean;\n /**\n * Custom logger for debug events (`request`, `response`, `retry`). When omitted,\n * debug output is written to `console.log`. Has no effect unless `debug` is `true`.\n * Useful for routing SDK logs through pino, winston, or similar structured loggers.\n */\n logger?: DelopayLogger;\n}\n\nconst SENSITIVE_QUERY_KEYS = new Set([\n 'client_secret',\n 'ephemeral_key',\n 'api_key',\n 'publishable_key',\n]);\n\n/**\n * Return a copy of `url` with the values of known-sensitive query parameters\n * replaced by `REDACTED`, leaving the rest of the query string intact.\n * Used only to sanitize URLs before they hit debug logs.\n */\nfunction redactUrlForLogging(url: string): string {\n const qIdx = url.indexOf('?');\n if (qIdx === -1) return url;\n const base = url.slice(0, qIdx);\n const query = url.slice(qIdx + 1);\n const parts = query.split('&').map((pair) => {\n const eqIdx = pair.indexOf('=');\n if (eqIdx === -1) return pair;\n const key = pair.slice(0, eqIdx);\n if (SENSITIVE_QUERY_KEYS.has(decodeURIComponent(key).toLowerCase())) {\n return `${key}=REDACTED`;\n }\n return pair;\n });\n return `${base}?${parts.join('&')}`;\n}\n\n/**\n * Low-level options forwarded to a single HTTP request.\n */\nexport interface RequestOptions {\n /** Request body, serialised as JSON. */\n body?: unknown;\n /**\n * Query-string parameters. `undefined` and `null` values are omitted.\n * Array values are emitted as repeated keys (`?tag=a&tag=b`) — not comma-joined.\n */\n query?: Record<\n string,\n string | number | boolean | null | undefined | (string | number | boolean)[]\n >;\n /** Additional HTTP headers merged with the default `api-key` header. */\n headers?: Record<string, string>;\n /** Override the client-level timeout for this request, in milliseconds. */\n timeout?: number;\n /**\n * Caller-provided `AbortSignal`. Aborting it cancels the in-flight request and rejects\n * with a `DelopayError` carrying code `'ABORTED'`. Combined with the per-request timeout.\n */\n signal?: AbortSignal;\n}\n\nexport type RequestFn = <T>(method: string, path: string, options?: RequestOptions) => Promise<T>;\n\n/**\n * Delopay API client.\n *\n * Instantiate once with your API key and reuse across your application.\n * All resource sub-clients (payments, refunds, customers, …) are exposed\n * as properties on the instance.\n *\n * @example\n * ```typescript\n * const delopay = new Delopay('sk_live_...', { sandbox: false });\n * const payment = await delopay.payments.create({ amount: 5000, currency: 'EUR' });\n * ```\n */\nexport class Delopay {\n /** Utility for verifying incoming webhook signatures (static, no instance needed). */\n static webhooks = Webhooks;\n\n /** The resolved base URL used for all API requests. */\n readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly debug: boolean;\n private readonly logger?: DelopayLogger;\n private jwtToken?: string;\n\n // Merchant-facing\n readonly payments: Payments;\n readonly refunds: Refunds;\n readonly customers: Customers;\n readonly paymentMethods: PaymentMethods;\n readonly paymentLinks: PaymentLinks;\n readonly mandates: Mandates;\n readonly disputes: Disputes;\n readonly payouts: Payouts;\n readonly ephemeralKeys: EphemeralKeys;\n readonly events: Events;\n readonly poll: Poll;\n\n // Connector / routing\n readonly connectors: Connectors;\n readonly routing: Routing;\n readonly profiles: Profiles;\n readonly shops: Shops;\n readonly profileAcquirers: ProfileAcquirers;\n\n // Authentication & verification\n readonly authentication: Authentication;\n readonly verification: Verification;\n\n // Dashboard / internal\n readonly users: Users;\n readonly apiKeys: ApiKeys;\n readonly billing: Billing;\n readonly blocklist: Blocklist;\n readonly fees: Fees;\n readonly merchantAccounts: MerchantAccounts;\n readonly projects: Projects;\n readonly relay: Relay;\n readonly stripeConnect: StripeConnect;\n readonly threeDsRules: ThreeDsRules;\n\n // New resources (Phases 3-4)\n readonly subscriptions: Subscriptions;\n readonly files: Files;\n readonly export: Export;\n readonly forex: Forex;\n readonly regions: Regions;\n readonly analytics: Analytics;\n readonly analyticsDashboard: AnalyticsDashboard;\n readonly featureMatrix: FeatureMatrix;\n readonly cards: Cards;\n\n /**\n * Create a new Delopay client.\n *\n * @param apiKey - Your Delopay API key (e.g. `sk_live_...` or `sk_test_...`).\n * Pass an empty string or omit for JWT-only usage (e.g. dashboard apps).\n * @param options - Optional configuration (sandbox mode, base URL override, timeout).\n */\n constructor(apiKey?: string, options?: DelopayOptions) {\n this.apiKey = apiKey ?? '';\n this.timeout = options?.timeout ?? 30_000;\n this.maxRetries = options?.maxRetries ?? 2;\n this.debug = options?.debug ?? false;\n if (options?.logger !== undefined) this.logger = options.logger;\n\n if (options?.baseUrl !== undefined) {\n this.baseUrl = options.baseUrl;\n } else if (options?.sandbox) {\n this.baseUrl = SANDBOX_URL;\n } else {\n this.baseUrl = PRODUCTION_URL;\n }\n\n const request = this.request.bind(this) as RequestFn;\n\n // JWT auth methods are defined below (setJwtToken / clearJwtToken)\n\n // Merchant-facing\n this.payments = new Payments(request);\n this.refunds = new Refunds(request);\n this.customers = new Customers(request);\n this.paymentMethods = new PaymentMethods(request);\n this.paymentLinks = new PaymentLinks(request);\n this.mandates = new Mandates(request);\n this.disputes = new Disputes(request);\n this.payouts = new Payouts(request);\n this.ephemeralKeys = new EphemeralKeys(request);\n this.events = new Events(request);\n this.poll = new Poll(request);\n\n // Connector / routing\n this.connectors = new Connectors(request);\n this.routing = new Routing(request);\n this.profiles = new Profiles(request);\n this.shops = new Shops(request);\n this.profileAcquirers = new ProfileAcquirers(request);\n\n // Authentication & verification\n this.authentication = new Authentication(request);\n this.verification = new Verification(request);\n\n // Dashboard / internal\n this.users = new Users(request);\n this.apiKeys = new ApiKeys(request);\n this.billing = new Billing(request);\n this.blocklist = new Blocklist(request);\n this.fees = new Fees(request);\n this.merchantAccounts = new MerchantAccounts(request);\n this.projects = new Projects(request);\n this.relay = new Relay(request);\n this.stripeConnect = new StripeConnect(request);\n this.threeDsRules = new ThreeDsRules(request);\n\n // New resources (Phases 3-4)\n this.subscriptions = new Subscriptions(request);\n this.files = new Files(request);\n this.export = new Export(request);\n this.forex = new Forex(request);\n this.regions = new Regions(request);\n this.analytics = new Analytics(request);\n this.analyticsDashboard = new AnalyticsDashboard(request);\n this.featureMatrix = new FeatureMatrix(request);\n this.cards = new Cards(request);\n }\n\n /**\n * Set a JWT token for subsequent requests.\n * When set, requests use `Authorization: Bearer <token>` instead of `api-key`.\n * Useful after `users.signIn()` returns a JWT for dashboard operations.\n */\n setJwtToken(token: string): void {\n this.jwtToken = token;\n }\n\n /**\n * Clear the JWT token, reverting to API key authentication.\n */\n clearJwtToken(): void {\n this.jwtToken = undefined;\n }\n\n /**\n * Make a raw HTTP request to the Delopay API.\n *\n * You rarely need to call this directly — prefer the typed resource methods.\n * Use it only for endpoints not yet covered by a resource class.\n *\n * @param method - HTTP method (`GET`, `POST`, `PUT`, `PATCH`, `DELETE`).\n * @param path - API path starting with `/` (e.g. `/payments`).\n * @param options - Optional body, query parameters, and headers.\n * @returns Parsed JSON response body typed as `T`.\n * @throws {DelopayAuthenticationError} On 401 responses.\n * @throws {DelopayError} On all other non-2xx responses, timeouts, and network errors.\n */\n async request<T>(method: string, path: string, options?: RequestOptions): Promise<T> {\n let url = `${this.baseUrl}${path}`;\n\n if (options?.query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const v of value) {\n if (v !== undefined && v !== null) params.append(key, String(v));\n }\n } else {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n url += `?${qs}`;\n }\n }\n\n const headers: Record<string, string> = {\n ...(this.jwtToken\n ? { Authorization: `Bearer ${this.jwtToken}` }\n : this.apiKey\n ? { 'api-key': this.apiKey }\n : {}),\n ...options?.headers,\n };\n\n // FormData / Blob / ArrayBuffer / URLSearchParams pass through unchanged so callers\n // can send multipart uploads. The runtime (browser or Node 18+ fetch) sets the\n // appropriate Content-Type including the multipart boundary, so we don't touch it.\n const isRawBody =\n options?.body !== undefined &&\n options?.body !== null &&\n (options.body instanceof FormData ||\n options.body instanceof Blob ||\n options.body instanceof ArrayBuffer ||\n options.body instanceof URLSearchParams);\n\n if (options?.body && !isRawBody) {\n headers['Content-Type'] = 'application/json';\n }\n\n const idempotencyKey = findIdempotencyKey(headers)?.trim();\n const isRetryable =\n method === 'GET' ||\n method === 'DELETE' ||\n (idempotencyKey !== undefined && idempotencyKey !== '');\n\n // Serialize body once so circular-reference errors surface immediately and big payloads\n // aren't re-stringified on every retry attempt. Raw bodies pass through untouched.\n let serializedBody: BodyInit | undefined;\n if (isRawBody) {\n serializedBody = options?.body as BodyInit;\n } else if (options?.body) {\n serializedBody = JSON.stringify(options.body);\n }\n\n const callerSignal = options?.signal;\n if (callerSignal?.aborted) {\n throw new DelopayError('Request aborted', {\n status: 0,\n code: 'ABORTED',\n type: 'abort_error',\n });\n }\n\n const timeoutMs = options?.timeout ?? this.timeout;\n\n let lastError: unknown;\n let retryAfterOverrideMs: number | null = null;\n\n const safeUrl = () => redactUrlForLogging(url);\n const emit = (event: 'request' | 'response' | 'retry', data: Record<string, unknown>) => {\n if (!this.debug) return;\n if (this.logger) {\n this.logger(event, data);\n return;\n }\n if (event === 'request')\n console.log(`[delopay] ${data.method as string} ${data.url as string}`);\n else if (event === 'response')\n console.log(\n `[delopay] ${data.status as number} ${data.method as string} ${data.path as string}`,\n );\n else\n console.log(\n `[delopay] retry ${data.attempt as number}/${data.maxRetries as number} ${data.method as string} ${data.path as string}`,\n );\n };\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const base = Math.min(500 * 2 ** (attempt - 1), 5000);\n // Full jitter: pick uniformly in [0, base) to avoid synchronized retry storms.\n const jittered = Math.random() * base;\n const delay = Math.max(retryAfterOverrideMs ?? 0, jittered);\n retryAfterOverrideMs = null;\n await new Promise((resolve) => setTimeout(resolve, delay));\n emit('retry', { attempt, maxRetries: this.maxRetries, method, path });\n }\n\n const timeoutCtrl = new AbortController();\n const timeoutId = setTimeout(() => timeoutCtrl.abort(), timeoutMs);\n const combined = combineSignals(\n callerSignal ? [timeoutCtrl.signal, callerSignal] : [timeoutCtrl.signal],\n );\n\n try {\n emit('request', { method, url: safeUrl(), path });\n\n const response = await fetch(url, {\n method,\n headers,\n body: serializedBody,\n signal: combined.signal,\n });\n\n const requestId =\n response.headers?.get('x-request-id') ?? response.headers?.get('x-trace-id') ?? undefined;\n\n emit('response', { status: response.status, method, path, requestId });\n\n if (!response.ok) {\n const rawBody = await response.text().catch(() => '');\n let parsed: Record<string, unknown> = {};\n if (rawBody) {\n try {\n parsed = JSON.parse(rawBody) as Record<string, unknown>;\n } catch {\n // non-JSON error body (HTML from a proxy, truncated stream, etc.) — keep raw\n }\n }\n // API wraps errors as { error: { message, code, type, data? } } — unwrap if present\n const err = (parsed.error as Record<string, unknown>) ?? parsed;\n const message =\n (err.message as string) ?? `Request failed with status ${response.status}`;\n const code = (err.code as string) ?? '';\n const type = (err.error_type as string) ?? (err.type as string) ?? '';\n const data =\n err.data && typeof err.data === 'object' && !Array.isArray(err.data)\n ? (err.data as Record<string, unknown>)\n : undefined;\n const truncatedRaw = truncateRawBody(rawBody);\n\n if (response.status === 401) {\n throw new DelopayAuthenticationError(message, {\n code,\n type,\n requestId,\n rawBody: truncatedRaw,\n data,\n });\n }\n\n const error = new DelopayError(message, {\n status: response.status,\n code,\n type,\n requestId,\n rawBody: truncatedRaw,\n data,\n });\n\n // Retry on 5xx and 429 (rate limit). 4xx other than 429 are not transient.\n const isTransientStatus = response.status >= 500 || response.status === 429;\n if (isTransientStatus && isRetryable && attempt < this.maxRetries) {\n if (response.status === 429) {\n retryAfterOverrideMs = parseRetryAfter(response.headers?.get('retry-after') ?? null);\n }\n lastError = error;\n continue;\n }\n\n throw error;\n }\n\n const text = await response.text();\n return (text ? JSON.parse(text) : undefined) as T;\n } catch (err) {\n if (err instanceof DelopayError || err instanceof DelopayAuthenticationError) {\n throw err;\n }\n if (err instanceof Error && err.name === 'AbortError') {\n if (callerSignal?.aborted) {\n throw new DelopayError('Request aborted', {\n status: 0,\n code: 'ABORTED',\n type: 'abort_error',\n });\n }\n lastError = new DelopayError('Request timed out', {\n status: 0,\n code: 'TIMEOUT',\n type: 'timeout_error',\n });\n if (isRetryable && attempt < this.maxRetries) continue;\n throw lastError;\n }\n if (err instanceof TypeError) {\n lastError = new DelopayError(`Network error: ${err.message}`, {\n status: 0,\n code: 'NETWORK',\n type: 'network_error',\n });\n if (isRetryable && attempt < this.maxRetries) continue;\n throw lastError;\n }\n throw err;\n } finally {\n clearTimeout(timeoutId);\n combined.dispose();\n }\n }\n\n throw lastError;\n }\n\n /**\n * Auto-paginate a list endpoint. Yields items one by one, fetching\n * the next page automatically when the current one is exhausted.\n *\n * @param listFn - A function that takes `{ limit, offset }` and returns `{ data: T[] }` or `T[]`.\n * @param params - Additional parameters to pass to every page request.\n * @param pageSize - Number of items per page. Defaults to `50`.\n *\n * @example\n * ```typescript\n * for await (const payment of delopay.paginate(\n * (p) => delopay.payments.list(p),\n * )) {\n * console.log(payment.payment_id);\n * }\n * ```\n */\n async *paginate<T, P extends Record<string, unknown>>(\n listFn: (params: P & { limit: number; offset: number }) => Promise<{ data: T[] } | T[]>,\n params?: P,\n pageSize = 50,\n ): AsyncGenerator<T> {\n let offset = 0;\n while (true) {\n const result = await listFn({\n ...((params ?? {}) as P),\n limit: pageSize,\n offset,\n });\n const items = Array.isArray(result) ? result : result.data;\n if (items.length === 0) break;\n for (const item of items) {\n yield item;\n }\n if (items.length < pageSize) break;\n offset += items.length;\n }\n }\n}\n","// Checkout branding — single source of truth for the merchant-editable\n// look of the buyer-facing checkout. Hosts:\n// - the typed `CheckoutBranding` shape and every enum it references\n// - the design-token maps (radius, font, spacing scales)\n// - light & dark default palettes\n// - the persistence codec — decode from a backend payment-link config or\n// a public CheckoutDetails response, encode back to the request shape\n// - the import/export envelope used by the merchant-control-center's\n// \"Import / Export\" buttons\n// - the custom-CSS sanitizer\n// - DOM helpers to apply the resolved branding as `--dp-*` CSS variables\n//\n// Both `delopay-checkout` (the SvelteKit buyer-facing app) and\n// `delopay-control-center` (the merchant Angular dashboard) consume this\n// module. Keeping it here is what stops the form from saving something the\n// checkout can't read back, and vice versa.\n//\n// Persistence layout:\n// - flat backend columns own the \"loud\" tokens (logo, theme,\n// payment_button_*, background_colour, payment_form_header_text,\n// branding_visibility, sdk_layout, payment_form_label_type,\n// custom_message_for_card_terms, seller_name).\n// - everything else lives inside `sdk_ui_rules.branding` as a string-keyed\n// bag — the Hyperswitch struct types `sdk_ui_rules` as\n// `HashMap<String, HashMap<String, String>>`, so:\n// - booleans round-trip as \"true\"/\"false\"\n// - numbers round-trip as decimal strings\n// - the trust-badge list round-trips as a JSON-stringified value\n// under the key \"trustBadges\"\n\n// --- Types --------------------------------------------------------------\n\nexport type CornerRadius = 'square' | 'small' | 'medium' | 'large' | 'pill';\n\n// Surfaces and inputs never make sense pill-shaped (a pill input ends up with\n// half-circle ends crammed against text). The form picker only exposes these\n// four; if a stale 'pill' value lands here from older saved data, decode\n// drops it back to 'medium'. Buttons and badges still allow 'pill'.\nexport type NonPillRadius = Exclude<CornerRadius, 'pill'>;\n\n// Spacing scales — split apart so the merchant can independently tune\n// surface padding, vertical rhythm, input height and pay-button height. Used\n// to live as a single `density` enum but that conflated four dimensions.\nexport type SpacingScale = 'compact' | 'comfortable' | 'spacious';\nexport type SizeScale = 'sm' | 'md' | 'lg';\nexport type SurfaceStyle = 'flat' | 'outlined' | 'elevated';\n\nexport type FontFamily =\n | 'inter'\n | 'system'\n | 'serif'\n | 'mono'\n | 'roboto'\n | 'poppins'\n | 'manrope'\n | 'dm-sans'\n | 'space-grotesk'\n | 'plex-sans'\n | 'work-sans'\n | 'open-sans'\n | 'lora'\n | 'playfair'\n | 'plex-mono'\n | 'jetbrains-mono';\n\nexport type FontWeight = 'regular' | 'medium' | 'semibold' | 'bold';\nexport type LayoutStyle = 'compact' | 'split';\nexport type SummaryPosition = 'left' | 'right';\n\n// Stripe Elements only supports two label modes (\"above\" or hidden via the\n// .Label-collapse hack); a \"floating\" label is not a Stripe concept and\n// would only render in our own mock — preview was lying about it. Persisted\n// `'floating'` is silently decoded to `'above'` for back-compat.\nexport type LabelStyle = 'above' | 'hidden';\n\n// Stripe Elements layout. Honored inside the StripeCardPane only — other\n// connector panes stack vertically regardless of this setting.\nexport type PaymentLayout = 'tabs' | 'accordion' | 'spaced_accordion';\n\nexport type LogoShape = 'square' | 'rounded' | 'circle';\nexport type LogoSize = 'sm' | 'md' | 'lg';\n\nexport interface TrustBadge {\n id: string;\n label: string;\n textColor: string;\n backgroundColor: string;\n borderColor: string | null;\n}\n\nexport interface CheckoutBranding {\n // Brand identity\n displayName: string;\n logoUrl: string;\n tagline: string;\n showLogo: boolean;\n logoShape: LogoShape;\n logoSize: LogoSize;\n\n // Color tokens\n primary: string;\n background: string;\n surface: string;\n text: string;\n heading: string;\n muted: string;\n border: string;\n accentText: string;\n buttonBackground: string;\n buttonText: string;\n\n // Typography\n fontFamily: FontFamily;\n headingWeight: FontWeight;\n\n // Shape — granular per-element. Surfaces & inputs use a narrower union\n // (no pill) because pill cards/inputs are always wrong; button and badge\n // keep the full `CornerRadius` since pill is a legitimate look there.\n radiusSurface: NonPillRadius;\n radiusInput: NonPillRadius;\n radiusButton: CornerRadius;\n radiusBadge: CornerRadius;\n surfaceStyle: SurfaceStyle;\n\n // Spacing — four independent dimensions.\n surfacePadding: SpacingScale;\n verticalGap: SpacingScale;\n inputSize: SizeScale;\n buttonSize: SizeScale;\n\n // Layout\n layout: LayoutStyle;\n summaryPosition: SummaryPosition;\n showOrderSummary: boolean;\n summaryGradient: boolean;\n showTotal: boolean;\n totalLabel: string;\n showCurrencyCode: boolean;\n showOrderItems: boolean;\n\n // Trust badges (fully customizable; empty = hide row).\n trustBadges: TrustBadge[];\n\n // Copy. All of these are optional in the persisted form: empty string\n // means \"unset\" and consumers should fall back (e.g. payButtonLabel falls\n // back to a localized \"Pay $X\" string).\n headerText: string;\n payButtonLabel: string;\n cardTermsMessage: string;\n footerText: string;\n supportEmail: string;\n\n // Stripe Elements behavior. `paymentLayout` only affects what's painted\n // inside Stripe's iframe; non-Stripe connector panes stack vertically\n // regardless. `labelStyle` is also Stripe-iframe scope.\n paymentLayout: PaymentLayout;\n labelStyle: LabelStyle;\n\n // Footer\n showPoweredBy: boolean;\n\n // Advanced — raw CSS appended after brand-token CSS variables are\n // applied, so its declarations win cascade order. Sanitized at render\n // time (see `sanitizeCustomCss`); persisted as-typed under\n // `sdk_ui_rules.branding.customCss`.\n customCss: string;\n}\n\n// --- Token maps ---------------------------------------------------------\n\n// Self-hostable font stacks. The buyer-facing checkout bundles these via\n// @fontsource* packages; the variable-font names ('Inter Variable', …) are\n// listed first so the smaller variable file is preferred when bundled.\nconst FONT_STACKS: Record<FontFamily, string> = {\n inter: \"'Inter Variable', 'Inter', system-ui, -apple-system, sans-serif\",\n system:\n \"system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif\",\n serif: \"Georgia, 'Times New Roman', serif\",\n mono: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n roboto: \"'Roboto', system-ui, sans-serif\",\n poppins: \"'Poppins', system-ui, sans-serif\",\n manrope: \"'Manrope Variable', 'Manrope', system-ui, sans-serif\",\n 'dm-sans': \"'DM Sans Variable', 'DM Sans', system-ui, sans-serif\",\n 'space-grotesk': \"'Space Grotesk Variable', 'Space Grotesk', system-ui, sans-serif\",\n 'plex-sans': \"'IBM Plex Sans', system-ui, sans-serif\",\n 'work-sans': \"'Work Sans Variable', 'Work Sans', system-ui, sans-serif\",\n 'open-sans': \"'Open Sans Variable', 'Open Sans', system-ui, sans-serif\",\n lora: \"'Lora Variable', 'Lora', Georgia, serif\",\n playfair: \"'Playfair Display Variable', 'Playfair Display', Georgia, serif\",\n 'plex-mono': \"'IBM Plex Mono', ui-monospace, monospace\",\n 'jetbrains-mono': \"'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, monospace\",\n};\n\nconst RADIUS_PX: Record<CornerRadius, string> = {\n square: '0px',\n small: '6px',\n medium: '12px',\n large: '20px',\n pill: '999px',\n};\n\nconst FONT_WEIGHT_NUMERIC: Record<FontWeight, string> = {\n regular: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n};\n\nconst SURFACE_PAD: Record<SpacingScale, string> = {\n compact: '1rem',\n comfortable: '1.5rem',\n spacious: '2rem',\n};\n\nconst VERTICAL_GAP: Record<SpacingScale, string> = {\n compact: '0.75rem',\n comfortable: '1rem',\n spacious: '1.5rem',\n};\n\nconst INPUT_PAD: Record<SizeScale, string> = {\n sm: '0.5rem 0.75rem',\n md: '0.625rem 0.75rem',\n lg: '0.875rem 0.875rem',\n};\n\nconst BUTTON_PAD: Record<SizeScale, string> = {\n sm: '0.625rem 1rem',\n md: '0.875rem 1.25rem',\n lg: '1.125rem 1.5rem',\n};\n\nexport function fontStack(family: FontFamily): string {\n return FONT_STACKS[family] ?? FONT_STACKS.inter;\n}\n\nexport function radiusValue(radius: CornerRadius): string {\n return RADIUS_PX[radius] ?? RADIUS_PX.medium;\n}\n\nexport function fontWeightValue(weight: FontWeight): string {\n return FONT_WEIGHT_NUMERIC[weight] ?? '600';\n}\n\nexport function surfacePadValue(scale: SpacingScale): string {\n return SURFACE_PAD[scale] ?? SURFACE_PAD.comfortable;\n}\n\nexport function verticalGapValue(scale: SpacingScale): string {\n return VERTICAL_GAP[scale] ?? VERTICAL_GAP.comfortable;\n}\n\nexport function inputPadValue(size: SizeScale): string {\n return INPUT_PAD[size] ?? INPUT_PAD.md;\n}\n\nexport function buttonPadValue(size: SizeScale): string {\n return BUTTON_PAD[size] ?? BUTTON_PAD.md;\n}\n\nexport function logoDimensions(size: LogoSize): { px: number; radius: number } {\n switch (size) {\n case 'sm':\n return { px: 36, radius: 8 };\n case 'lg':\n return { px: 64, radius: 16 };\n case 'md':\n default:\n return { px: 48, radius: 12 };\n }\n}\n\nconst HEX_RE = /^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/;\n\nexport function isHexColor(value: string): boolean {\n return HEX_RE.test(value.trim());\n}\n\n// Crude perceived-luminance check — picks the right Stripe Elements preset\n// (`'night'` vs `'stripe'`) when the merchant has a dark surface. Inputs we\n// don't recognize as a 6-/3-digit hex fall through to \"light\" since that's\n// the safer assumption for the default palette.\nexport function isDarkSurface(color: string): boolean {\n const m = color.replace('#', '').trim();\n if (m.length !== 3 && m.length !== 6) return false;\n const full =\n m.length === 3\n ? m\n .split('')\n .map((c) => c + c)\n .join('')\n : m;\n const r = parseInt(full.slice(0, 2), 16);\n const g = parseInt(full.slice(2, 4), 16);\n const b = parseInt(full.slice(4, 6), 16);\n if ([r, g, b].some(Number.isNaN)) return false;\n const luma = (r * 299 + g * 587 + b * 114) / 1000;\n return luma < 128;\n}\n\n// --- Defaults -----------------------------------------------------------\n\n// Light-mode DeloPay-branded baseline. Hex values come straight from\n// `design-guidelines/colors.md`:\n// - #1E4FEB is `--color-dp-blue`, the wordmark/icon brand blue\n// - #0A1130 is `--color-dp-blue-dark`, the wordmark navy\n// - the rest are slate-50 / slate-200 / slate-500 / slate-800 from the\n// design system's neutral ramp.\n// Picked for: high contrast, neutral surroundings, brand-blue accents,\n// confident navy CTA. Reads \"fintech\" without feeling cold.\nconst LIGHT_PALETTE = {\n primary: '#1E4FEB',\n background: '#f8fafc',\n surface: '#ffffff',\n text: '#1e293b',\n heading: '#0A1130',\n muted: '#64748b',\n border: '#e2e8f0',\n accentText: '#1E4FEB',\n buttonBackground: '#0A1130',\n buttonText: '#ffffff',\n} as const;\n\nexport const DEFAULT_BADGES: TrustBadge[] = [\n {\n id: 'secure',\n label: 'Secure',\n textColor: '#047857',\n backgroundColor: '#ecfdf5',\n borderColor: '#a7f3d0',\n },\n {\n id: 'ssl',\n label: '256-bit SSL',\n textColor: '#1E4FEB',\n backgroundColor: '#eff6ff',\n borderColor: '#bfdbfe',\n },\n];\n\n// Dark-mode equivalents of DEFAULT_BADGES. Dark trust chips need solid hex\n// (the form's color picker only accepts hex), so we pick the design system's\n// success-900 / info-900 backdrops paired with their *-400 foreground tokens.\nexport const DEFAULT_BADGES_DARK: TrustBadge[] = [\n {\n id: 'secure',\n label: 'Secure',\n textColor: '#34d399',\n backgroundColor: '#064e3b',\n borderColor: '#065f46',\n },\n {\n id: 'ssl',\n label: '256-bit SSL',\n textColor: '#60a5fa',\n backgroundColor: '#172554',\n borderColor: '#1e40af',\n },\n];\n\nconst DEFAULT_BRANDING_BASE: Omit<CheckoutBranding, keyof typeof LIGHT_PALETTE | 'trustBadges'> = {\n displayName: '',\n logoUrl: '',\n tagline: '',\n // Logo + summary gradient OFF by default — an unconfigured DeloPay\n // checkout reads cleaner without a placeholder logo block, and the\n // gradient implies a primary tint the merchant hasn't yet picked.\n showLogo: false,\n logoShape: 'rounded',\n logoSize: 'md',\n\n fontFamily: 'inter',\n headingWeight: 'semibold',\n\n radiusSurface: 'medium',\n radiusInput: 'medium',\n radiusButton: 'medium',\n radiusBadge: 'pill',\n surfaceStyle: 'elevated',\n surfacePadding: 'comfortable',\n verticalGap: 'comfortable',\n inputSize: 'md',\n buttonSize: 'md',\n\n layout: 'split',\n summaryPosition: 'left',\n showOrderSummary: true,\n summaryGradient: false,\n showTotal: true,\n totalLabel: 'Total',\n showCurrencyCode: false,\n showOrderItems: true,\n\n headerText: '',\n payButtonLabel: '',\n cardTermsMessage: '',\n footerText: '',\n supportEmail: '',\n\n paymentLayout: 'tabs',\n labelStyle: 'above',\n showPoweredBy: true,\n\n customCss: '',\n};\n\nexport const DEFAULT_BRANDING: CheckoutBranding = {\n ...DEFAULT_BRANDING_BASE,\n ...LIGHT_PALETTE,\n trustBadges: DEFAULT_BADGES.map((b) => ({ ...b })),\n};\n\n// Dark counterpart to DEFAULT_BRANDING. Same form-only fields stay empty\n// (logo / display name / tagline / copy) — only visual tokens diverge.\n// Palette mirrors the design-guidelines dark ramp:\n// - background = slate-950, surface = slate-900 → soft contrast.\n// - text = slate-200, heading = slate-50 → AA+ contrast on the surface.\n// - muted = slate-400, border = slate-800 → chrome that fades into the bg.\n// - accentText = primary-400, button bg = brand blue → brand pops on dark\n// where the light theme's near-black navy CTA would disappear.\n// - surfaceStyle = 'flat' because soft drop-shadows don't read on dark\n// surfaces; the existing 'elevated' shadow tokens are tuned for light.\nexport const DEFAULT_BRANDING_DARK: CheckoutBranding = {\n ...DEFAULT_BRANDING_BASE,\n primary: '#1E4FEB',\n background: '#020617',\n surface: '#0f172a',\n text: '#e2e8f0',\n heading: '#f8fafc',\n muted: '#94a3b8',\n border: '#1e293b',\n accentText: '#60a5fa',\n buttonBackground: '#1E4FEB',\n buttonText: '#ffffff',\n surfaceStyle: 'flat',\n trustBadges: DEFAULT_BADGES_DARK.map((b) => ({ ...b })),\n};\n\n// Back-compat alias. Prefer `DEFAULT_BRANDING` directly.\nexport function defaultBranding(): CheckoutBranding {\n return cloneBranding(DEFAULT_BRANDING);\n}\n\n// Deep-ish clone — needed because the form mutates state reactively and we\n// don't want shared TrustBadge object refs across the loaded/edit/default\n// snapshots. Spread is shallow; trustBadges array elements would otherwise\n// be shared between snapshots, breaking reset.\nexport function cloneBranding(b: CheckoutBranding): CheckoutBranding {\n return { ...b, trustBadges: b.trustBadges.map((badge) => ({ ...badge })) };\n}\n\n// --- Sanitizer ----------------------------------------------------------\n\n// Hard cap on the persisted custom CSS payload. Mirrors the editor's\n// validation; oversized input is dropped to null rather than truncated,\n// since a half-truncated rule is worse than no rule.\nexport const CUSTOM_CSS_MAX_LENGTH = 50_000;\n\n// Strip CSS tokens that turn a stylesheet into a delivery vector before\n// handing the merchant's input to the renderer. The list isn't exhaustive\n// — it's the everyday surface area:\n//\n// - `</style` would let injected text break out of the <style> block and\n// parse as HTML/JS. Replaced with a benign token (not removed) so\n// `</styled-tag` (unlikely but possible inside a content: string)\n// doesn't silently merge into surrounding text.\n// - `@import` would let the merchant pull in a remote stylesheet on\n// every buyer page-load (analytics by side-channel; possible buyer-IP\n// leak).\n// - `expression(…)` was a legacy IE construct that ran JS from CSS.\n// - `behavior:` and `-moz-binding:` ditto for IE/old-Gecko.\n// - `javascript:` URLs in url(...) execute on resource load in some\n// browsers/contexts.\n//\n// Anything else passes through. The merchant can still write whatever\n// declarations they like (background images, gradients, transforms,\n// keyframes, container queries, …).\nexport function sanitizeCustomCss(raw: string | null | undefined): string | null {\n if (typeof raw !== 'string') return null;\n const trimmed = raw.trim();\n if (trimmed.length === 0) return null;\n if (trimmed.length > CUSTOM_CSS_MAX_LENGTH) return null;\n\n let out = trimmed;\n out = out.replace(/<\\/style/gi, '<\\\\/style');\n out = out.replace(/@import\\b[^;]*;?/gi, '');\n out = out.replace(/expression\\s*\\(/gi, '/* expression( */');\n out = out.replace(/(^|[^a-z-])behavior\\s*:/gi, '$1/* behavior: */');\n out = out.replace(/-moz-binding\\s*:/gi, '/* -moz-binding: */');\n out = out.replace(/url\\s*\\(\\s*[\"']?\\s*javascript:/gi, 'url(invalid:');\n return out;\n}\n\n// --- Codec --------------------------------------------------------------\n\n// Structural shape the decoder reads. Both `CheckoutDetails` (public buyer\n// payload) and `BusinessPaymentLinkConfig` (merchant config request shape)\n// satisfy this via duck typing — they each fill some of these and leave the\n// rest undefined. `merchant_*` and `seller_*`/`logo` are aliases for the\n// same backend field, surfaced under different names by the two payloads.\nexport interface BrandingSource {\n // Identity (one or the other, depending on payload shape)\n merchant_name?: string | null;\n seller_name?: string | null;\n merchant_logo?: string | null;\n logo?: string | null;\n merchant_description?: string | null;\n\n // Visual\n theme?: string | null;\n background_colour?: string | null;\n payment_button_colour?: string | null;\n payment_button_text_colour?: string | null;\n\n // Copy\n payment_form_header_text?: string | null;\n payment_button_text?: string | null;\n custom_message_for_card_terms?: string | null;\n\n // Footer\n branding_visibility?: boolean | null;\n\n // Stripe\n sdk_layout?: string | null;\n payment_form_label_type?: string | null;\n\n // The bag for everything else\n sdk_ui_rules?: Record<string, Record<string, string> | null | undefined> | null;\n}\n\nconst BRANDING_GROUP_KEY = 'branding';\n\nconst ALL_FONT_FAMILIES: readonly FontFamily[] = [\n 'inter',\n 'system',\n 'serif',\n 'mono',\n 'roboto',\n 'poppins',\n 'manrope',\n 'dm-sans',\n 'space-grotesk',\n 'plex-sans',\n 'work-sans',\n 'open-sans',\n 'lora',\n 'playfair',\n 'plex-mono',\n 'jetbrains-mono',\n];\n\nconst ALL_RADII: readonly CornerRadius[] = ['square', 'small', 'medium', 'large', 'pill'];\nconst NON_PILL_RADII: readonly NonPillRadius[] = ['square', 'small', 'medium', 'large'];\n\nfunction pickEnum<T extends string>(value: unknown, allowed: readonly T[], fallback: T): T {\n if (typeof value !== 'string') return fallback;\n return (allowed as readonly string[]).includes(value) ? (value as T) : fallback;\n}\n\nfunction parseBool(value: unknown, fallback: boolean): boolean {\n if (typeof value === 'boolean') return value;\n if (value === 'true') return true;\n if (value === 'false') return false;\n return fallback;\n}\n\nfunction s(value: string | null | undefined): string {\n return typeof value === 'string' ? value : '';\n}\n\n// Decode the JSON-encoded trust badges stored under\n// `sdk_ui_rules.branding.trustBadges`. Tolerant: a malformed payload,\n// missing fields, or wrong types fall through to null so the caller can\n// substitute the default badge set. An explicit empty array means \"no\n// badges\" (we honor it — merchants who hide the row need a way to express\n// that).\nexport function decodeBadges(raw: string | undefined): TrustBadge[] | null {\n if (raw === undefined) return null;\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!Array.isArray(parsed)) return null;\n return parsed\n .filter((b): b is Record<string, unknown> => !!b && typeof b === 'object')\n .map((b, i) => ({\n id: typeof b['id'] === 'string' && b['id'] ? (b['id'] as string) : `badge-${i}`,\n label: typeof b['label'] === 'string' ? (b['label'] as string) : '',\n textColor: typeof b['textColor'] === 'string' ? (b['textColor'] as string) : '#0f172a',\n backgroundColor:\n typeof b['backgroundColor'] === 'string' ? (b['backgroundColor'] as string) : '#f1f5f9',\n borderColor:\n typeof b['borderColor'] === 'string' && b['borderColor']\n ? (b['borderColor'] as string)\n : null,\n }))\n .filter((b) => b.label.length > 0);\n } catch {\n return null;\n }\n}\n\nexport function encodeBadges(badges: TrustBadge[]): string {\n return JSON.stringify(\n badges.map((b) => ({\n id: b.id,\n label: b.label,\n textColor: b.textColor,\n backgroundColor: b.backgroundColor,\n ...(b.borderColor ? { borderColor: b.borderColor } : {}),\n })),\n );\n}\n\n// Read a backend branding source into a fully-resolved CheckoutBranding.\n// Flat fields are authoritative when set; the bag fills in everything not\n// reachable via flat columns. Persisted `labelStyle: 'floating'` (legacy\n// \"floating\" mock) decodes to `'above'`.\nexport function decodeBranding(source: BrandingSource | null | undefined): CheckoutBranding {\n if (!source) return cloneBranding(DEFAULT_BRANDING);\n\n const extras: Record<string, string> = (source.sdk_ui_rules?.[BRANDING_GROUP_KEY] ??\n {}) as Record<string, string>;\n\n const decodedBadges = decodeBadges(extras['trustBadges']);\n\n // Identity name: public payloads call it `merchant_name`, request payloads\n // call it `seller_name`. Same backend field; pick whichever is present.\n const displayName = s(source.merchant_name) || s(source.seller_name);\n const logoUrl = s(source.merchant_logo) || s(source.logo);\n\n // Tagline lives in the bag, but `merchant_description` is its public\n // surface. Either may fill it; bag wins if both are set.\n const tagline = s(extras['tagline']) || s(source.merchant_description);\n\n // Stripe label style: the bag's `labelStyle` is the new source of truth;\n // the legacy flat `payment_form_label_type` is consulted only when the\n // bag is empty. `'floating'` (a legacy preview-only value that Stripe\n // Elements never honored) decodes to `'above'`. `'never'` (legacy backend\n // wording) decodes to `'hidden'`.\n const labelStyle: LabelStyle = (() => {\n const fromBag = extras['labelStyle'];\n if (fromBag === 'above' || fromBag === 'hidden') return fromBag;\n if (fromBag === 'floating') return 'above';\n const legacy = source.payment_form_label_type;\n if (legacy === 'above' || legacy === 'floating') return 'above';\n if (legacy === 'hidden' || legacy === 'never') return 'hidden';\n return DEFAULT_BRANDING.labelStyle;\n })();\n\n return {\n displayName,\n logoUrl,\n tagline,\n showLogo: parseBool(extras['showLogo'], DEFAULT_BRANDING.showLogo),\n logoShape: pickEnum<LogoShape>(\n extras['logoShape'],\n ['square', 'rounded', 'circle'],\n DEFAULT_BRANDING.logoShape,\n ),\n logoSize: pickEnum<LogoSize>(extras['logoSize'], ['sm', 'md', 'lg'], DEFAULT_BRANDING.logoSize),\n\n primary: s(source.theme) || DEFAULT_BRANDING.primary,\n background: s(source.background_colour) || DEFAULT_BRANDING.background,\n surface: s(extras['surface']) || DEFAULT_BRANDING.surface,\n text: s(extras['text']) || DEFAULT_BRANDING.text,\n heading: s(extras['heading']) || s(extras['text']) || DEFAULT_BRANDING.heading,\n muted: s(extras['muted']) || DEFAULT_BRANDING.muted,\n border: s(extras['border']) || DEFAULT_BRANDING.border,\n accentText: s(extras['accentText']) || s(source.theme) || DEFAULT_BRANDING.accentText,\n buttonBackground:\n s(source.payment_button_colour) || s(source.theme) || DEFAULT_BRANDING.buttonBackground,\n buttonText: s(source.payment_button_text_colour) || DEFAULT_BRANDING.buttonText,\n\n fontFamily: pickEnum<FontFamily>(\n extras['fontFamily'],\n ALL_FONT_FAMILIES,\n DEFAULT_BRANDING.fontFamily,\n ),\n headingWeight: pickEnum<FontWeight>(\n extras['headingWeight'],\n ['regular', 'medium', 'semibold', 'bold'],\n DEFAULT_BRANDING.headingWeight,\n ),\n\n radiusSurface: pickEnum<NonPillRadius>(\n extras['radiusSurface'],\n NON_PILL_RADII,\n DEFAULT_BRANDING.radiusSurface,\n ),\n radiusInput: pickEnum<NonPillRadius>(\n extras['radiusInput'],\n NON_PILL_RADII,\n DEFAULT_BRANDING.radiusInput,\n ),\n radiusButton: pickEnum<CornerRadius>(\n extras['radiusButton'],\n ALL_RADII,\n DEFAULT_BRANDING.radiusButton,\n ),\n radiusBadge: pickEnum<CornerRadius>(\n extras['radiusBadge'],\n ALL_RADII,\n DEFAULT_BRANDING.radiusBadge,\n ),\n surfaceStyle: pickEnum<SurfaceStyle>(\n extras['surfaceStyle'],\n ['flat', 'outlined', 'elevated'],\n DEFAULT_BRANDING.surfaceStyle,\n ),\n surfacePadding: pickEnum<SpacingScale>(\n extras['surfacePadding'],\n ['compact', 'comfortable', 'spacious'],\n DEFAULT_BRANDING.surfacePadding,\n ),\n verticalGap: pickEnum<SpacingScale>(\n extras['verticalGap'],\n ['compact', 'comfortable', 'spacious'],\n DEFAULT_BRANDING.verticalGap,\n ),\n inputSize: pickEnum<SizeScale>(\n extras['inputSize'],\n ['sm', 'md', 'lg'],\n DEFAULT_BRANDING.inputSize,\n ),\n buttonSize: pickEnum<SizeScale>(\n extras['buttonSize'],\n ['sm', 'md', 'lg'],\n DEFAULT_BRANDING.buttonSize,\n ),\n\n layout: pickEnum<LayoutStyle>(extras['layout'], ['compact', 'split'], DEFAULT_BRANDING.layout),\n summaryPosition: pickEnum<SummaryPosition>(\n extras['summaryPosition'],\n ['left', 'right'],\n DEFAULT_BRANDING.summaryPosition,\n ),\n showOrderSummary: parseBool(extras['showOrderSummary'], DEFAULT_BRANDING.showOrderSummary),\n summaryGradient: parseBool(extras['summaryGradient'], DEFAULT_BRANDING.summaryGradient),\n showTotal: parseBool(extras['showTotal'], DEFAULT_BRANDING.showTotal),\n totalLabel: s(extras['totalLabel']) || DEFAULT_BRANDING.totalLabel,\n showCurrencyCode: parseBool(extras['showCurrencyCode'], DEFAULT_BRANDING.showCurrencyCode),\n showOrderItems: parseBool(extras['showOrderItems'], DEFAULT_BRANDING.showOrderItems),\n\n trustBadges: decodedBadges ?? DEFAULT_BRANDING.trustBadges.map((b) => ({ ...b })),\n\n headerText: s(source.payment_form_header_text),\n payButtonLabel: s(source.payment_button_text),\n cardTermsMessage: s(source.custom_message_for_card_terms),\n footerText: s(extras['footerText']),\n supportEmail: s(extras['supportEmail']),\n\n paymentLayout: pickEnum<PaymentLayout>(\n source.sdk_layout,\n ['tabs', 'accordion', 'spaced_accordion'],\n DEFAULT_BRANDING.paymentLayout,\n ),\n labelStyle,\n showPoweredBy: source.branding_visibility !== false,\n\n customCss: s(extras['customCss']),\n };\n}\n\n// Encoded request shape — the union of fields the encoder fills. Compatible\n// with `BusinessPaymentLinkConfig` / `PaymentLinkConfigRequest` via\n// structural typing on the consumer side.\nexport interface EncodedBranding {\n theme: string;\n logo: string | null;\n seller_name: string | null;\n sdk_layout: PaymentLayout;\n payment_button_text: string | null;\n payment_button_colour: string;\n payment_button_text_colour: string;\n background_colour: string;\n payment_form_header_text: string | null;\n payment_form_label_type: 'above' | 'never';\n custom_message_for_card_terms: string | null;\n sdk_ui_rules: Record<string, Record<string, string>>;\n branding_visibility: boolean;\n}\n\n// Encode a CheckoutBranding into the backend request shape. `base` is the\n// existing config (if any) — preserves bag entries the form doesn't surface\n// (other sdk_ui_rules groups, business_specific_configs, etc.) by spreading\n// it through.\n//\n// `TBase` is constrained to `object | null | undefined` (not\n// `Record<string, unknown>`) so consumers can pass interface-typed values\n// directly. TS interfaces don't get an implicit string index signature, so\n// they don't structurally satisfy `Record<string, unknown>` even when their\n// property values would all unify to `unknown` — `object` admits them\n// without forcing a cast at every call site. We only spread the value, so\n// no index-signature semantics are needed at runtime.\nexport function encodeBranding<TBase extends object | null | undefined>(\n branding: CheckoutBranding,\n base?: TBase,\n): EncodedBranding & (TBase extends object ? TBase : Record<string, never>) {\n const trim = (v: string): string | null => {\n const t = v.trim();\n return t.length > 0 ? t : null;\n };\n\n // We only read one property off `base` and structural typing on `object`\n // doesn't permit index access, so go through `unknown` here.\n const existingRules = ((base as unknown as Record<string, unknown> | undefined)?.[\n 'sdk_ui_rules'\n ] ?? {}) as Record<string, Record<string, string>>;\n const extras: Record<string, string> = {\n surface: branding.surface,\n text: branding.text,\n heading: branding.heading,\n muted: branding.muted,\n border: branding.border,\n accentText: branding.accentText,\n fontFamily: branding.fontFamily,\n headingWeight: branding.headingWeight,\n radiusSurface: branding.radiusSurface,\n radiusInput: branding.radiusInput,\n radiusButton: branding.radiusButton,\n radiusBadge: branding.radiusBadge,\n surfaceStyle: branding.surfaceStyle,\n surfacePadding: branding.surfacePadding,\n verticalGap: branding.verticalGap,\n inputSize: branding.inputSize,\n buttonSize: branding.buttonSize,\n layout: branding.layout,\n summaryPosition: branding.summaryPosition,\n showOrderSummary: String(branding.showOrderSummary),\n summaryGradient: String(branding.summaryGradient),\n showTotal: String(branding.showTotal),\n totalLabel: branding.totalLabel,\n showCurrencyCode: String(branding.showCurrencyCode),\n showOrderItems: String(branding.showOrderItems),\n showLogo: String(branding.showLogo),\n logoShape: branding.logoShape,\n logoSize: branding.logoSize,\n labelStyle: branding.labelStyle,\n trustBadges: encodeBadges(branding.trustBadges),\n };\n const tagline = trim(branding.tagline);\n if (tagline) extras['tagline'] = tagline;\n const footer = trim(branding.footerText);\n if (footer) extras['footerText'] = footer;\n const support = trim(branding.supportEmail);\n if (support) extras['supportEmail'] = support;\n // Persist raw — sanitization runs at render time so we keep the merchant's\n // input as-typed (preserves comments, whitespace) and let the checkout\n // strip dangerous tokens consistently across all readers.\n const css = trim(branding.customCss);\n if (css) extras['customCss'] = css;\n\n const nextRules: Record<string, Record<string, string>> = {\n ...existingRules,\n [BRANDING_GROUP_KEY]: extras,\n };\n\n // Map `hidden` back to the legacy `never` token the backend's\n // PaymentLinkSdkLabelType enum understands. `floating` no longer exists.\n const legacyLabel: 'above' | 'never' = branding.labelStyle === 'hidden' ? 'never' : 'above';\n\n const flatFields: EncodedBranding = {\n theme: branding.primary,\n logo: trim(branding.logoUrl),\n seller_name: trim(branding.displayName),\n sdk_layout: branding.paymentLayout,\n payment_button_text: trim(branding.payButtonLabel),\n payment_button_colour: branding.buttonBackground,\n payment_button_text_colour: branding.buttonText,\n background_colour: branding.background,\n payment_form_header_text: trim(branding.headerText),\n payment_form_label_type: legacyLabel,\n custom_message_for_card_terms: trim(branding.cardTermsMessage),\n sdk_ui_rules: nextRules,\n branding_visibility: branding.showPoweredBy,\n };\n\n // Spread `base` first to preserve fields the encoder doesn't surface\n // (show_card_terms, show_card_form_by_default, hide_card_nickname_field,\n // enable_button_only_on_form_ready, skip_status_screen,\n // transaction_details, background_image, details_layout,\n // custom_message_for_payment_method_types, payment_link_ui_rules,\n // color_icon_card_cvc_error, is_setup_mandate_flow,\n // enabled_saved_payment_method, display_sdk_only,\n // business_specific_configs, domain_name, allowed_domains).\n return {\n ...base,\n ...flatFields,\n } as EncodedBranding & (TBase extends object ? TBase : Record<string, never>);\n}\n\n// --- Import / Export envelope ------------------------------------------\n\n// Versioned envelope used by the merchant control-center's \"Import /\n// Export\" buttons. Bumping `version` is informational; the importer is\n// graceful and accepts any version (or no envelope at all).\nexport const BRANDING_EXPORT_FORMAT = 'delopay-checkout-branding';\nexport const BRANDING_EXPORT_VERSION = 1;\n\nexport interface BrandingExport {\n format: typeof BRANDING_EXPORT_FORMAT;\n version: number;\n exported_at: string;\n branding: CheckoutBranding;\n}\n\nexport function buildBrandingExport(branding: CheckoutBranding): BrandingExport {\n return {\n format: BRANDING_EXPORT_FORMAT,\n version: BRANDING_EXPORT_VERSION,\n exported_at: new Date().toISOString(),\n branding: cloneBranding(branding),\n };\n}\n\n// Resolve arbitrary JSON into a fully-typed CheckoutBranding. Designed to\n// never throw — every field is independently validated against its type\n// and silently falls back to the light-mode default if missing or\n// malformed:\n// - extra fields the form doesn't know about are ignored,\n// - missing fields inherit defaults,\n// - hex colors that fail the regex stay at the default,\n// - enums outside the allowed set fall back,\n// - a payload with no recognizable shape produces DEFAULT_BRANDING.\n//\n// Accepts either a bare CheckoutBranding object or an envelope produced by\n// `buildBrandingExport()`. The caller (the import handler) only needs to\n// catch JSON.parse errors; everything past that point is total.\nexport function parseImportedBranding(raw: unknown): CheckoutBranding {\n // Unwrap the envelope if present. Don't gate on version — bumping it is\n // informational; this function is the migration layer.\n const root: Record<string, unknown> | null =\n isObject(raw) && isObject(raw['branding'])\n ? (raw['branding'] as Record<string, unknown>)\n : isObject(raw)\n ? raw\n : null;\n\n if (!root) return cloneBranding(DEFAULT_BRANDING);\n\n const dflt = DEFAULT_BRANDING;\n const sStr = (v: unknown, fallback: string): string => (typeof v === 'string' ? v : fallback);\n const sHex = (v: unknown, fallback: string): string =>\n typeof v === 'string' && isHexColor(v) ? v : fallback;\n\n const trustBadges =\n parseTrustBadgesLoose(root['trustBadges']) ?? dflt.trustBadges.map((b) => ({ ...b }));\n\n // `floating` from older exports normalizes to `above`; see decodeBranding.\n const labelStyle: LabelStyle = (() => {\n const v = root['labelStyle'];\n if (v === 'above' || v === 'hidden') return v;\n return dflt.labelStyle;\n })();\n\n return {\n displayName: sStr(root['displayName'], dflt.displayName),\n logoUrl: sStr(root['logoUrl'], dflt.logoUrl),\n tagline: sStr(root['tagline'], dflt.tagline),\n showLogo: parseBool(root['showLogo'], dflt.showLogo),\n logoShape: pickEnum<LogoShape>(\n root['logoShape'],\n ['square', 'rounded', 'circle'],\n dflt.logoShape,\n ),\n logoSize: pickEnum<LogoSize>(root['logoSize'], ['sm', 'md', 'lg'], dflt.logoSize),\n\n primary: sHex(root['primary'], dflt.primary),\n background: sHex(root['background'], dflt.background),\n surface: sHex(root['surface'], dflt.surface),\n text: sHex(root['text'], dflt.text),\n heading: sHex(root['heading'], dflt.heading),\n muted: sHex(root['muted'], dflt.muted),\n border: sHex(root['border'], dflt.border),\n accentText: sHex(root['accentText'], dflt.accentText),\n buttonBackground: sHex(root['buttonBackground'], dflt.buttonBackground),\n buttonText: sHex(root['buttonText'], dflt.buttonText),\n\n fontFamily: pickEnum<FontFamily>(root['fontFamily'], ALL_FONT_FAMILIES, dflt.fontFamily),\n headingWeight: pickEnum<FontWeight>(\n root['headingWeight'],\n ['regular', 'medium', 'semibold', 'bold'],\n dflt.headingWeight,\n ),\n\n radiusSurface: pickEnum<NonPillRadius>(\n root['radiusSurface'],\n NON_PILL_RADII,\n dflt.radiusSurface,\n ),\n radiusInput: pickEnum<NonPillRadius>(root['radiusInput'], NON_PILL_RADII, dflt.radiusInput),\n radiusButton: pickEnum<CornerRadius>(root['radiusButton'], ALL_RADII, dflt.radiusButton),\n radiusBadge: pickEnum<CornerRadius>(root['radiusBadge'], ALL_RADII, dflt.radiusBadge),\n surfaceStyle: pickEnum<SurfaceStyle>(\n root['surfaceStyle'],\n ['flat', 'outlined', 'elevated'],\n dflt.surfaceStyle,\n ),\n surfacePadding: pickEnum<SpacingScale>(\n root['surfacePadding'],\n ['compact', 'comfortable', 'spacious'],\n dflt.surfacePadding,\n ),\n verticalGap: pickEnum<SpacingScale>(\n root['verticalGap'],\n ['compact', 'comfortable', 'spacious'],\n dflt.verticalGap,\n ),\n inputSize: pickEnum<SizeScale>(root['inputSize'], ['sm', 'md', 'lg'], dflt.inputSize),\n buttonSize: pickEnum<SizeScale>(root['buttonSize'], ['sm', 'md', 'lg'], dflt.buttonSize),\n\n layout: pickEnum<LayoutStyle>(root['layout'], ['compact', 'split'], dflt.layout),\n summaryPosition: pickEnum<SummaryPosition>(\n root['summaryPosition'],\n ['left', 'right'],\n dflt.summaryPosition,\n ),\n showOrderSummary: parseBool(root['showOrderSummary'], dflt.showOrderSummary),\n summaryGradient: parseBool(root['summaryGradient'], dflt.summaryGradient),\n showTotal: parseBool(root['showTotal'], dflt.showTotal),\n totalLabel: sStr(root['totalLabel'], dflt.totalLabel),\n showCurrencyCode: parseBool(root['showCurrencyCode'], dflt.showCurrencyCode),\n showOrderItems: parseBool(root['showOrderItems'], dflt.showOrderItems),\n\n trustBadges,\n\n headerText: sStr(root['headerText'], dflt.headerText),\n payButtonLabel: sStr(root['payButtonLabel'], dflt.payButtonLabel),\n cardTermsMessage: sStr(root['cardTermsMessage'], dflt.cardTermsMessage),\n footerText: sStr(root['footerText'], dflt.footerText),\n supportEmail: sStr(root['supportEmail'], dflt.supportEmail),\n\n paymentLayout: pickEnum<PaymentLayout>(\n root['paymentLayout'],\n ['tabs', 'accordion', 'spaced_accordion'],\n dflt.paymentLayout,\n ),\n labelStyle,\n showPoweredBy: parseBool(root['showPoweredBy'], dflt.showPoweredBy),\n\n customCss: sStr(root['customCss'], dflt.customCss).slice(0, CUSTOM_CSS_MAX_LENGTH),\n };\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n// Loose trust-badge parser used by the importer. Unlike `decodeBadges`\n// (which reads the JSON-stringified backend bag), this accepts an array of\n// objects directly. Returns null when the input isn't an array — the\n// caller falls back to the default badge set; an explicit empty array is\n// honored.\nfunction parseTrustBadgesLoose(raw: unknown): TrustBadge[] | null {\n if (!Array.isArray(raw)) return null;\n return raw\n .filter(isObject)\n .map((b, i) => ({\n id: typeof b['id'] === 'string' && b['id'] ? (b['id'] as string) : `badge-${i}`,\n label: typeof b['label'] === 'string' ? (b['label'] as string) : '',\n textColor:\n typeof b['textColor'] === 'string' && isHexColor(b['textColor'] as string)\n ? (b['textColor'] as string)\n : '#0f172a',\n backgroundColor:\n typeof b['backgroundColor'] === 'string' && isHexColor(b['backgroundColor'] as string)\n ? (b['backgroundColor'] as string)\n : '#f1f5f9',\n borderColor:\n typeof b['borderColor'] === 'string' && isHexColor(b['borderColor'] as string)\n ? (b['borderColor'] as string)\n : null,\n }))\n .filter((b) => b.label.length > 0);\n}\n\n// --- DOM helpers --------------------------------------------------------\n\n// Write branding tokens onto a target element as CSS custom properties.\n// The buyer-facing checkout sets these on `<html>` so every component sees\n// the same set, including Stripe Elements (indirectly via\n// appearance.variables). The merchant control-center's preview component\n// uses an analogous `--p-*` set with `var(--dp-*, fallback)` indirection so\n// a custom-CSS rule like `:root{--dp-primary:red}` overrides the preview\n// without re-typing the whole brand.\nexport function applyBrandingVariables(el: HTMLElement, b: CheckoutBranding): void {\n const set = (k: string, v: string) => {\n el.style.setProperty(k, v);\n };\n\n set('--dp-primary', b.primary);\n set('--dp-bg', b.background);\n set('--dp-surface', b.surface);\n set('--dp-text', b.text);\n set('--dp-heading', b.heading);\n set('--dp-muted', b.muted);\n set('--dp-border', b.border);\n set('--dp-accent-text', b.accentText);\n set('--dp-btn-bg', b.buttonBackground);\n set('--dp-btn-fg', b.buttonText);\n\n set('--dp-radius-surface', radiusValue(b.radiusSurface));\n set('--dp-radius-input', radiusValue(b.radiusInput));\n set('--dp-radius-button', radiusValue(b.radiusButton));\n set('--dp-radius-badge', radiusValue(b.radiusBadge));\n\n set('--dp-font', fontStack(b.fontFamily));\n set('--dp-heading-weight', fontWeightValue(b.headingWeight));\n\n set('--dp-pad-surface', SURFACE_PAD[b.surfacePadding]);\n set('--dp-gap-vertical', VERTICAL_GAP[b.verticalGap]);\n set('--dp-input-pad', INPUT_PAD[b.inputSize]);\n set('--dp-button-pad', BUTTON_PAD[b.buttonSize]);\n\n set('--dp-shadow', shadowFor(b.surfaceStyle));\n set(\n '--dp-surface-border',\n b.surfaceStyle === 'outlined' ? `1px solid ${b.border}` : '1px solid transparent',\n );\n}\n\nexport function shadowFor(style: SurfaceStyle): string {\n switch (style) {\n case 'elevated':\n return '0 1px 2px rgba(15, 23, 42, 0.04), 0 8px 32px -12px rgba(15, 23, 42, 0.08)';\n case 'outlined':\n case 'flat':\n default:\n return 'none';\n }\n}\n","import type { AuthResponse, SignUpWithMerchantIdRequest } from '../../types';\nimport type {\n AdminSignInRequest,\n AuthorizeResponse,\n CreateInternalUserRequest,\n CreateTenantUserRequest,\n OnboardMerchantRequest,\n OnboardMerchantResponse,\n SignupToggleRequest,\n SignupToggleResponse,\n} from '../types';\nimport type { RequestFn } from '../../client';\n\nexport class Admin {\n constructor(private readonly request: RequestFn) {}\n\n async signIn(params: AdminSignInRequest): Promise<AuthResponse> {\n return this.request('POST', '/admin/signin', { body: params });\n }\n\n async createInternalUser(params: CreateInternalUserRequest): Promise<AuthorizeResponse> {\n return this.request('POST', '/admin/internal_signup', { body: params });\n }\n\n async createTenant(params: CreateTenantUserRequest): Promise<AuthorizeResponse> {\n return this.request('POST', '/admin/tenant_signup', { body: params });\n }\n\n /**\n * Create a new merchant admin user and merchant account atomically.\n *\n * This is the correct endpoint for bootstrapping the first admin user in a\n * fresh deployment — `internal_signup`/`tenant_signup` both require\n * pre-existing merchant records that don't exist on a clean database.\n *\n * `POST /admin/signup_with_merchant_id`\n */\n async signupWithMerchantId(params: SignUpWithMerchantIdRequest): Promise<AuthorizeResponse> {\n return this.request('POST', '/admin/signup_with_merchant_id', { body: params });\n }\n\n /** Toggle public signup on/off. `POST /admin/settings/signup` */\n async setSignupSettings(params: SignupToggleRequest): Promise<SignupToggleResponse> {\n return this.request('POST', '/admin/settings/signup', { body: params });\n }\n\n /** Read current public-signup status. `GET /admin/settings/signup` */\n async getSignupSettings(): Promise<SignupToggleResponse> {\n return this.request('GET', '/admin/settings/signup');\n }\n\n /** Full merchant bootstrap — user + merchant + project + profile + keys. `POST /admin/onboard_merchant` */\n async onboardMerchant(params: OnboardMerchantRequest): Promise<OnboardMerchantResponse> {\n return this.request('POST', '/admin/onboard_merchant', { body: params });\n }\n}\n","import type {\n MerchantAccountResponse,\n MerchantAccountUpdateRequest,\n ProfileResponse,\n} from '../../types';\nimport type {\n AdminCustomerListParams,\n AdminCustomerListResponse,\n AdminCustomerDetail,\n AdminTransactionListParams,\n AdminTransactionListResponse,\n AdminAnalyticsRequest,\n PlatformAnalyticsResponse,\n OverviewStatsResponse,\n PaymentAnalyticsRequest,\n PaymentAnalyticsResponse,\n AdminCreateUserForMerchantRequest,\n AdminUpdateUserRequest,\n AdminUserResponse,\n} from '../types';\nimport type { RequestFn } from '../../client';\n\nexport class AdminPortal {\n constructor(private readonly request: RequestFn) {}\n\n async listCustomers(params?: AdminCustomerListParams): Promise<AdminCustomerListResponse> {\n return this.request('GET', '/admin-portal/customers', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n async getCustomer(customerId: string): Promise<AdminCustomerDetail> {\n return this.request('GET', `/admin-portal/customers/${encodeURIComponent(customerId)}`);\n }\n\n async listTransactions(\n params?: AdminTransactionListParams,\n ): Promise<AdminTransactionListResponse> {\n return this.request('GET', '/admin-portal/transactions', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n async analytics(params: AdminAnalyticsRequest): Promise<PlatformAnalyticsResponse> {\n return this.request('GET', '/admin-portal/analytics', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n async overviewStats(): Promise<OverviewStatsResponse> {\n return this.request('GET', '/admin-portal/overview-stats');\n }\n\n async paymentAnalytics(params: PaymentAnalyticsRequest): Promise<PaymentAnalyticsResponse> {\n return this.request('GET', '/admin-portal/payment-analytics', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n /**\n * Retrieve a merchant account via the admin portal. Unlike\n * `merchantAccounts.retrieve`, this route accepts an admin JWT (or admin API\n * key) and does not require the JWT to be scoped to the target merchant.\n */\n async retrieveAccount(merchantId: string): Promise<MerchantAccountResponse> {\n return this.request('GET', `/admin-portal/accounts/${encodeURIComponent(merchantId)}`);\n }\n\n /**\n * Update a merchant account via the admin portal. Authenticated via admin JWT\n * or admin API key.\n */\n async updateAccount(\n merchantId: string,\n params: MerchantAccountUpdateRequest,\n ): Promise<MerchantAccountResponse> {\n return this.request('POST', `/admin-portal/accounts/${encodeURIComponent(merchantId)}`, {\n body: params,\n });\n }\n\n /**\n * Delete a merchant account via the admin portal. Authenticated via admin JWT\n * or admin API key.\n */\n async deleteAccount(merchantId: string): Promise<MerchantAccountResponse> {\n return this.request('DELETE', `/admin-portal/accounts/${encodeURIComponent(merchantId)}`);\n }\n\n /**\n * Create a brand-new user attached to the given merchant. The user is\n * marked `is_verified = true` so the admin can hand off credentials\n * immediately — no email round-trip is sent.\n */\n async createUserForMerchant(\n customerId: string,\n body: AdminCreateUserForMerchantRequest,\n ): Promise<AdminUserResponse> {\n return this.request('POST', `/admin-portal/customers/${encodeURIComponent(customerId)}/users`, {\n body,\n });\n }\n\n /**\n * Edit a user record. Any subset of fields may be supplied. `role_id`\n * requires `merchant_id`. `password` triggers a password reset (validated\n * against signup policy + JWT blacklist). `reset_2fa` clears TOTP state\n * so the user re-enrolls on next login. `is_active` supports both\n * directions: false soft-disables, true reactivates a soft-disabled user.\n */\n async updateUser(userId: string, body: AdminUpdateUserRequest): Promise<AdminUserResponse> {\n return this.request('PATCH', `/admin-portal/users/${encodeURIComponent(userId)}`, { body });\n }\n\n /**\n * Soft-delete a user globally: deactivates the row, blacklists existing\n * JWTs, and wipes credentials. Distinct from `deleteUserRole`, which\n * removes a single role binding while leaving the user signed-in elsewhere.\n */\n async deleteUser(userId: string): Promise<void> {\n return this.request('DELETE', `/admin-portal/users/${encodeURIComponent(userId)}`);\n }\n\n /**\n * Set a target merchant's shop iframe-allowed origins. Internal-admin\n * route — accepts an admin JWT or admin API key without requiring the\n * caller to be scoped to the target merchant. Pass `null` (or an empty\n * array) to clear the allowlist back to same-origin only.\n *\n * Server validates each origin: full origin (scheme + host[:port]),\n * no path/query/fragment, no wildcards.\n */\n async updateShopIframeOrigins(\n merchantId: string,\n profileId: string,\n origins: string[] | null,\n ): Promise<ProfileResponse> {\n return this.request(\n 'POST',\n `/admin-portal/accounts/${encodeURIComponent(merchantId)}/business_profile/${encodeURIComponent(profileId)}/iframe-origins`,\n { body: { iframe_allowed_origins: origins } },\n );\n }\n}\n","import type { AuditLogListParams, AuditLogListResponse, AuditLogResponse } from '../types';\nimport type { RequestFn } from '../../client';\n\nexport class AuditLogs {\n constructor(private readonly request: RequestFn) {}\n\n async list(params?: AuditLogListParams): Promise<AuditLogListResponse> {\n return this.request('GET', '/admin-portal/audit', {\n query: params as Record<string, string | number | boolean | undefined>,\n });\n }\n\n async retrieve(logId: string): Promise<AuditLogResponse> {\n return this.request('GET', `/admin-portal/audit/${encodeURIComponent(logId)}`);\n }\n}\n","import type { RequestFn } from '../../client';\n\nexport class Cache {\n constructor(private readonly request: RequestFn) {}\n\n /** Invalidate a cache entry by key. `POST /cache/invalidate/{key}` */\n async invalidate(key: string): Promise<Record<string, unknown>> {\n return this.request('POST', `/cache/invalidate/${encodeURIComponent(key)}`);\n }\n}\n","import type {\n CardIssuerCreateRequest,\n CardIssuerResponse,\n CardIssuerUpdateRequest,\n CardIssuerListResponse,\n} from '../types';\nimport type { RequestFn } from '../../client';\n\nexport class CardIssuers {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: CardIssuerCreateRequest): Promise<CardIssuerResponse> {\n return this.request('POST', '/card_issuers', { body: params });\n }\n\n async update(issuerId: string, params: CardIssuerUpdateRequest): Promise<CardIssuerResponse> {\n return this.request('PUT', `/card_issuers/${encodeURIComponent(issuerId)}`, { body: params });\n }\n\n async list(): Promise<CardIssuerListResponse> {\n return this.request('GET', '/card_issuers');\n }\n}\n","import type { RequestFn } from '../../client';\n\nexport class Configs {\n constructor(private readonly request: RequestFn) {}\n\n /** Create a config. `POST /configs` */\n async create(params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('POST', '/configs', { body: params });\n }\n\n /** Retrieve a config by key. `GET /configs/{key}` */\n async retrieve(key: string): Promise<Record<string, unknown>> {\n return this.request('GET', `/configs/${encodeURIComponent(key)}`);\n }\n\n /** Update a config. `PUT /configs/{key}` */\n async update(key: string, params: Record<string, unknown>): Promise<Record<string, unknown>> {\n return this.request('PUT', `/configs/${encodeURIComponent(key)}`, { body: params });\n }\n\n /** Delete a config. `DELETE /configs/{key}` */\n async delete(key: string): Promise<Record<string, unknown>> {\n return this.request('DELETE', `/configs/${encodeURIComponent(key)}`);\n }\n}\n","import type { ConnectorRestrictionResponse, UpsertConnectorRestrictionRequest } from '../types';\nimport type { RequestFn } from '../../client';\n\n/**\n * Admin-only allowlist for phased connector rollouts.\n *\n * Default-open semantics: a connector with no restriction row is\n * usable by every merchant (current behavior). A connector with a\n * row is gated — only merchants in `allowed_merchant_ids` can attach\n * a connector account. Enforced server-side at MCA-create time.\n */\nexport class ConnectorRestrictions {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Idempotent upsert. If a row exists for `connector_name`, its\n * allowlist + reason are replaced. To open the connector to\n * everyone again, call `delete()`.\n */\n async upsert(body: UpsertConnectorRestrictionRequest): Promise<ConnectorRestrictionResponse> {\n return this.request('POST', '/admin/connector_restrictions', { body });\n }\n\n async list(): Promise<ConnectorRestrictionResponse[]> {\n return this.request('GET', '/admin/connector_restrictions');\n }\n\n async retrieve(connectorName: string): Promise<ConnectorRestrictionResponse> {\n return this.request(\n 'GET',\n `/admin/connector_restrictions/${encodeURIComponent(connectorName)}`,\n );\n }\n\n /** Removing the row makes the connector public again. */\n async delete(connectorName: string): Promise<{ connector_name: string; deleted: boolean }> {\n return this.request(\n 'DELETE',\n `/admin/connector_restrictions/${encodeURIComponent(connectorName)}`,\n );\n }\n}\n","import type { GsmRuleCreateRequest, GsmRuleResponse, GsmRuleUpdateRequest } from '../types';\nimport type { RequestFn } from '../../client';\n\nexport class Gsm {\n constructor(private readonly request: RequestFn) {}\n\n async create(params: GsmRuleCreateRequest): Promise<GsmRuleResponse> {\n return this.request('POST', '/gsm', { body: params });\n }\n\n async retrieve(params: Record<string, unknown>): Promise<GsmRuleResponse> {\n return this.request('POST', '/gsm/get', { body: params });\n }\n\n async update(params: GsmRuleUpdateRequest): Promise<GsmRuleResponse> {\n return this.request('POST', '/gsm/update', { body: params });\n }\n\n async delete(params: Record<string, unknown>): Promise<GsmRuleResponse> {\n return this.request('POST', '/gsm/delete', { body: params });\n }\n}\n","import type { AdminAdjustmentRequest, AdminAdjustmentResponse } from '../types';\nimport type { RequestFn } from '../../client';\n\n/**\n * Platform-level ledger adjustments on a merchant's balance. Admin-only\n * routes under `/billing/{merchantId}/admin/credit|debit`. Exposed only\n * via `'@delopay/sdk/internal'` so the public merchant SDK doesn't\n * advertise the admin adjustment path in autocomplete.\n */\nexport class PlatformBilling {\n constructor(private readonly request: RequestFn) {}\n\n /**\n * Manually credit a merchant's balance (e.g. promotional credit,\n * dispute reversal, manual correction).\n *\n * @param merchantId - The merchant account ID.\n * @param params - Credit amount and reason.\n */\n async credit(\n merchantId: string,\n params: AdminAdjustmentRequest,\n ): Promise<AdminAdjustmentResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/admin/credit`, {\n body: params,\n });\n }\n\n /**\n * Manually debit a merchant's balance.\n *\n * @param merchantId - The merchant account ID.\n * @param params - Debit amount and reason.\n */\n async debit(\n merchantId: string,\n params: AdminAdjustmentRequest,\n ): Promise<AdminAdjustmentResponse> {\n return this.request('POST', `/billing/${encodeURIComponent(merchantId)}/admin/debit`, {\n body: params,\n });\n }\n}\n","import type {\n FeeScheduleCreateRequest,\n FeeScheduleResponse,\n FeeScheduleUpdateRequest,\n} from '../../types';\nimport type { RequestFn } from '../../client';\n\n/**\n * Platform-wide fee schedule management. Admin-only routes under\n * `/admin/fees/*`. Exposed only via `'@delopay/sdk/internal'`.\n */\nexport class PlatformFees {\n constructor(private readonly request: RequestFn) {}\n\n /** Create a platform fee schedule for a specific merchant. */\n async create(params: FeeScheduleCreateRequest, merchantId: string): Promise<FeeScheduleResponse> {\n return this.request('POST', '/admin/fees', {\n body: params,\n query: { merchant_id: merchantId },\n });\n }\n\n /** List every platform fee schedule assigned to a merchant. */\n async list(merchantId: string): Promise<FeeScheduleResponse[]> {\n return this.request('GET', '/admin/fees/list', {\n query: { merchant_id: merchantId },\n });\n }\n\n /** Retrieve a single platform fee schedule by ID. */\n async retrieve(feeId: string): Promise<FeeScheduleResponse> {\n return this.request('GET', `/admin/fees/${encodeURIComponent(feeId)}`);\n }\n\n /** Update a platform fee schedule. */\n async update(feeId: string, params: FeeScheduleUpdateRequest): Promise<FeeScheduleResponse> {\n return this.request('PUT', `/admin/fees/${encodeURIComponent(feeId)}`, { body: params });\n }\n\n /** Delete a platform fee schedule. */\n async delete(feeId: string): Promise<FeeScheduleResponse> {\n return this.request('DELETE', `/admin/fees/${encodeURIComponent(feeId)}`);\n }\n}\n","import type { RequestFn } from '../client';\nimport { Delopay } from '../client';\nimport { Admin } from './resources/admin';\nimport { AdminPortal } from './resources/adminPortal';\nimport { AuditLogs } from './resources/auditLogs';\nimport { Cache } from './resources/cache';\nimport { CardIssuers } from './resources/cardIssuers';\nimport { Configs } from './resources/configs';\nimport { ConnectorRestrictions } from './resources/connectorRestrictions';\nimport { Gsm } from './resources/gsm';\nimport { PlatformBilling } from './resources/platformBilling';\nimport { PlatformFees } from './resources/platformFees';\n\n/**\n * Internal-only Delopay client for DeloPay staff tooling (the admin\n * control-center, audit UIs, etc.). Extends the public `Delopay` surface\n * with admin-plane resources that must **not** be discoverable from the\n * merchant-facing package entry.\n *\n * Import path: `import { DelopayInternal } from '@delopay/sdk/internal'`.\n * The merchant-facing `import { Delopay } from '@delopay/sdk'` never\n * surfaces these.\n */\nexport class DelopayInternal extends Delopay {\n /** Bootstrap admin endpoints — signup, signin, onboarding. */\n readonly admin: Admin;\n /** Platform-wide customer, transaction, analytics, merchant-account ops. */\n readonly adminPortal: AdminPortal;\n /** Audit log reads. */\n readonly auditLogs: AuditLogs;\n /** Backend cache invalidation. */\n readonly cache: Cache;\n /** Platform card-issuer program management. */\n readonly cardIssuers: CardIssuers;\n /** Generic platform config store. */\n readonly configs: Configs;\n /** Per-merchant connector allowlist for phased rollouts. */\n readonly connectorRestrictions: ConnectorRestrictions;\n /** GSM (Gateway Status Mapping) routing rules. */\n readonly gsm: Gsm;\n /** Admin-only ledger credits/debits against a merchant's balance. */\n readonly platformBilling: PlatformBilling;\n /** Platform-wide fee schedules assigned to merchants. */\n readonly platformFees: PlatformFees;\n\n constructor(...args: ConstructorParameters<typeof Delopay>) {\n super(...args);\n const request = this.request.bind(this) as RequestFn;\n this.admin = new Admin(request);\n this.adminPortal = new AdminPortal(request);\n this.auditLogs = new AuditLogs(request);\n this.cache = new Cache(request);\n this.cardIssuers = new CardIssuers(request);\n this.configs = new Configs(request);\n this.connectorRestrictions = new ConnectorRestrictions(request);\n this.gsm = new Gsm(request);\n this.platformBilling = new PlatformBilling(request);\n this.platformFees = new PlatformFees(request);\n }\n}\n"],"mappings":"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","names":[]}
|