@torrow/sdk-client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/TorrowClientConfig.ts","../../../src/http/auth.ts","../../../src/http/TorrowHttpError.ts","../../../src/util/json.ts","../../../src/util/query-string.ts","../../../src/util/url.ts","../../../src/http/HttpClient.ts","../../../src/raw/RawClient.ts","../../../src/util/path.ts","../../../src/resources/common/item-social-facet-base.ts","../../../src/resources/common/timetable-query.ts","../../../src/resources/calendars/CalendarsFacade.ts","../../../src/resources/cases/CasesFacade.ts","../../../src/resources/contacts/ContactsFacade.ts","../../../src/resources/contexts/ContextsFacade.ts","../../../src/resources/notes/NotesFacade.ts","../../../src/resources/relations/RelationsFacade.ts","../../../src/resources/common/implicit-tag-params.ts","../../../src/resources/resources/ResourcesFacade.ts","../../../src/resources/services/ServicesFacade.ts","../../../src/resources/auth/AuthFacade.ts","../../../src/resources/user-profiles/ProfilesFacade.ts","../../../src/resources/views/ViewsFacade.ts","../../../src/resources/search/SearchFacade.ts","../../../src/resources/action-history/ActionHistoryFacade.ts","../../../src/resources/accounting-transactions/AccountingTransactionsFacade.ts","../../../src/resources/announcements/AnnouncementsFacade.ts","../../../src/resources/export-import/ExportImportFacade.ts","../../../src/resources/reports/ReportsFacade.ts","../../../src/resources/loyalty-systems/LoyaltySystemsFacade.ts","../../../src/resources/loyalty-cards/LoyaltyCardsFacade.ts","../../../src/resources/user-settings/UserSettingsFacade.ts","../../../src/resources/user/UserFacade.ts","../../../src/resources/block-reason/BlockReasonsFacade.ts","../../../src/resources/external-auths/ExternalAuthsFacade.ts","../../../src/resources/id-generator/IdGeneratorFacade.ts","../../../src/resources/integrations/IntegrationsFacade.ts","../../../src/resources/item/ItemFacade.ts","../../../src/resources/short-url/ShortUrlFacade.ts","../../../src/resources/thesaurus/ThesaurusFacade.ts","../../../src/TorrowClient.ts","../../../src/resources/services/booking-wizard-hints.ts","../../../src/resources/services/booking-wizard-expand.ts","../../../src/resources/cases/payment-hints.ts"],"sourcesContent":["/**\n * Публичный продакшен-шлюз Torrow (только origin, без `/api/v1`).\n * Переопредели {@link TorrowClientConfig.baseUrl}, если бьёшься в другой стенд или мок.\n */\nexport const DEFAULT_TORROW_API_BASE_URL = \"https://torrow.net\";\n\nexport interface TorrowClientConfig {\n /**\n * Origin API, например `https://torrow.net` (слэш в конце не нужен; пути `/api/v1/...` добавляет клиент).\n * Если не задан — используется {@link DEFAULT_TORROW_API_BASE_URL} (единый интернет-сервис Torrow).\n */\n baseUrl?: string;\n /**\n * Bearer для `Authorization`. Не задавай или возвращай `undefined` — заголовок не ставится\n * (подходит для публичных GET и гостевых сценариев; конкретные эндпоинты — по контракту API).\n *\n * Обновление access по **refresh** и хранение токенов — в приложении: удобно вызывать\n * **`client.auth.refresh`** (внутренний HTTP **без** этого колбэка и без `securityToken`) или\n * отдельный {@link HttpClient} без `getAccessToken`, чтобы избежать рекурсии. См. **`docs/sdk-development-plan.md`** §8,\n * пример **`examples/node/auth/74-auth-getaccesstoken-with-refresh.ts`**. Смысл полей ответа **`TokenResp`** —\n * **`@torrow/sdk-docs`** (`mcpAuthFieldCatalog.TokenResp`, **`tokenRespFieldDocEntries`**).\n */\n getAccessToken?: () => Promise<string | undefined>;\n /**\n * Гостевой или общий токен доступа к сущности: при непустом значении SDK добавляет query-параметр\n * **`securityToken`** ко **всем** запросам этого клиента (вместе с остальными query полями пути).\n * Типичный кейс — событие-заказ после **`createOrder`** (`consumerSecurityToken` и т.д.); см. capability-map и **`@torrow/sdk-docs`** (`mcpAuthFieldCatalog` → `TorrowClientConfigAuth.securityToken`).\n */\n securityToken?: string;\n /** Inject `fetch` (tests, proxies, undici in older Node). Defaults to global `fetch`. */\n fetch?: typeof fetch;\n /** Merged into every request after defaults. */\n defaultHeaders?: Record<string, string>;\n /** e.g. `torrow-sdk-js/0.1.0` for server diagnostics. */\n userAgent?: string;\n}\n\n/** Конфиг после применения значений по умолчанию (`baseUrl` всегда задан). */\nexport type ResolvedTorrowClientConfig = Omit<TorrowClientConfig, \"baseUrl\"> & {\n baseUrl: string;\n};\n","import type { TorrowClientConfig } from \"../TorrowClientConfig.js\";\n\n/**\n * Собирает заголовки авторизации из колбэка **`getAccessToken`** в {@link TorrowClientConfig}.\n * При непустом токене: `Authorization: Bearer <accessToken>`; иначе пустой объект (запрос без Bearer).\n *\n * Не вызывает **`/api/v1/auth/refresh`** — только то, что вернул колбэк. Для refresh используй **`TorrowClient.auth`** (см. **`src/resources/auth/AuthFacade.ts`**). Смыслы полей — **`mcpAuthFieldCatalog`** в **`@torrow/sdk-docs`**.\n */\nexport async function buildAuthHeaders(\n config: TorrowClientConfig,\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {};\n const token = await config.getAccessToken?.();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n return headers;\n}\n","function pickApiErrorName(body: unknown): string | undefined {\n if (body === null || typeof body !== \"object\") {\n return undefined;\n }\n const o = body as Record<string, unknown>;\n if (typeof o.error === \"string\" && o.error.length > 0) {\n return o.error;\n }\n if (typeof o.title === \"string\" && o.title.length > 0) {\n return o.title;\n }\n if (typeof o.message === \"string\" && o.message.length > 0) {\n return o.message;\n }\n return undefined;\n}\n\nfunction pickApiCode(body: unknown): string | undefined {\n if (body === null || typeof body !== \"object\") {\n return undefined;\n }\n const c = (body as Record<string, unknown>).code;\n return typeof c === \"string\" ? c : undefined;\n}\n\nexport class TorrowHttpError extends Error {\n readonly status: number;\n readonly body: unknown;\n readonly apiErrorName?: string;\n readonly code?: string;\n readonly requestId?: string;\n readonly url: string;\n\n constructor(init: {\n status: number;\n body: unknown;\n url: string;\n requestId?: string;\n cause?: unknown;\n }) {\n const apiName = pickApiErrorName(init.body);\n const code = pickApiCode(init.body);\n const message = TorrowHttpError.buildMessage(init.status, init.url, apiName, code);\n super(message, { cause: init.cause });\n this.name = \"TorrowHttpError\";\n this.status = init.status;\n this.body = init.body;\n this.url = init.url;\n this.requestId = init.requestId;\n this.apiErrorName = apiName;\n this.code = code;\n }\n\n private static buildMessage(\n status: number,\n url: string,\n apiErrorName?: string,\n code?: string,\n ): string {\n const parts = [`HTTP ${status}`, url];\n if (code) {\n parts.push(`code=${code}`);\n }\n if (apiErrorName) {\n parts.push(apiErrorName);\n }\n return parts.join(\" — \");\n }\n}\n","/** Matches NSwag `ClientBase.parseJson` in torrow-apps `libs/api/src/lib/api.ts`. */\nconst ISO_DATE_REGEX =\n /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)(Z|([+-])(\\d{2}):(\\d{2}))$/;\n\nexport function parseJsonWithIsoDates(json: string): unknown {\n if (json === \"\") {\n return undefined;\n }\n return JSON.parse(json, (_key: string, value: unknown) => {\n if (typeof value !== \"string\") {\n return value;\n }\n return ISO_DATE_REGEX.exec(value) ? new Date(value) : value;\n });\n}\n\nexport function stringifyJsonBody(body: unknown): string {\n return JSON.stringify(body, (_key: string, value: unknown) => {\n if (value instanceof Date) {\n return value.toISOString();\n }\n return value;\n });\n}\n","/** Mirrors NSwag `ClientBase.mapToQueryString` (torrow-apps `libs/api`). */\nexport function buildQueryString(queryStringParams: Record<string, unknown>): string {\n const queryString: string[] = [];\n for (const prop of Object.keys(queryStringParams)) {\n const value = queryStringParams[prop];\n if (value === undefined) {\n continue;\n }\n if (value === null) {\n continue;\n }\n if (value instanceof Date) {\n queryString.push(`${prop}=${encodeURIComponent(value.toISOString())}`);\n } else if (Array.isArray(value)) {\n for (const val of value) {\n queryString.push(buildQueryString({ [prop]: val }));\n }\n } else {\n queryString.push(`${prop}=${encodeURIComponent(String(value))}`);\n }\n }\n return queryString.join(\"&\");\n}\n","export function joinBaseUrlAndPath(baseUrl: string, path: string): string {\n const base = baseUrl.replace(/\\/+$/, \"\");\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n return `${base}${p}`;\n}\n","import { DEFAULT_TORROW_API_BASE_URL, type TorrowClientConfig } from \"../TorrowClientConfig.js\";\nimport { buildAuthHeaders } from \"./auth.js\";\nimport { TorrowHttpError } from \"./TorrowHttpError.js\";\nimport { parseJsonWithIsoDates, stringifyJsonBody } from \"../util/json.js\";\nimport { buildQueryString } from \"../util/query-string.js\";\nimport { joinBaseUrlAndPath } from \"../util/url.js\";\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\nexport interface HttpRequestInit {\n method: HttpMethod;\n /** Path starting with `/`, e.g. `/api/v1/contacts` */\n path: string;\n query?: Record<string, unknown>;\n headers?: Record<string, string>;\n body?: unknown;\n signal?: AbortSignal;\n}\n\nconst JSON_MIME = \"application/json\";\n\n/**\n * JSON поверх `fetch`: query, **`Authorization`** из **`getAccessToken`** (см. {@link buildAuthHeaders}),\n * опционально **`securityToken`** в query из конфига. Не выполняет refresh и не разбирает 401.\n */\nexport class HttpClient {\n constructor(private readonly config: TorrowClientConfig) {}\n\n async requestJson<T = unknown>(init: HttpRequestInit): Promise<T> {\n const { fetch: fetchFn = globalThis.fetch } = this.config;\n const url = this.buildUrl(init.path, init.query);\n const authHeaders = await buildAuthHeaders(this.config);\n const headers: Record<string, string> = {\n Accept: JSON_MIME,\n ...authHeaders,\n ...this.config.defaultHeaders,\n ...init.headers,\n };\n if (this.config.userAgent) {\n headers[\"User-Agent\"] = this.config.userAgent;\n }\n\n const needsBody =\n init.body !== undefined && init.method !== \"GET\" && init.method !== \"DELETE\";\n if (needsBody) {\n headers[\"Content-Type\"] = JSON_MIME;\n }\n\n const res = await fetchFn(url, {\n method: init.method,\n headers,\n body: needsBody ? stringifyJsonBody(init.body) : undefined,\n signal: init.signal,\n });\n\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const text = await res.text();\n\n if (!res.ok) {\n const errBody = tryParseErrorBody(text, res.headers.get(\"content-type\"));\n throw new TorrowHttpError({\n status: res.status,\n body: errBody,\n url,\n requestId,\n });\n }\n\n if (text === \"\") {\n return undefined as T;\n }\n return parseJsonWithIsoDates(text) as T;\n }\n\n private buildUrl(path: string, query?: Record<string, unknown>): string {\n const origin = this.config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL;\n const basePath = joinBaseUrlAndPath(origin, path);\n const q: Record<string, unknown> = { ...query };\n if (this.config.securityToken !== undefined && this.config.securityToken !== \"\") {\n q.securityToken = this.config.securityToken;\n }\n const qs = buildQueryString(q);\n if (!qs) {\n return basePath;\n }\n const joiner = basePath.includes(\"?\") ? \"&\" : \"?\";\n return `${basePath}${joiner}${qs}`;\n }\n}\n\nfunction tryParseErrorBody(text: string, contentType: string | null): unknown {\n const ct = contentType ?? \"\";\n if (ct.includes(JSON_MIME) || (text.startsWith(\"{\") && text.endsWith(\"}\"))) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n}\n","import type { HttpClient, HttpMethod, HttpRequestInit } from \"../http/HttpClient.js\";\n\nexport type RawRequestOptions = Omit<HttpRequestInit, \"method\" | \"path\">;\n\n/**\n * Low-level REST calls (1:1 with paths). Prefer `TorrowClient` / `resources/*` when available.\n */\nexport class RawClient {\n constructor(private readonly http: HttpClient) {}\n\n request<T = unknown>(\n method: HttpMethod,\n path: string,\n options?: RawRequestOptions,\n ): Promise<T> {\n return this.http.requestJson<T>({ method, path, ...options });\n }\n\n get<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"GET\", path, options);\n }\n\n post<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"POST\", path, options);\n }\n\n put<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"PUT\", path, options);\n }\n\n patch<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"PATCH\", path, options);\n }\n\n delete<T = unknown>(path: string, options?: RawRequestOptions): Promise<T> {\n return this.request<T>(\"DELETE\", path, options);\n }\n}\n","/** Path segment for `{torrowId}` / `{itemId}` style parameters. */\nexport function encodePathSegment(id: string): string {\n return encodeURIComponent(id);\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { ContactCaseParticipantsListQuery, ItemTagsListQuery } from \"./contact-case-participants-query.js\";\nimport type {\n FeedbackOptions,\n GroupStatus,\n IncludeExcludeResp,\n ExcludeResp,\n NotificationWay,\n ObjectInfo,\n PersonalReminder,\n PersonalSolutionData,\n PublicityType,\n SolutionData,\n UpdateItemAccountsReq,\n UpdateItemGroupsReq,\n UpdateMasterInfoReq,\n UpdatePersonalListOrderReq,\n UpdatePersonalListOrderResp,\n} from \"../contacts/types.js\";\nimport type {\n GenerateSecurityTokenReq,\n GenerateSecurityTokenResp,\n GetParticipationCountResp,\n LoyaltyGroupListQuery,\n ParticipantType,\n ParticipantView,\n Participation,\n ParticipationResp,\n SaveItemToMindMapReq,\n SendLinkOfItemReq,\n SendLinkOfItemResp,\n SetGroupItemReq,\n ShareItemReq,\n UnsetGroupItemReq,\n} from \"../loyalty-systems/types.js\";\nimport type { FileInfo, PutUrlResp, UpdateFileIdResp } from \"../notes/types.js\";\nimport type {\n ExcludeFromGroupsReq,\n ExcludeReq,\n IncludeForUserReq,\n IncludeToGroupsReq,\n IncludeToParentReq,\n} from \"../relations/types.js\";\nimport type { TorrowItem, TorrowObject } from \"./torrow-entities.js\";\n\n/** Поведение «социального» слоя элемента: image puturl, опционально фото (только contacts). */\nexport type TorrowItemFacadeOptions = {\n /** Добавить `securityToken` в query `GET .../image/puturl` (contacts). */\n imagePutUrlSecurityToken?: boolean;\n /** `GET .../photo/info`, `GET .../photo/puturl` — только contacts. */\n withPhotoEndpoints?: boolean;\n /**\n * `GET .../group/list` есть не у всех доменов (например, есть у **loyaltysystems**, нет у **loyaltycards**).\n * Если `false`, {@link TorrowItemCoreFacade.listGroup} бросает ошибку. По умолчанию метод доступен.\n */\n withGroupListEndpoint?: boolean;\n};\n\n/**\n * Общий HTTP-слой для item-доменов без эндпоинтов, отсутствующих у **loyaltysystems**\n * (например `GET .../participants/anonymous`, `GET .../tags`, `PUT .../updateaccounts`, block/unblock).\n * Полный набор — {@link TorrowItemFacade}.\n *\n * @typeParam TParticipantsQuery — query для `GET .../participants` (у **loyaltysystems** — `lmFrom`/`lmTo`, у contact/case — `lmfrom`/`lmto`).\n */\nexport abstract class TorrowItemCoreFacade<\n TItem,\n TParticipantsQuery = ContactCaseParticipantsListQuery,\n> {\n protected constructor(\n protected readonly http: HttpClient,\n protected readonly basePath: string,\n protected readonly socialOpts: TorrowItemFacadeOptions = {},\n ) {}\n\n /** `PUT /api/v1/{domain}/{torrowId}/publicity` */\n updatePublicity(\n torrowId: string,\n body: PublicityType,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/publicity`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/image/id` — тело: JSON-string **`fileId`**. */\n updateImageId(\n torrowId: string,\n fileId: string,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<UpdateFileIdResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/image/id`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: fileId,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/torrowaccount/id` — тело: JSON-string account id. */\n updateTorrowAccountId(\n torrowId: string,\n accountId: string,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/torrowaccount/id`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: accountId,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/masterinfo` */\n updateMasterInfo(\n torrowId: string,\n body: UpdateMasterInfoReq,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/masterinfo`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/integrations` */\n updateIntegrations(\n torrowId: string,\n integrationIds: string[],\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/integrations`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: integrationIds,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/participants` — см. {@link TorrowItemCoreFacade TParticipantsQuery}. */\n listParticipants(\n torrowId: string,\n query?: TParticipantsQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ParticipantView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participants`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{torrowId}/generatesecuritytoken` */\n generateSecurityToken(\n torrowId: string,\n body: GenerateSecurityTokenReq,\n options?: { signal?: AbortSignal },\n ): Promise<GenerateSecurityTokenResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/generatesecuritytoken`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/participation/{participantProfileId}/type` */\n updateParticipationType(\n torrowId: string,\n participantProfileId: string,\n participantType: ParticipantType,\n options?: {\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/${encodePathSegment(participantProfileId)}/type`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: participantType,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/participation/requestaccess` */\n requestAccess(\n torrowId: string,\n profileId: string,\n options?: { userMessage?: string | null; signal?: AbortSignal },\n ): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/requestaccess`,\n query: { userMessage: options?.userMessage },\n body: profileId,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/participation/revokerequest` */\n revokeAccessRequest(torrowId: string, options?: { signal?: AbortSignal }): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/revokerequest`,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/group/set` */\n setGroup(\n torrowId: string,\n body: SetGroupItemReq,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/group/set`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/group/unset` */\n unsetGroup(\n torrowId: string,\n body: UnsetGroupItemReq,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/group/unset`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/tags` */\n updateTags(\n torrowId: string,\n tags: string[],\n options?: {\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/tags`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: tags,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/group/list` */\n listGroup(\n torrowId: string,\n query?: LoyaltyGroupListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItem[]> {\n if (this.socialOpts.withGroupListEndpoint === false) {\n throw new Error(\"listGroup is not supported for this API domain (withGroupListEndpoint: false)\");\n }\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/group/list`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/updategroups` */\n updateGroups(\n torrowId: string,\n body: UpdateItemGroupsReq[],\n options?: {\n parentId?: string | null;\n tags?: string[] | null;\n alias?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/updategroups`,\n query: {\n parentId: options?.parentId,\n tags: options?.tags,\n alias: options?.alias,\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/include/togroups` */\n includeToGroups(body: IncludeToGroupsReq, options?: { signal?: AbortSignal }): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/include/togroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/exclude/fromgroups` */\n excludeFromGroups(body: ExcludeFromGroupsReq, options?: { signal?: AbortSignal }): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/exclude/fromgroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/include/items` */\n includeToParent(\n parentId: string,\n body: IncludeToParentReq,\n options?: { signal?: AbortSignal },\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/include/items`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/exclude/items` */\n excludeFromParent(\n parentId: string,\n body: ExcludeReq,\n options?: { signal?: AbortSignal },\n ): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/exclude/items`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/include/foruser` */\n includeForUser(\n parentId: string,\n body: IncludeForUserReq,\n options?: { signal?: AbortSignal },\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/include/foruser`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/exclude/fromuser` */\n excludeFromUser(\n parentId: string,\n body: ExcludeReq,\n options?: { signal?: AbortSignal },\n ): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(parentId)}/exclude/fromuser`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/participation/rejectoffer` */\n rejectOffer(\n torrowId: string,\n profileId: string,\n options?: { userMessage?: string | null; signal?: AbortSignal },\n ): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/rejectoffer`,\n query: { userMessage: options?.userMessage },\n body: profileId,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/participation/reject` */\n reject(\n torrowId: string,\n profileId: string,\n options?: { signal?: AbortSignal },\n ): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/reject`,\n body: profileId,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/participation/share` */\n share(\n torrowId: string,\n body: ShareItemReq,\n options?: { signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/share`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/participation/revokeoffer` */\n revokeOffer(\n torrowId: string,\n profileIds: string[],\n options?: { signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/revokeoffer`,\n body: profileIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/participation/grantaccess` */\n grantAccess(\n torrowId: string,\n profileIds: string[],\n options?: { signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/grantaccess`,\n body: profileIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/participation/declineaccess` */\n declineAccess(\n torrowId: string,\n profileIds: string[],\n options?: { userMessage?: string | null; signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/declineaccess`,\n query: { userMessage: options?.userMessage },\n body: profileIds,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/personallist/updateorder` */\n updatePersonalListOrder(\n body: UpdatePersonalListOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<UpdatePersonalListOrderResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/personallist/updateorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/alias` */\n updateAlias(\n itemId: string,\n alias: string,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/alias`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: alias,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/lastusagetime` — тело ISO date-time string. */\n updateLastUsageTime(\n itemId: string,\n lastUsageTime: string,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/lastusagetime`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: lastUsageTime,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/participation/profile` */\n updateParticipationProfile(\n itemId: string,\n profileId: string,\n options?: {\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/participation/profile`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: profileId,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/sendlink` */\n sendLink(\n itemId: string,\n body: SendLinkOfItemReq,\n options?: { signal?: AbortSignal },\n ): Promise<SendLinkOfItemResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/sendlink`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{torrowId}/shorturl` */\n getShortUrl(torrowId: string, options?: { signal?: AbortSignal }): Promise<string> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/shorturl`,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/uniquename` */\n updateUniqueName(\n itemId: string,\n uniqueName: string,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/uniquename`,\n body: uniqueName,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/uniquename/{uniqueName}` */\n getByUniqueName(uniqueName: string, options?: { signal?: AbortSignal }): Promise<TItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/uniquename/${encodePathSegment(uniqueName)}`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/image/info` */\n getImageInfo(torrowId: string, options?: { signal?: AbortSignal }): Promise<FileInfo> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/image/info`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/image/puturl` */\n getImagePutUrl(\n torrowId: string,\n options?: {\n fileId?: string | null;\n fileName?: string | null;\n fileSize?: number | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<PutUrlResp> {\n const query: Record<string, unknown> = {\n fileId: options?.fileId,\n fileName: options?.fileName,\n fileSize: options?.fileSize,\n };\n if (this.socialOpts.imagePutUrlSecurityToken) {\n query.securityToken = options?.securityToken;\n }\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/image/puturl`,\n query,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/savetomindmap` */\n saveToMindMap(\n torrowId: string,\n body: SaveItemToMindMapReq,\n options?: { signal?: AbortSignal },\n ): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/savetomindmap`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/solutiondata` */\n updateSolutionData(\n torrowId: string,\n body: SolutionData,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/solutiondata`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/personalsolutiondata` */\n updatePersonalSolutionData(\n itemId: string,\n body: PersonalSolutionData,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/personalsolutiondata`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/photo/info` — только при {@link TorrowItemFacadeOptions.withPhotoEndpoints}. */\n getPhotoInfo(\n torrowId: string,\n options?: { photoId?: string | null; signal?: AbortSignal },\n ): Promise<FileInfo> {\n if (!this.socialOpts.withPhotoEndpoints) {\n throw new Error(\"getPhotoInfo is only supported when withPhotoEndpoints is true (contacts)\");\n }\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/photo/info`,\n query: { photoId: options?.photoId },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/photo/puturl` — только при {@link TorrowItemFacadeOptions.withPhotoEndpoints}. */\n getPhotoPutUrl(\n torrowId: string,\n options?: {\n fileId?: string | null;\n fileName?: string | null;\n fileSize?: number | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<PutUrlResp> {\n if (!this.socialOpts.withPhotoEndpoints) {\n throw new Error(\"getPhotoPutUrl is only supported when withPhotoEndpoints is true (contacts)\");\n }\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/photo/puturl`,\n query: {\n fileId: options?.fileId,\n fileName: options?.fileName,\n fileSize: options?.fileSize,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n}\n\n/**\n * Полный item-фасад для доменов с расширенным OpenAPI (contacts, cases, services, notes, …).\n * **LoyaltySystem** использует только {@link TorrowItemCoreFacade}.\n */\nexport abstract class TorrowItemFacade<TItem> extends TorrowItemCoreFacade<\n TItem,\n ContactCaseParticipantsListQuery\n> {\n protected constructor(\n http: HttpClient,\n basePath: string,\n socialOpts: TorrowItemFacadeOptions = {},\n ) {\n super(http, basePath, socialOpts);\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/feedbacks/options` */\n updateFeedbackOptions(\n torrowId: string,\n body: FeedbackOptions,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/feedbacks/options`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/participants/anonymous` */\n getParticipantsAnonymousCount(\n torrowId: string,\n options?: { signal?: AbortSignal },\n ): Promise<GetParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participants/anonymous`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/participants/nonanonymous` */\n getParticipantsNonAnonymousCount(\n torrowId: string,\n query?: Pick<ContactCaseParticipantsListQuery, \"participantStateList\" | \"participantTypeList\">,\n options?: { signal?: AbortSignal },\n ): Promise<GetParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participants/nonanonymous`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/tags` */\n listTags(\n torrowId: string,\n query?: ItemTagsListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<string[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/tags`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{torrowId}/groups` */\n listGroups(\n torrowId: string,\n query?: LoyaltyGroupListQuery & { parentId?: string | null },\n options?: { signal?: AbortSignal },\n ): Promise<GroupStatus[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/groups`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{torrowId}/updateaccounts` */\n updateAccounts(\n torrowId: string,\n body: UpdateItemAccountsReq[],\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/updateaccounts`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{torrowId}/participation/shareitemlink` */\n shareItemLink(\n torrowId: string,\n body: SendLinkOfItemReq,\n options?: { signal?: AbortSignal },\n ): Promise<SendLinkOfItemResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(torrowId)}/participation/shareitemlink`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/offlinable` */\n updateOfflinable(\n itemId: string,\n offlinable: boolean,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/offlinable`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: offlinable,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/reminders` */\n updateReminders(\n itemId: string,\n reminders: PersonalReminder[],\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/reminders`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: reminders,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/notificationwaylist` */\n updateNotificationWayList(\n itemId: string,\n ways: NotificationWay[],\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/notificationwaylist`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: ways,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{itemId}/block` */\n block(\n itemId: string,\n options?: {\n reasonId?: number | null;\n reasonNote?: string | null;\n language?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/block`,\n query: {\n reasonId: options?.reasonId,\n reasonNote: options?.reasonNote,\n language: options?.language,\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{itemId}/unblock` */\n unblock(\n itemId: string,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.basePath}/${encodePathSegment(itemId)}/unblock`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n}\n","import type { ItemViewSortCondition, TimetableDetailsVisibility } from \"../services/types.js\";\n\n/**\n * Query-параметры `PUT .../{id}/timetable` (услуга, ресурс, календарь, контакт).\n * Для **services** дополнительно поддерживаются `createDateFrom` / `createDateTo` (экспорт заказов и т.п.).\n */\nexport type TimetableQueryOptions = {\n visibility?: TimetableDetailsVisibility | null;\n take?: number | null;\n skip?: number | null;\n lmfrom?: string | Date | null;\n lmto?: string | Date | null;\n includeDeleted?: boolean | null;\n sort?: ItemViewSortCondition | null;\n /** Только `GET/PUT` расписания **услуги** (NSwag `ServiceClient.getTimetable`). */\n createDateFrom?: string | Date | null;\n createDateTo?: string | Date | null;\n};\n\n/** Собирает query для `HttpClient`; `undefined`/`null` отбрасываются в {@link buildQueryString}. */\nexport function buildTimetableQuery(options: TimetableQueryOptions | undefined): Record<string, unknown> {\n const o = options ?? {};\n return {\n visibility: o.visibility,\n take: o.take,\n skip: o.skip,\n lmfrom: o.lmfrom,\n lmto: o.lmto,\n includeDeleted: o.includeDeleted,\n sort: o.sort,\n createDateFrom: o.createDateFrom,\n createDateTo: o.createDateTo,\n };\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport type {\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n TimetableCase,\n TimetableFilter,\n} from \"../services/types.js\";\nimport type { CalendarItem, DeleteResponse } from \"./types.js\";\n\nconst BASE = \"/api/v1/calendars\";\n\n/** CRUD + personal list + социальный слой для календарей (`CalendarItem`). `getById` использует `includeChildItems`. */\nexport class CalendarsFacade extends TorrowItemFacade<CalendarItem> {\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n /** `POST /api/v1/calendars` */\n create(\n body: CalendarItem,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CalendarItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/calendars/{torrowId}` */\n update(\n body: CalendarItem,\n torrowId: string,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CalendarItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/calendars/{torrowId}` */\n delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n }\n\n /** `GET /api/v1/calendars/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildItems?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CalendarItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildItems: options?.includeChildItems,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/calendars/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<CalendarItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** Расписание кейсов календаря — `PUT /api/v1/calendars/{id}/timetable`. */\n getTimetable(\n calendarId: string,\n body: TimetableFilter,\n options?: Omit<TimetableQueryOptions, \"createDateFrom\" | \"createDateTo\"> & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /** `POST /api/v1/calendars/timetable/statistics` */\n getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<GetTimetableStatisticsResponse> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/calendars/{calendarId}/includecase` — тело: массив id кейсов. */\n includeCase(\n calendarId: string,\n caseIds: string[],\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/includecase`,\n query: { profileId: options?.profileId },\n body: caseIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/calendars/{calendarId}/includecasetocustomcalendar` */\n includeCaseToCustomCalendar(\n calendarId: string,\n caseIds: string[],\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/includecasetocustomcalendar`,\n query: { profileId: options?.profileId },\n body: caseIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/calendars/{calendarId}/excludecasefromcustomcalendar` */\n excludeCaseFromCustomCalendar(\n calendarId: string,\n caseIds: string[],\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/excludecasefromcustomcalendar`,\n query: { profileId: options?.profileId },\n body: caseIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/calendars/{calendarId}/excludecase` */\n excludeCase(\n calendarId: string,\n caseIds: string[],\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(calendarId)}/excludecase`,\n query: { profileId: options?.profileId },\n body: caseIds,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type {\n CaseParticipantsCountQuery,\n CaseParticipantsListQuery,\n} from \"../common/contact-case-participants-query.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport type { ExcludeFromGroupsReq, IncludeToGroupsReq } from \"../relations/types.js\";\nimport type { ExcludeResp, IncludeExcludeResp } from \"../contacts/types.js\";\nimport type {\n ApproveCaseParticipationReq,\n AvailabilityTime,\n BookResourcesForMeReq,\n BookResourcesForOthersReq,\n BookResourcesReq,\n CancelCaseParticipationReq,\n CancelMyCaseParticipationReq,\n CancelOtherCaseParticipationReq,\n CaseItem,\n CaseParticipant,\n CaseParticipantFields,\n CaseParticipantType,\n CaseParticipantView,\n ChangeMoneyReceiveReq,\n CheckInOtherReq,\n CheckInProps,\n CheckInReq,\n CreateCaseReq,\n DeleteResponse,\n GetCaseParticipationCountResp,\n PatchCaseReq,\n ResourceView,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/cases\";\n\n/**\n * События в продуктовой терминологии (REST **`/api/v1/cases`**, DTO **`CaseItem`**). **Заказ** — событие после записи на услугу (`createOrder`); событие без услуги — **`create`** / **`createWithReminder`**. Для оплаты заказа чаще **`getById`** + токены гостя.\n */\nexport class CasesFacade extends TorrowItemFacade<CaseItem> {\n constructor(http: HttpClient) {\n super(http, BASE);\n }\n\n\n /** `POST /api/v1/cases` — create case from `CaseItem` body. */\n create(\n body: CaseItem,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n isNeedToCheckInMySelf?: boolean;\n availabilityTime?: AvailabilityTime | null;\n roadTime?: number | null;\n calendarId?: string | null;\n caseParticipantType?: CaseParticipantType | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n isNeedToCheckInMySelf: options?.isNeedToCheckInMySelf,\n availabilityTime: options?.availabilityTime,\n roadTime: options?.roadTime,\n calendarId: options?.calendarId,\n caseParticipantType: options?.caseParticipantType,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/cases` with `CreateCaseReq` body (reminder flow).\n * Distinct from **`create`** (`POST` + `CaseItem`).\n */\n createWithReminder(\n body: CreateCaseReq,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}` */\n update(\n body: CaseItem,\n torrowId: string,\n options?: {\n profileId?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n profileId: options?.profileId,\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/cases/{torrowId}` */\n delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n }\n\n /** `GET /api/v1/cases/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n profileId?: string | null;\n caseParticipantProfileId?: string | null;\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n caseParticipantId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n profileId: options?.profileId,\n caseParticipantProfileId: options?.caseParticipantProfileId,\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n caseParticipantId: options?.caseParticipantId,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<CaseItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `PUT /api/v1/cases/include/togroups` */\n includeToGroups(body: IncludeToGroupsReq, options?: { signal?: AbortSignal }): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/include/togroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/exclude/fromgroups` */\n excludeFromGroups(body: ExcludeFromGroupsReq, options?: { signal?: AbortSignal }): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/exclude/fromgroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/uniquename/{uniqueName}` — query **`profileId`** (в отличие от базового `GET .../uniquename/...`). */\n override getByUniqueName(\n uniqueName: string,\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/uniquename/${encodePathSegment(uniqueName)}`,\n query: { profileId: options?.profileId },\n signal: options?.signal,\n });\n }\n\n\n /** `GET /api/v1/cases/{torrowId}/resources` */\n listResources(\n torrowId: string,\n query?: {\n resourceGroupId?: string | null;\n take?: number | null;\n skip?: number | null;\n includeDeleted?: boolean | null;\n },\n options?: { signal?: AbortSignal },\n ): Promise<ResourceView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/resources`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/{torrowId}/caseparticipants` */\n listCaseParticipants(\n torrowId: string,\n query?: CaseParticipantsListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipantView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/{torrowId}/caseparticipants/{caseParticipantId}` */\n getCaseParticipantById(\n torrowId: string,\n caseParticipantId: string,\n options?: { securityToken?: string | null; signal?: AbortSignal },\n ): Promise<CaseParticipantView> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/${encodePathSegment(caseParticipantId)}`,\n query: { securityToken: options?.securityToken },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/{torrowId}/caseparticipants/count` */\n getCaseParticipantsCount(\n torrowId: string,\n query?: CaseParticipantsCountQuery,\n options?: { signal?: AbortSignal },\n ): Promise<GetCaseParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/count`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/cases/{torrowId}/caseparticipants/nonanonymous` */\n getCaseParticipantsNonAnonymousCount(\n torrowId: string,\n query?: CaseParticipantsCountQuery,\n options?: { signal?: AbortSignal },\n ): Promise<GetCaseParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/nonanonymous`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/cases/{torrowId}/caseparticipants/{caseParticipantId}/fields` */\n patchCaseParticipantFields(\n torrowId: string,\n caseParticipantId: string,\n body: CaseParticipantFields,\n options?: {\n userMessage?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseParticipant> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/${encodePathSegment(caseParticipantId)}/fields`,\n query: {\n userMessage: options?.userMessage,\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/cases/{torrowId}/caseparticipants/{caseParticipantId}/confirmparticipation` */\n confirmCaseParticipantParticipation(\n torrowId: string,\n caseParticipantId: string,\n options?: {\n userMessage?: string | null;\n profileId?: string | null;\n isNeedAnnouncement?: boolean | null;\n versionToCheck?: number | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseParticipant> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/${encodePathSegment(caseParticipantId)}/confirmparticipation`,\n query: {\n userMessage: options?.userMessage,\n profileId: options?.profileId,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n versionToCheck: options?.versionToCheck,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/checkin` */\n caseParticipationCheckIn(\n torrowId: string,\n body: CheckInReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/checkin`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/checkinmyself` (deprecated в Swagger). */\n checkInMyself(\n torrowId: string,\n body: CheckInProps,\n options?: { message?: string | null; signal?: AbortSignal },\n ): Promise<CaseParticipant> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/checkinmyself`,\n query: { message: options?.message },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/checkinother` (deprecated). */\n checkInOther(\n torrowId: string,\n body: CheckInOtherReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/checkinother`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/bookresourcesforme` */\n bookResourcesForMe(\n torrowId: string,\n body: BookResourcesForMeReq,\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/bookresourcesforme`,\n query: { profileId: options?.profileId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/bookresourcesforother` */\n bookResourcesForOthers(\n torrowId: string,\n body: BookResourcesForOthersReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/bookresourcesforother`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/bookresources` (deprecated). */\n bookResources(\n torrowId: string,\n body: BookResourcesReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/bookresources`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipants/approvemoneyreceive` */\n approveMoneyReceive(\n torrowId: string,\n body: ChangeMoneyReceiveReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/approvemoneyreceive`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipants/rejectmoneyreceive` */\n rejectMoneyReceive(\n torrowId: string,\n body: ChangeMoneyReceiveReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipants/rejectmoneyreceive`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/cancelmycaseparticipation` (deprecated). */\n cancelMyCaseParticipation(\n torrowId: string,\n body: CancelMyCaseParticipationReq,\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<CaseParticipant> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/cancelmycaseparticipation`,\n query: { profileId: options?.profileId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/cancelothercaseparticipation` (deprecated). */\n cancelOtherCaseParticipation(\n torrowId: string,\n body: CancelOtherCaseParticipationReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/cancelothercaseparticipation`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/approvecaseparticipation` */\n approveCaseParticipation(\n torrowId: string,\n body: ApproveCaseParticipationReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/approvecaseparticipation`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/cases/{torrowId}/caseparticipation/cancelcaseparticipation` */\n cancelCaseParticipation(\n torrowId: string,\n body: CancelCaseParticipationReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseParticipant[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/caseparticipation/cancelcaseparticipation`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/reject` */\n rejectCase(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/reject`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/declinework` */\n declineWork(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/declinework`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/plan` */\n planCase(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/plan`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/takeinwork` */\n takeInWork(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/takeinwork`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/complete` */\n completeCase(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/complete`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/accept` */\n acceptCase(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/accept`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/returntoverification` */\n returnToVerification(\n torrowId: string,\n options?: { profileId?: string | null; userMessage?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/returntoverification`,\n query: { profileId: options?.profileId, userMessage: options?.userMessage },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/cancel` */\n cancelCase(\n torrowId: string,\n options?: {\n profileId?: string | null;\n userMessage?: string | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/cancel`,\n query: {\n profileId: options?.profileId,\n userMessage: options?.userMessage,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/cases/{torrowId}/patch` */\n patchCase(torrowId: string, body: PatchCaseReq, options?: { signal?: AbortSignal }): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/patch`,\n body,\n signal: options?.signal,\n });\n }\n\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { TorrowItemFacadeOptions } from \"../common/item-social-facet-base.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport type {\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n TimetableCase,\n TimetableFilter,\n} from \"../services/types.js\";\nimport type {\n ActivityStatus,\n ContactItem,\n ContactProperties,\n DeleteResponse,\n SendCommunicationCodeReq,\n SendCommunicationCodeResp,\n VerifyCommunicationCodeReq,\n VerifyCommunicationCodeResp,\n UpdateContactPropertiesResp,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/contacts\";\n\nconst CONTACT_SOCIAL_OPTS: TorrowItemFacadeOptions = {\n imagePutUrlSecurityToken: true,\n withPhotoEndpoints: true,\n};\n\n/**\n * CRUD and personal list for contact items (`ContactItem`).\n */\nexport class ContactsFacade extends TorrowItemFacade<ContactItem> {\n constructor(http: HttpClient) {\n super(http, BASE, CONTACT_SOCIAL_OPTS);\n }\n\n /** `POST /api/v1/contacts` */\n create(\n body: ContactItem,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContactItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/contacts/{torrowId}` */\n update(\n body: ContactItem,\n torrowId: string,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContactItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/contacts/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContactItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * `DELETE /api/v1/contacts/{torrowId}`\n * @param options.cascade / withPinnedItems — required by API (see Swagger).\n */\n delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n }\n\n /** `GET /api/v1/contacts/personallist` */\n listPersonal(\n options?: PersonalListQuery & { securityToken?: string | null; signal?: AbortSignal },\n ): Promise<ContactItem[]> {\n const { signal, securityToken, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest, securityToken },\n signal,\n });\n }\n\n /** Расписание по контакту (профиль/исполнитель) — `PUT /api/v1/contacts/{id}/timetable`. */\n getTimetable(\n contactId: string,\n body: TimetableFilter,\n options?: Omit<TimetableQueryOptions, \"createDateFrom\" | \"createDateTo\"> & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(contactId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /** `POST /api/v1/contacts/timetable/statistics` */\n getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<GetTimetableStatisticsResponse> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/contacts/communication/sendcode` */\n sendCommunicationCode(\n body: SendCommunicationCodeReq,\n options?: { signal?: AbortSignal },\n ): Promise<SendCommunicationCodeResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/communication/sendcode`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/contacts/communication/verify` */\n verifyCommunicationCode(\n body: VerifyCommunicationCodeReq,\n options?: { signal?: AbortSignal },\n ): Promise<VerifyCommunicationCodeResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/communication/verify`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/contacts/{torrowId}/invite` — тело JSON-string (идентификатор приглашения / профиля по контракту API). */\n invite(\n torrowId: string,\n body: string,\n options?: { communicationId?: string | null; signal?: AbortSignal },\n ): Promise<string> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/invite`,\n query: { communicationId: options?.communicationId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/contacts/activitystatuslist` */\n listActivityStatuses(\n itemIds: string[],\n options?: { signal?: AbortSignal },\n ): Promise<ActivityStatus[]> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/activitystatuslist`,\n body: itemIds,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/contacts/{contactId}/contactproperties` */\n updateContactProperties(\n contactId: string,\n body: ContactProperties,\n options?: { signal?: AbortSignal },\n ): Promise<UpdateContactPropertiesResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(contactId)}/contactproperties`,\n body,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport type { ContextItem, DeleteResponse } from \"./types.js\";\n\nconst BASE = \"/api/v1/contexts\";\n\n/** CRUD + personal list + социальный слой для контекстов (`ContextItem`). `POST` принимает только опциональный `profileId`. */\nexport class ContextsFacade extends TorrowItemFacade<ContextItem> {\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n /** `POST /api/v1/contexts` */\n create(\n body: ContextItem,\n options?: {\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContextItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: { profileId: options?.profileId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/contexts/{torrowId}` */\n update(\n body: ContextItem,\n torrowId: string,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<ContextItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/contexts/{torrowId}` */\n delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n }\n\n /** `GET /api/v1/contexts/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ContextItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/contexts/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<ContextItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport type { DeleteResponse, FileInfo, NoteItem, PutUrlResp } from \"./types.js\";\n\nconst BASE = \"/api/v1/notes\";\n\n/** CRUD, personal list, файлы, изображения и социальный слой для заметок (`NoteItem`). */\nexport class NotesFacade extends TorrowItemFacade<NoteItem> {\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n /** `POST /api/v1/notes` */\n create(\n body: NoteItem,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<NoteItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/notes/{torrowId}` */\n update(\n body: NoteItem,\n torrowId: string,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<NoteItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/notes/{torrowId}` */\n delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n }\n\n /** `GET /api/v1/notes/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<NoteItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/notes/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<NoteItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `GET /api/v1/notes/{torrowId}/file/info` */\n getFileInfo(\n torrowId: string,\n options?: { fileId?: string | null; signal?: AbortSignal },\n ): Promise<FileInfo> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/file/info`,\n query: { fileId: options?.fileId },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/notes/{torrowId}/file/puturl` — URL для загрузки файла (presigned). */\n getFilePutUrl(\n torrowId: string,\n options?: {\n fileId?: string | null;\n fileName?: string | null;\n fileSize?: number | null;\n signal?: AbortSignal;\n },\n ): Promise<PutUrlResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/file/puturl`,\n query: {\n fileId: options?.fileId,\n fileName: options?.fileName,\n fileSize: options?.fileSize,\n },\n signal: options?.signal,\n });\n }\n\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type {\n ExcludeFromGroupsReq,\n ExcludeReq,\n ExcludeResp,\n IncludeExcludeResp,\n IncludeForUserReq,\n IncludeToGroupsReq,\n IncludeToParentReq,\n ItemRelationDomain,\n Participation,\n SaveItemToMindMapReq,\n} from \"./types.js\";\n\nconst DOMAIN_BASE: Record<ItemRelationDomain, string> = {\n contacts: \"/api/v1/contacts\",\n notes: \"/api/v1/notes\",\n contexts: \"/api/v1/contexts\",\n resources: \"/api/v1/resources\",\n services: \"/api/v1/services\",\n cases: \"/api/v1/cases\",\n calendars: \"/api/v1/calendars\",\n};\n\n/**\n * Связи между элементами: включение в родителя/группы, исключение, сохранение в mind map.\n * В продукте «прикрепить к другому» часто сводится к {@link includeToParent} / {@link includeToGroups}.\n */\nexport class RelationsFacade {\n constructor(private readonly http: HttpClient) {}\n\n private base(domain: ItemRelationDomain): string {\n return DOMAIN_BASE[domain];\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/include/items` — привязать дочерние элементы к родителю (иерархия). */\n includeToParent(\n domain: ItemRelationDomain,\n parentId: string,\n body: IncludeToParentReq,\n options?: { signal?: AbortSignal },\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(parentId)}/include/items`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/include/foruser` — добавить представления/элементы в mind map пользователя под родителем. */\n includeForUser(\n domain: ItemRelationDomain,\n parentId: string,\n body: IncludeForUserReq,\n options?: { signal?: AbortSignal },\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(parentId)}/include/foruser`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/exclude/items` — убрать элементы из родителя. */\n excludeFromParent(\n domain: ItemRelationDomain,\n parentId: string,\n body: ExcludeReq,\n options?: { signal?: AbortSignal },\n ): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(parentId)}/exclude/items`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{parentId}/exclude/fromuser` — убрать из персонального mind map пользователя. */\n excludeFromUser(\n domain: ItemRelationDomain,\n parentId: string,\n body: ExcludeReq,\n options?: { signal?: AbortSignal },\n ): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(parentId)}/exclude/fromuser`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/include/togroups` — включить элементы в несколько групп. */\n includeToGroups(\n domain: ItemRelationDomain,\n body: IncludeToGroupsReq,\n options?: { signal?: AbortSignal },\n ): Promise<IncludeExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/include/togroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/exclude/fromgroups` — исключить элементы из групп. */\n excludeFromGroups(\n domain: ItemRelationDomain,\n body: ExcludeFromGroupsReq,\n options?: { signal?: AbortSignal },\n ): Promise<ExcludeResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/exclude/fromgroups`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/{domain}/{itemId}/savetomindmap` — позиция/alias элемента в mind map. */\n saveToMindMap(\n domain: ItemRelationDomain,\n itemId: string,\n body: SaveItemToMindMapReq,\n options?: { signal?: AbortSignal },\n ): Promise<Participation> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${this.base(domain)}/${encodePathSegment(itemId)}/savetomindmap`,\n body,\n signal: options?.signal,\n });\n }\n}\n","/**\n * Неявные параметры, кодируемые в `tags` элементов (в основном ServiceItem).\n *\n * Источник логики: поведение в клиентских потоках `torrow-apps` (time zone, order name,\n * ограничения по времени, тексты unavailable booking, автозапуск уведомлений, discount field tag).\n */\n\nexport const SERVICE_IMPLICIT_TAG_SUFFIX = {\n orderNameLegacy: \":ordername\",\n orderName: \":OrderName\",\n timeZoneLegacy: \":timeZone\",\n timeZone: \":timezone\",\n disableCancelMyParticipation: \":DisableCancelMyParticipation\",\n disableUpdateOrderTime: \":DisableUpdateOrderTime\",\n unavailableBookingMessage: \":UnavailableBookingMessage\",\n discountPercentage: \":DiscountPercentage\",\n agreementText: \":AgreementText\",\n agreementLink: \":AgreementLink\",\n marginTime: \":MarginTime\",\n lockId: \":lockId\",\n autoStartTelegramNotificationBot: \"AutoStartTelegramNotificationBot\",\n autoStartTelegramNotificationBotTypo: \"AutoStartTelegramNotifcationBot\",\n autoStartConnectNotifications: \"AutoStartConnectNotifications\",\n hideMessengerConnectUiLegacy: \"HideTelegramNotificationBot\",\n hideMessengerConnectUi: \"HideMessengerNotifications\",\n /**\n * Резерв под серверную договоренность. Формат в `tags`: `NNN:payment_redirect_timeout_sec`.\n * Непосредственно в текущем `torrow-apps` литерал пока не используется.\n */\n paymentRedirectTimeoutSec: \":payment_redirect_timeout_sec\",\n} as const;\n\ntype PrimitiveTagConfig = {\n field: keyof ServiceImplicitTagParams;\n kind: \"string\" | \"positiveInt\";\n suffixes: readonly string[];\n caseInsensitive?: boolean;\n};\n\ntype ContainsTagConfig = {\n field: keyof ServiceImplicitTagParams;\n kind: \"containsFlag\";\n tokens: readonly string[];\n};\n\ntype AutoStartTagConfig = {\n field: \"autoStartNotificationDelaySeconds\";\n kind: \"autoStart\";\n suffixes: readonly string[];\n};\n\ntype AgreementTagConfig = {\n field: \"agreementItems\";\n kind: \"agreement\";\n textSuffix: string;\n linkSuffix: string;\n};\n\ntype ServiceImplicitTagConfig = PrimitiveTagConfig | ContainsTagConfig | AutoStartTagConfig | AgreementTagConfig;\n\n/**\n * Единый реестр тегов (registry-driven). Это источник правды для parse/build/isImplicit.\n */\nexport const SERVICE_IMPLICIT_TAG_REGISTRY = {\n orderName: {\n field: \"orderName\",\n kind: \"string\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.orderName, SERVICE_IMPLICIT_TAG_SUFFIX.orderNameLegacy],\n caseInsensitive: true,\n },\n timeZone: {\n field: \"timeZone\",\n kind: \"string\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.timeZone, SERVICE_IMPLICIT_TAG_SUFFIX.timeZoneLegacy],\n caseInsensitive: true,\n },\n disableCancelMyParticipationBeforeMinutes: {\n field: \"disableCancelMyParticipationBeforeMinutes\",\n kind: \"positiveInt\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.disableCancelMyParticipation],\n },\n disableUpdateOrderTimeBeforeMinutes: {\n field: \"disableUpdateOrderTimeBeforeMinutes\",\n kind: \"positiveInt\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.disableUpdateOrderTime],\n },\n unavailableBookingMessage: {\n field: \"unavailableBookingMessage\",\n kind: \"string\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.unavailableBookingMessage],\n },\n discountPercentageFieldName: {\n field: \"discountPercentageFieldName\",\n kind: \"string\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.discountPercentage],\n },\n marginTimeSec: {\n field: \"marginTimeSec\",\n kind: \"positiveInt\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.marginTime],\n },\n paymentRedirectTimeoutSec: {\n field: \"paymentRedirectTimeoutSec\",\n kind: \"positiveInt\",\n suffixes: [SERVICE_IMPLICIT_TAG_SUFFIX.paymentRedirectTimeoutSec],\n },\n hideMessengerConnectUi: {\n field: \"hideMessengerConnectUi\",\n kind: \"containsFlag\",\n tokens: [SERVICE_IMPLICIT_TAG_SUFFIX.hideMessengerConnectUi, SERVICE_IMPLICIT_TAG_SUFFIX.hideMessengerConnectUiLegacy],\n },\n hideTelegramNotificationBot: {\n field: \"hideTelegramNotificationBot\",\n kind: \"containsFlag\",\n tokens: [SERVICE_IMPLICIT_TAG_SUFFIX.hideMessengerConnectUiLegacy],\n },\n autoStartNotificationDelaySeconds: {\n field: \"autoStartNotificationDelaySeconds\",\n kind: \"autoStart\",\n suffixes: [\n SERVICE_IMPLICIT_TAG_SUFFIX.autoStartConnectNotifications,\n SERVICE_IMPLICIT_TAG_SUFFIX.autoStartTelegramNotificationBot,\n SERVICE_IMPLICIT_TAG_SUFFIX.autoStartTelegramNotificationBotTypo,\n ],\n },\n agreementItems: {\n field: \"agreementItems\",\n kind: \"agreement\",\n textSuffix: SERVICE_IMPLICIT_TAG_SUFFIX.agreementText,\n linkSuffix: SERVICE_IMPLICIT_TAG_SUFFIX.agreementLink,\n },\n} as const satisfies Record<string, ServiceImplicitTagConfig>;\n\nexport type ServiceImplicitTagParams = {\n orderName?: string;\n timeZone?: string;\n disableCancelMyParticipationBeforeMinutes?: number;\n disableUpdateOrderTimeBeforeMinutes?: number;\n unavailableBookingMessage?: string;\n discountPercentageFieldName?: string;\n marginTimeSec?: number;\n autoStartNotificationDelaySeconds?: number;\n hideMessengerConnectUi?: boolean;\n hideTelegramNotificationBot?: boolean;\n agreementItems?: { index: number; text?: string; link?: string }[];\n paymentRedirectTimeoutSec?: number;\n};\n\n/** Минимальная структура поведения ресурса (сейчас: только margin between events). */\nexport type ResourceBehaviorSettings = {\n marginTimeSec?: number;\n /**\n * Идентификатор TTLock-замка в формате тега `<lockNumber>:lockId`.\n */\n lockId?: number;\n};\n\nfunction isPositiveInt(value: number | undefined): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0;\n}\n\nfunction splitBySuffix(tag: string, suffix: string, caseInsensitive = false): string | undefined {\n if (caseInsensitive) {\n const lowerTag = tag.toLowerCase();\n const lowerSuffix = suffix.toLowerCase();\n if (!lowerTag.endsWith(lowerSuffix)) return undefined;\n return tag.slice(0, tag.length - suffix.length);\n }\n if (!tag.endsWith(suffix)) return undefined;\n return tag.slice(0, tag.length - suffix.length);\n}\n\nfunction firstPrefixBySuffix(\n tags: readonly string[],\n suffix: string,\n options?: { caseInsensitive?: boolean },\n): string | undefined {\n for (const tag of tags) {\n const prefix = splitBySuffix(tag, suffix, options?.caseInsensitive ?? false);\n if (prefix !== undefined) return prefix;\n }\n return undefined;\n}\n\nfunction toPositiveInt(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const value = Number.parseInt(raw.trim(), 10);\n return Number.isFinite(value) && value > 0 ? value : undefined;\n}\n\nfunction parseAutoStartDelay(tag: string): number | undefined {\n const suffixes = SERVICE_IMPLICIT_TAG_REGISTRY.autoStartNotificationDelaySeconds.suffixes;\n for (const suffix of suffixes) {\n const match = tag.match(new RegExp(`^(\\\\d+):${suffix}$`));\n if (match?.[1]) {\n const sec = Number.parseInt(match[1], 10);\n if (Number.isFinite(sec) && sec > 0) return sec;\n }\n }\n return undefined;\n}\n\nfunction parseAgreementIndexedTag(tag: string, baseSuffix: string): { index: number; value: string } | undefined {\n const escaped = baseSuffix.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = tag.match(new RegExp(`^(.*)${escaped}(\\\\d+)$`));\n if (!match?.[1] || !match[2]) return undefined;\n const index = Number.parseInt(match[2], 10);\n if (!Number.isFinite(index) || index <= 0) return undefined;\n return { index, value: match[1] };\n}\n\nfunction decodeAgreementLink(linkRaw: string): string {\n const trimmed = linkRaw.trim();\n if (trimmed.startsWith(\"https//\")) return `https://${trimmed.slice(\"https//\".length)}`;\n if (trimmed.startsWith(\"http//\")) return `http://${trimmed.slice(\"http//\".length)}`;\n return trimmed;\n}\n\nfunction encodeAgreementLink(linkRaw: string): string {\n const trimmed = linkRaw.trim();\n if (trimmed.startsWith(\"https://\")) return `https//${trimmed.slice(\"https://\".length)}`;\n if (trimmed.startsWith(\"http://\")) return `http//${trimmed.slice(\"http://\".length)}`;\n return trimmed;\n}\n\n/**\n * Парсинг используемых в продукте неявных \"тег-параметров\" сервиса.\n */\nexport function parseServiceImplicitTagParams(tags: readonly string[] | undefined | null): ServiceImplicitTagParams {\n const safeTags = tags ?? [];\n const result: ServiceImplicitTagParams = {};\n const mutable = result as Record<string, unknown>;\n\n for (const config of Object.values(SERVICE_IMPLICIT_TAG_REGISTRY) as ServiceImplicitTagConfig[]) {\n if (config.kind === \"string\" || config.kind === \"positiveInt\") {\n const raw = config.suffixes\n .map((suffix) => firstPrefixBySuffix(safeTags, suffix, { caseInsensitive: config.caseInsensitive ?? false }))\n .find((x) => x !== undefined);\n if (config.kind === \"string\") {\n if (raw?.trim()) mutable[config.field] = raw.trim();\n } else {\n const value = toPositiveInt(raw);\n if (value !== undefined) mutable[config.field] = value;\n }\n }\n if (config.kind === \"containsFlag\") {\n const hasAny = safeTags.some((tag) => config.tokens.some((token) => tag.includes(token)));\n if (hasAny) mutable[config.field] = true;\n }\n }\n\n let autoStartNotificationDelaySeconds: number | undefined = result.autoStartNotificationDelaySeconds;\n if (autoStartNotificationDelaySeconds === undefined) {\n for (const tag of safeTags) {\n autoStartNotificationDelaySeconds = parseAutoStartDelay(tag);\n if (autoStartNotificationDelaySeconds !== undefined) break;\n }\n }\n if (autoStartNotificationDelaySeconds !== undefined) {\n mutable.autoStartNotificationDelaySeconds = autoStartNotificationDelaySeconds;\n }\n\n const agreementsMap = new Map<number, { index: number; text?: string; link?: string }>();\n const agreementConfig = SERVICE_IMPLICIT_TAG_REGISTRY.agreementItems;\n for (const tag of safeTags) {\n const textTag = parseAgreementIndexedTag(tag, agreementConfig.textSuffix);\n if (textTag) {\n agreementsMap.set(textTag.index, {\n index: textTag.index,\n ...(agreementsMap.get(textTag.index) ?? {}),\n text: textTag.value.trim() || undefined,\n });\n }\n const linkTag = parseAgreementIndexedTag(tag, agreementConfig.linkSuffix);\n if (linkTag) {\n agreementsMap.set(linkTag.index, {\n index: linkTag.index,\n ...(agreementsMap.get(linkTag.index) ?? {}),\n link: decodeAgreementLink(linkTag.value),\n });\n }\n }\n const agreementItems = [...agreementsMap.values()]\n .sort((a, b) => a.index - b.index)\n .filter((x) => x.text || x.link);\n if (agreementItems.length) mutable.agreementItems = agreementItems;\n return result;\n}\n\n/**\n * Генерация service-тегов из явной структуры параметров.\n * Удобно для create/update запросов и codegen-агентов.\n */\nexport function buildServiceImplicitTags(\n params: ServiceImplicitTagParams,\n options?: {\n /**\n * Какой suffix использовать для auto-start delay.\n * По умолчанию новый: `AutoStartConnectNotifications`.\n */\n autoStartNotificationSuffix?:\n | typeof SERVICE_IMPLICIT_TAG_SUFFIX.autoStartConnectNotifications\n | typeof SERVICE_IMPLICIT_TAG_SUFFIX.autoStartTelegramNotificationBot\n | typeof SERVICE_IMPLICIT_TAG_SUFFIX.autoStartTelegramNotificationBotTypo;\n },\n): string[] {\n const tags: string[] = [];\n const singleValueConfigs = (Object.values(SERVICE_IMPLICIT_TAG_REGISTRY) as ServiceImplicitTagConfig[]).filter(\n (x) => x.kind === \"string\" || x.kind === \"positiveInt\",\n ) as PrimitiveTagConfig[];\n for (const config of singleValueConfigs) {\n const value = params[config.field] as unknown;\n const writeSuffix = config.suffixes[0];\n if (config.kind === \"string\") {\n if (typeof value === \"string\" && value.trim()) {\n tags.push(`${value.trim()}${writeSuffix}`);\n }\n } else if (isPositiveInt(typeof value === \"number\" ? value : undefined)) {\n tags.push(`${value}${writeSuffix}`);\n }\n }\n\n for (const agreement of params.agreementItems ?? []) {\n if (!isPositiveInt(agreement.index)) continue;\n if (agreement.text?.trim()) {\n tags.push(\n `${agreement.text.trim()}${SERVICE_IMPLICIT_TAG_REGISTRY.agreementItems.textSuffix}${agreement.index}`,\n );\n }\n if (agreement.link?.trim()) {\n tags.push(\n `${encodeAgreementLink(agreement.link)}${SERVICE_IMPLICIT_TAG_REGISTRY.agreementItems.linkSuffix}${agreement.index}`,\n );\n }\n }\n if (isPositiveInt(params.autoStartNotificationDelaySeconds)) {\n tags.push(\n `${params.autoStartNotificationDelaySeconds}:${\n options?.autoStartNotificationSuffix ?? SERVICE_IMPLICIT_TAG_SUFFIX.autoStartConnectNotifications\n }`,\n );\n }\n if (params.hideMessengerConnectUi) {\n tags.push(SERVICE_IMPLICIT_TAG_REGISTRY.hideMessengerConnectUi.tokens[0]);\n }\n if (params.hideTelegramNotificationBot) {\n tags.push(SERVICE_IMPLICIT_TAG_REGISTRY.hideTelegramNotificationBot.tokens[0]);\n }\n\n return tags;\n}\n\nfunction isImplicitServiceTag(tag: string): boolean {\n for (const config of Object.values(SERVICE_IMPLICIT_TAG_REGISTRY) as ServiceImplicitTagConfig[]) {\n if (config.kind === \"string\" || config.kind === \"positiveInt\") {\n const matched = config.suffixes.some(\n (suffix) => splitBySuffix(tag, suffix, config.caseInsensitive ?? false) !== undefined,\n );\n if (matched) return true;\n }\n if (config.kind === \"containsFlag\") {\n if (config.tokens.some((token) => tag.includes(token))) return true;\n }\n if (config.kind === \"autoStart\") {\n const isAutoStart = config.suffixes.some((suffix) => tag.match(new RegExp(`^\\\\d+:${suffix}$`)) !== null);\n if (isAutoStart) return true;\n }\n if (config.kind === \"agreement\") {\n if (\n parseAgreementIndexedTag(tag, config.textSuffix) !== undefined ||\n parseAgreementIndexedTag(tag, config.linkSuffix) !== undefined\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Обновляет только implicit service tags, не трогая \"обычные\" пользовательские теги.\n * Полезно для patch/update сценариев поверх существующего массива tags.\n */\nexport function mergeServiceImplicitTags(\n baseTags: readonly string[] | undefined | null,\n params: ServiceImplicitTagParams,\n options?: Parameters<typeof buildServiceImplicitTags>[1],\n): string[] {\n const safeBase = baseTags ?? [];\n const preservedNonImplicit = safeBase.filter((tag) => !isImplicitServiceTag(tag));\n const nextImplicit = buildServiceImplicitTags(params, options);\n return [...preservedNonImplicit, ...nextImplicit];\n}\n\n/**\n * One-liner для частичного обновления implicit service params.\n * Сценарий: parse(existing) -> apply patch -> mergeServiceImplicitTags(baseTags, next).\n */\nexport function upsertServiceImplicitTagParams(\n baseTags: readonly string[] | undefined | null,\n patch: Partial<ServiceImplicitTagParams>,\n options?: Parameters<typeof buildServiceImplicitTags>[1],\n): string[] {\n const current = parseServiceImplicitTagParams(baseTags);\n const next: ServiceImplicitTagParams = {\n ...current,\n ...patch,\n };\n return mergeServiceImplicitTags(baseTags, next, options);\n}\n\n/**\n * Конвенция сервера по шагам услуги:\n * если название шага начинается с `*`, выбранный ресурс из этого шага считается \"первичным\".\n */\nexport function isPrimaryServiceStepName(stepName: string | undefined | null): boolean {\n return !!stepName && stepName.trimStart().startsWith(\"*\");\n}\n\n/**\n * Возвращает \"чистое\" название шага без префикса `*`.\n */\nexport function getServiceStepDisplayName(stepName: string | undefined | null): string {\n if (!stepName) return \"\";\n const normalized = stepName.trimStart();\n return normalized.startsWith(\"*\") ? normalized.slice(1).trimStart() : stepName;\n}\n\n/** Парсинг поведения ресурса из `resource.tags`. */\nexport function parseResourceBehaviorSettings(tags: readonly string[] | undefined | null): ResourceBehaviorSettings {\n const parsed = parseServiceImplicitTagParams(tags);\n const lockId = toPositiveInt(firstPrefixBySuffix(tags ?? [], SERVICE_IMPLICIT_TAG_SUFFIX.lockId));\n return {\n marginTimeSec: parsed.marginTimeSec,\n lockId,\n };\n}\n\n/** Сериализация/merge behavior параметров ресурса в `resource.tags`. */\nexport function mergeResourceBehaviorTags(\n baseTags: readonly string[] | undefined | null,\n settings: ResourceBehaviorSettings,\n): string[] {\n const safeBase = baseTags ?? [];\n const nonManaged = safeBase.filter(\n (tag) =>\n splitBySuffix(tag, SERVICE_IMPLICIT_TAG_SUFFIX.marginTime) === undefined &&\n splitBySuffix(tag, SERVICE_IMPLICIT_TAG_SUFFIX.lockId) === undefined,\n );\n const managed: string[] = [];\n if (isPositiveInt(settings.marginTimeSec)) {\n managed.push(`${settings.marginTimeSec}${SERVICE_IMPLICIT_TAG_SUFFIX.marginTime}`);\n }\n if (isPositiveInt(settings.lockId)) {\n managed.push(`${settings.lockId}${SERVICE_IMPLICIT_TAG_SUFFIX.lockId}`);\n }\n return [...nonManaged, ...managed];\n}\n\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport {\n mergeResourceBehaviorTags,\n parseResourceBehaviorSettings,\n type ResourceBehaviorSettings,\n} from \"../common/implicit-tag-params.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport type {\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n TimetableCase,\n TimetableFilter,\n} from \"../services/types.js\";\nimport type {\n DeleteResponse,\n PickOrderReq,\n PickOrderResp,\n ResourceItem,\n ResourceItemApi,\n ReturnOrderReq,\n ReturnOrderResp,\n WorkloadPeriod,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/resources\";\n\n/**\n * CRUD + personal list + социальный слой для **Resource** (`ResourceItem`, путь `/api/v1/resources`).\n * Свойство фасада — `client.resourceItems`.\n */\nexport class ResourcesFacade extends TorrowItemFacade<ResourceItem> {\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n private toSdkResourceItem(item: ResourceItemApi): ResourceItem {\n return {\n ...item,\n behaviorSettings: parseResourceBehaviorSettings(item.tags),\n };\n }\n\n private toApiResourceItem(item: ResourceItem): ResourceItemApi {\n const { behaviorSettings, ...apiBase } = item;\n const nextTags = behaviorSettings ? mergeResourceBehaviorTags(apiBase.tags, behaviorSettings) : apiBase.tags;\n return {\n ...apiBase,\n tags: nextTags,\n };\n }\n\n /** `POST /api/v1/resources` */\n create(\n body: ResourceItem,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceItem> {\n return this.http\n .requestJson<ResourceItemApi>({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: this.toApiResourceItem(body),\n signal: options?.signal,\n })\n .then((item) => this.toSdkResourceItem(item));\n }\n\n /** `PUT /api/v1/resources/{torrowId}` */\n update(\n body: ResourceItem,\n torrowId: string,\n options?: {\n profileId?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceItem> {\n return this.http\n .requestJson<ResourceItemApi>({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n profileId: options?.profileId,\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: this.toApiResourceItem(body),\n signal: options?.signal,\n })\n .then((item) => this.toSdkResourceItem(item));\n }\n\n /** `DELETE /api/v1/resources/{torrowId}` */\n delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n }\n\n /** `GET /api/v1/resources/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n isNeedItem?: boolean | null;\n isNeedParentResource?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceItem> {\n return this.http\n .requestJson<ResourceItemApi>({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n isNeedItem: options?.isNeedItem,\n isNeedParentResource: options?.isNeedParentResource,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n })\n .then((item) => this.toSdkResourceItem(item));\n }\n\n private getBehaviorSettingsFromResource(\n resource: Pick<ResourceItem, \"tags\"> & Partial<Pick<ResourceItem, \"behaviorSettings\">>,\n ): ResourceBehaviorSettings {\n return \"behaviorSettings\" in resource && resource.behaviorSettings\n ? resource.behaviorSettings\n : parseResourceBehaviorSettings(resource.tags);\n }\n\n async getBehaviorSettings(\n resourceId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n isNeedItem?: boolean | null;\n isNeedParentResource?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceBehaviorSettings> {\n const resource = await this.getById(resourceId, options);\n return this.getBehaviorSettingsFromResource(resource);\n }\n\n async updateBehaviorSettings(\n resourceId: string,\n settingsPatch: Partial<ResourceBehaviorSettings>,\n options?: {\n mergeParameters?: boolean;\n profileId?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n includeDeleted?: boolean | null;\n isNeedItem?: boolean | null;\n isNeedParentResource?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ResourceItem> {\n const resource = await this.getById(resourceId, {\n includeDeleted: options?.includeDeleted,\n isNeedItem: options?.isNeedItem,\n isNeedParentResource: options?.isNeedParentResource,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n signal: options?.signal,\n });\n\n const mergeParameters = options?.mergeParameters ?? true;\n const nextSettings: ResourceBehaviorSettings = mergeParameters\n ? {\n ...this.getBehaviorSettingsFromResource(resource),\n ...settingsPatch,\n }\n : { ...settingsPatch };\n\n resource.behaviorSettings = nextSettings;\n resource.tags = mergeResourceBehaviorTags(resource.tags, nextSettings);\n\n return this.update(resource, resourceId, {\n profileId: options?.profileId,\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n signal: options?.signal,\n });\n }\n\n setBehaviorSettings(\n resourceId: string,\n settings: ResourceBehaviorSettings,\n options?: Omit<Parameters<ResourcesFacade[\"updateBehaviorSettings\"]>[2], \"mergeParameters\">,\n ): Promise<ResourceItem> {\n return this.updateBehaviorSettings(resourceId, settings, {\n ...options,\n mergeParameters: false,\n });\n }\n\n /** `GET /api/v1/resources/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<ResourceItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http\n .requestJson<ResourceItemApi[]>({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n })\n .then((items) => items.map((item) => this.toSdkResourceItem(item)));\n }\n\n /**\n * Расписание заказов, привязанных к **ресурсу** — `PUT /api/v1/resources/{id}/timetable`.\n */\n getTimetable(\n resourceId: string,\n body: TimetableFilter,\n options?: Omit<TimetableQueryOptions, \"createDateFrom\" | \"createDateTo\"> & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(resourceId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /**\n * Полосы занятости ресурса — `GET /api/v1/resources/{id}/workload`.\n */\n getWorkload(\n resourceId: string,\n options: {\n from: string | Date;\n to: string | Date;\n serviceId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<WorkloadPeriod[]> {\n const { signal, from, to, serviceId } = options;\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(resourceId)}/workload`,\n query: {\n From: from,\n To: to,\n serviceId,\n },\n signal,\n });\n }\n\n /** `POST /api/v1/resources/{id}/pickorder`. */\n pickOrder(\n resourceId: string,\n body: PickOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<PickOrderResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(resourceId)}/pickorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/resources/{id}/returnorder`. */\n returnOrder(\n resourceId: string,\n body: ReturnOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<ReturnOrderResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(resourceId)}/returnorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/resources/timetable/statistics`. */\n getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<GetTimetableStatisticsResponse> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n }\n}\n\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { CaseItem } from \"../cases/types.js\";\nimport {\n mergeServiceImplicitTags,\n parseServiceImplicitTagParams,\n type ServiceImplicitTagParams,\n} from \"../common/implicit-tag-params.js\";\nimport { TorrowItemFacade } from \"../common/item-social-facet-base.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport { buildTimetableQuery, type TimetableQueryOptions } from \"../common/timetable-query.js\";\nimport type {\n ChangeOrderServiceReq,\n CreateOrderReq,\n DeleteResponse,\n GetCheckInScheduleReq,\n GetCheckInScheduleResp,\n GetReCheckInScheduleReq,\n GetServiceWorkloadInfoRequest,\n GetServiceWorkloadInfoResp,\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n OrderResp,\n ResourceView,\n SearchServiceResourcesReq,\n SearchServiceResourcesResp,\n ServiceBehaviorSettings,\n ServiceItem,\n ServiceItemApi,\n TimetableCase,\n TimetableFilter,\n UpdateOrderInfoReq,\n UpdateOrderReq,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/services\";\n\n/** CRUD, personal list, booking, session/order, и социальный слой для `ServiceItem`. */\nexport class ServicesFacade extends TorrowItemFacade<ServiceItem> {\n constructor(http: HttpClient) {\n super(http, BASE, { imagePutUrlSecurityToken: false, withPhotoEndpoints: false });\n }\n\n private toSdkServiceItem(service: ServiceItemApi): ServiceItem {\n return {\n ...service,\n behaviorSettings: parseServiceImplicitTagParams(service.tags),\n };\n }\n\n private toApiServiceItem(service: ServiceItem): ServiceItemApi {\n const { behaviorSettings, ...apiBase } = service;\n const nextTags = behaviorSettings ? mergeServiceImplicitTags(apiBase.tags, behaviorSettings) : apiBase.tags;\n return {\n ...apiBase,\n tags: nextTags,\n };\n }\n\n /** `POST /api/v1/services` */\n create(\n body: ServiceItem,\n options?: {\n parentId?: string | null;\n profileId?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ServiceItem> {\n return this.http\n .requestJson<ServiceItemApi>({\n method: \"POST\",\n path: BASE,\n query: {\n parentId: options?.parentId,\n profileId: options?.profileId,\n },\n body: this.toApiServiceItem(body),\n signal: options?.signal,\n })\n .then((item) => this.toSdkServiceItem(item));\n }\n\n /** `PUT /api/v1/services/{torrowId}` */\n update(\n body: ServiceItem,\n torrowId: string,\n options?: {\n profileId?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<ServiceItem> {\n return this.http\n .requestJson<ServiceItemApi>({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n profileId: options?.profileId,\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: this.toApiServiceItem(body),\n signal: options?.signal,\n })\n .then((item) => this.toSdkServiceItem(item));\n }\n\n /** `DELETE /api/v1/services/{torrowId}` */\n delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n }\n\n /** `GET /api/v1/services/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n profileId?: string | null;\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ServiceItem> {\n return this.http\n .requestJson<ServiceItemApi>({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n profileId: options?.profileId,\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n })\n .then((item) => this.toSdkServiceItem(item));\n }\n\n /** Внутренний helper: получить типизированные настройки поведения услуги из `service.tags`. */\n private getBehaviorSettingsFromService(\n service: Pick<ServiceItem, \"tags\"> & Partial<Pick<ServiceItem, \"behaviorSettings\">>,\n ): ServiceBehaviorSettings {\n const settings =\n \"behaviorSettings\" in service && service.behaviorSettings\n ? service.behaviorSettings\n : parseServiceImplicitTagParams(service.tags);\n return settings;\n }\n\n /** `GET + parse`: получить сервис и извлечь `ServiceBehaviorSettings`. */\n async getBehaviorSettings(\n serviceId: string,\n options?: {\n profileId?: string | null;\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ServiceBehaviorSettings> {\n const service = await this.getById(serviceId, options);\n return this.getBehaviorSettingsFromService(service);\n }\n\n /**\n * Обновляет настройки поведения услуги через типизированную структуру.\n * `mergeParameters=true` по умолчанию: patch поверх текущих settings.\n */\n async updateBehaviorSettings(\n serviceId: string,\n settingsPatch: Partial<ServiceBehaviorSettings>,\n options?: {\n mergeParameters?: boolean;\n profileId?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n includeDeleted?: boolean | null;\n includeChildTypes?: boolean;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<ServiceItem> {\n const service = await this.getById(serviceId, {\n profileId: options?.profileId,\n includeDeleted: options?.includeDeleted,\n includeChildTypes: options?.includeChildTypes,\n securityToken: options?.securityToken,\n signal: options?.signal,\n });\n\n const mergeParameters = options?.mergeParameters ?? true;\n const nextSettings: ServiceImplicitTagParams = mergeParameters\n ? {\n ...this.getBehaviorSettingsFromService(service),\n ...settingsPatch,\n }\n : { ...settingsPatch };\n\n service.behaviorSettings = nextSettings;\n service.tags = mergeServiceImplicitTags(service.tags, nextSettings);\n\n return this.update(service, serviceId, {\n profileId: options?.profileId,\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n signal: options?.signal,\n });\n }\n\n /** Полная установка `ServiceBehaviorSettings` (без merge c текущими параметрами). */\n setBehaviorSettings(\n serviceId: string,\n settings: ServiceBehaviorSettings,\n options?: Omit<Parameters<ServicesFacade[\"updateBehaviorSettings\"]>[2], \"mergeParameters\">,\n ): Promise<ServiceItem> {\n return this.updateBehaviorSettings(serviceId, settings, {\n ...options,\n mergeParameters: false,\n });\n }\n\n /**\n * Запись на услугу — `POST /api/v1/services/{serviceId}/order`.\n * Минимум в теле: непустой смысл в `checkInProperties` (слот, участник, контакты — по правилам услуги и OpenAPI).\n * Успех: `OrderResp` (часто интересен `order` как кейс и `consumerSecurityToken` для гостевого доступа).\n * Типичные отказы: нет слота, услуга недоступна по времени, подписка/баланс — разбирай тело `TorrowHttpError` (`name` / `code`); эталон UX — `torrow-apps` `CreateOrderTask`.\n */\n createOrder(\n serviceId: string,\n body: CreateOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<OrderResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/order`,\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * Слоты расписания услуги — `PUT /api/v1/services/{serviceId}/timetable` с телом `TimetableFilter`.\n * Используется для выбора времени в мастере записи (после выбора ресурсов передай `bookingResourceFilter` в фильтре).\n */\n getTimetable(\n serviceId: string,\n body: TimetableFilter,\n options?: TimetableQueryOptions & { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n const { signal, ...queryOpts } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(serviceId)}/timetable`,\n query: buildTimetableQuery(queryOpts),\n body,\n signal,\n });\n }\n\n /**\n * Нагрузка и расписание по ресурсам услуги — `PUT /api/v1/services/workloadinfo`.\n * Эталон: torrow-apps `ServiceItemService.getWorkloadInfo`, экран заказов по ресурсам (`service-resource-orders`).\n */\n getWorkloadInfo(\n body: GetServiceWorkloadInfoRequest,\n options?: { signal?: AbortSignal },\n ): Promise<GetServiceWorkloadInfoResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/workloadinfo`,\n body,\n signal: options?.signal,\n });\n }\n\n /** Агрегаты по расписанию услуги — `POST /api/v1/services/timetable/statistics`. */\n getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<GetTimetableStatisticsResponse> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n }\n\n /** Доступные окна чекина — `POST /api/v1/services/{id}/checkinschedule`. */\n getCheckInSchedule(\n serviceId: string,\n body: GetCheckInScheduleReq,\n options?: { signal?: AbortSignal },\n ): Promise<GetCheckInScheduleResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/checkinschedule`,\n body,\n signal: options?.signal,\n });\n }\n\n /** Пересчёт расписания чекина — `PUT /api/v1/services/{id}/recheckinschedule`. */\n getReCheckInSchedule(\n serviceId: string,\n body: GetReCheckInScheduleReq,\n options?: { signal?: AbortSignal },\n ): Promise<GetCheckInScheduleResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(serviceId)}/recheckinschedule`,\n body,\n signal: options?.signal,\n });\n }\n\n /** Доступные ресурсы группы для шага «Ресурс» — `POST /api/v1/services/{serviceId}/resources`. */\n getServiceResources(\n serviceId: string,\n body: SearchServiceResourcesReq,\n options?: { signal?: AbortSignal },\n ): Promise<ResourceView[]> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/resources`,\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * Ресурсы с детализацией (в т.ч. гарантированные количества) — `POST .../resourceswithdetalization`.\n * Удобно для виджетов с лимитами мест / «осталось N».\n */\n getServiceResourcesWithDetalization(\n serviceId: string,\n body: SearchServiceResourcesReq,\n options?: { signal?: AbortSignal },\n ): Promise<SearchServiceResourcesResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/resourceswithdetalization`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/services/personallist` */\n listPersonal(options?: PersonalListQuery & { signal?: AbortSignal }): Promise<ServiceItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http\n .requestJson<ServiceItemApi[]>({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n })\n .then((items) => items.map((item) => this.toSdkServiceItem(item)));\n }\n\n /** `POST /api/v1/services/{serviceId}/session` — создать сессию записи (тело `CaseItem`). */\n createSession(\n serviceId: string,\n body: CaseItem,\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(serviceId)}/session`,\n query: { profileId: options?.profileId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/services/{serviceId}/session` — получить/обновить сессию по `caseId`. */\n refreshSession(\n serviceId: string,\n options?: { caseId?: string | null; profileId?: string | null; signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(serviceId)}/session`,\n query: { caseId: options?.caseId, profileId: options?.profileId },\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/services/{serviceId}/updateorder` */\n patchUpdateOrder(\n serviceId: string,\n body: UpdateOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(serviceId)}/updateorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/services/{serviceId}/updateorder2` */\n patchUpdateOrder2(\n serviceId: string,\n body: UpdateOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(serviceId)}/updateorder2`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/services/{serviceId}/changeorderservice` */\n changeOrderService(\n serviceId: string,\n body: ChangeOrderServiceReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(serviceId)}/changeorderservice`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PATCH /api/v1/services/{serviceId}/updateorderinfo` */\n patchUpdateOrderInfo(\n serviceId: string,\n body: UpdateOrderInfoReq,\n options?: { signal?: AbortSignal },\n ): Promise<CaseItem> {\n return this.http.requestJson({\n method: \"PATCH\",\n path: `${BASE}/${encodePathSegment(serviceId)}/updateorderinfo`,\n body,\n signal: options?.signal,\n });\n }\n}\n","import { HttpClient } from \"../../http/HttpClient.js\";\nimport type { ResolvedTorrowClientConfig } from \"../../TorrowClientConfig.js\";\nimport type {\n CreateAuthSessionReq,\n CreateAuthSessionResp,\n RefreshReq,\n RevokeReq,\n SendCodeReq,\n SendCodeResp,\n TokenReq,\n TokenResp,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/auth\";\n\n/**\n * **AuthIdentity** (`/api/v1/auth/*`): выдача и обновление токенов, сессия, код.\n *\n * Все методы ходят через **отдельный** {@link HttpClient} **без** `getAccessToken` и **без**\n * `securityToken`, чтобы вызовы вроде **`refresh`** не зацикливались на Bearer основного\n * **`TorrowClient`** и не тащили гостевой query на identity-эндпоинты.\n */\nexport class AuthFacade {\n private readonly anonHttp: HttpClient;\n\n constructor(config: ResolvedTorrowClientConfig) {\n this.anonHttp = new HttpClient({\n baseUrl: config.baseUrl,\n fetch: config.fetch,\n defaultHeaders: config.defaultHeaders,\n userAgent: config.userAgent,\n });\n }\n\n /** `POST /api/v1/auth/refresh` — новая пара токенов по `refreshToken`. */\n refresh(body: RefreshReq, options?: { signal?: AbortSignal }): Promise<TokenResp> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/refresh`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/auth/token` — обмен `sessionId` / `code` (и др.) на `TokenResp`. */\n requestToken(body: TokenReq, options?: { signal?: AbortSignal }): Promise<TokenResp> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/token`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/auth/revoke` — инвалидация refresh (тело `RevokeReq`). */\n revoke(body: RevokeReq, options?: { signal?: AbortSignal }): Promise<void> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/revoke`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/auth/sendcode` — отправка кода входа; ответ `SendCodeResp`. */\n sendCode(body: SendCodeReq, options?: { signal?: AbortSignal }): Promise<SendCodeResp> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/sendcode`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/auth/session` — создание сессии аутентификации. */\n createSession(\n body: CreateAuthSessionReq,\n options?: { signal?: AbortSignal },\n ): Promise<CreateAuthSessionResp> {\n return this.anonHttp.requestJson({\n method: \"POST\",\n path: `${BASE}/session`,\n body,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type {\n AddProfileResp,\n ContactItem,\n ProfileListResp,\n ProfileProperties,\n RemoveProfileResp,\n UpdateProfilePropertiesResp,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/user/profiles\";\n\n/**\n * **Профили пользователя** Torrow: `ContactItem`, привязанные к учётной записи (`profileType`, напр. `MyProfile`).\n * REST раздел **User**, не домен `/api/v1/contacts`.\n */\nexport class ProfilesFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/user/profiles` — список Профилей текущего пользователя. */\n list(options?: { signal?: AbortSignal }): Promise<ProfileListResp> {\n return this.http.requestJson({ method: \"GET\", path: BASE, signal: options?.signal });\n }\n\n /**\n * `POST /api/v1/user/profiles` — создать Профиль по телу контакта.\n * Ответ: `AddProfileResp` с полем `profile` (и устаревшим `personalContactList`).\n */\n add(body: ContactItem, options?: { signal?: AbortSignal }): Promise<AddProfileResp> {\n return this.http.requestJson({ method: \"POST\", path: BASE, body, signal: options?.signal });\n }\n\n /**\n * `PUT /api/v1/user/profiles` — в OpenAPI тело **JSON-строка** (id существующего контакта), не объект.\n * Добавляет этот контакт как Профиль. Ответ: `AddProfileResp`.\n */\n addByContactId(contactId: string, options?: { signal?: AbortSignal }): Promise<AddProfileResp> {\n return this.http.requestJson({ method: \"PUT\", path: BASE, body: contactId, signal: options?.signal });\n }\n\n /**\n * `PUT /api/v1/user/profiles/{profileId}/profileproperties` — обновить расширенные свойства Профиля\n * (цвет, доступность и т.д., см. тип `ProfileProperties`).\n */\n updateProfileProperties(\n profileId: string,\n body: ProfileProperties,\n options?: { signal?: AbortSignal },\n ): Promise<UpdateProfilePropertiesResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(profileId)}/profileproperties`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/user/profiles/{profileId}` — удалить Профиль. Ответ: `RemoveProfileResp`. */\n remove(profileId: string, options?: { signal?: AbortSignal }): Promise<RemoveProfileResp> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(profileId)}`,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type {\n CreateViewListReq,\n CreateViewListResp,\n DeleteResponse,\n DomainViewMap,\n ItemViewDomain,\n ObjectInfo,\n UpdateViewListOrderReq,\n UpdateViewListOrderResp,\n ViewListQuery,\n ViewListRootQuery,\n} from \"./types.js\";\n\nconst DOMAIN_BASE: Record<ItemViewDomain, string> = {\n contacts: \"/api/v1/contacts\",\n notes: \"/api/v1/notes\",\n contexts: \"/api/v1/contexts\",\n resources: \"/api/v1/resources\",\n services: \"/api/v1/services\",\n cases: \"/api/v1/cases\",\n calendars: \"/api/v1/calendars\",\n loyaltycards: \"/api/v1/loyaltycards\",\n loyaltysystems: \"/api/v1/loyaltysystems\",\n};\n\n/**\n * Персональные и закреплённые представления элементов под родителем (mind map, «мои» списки).\n * Пути `/api/v1/{domain}/{parentId}/views/user|pinned/...` — см. OpenAPI теги `*View`.\n */\nexport class ViewsFacade {\n constructor(private readonly http: HttpClient) {}\n\n private base(domain: ItemViewDomain): string {\n return DOMAIN_BASE[domain];\n }\n\n private parentPath(domain: ItemViewDomain, parentId: string): string {\n return `${this.base(domain)}/${encodePathSegment(parentId)}`;\n }\n\n /** У контактов снятие закрепления идёт через `.../pinned/{childId}/unpin`, у остальных доменов — `.../user/{childId}/unpin`. */\n private unpinUserSegment(domain: ItemViewDomain): \"user\" | \"pinned\" {\n return domain === \"contacts\" ? \"pinned\" : \"user\";\n }\n\n /** `GET /api/v1/{domain}/{parentId}/views/user` */\n listUserForParent<D extends ItemViewDomain>(\n domain: D,\n parentId: string,\n options?: ViewListQuery & { signal?: AbortSignal },\n ): Promise<DomainViewMap[D][]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.parentPath(domain, parentId)}/views/user`,\n query: { ...query },\n signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{parentId}/views/user` */\n createUserViews(\n domain: ItemViewDomain,\n parentId: string,\n body: CreateViewListReq,\n options?: { signal?: AbortSignal },\n ): Promise<CreateViewListResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.parentPath(domain, parentId)}/views/user`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/views/user` — все пользовательские представления по домену без привязки к одному родителю. */\n listUserAll<D extends ItemViewDomain>(\n domain: D,\n options?: ViewListRootQuery & { signal?: AbortSignal },\n ): Promise<DomainViewMap[D][]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.base(domain)}/views/user`,\n query: { ...query },\n signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{parentId}/views/user/{childId}` */\n getUserView<D extends ItemViewDomain>(\n domain: D,\n parentId: string,\n childId: string,\n options?: { signal?: AbortSignal },\n ): Promise<DomainViewMap[D]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.parentPath(domain, parentId)}/views/user/${encodePathSegment(childId)}`,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/{domain}/{parentId}/views/user/{childId}` — убрать из mind map пользователя под родителем. */\n deleteUserView(\n domain: ItemViewDomain,\n parentId: string,\n childId: string,\n options?: { signal?: AbortSignal },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${this.parentPath(domain, parentId)}/views/user/${encodePathSegment(childId)}`,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{parentId}/views/pinned` */\n createPinnedViews(\n domain: ItemViewDomain,\n parentId: string,\n body: CreateViewListReq,\n options?: { signal?: AbortSignal },\n ): Promise<CreateViewListResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.parentPath(domain, parentId)}/views/pinned`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{parentId}/views/pinned` */\n listPinnedForParent<D extends ItemViewDomain>(\n domain: D,\n parentId: string,\n options?: ViewListQuery & { signal?: AbortSignal },\n ): Promise<DomainViewMap[D][]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.parentPath(domain, parentId)}/views/pinned`,\n query: { ...query },\n signal,\n });\n }\n\n /** `DELETE /api/v1/{domain}/{parentId}/views/pinned/{childId}` */\n deletePinnedView(\n domain: ItemViewDomain,\n parentId: string,\n childId: string,\n options?: { signal?: AbortSignal },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${this.parentPath(domain, parentId)}/views/pinned/${encodePathSegment(childId)}`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/{domain}/{parentId}/views/pinned/{childId}` */\n getPinnedView<D extends ItemViewDomain>(\n domain: D,\n parentId: string,\n childId: string,\n options?: { signal?: AbortSignal },\n ): Promise<DomainViewMap[D]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${this.parentPath(domain, parentId)}/views/pinned/${encodePathSegment(childId)}`,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{parentId}/views/pinned/updateorder` */\n updatePinnedOrder(\n domain: ItemViewDomain,\n parentId: string,\n body: UpdateViewListOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<UpdateViewListOrderResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.parentPath(domain, parentId)}/views/pinned/updateorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{parentId}/views/user/updateorder` */\n updateUserViewOrder(\n domain: ItemViewDomain,\n parentId: string,\n body: UpdateViewListOrderReq,\n options?: { signal?: AbortSignal },\n ): Promise<UpdateViewListOrderResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.parentPath(domain, parentId)}/views/user/updateorder`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/{domain}/{parentId}/views/user/{childId}/pin` */\n pinUserView(\n domain: ItemViewDomain,\n parentId: string,\n childId: string,\n options?: { alias?: string | null; signal?: AbortSignal },\n ): Promise<ObjectInfo> {\n const { signal, alias } = options ?? {};\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.parentPath(domain, parentId)}/views/user/${encodePathSegment(childId)}/pin`,\n query: { alias },\n signal,\n });\n }\n\n /**\n * Снять закрепление пользовательского представления.\n * Для `contacts`: `POST .../views/pinned/{childId}/unpin`; иначе `POST .../views/user/{childId}/unpin`.\n */\n unpinUserView(\n domain: ItemViewDomain,\n parentId: string,\n childId: string,\n options?: { alias?: string | null; signal?: AbortSignal },\n ): Promise<ObjectInfo> {\n const { signal, alias } = options ?? {};\n const seg = this.unpinUserSegment(domain);\n return this.http.requestJson({\n method: \"POST\",\n path: `${this.parentPath(domain, parentId)}/views/${seg}/${encodePathSegment(childId)}/unpin`,\n query: { alias },\n signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type { components } from \"../../schema/generated.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { CaseView, CalendarView, ContactView, NoteView, ServiceView } from \"../views/types.js\";\nimport type { ResourceView } from \"../services/types.js\";\nimport type {\n AdvisedItemsSearchQuery,\n ContactSearchQuery,\n OrderFilter,\n OrderSearchQuery,\n ItemTextSearchQuery,\n} from \"./types.js\";\n\ntype TorrowItem = components[\"schemas\"][\"TorrowItem\"];\n\nconst BASE = \"/api/v1/search\";\n\n/**\n * Поиск по API (**OpenAPI** тег **Search**): рекомендации, текстовый поиск по типам элементов,\n * фильтруемый список заказов под родителем.\n */\nexport class SearchFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/search/adviseditems` */\n advisedItems(\n query?: AdvisedItemsSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItem[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/adviseditems`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/search/{torrowId}/orders` — заказы (события-заказы) под элементом с фильтром.\n * Тело **`OrderFilter`**; см. также **`examples/node/raw/24-search-orders-raw.ts`** (сырой `raw.put`).\n */\n orders(\n torrowId: string,\n body: OrderFilter,\n query?: OrderSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<CaseView[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/orders`,\n query: { ...(query ?? {}) },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/search/contacts` */\n contacts(\n query?: ContactSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ContactView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/contacts`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/search/notes` */\n notes(query?: ItemTextSearchQuery, options?: { signal?: AbortSignal }): Promise<NoteView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/notes`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/search/calendars` */\n calendars(\n query?: ItemTextSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<CalendarView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/calendars`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/search/cases` */\n cases(query?: ItemTextSearchQuery, options?: { signal?: AbortSignal }): Promise<CaseView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/cases`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/search/resources` */\n resources(\n query?: ItemTextSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ResourceView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/resources`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/search/services` */\n services(\n query?: ItemTextSearchQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ServiceView[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/services`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type { ActionHistoryInfo, ActionHistoryListQuery } from \"./types.js\";\n\nconst BASE = \"/api/v1/actionhistory\";\n\n/** История действий пользователя/системы (OpenAPI tag `ActionHistory`). */\nexport class ActionHistoryFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/actionhistory` */\n list(\n query?: ActionHistoryListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<ActionHistoryInfo[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: BASE,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { DeleteResponse } from \"../contacts/types.js\";\nimport type {\n AccountingTransaction,\n AccountingTransactionState,\n AccountingTransactionsListQuery,\n BalanceValue,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/accountingtransactions\";\n\n/**\n * Учётные транзакции (**OpenAPI** **AccountingTransaction**): CRUD, смена состояния, баланс, список транзакций.\n */\nexport class AccountingTransactionsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/accountingtransactions` */\n create(\n body: AccountingTransaction,\n options?: { securityToken?: string | null; signal?: AbortSignal },\n ): Promise<AccountingTransaction> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: { securityToken: options?.securityToken },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/accountingtransactions/{torrowId}` */\n update(\n body: AccountingTransaction,\n torrowId: string,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<AccountingTransaction> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/accountingtransactions/{torrowId}` */\n delete(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/accountingtransactions/{torrowId}/state` — смена **`AccountingTransactionState`**\n * (в query **`state`**).\n */\n updateState(\n torrowId: string,\n state: AccountingTransactionState,\n options?: {\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<AccountingTransaction> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/state`,\n query: {\n state,\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/accountingtransactions/{torrowId}/balance` */\n getBalance(\n torrowId: string,\n options?: { balanceDate?: string | null; securityToken?: string | null; signal?: AbortSignal },\n ): Promise<BalanceValue[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/balance`,\n query: {\n balanceDate: options?.balanceDate,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/accountingtransactions/{torrowId}/transactions` */\n listTransactions(\n torrowId: string,\n query?: AccountingTransactionsListQuery,\n options?: { signal?: AbortSignal },\n ): Promise<AccountingTransaction[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/transactions`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type {\n AnnouncementInfo,\n AnnouncementsListQuery,\n TorrowObject,\n UpdateAnnouncementStateReq,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/announcements\";\n\n/**\n * Объявления (**OpenAPI** **Announcement**): список и массовое обновление состояния.\n */\nexport class AnnouncementsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/announcements` */\n list(query?: AnnouncementsListQuery, options?: { signal?: AbortSignal }): Promise<AnnouncementInfo[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: BASE,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/announcements/updatestate` */\n updateState(\n body: UpdateAnnouncementStateReq[],\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject[]> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/updatestate`,\n body,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type {\n ExportGraph,\n ExportRequest,\n ImportByFileRequest,\n ImportByUniqueNameRequest,\n TorrowItem,\n} from \"./types.js\";\n\n/**\n * Экспорт / импорт графа элементов (**OpenAPI** **ExportImport**).\n */\nexport class ExportImportFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/export` */\n exportSubgraph(body: ExportRequest, options?: { signal?: AbortSignal }): Promise<ExportGraph> {\n return this.http.requestJson({\n method: \"POST\",\n path: \"/api/v1/export\",\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/import` */\n importFromFile(body: ImportByFileRequest, options?: { signal?: AbortSignal }): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: \"/api/v1/import\",\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/importbyuniquename` */\n importByUniqueName(\n body: ImportByUniqueNameRequest,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: \"/api/v1/importbyuniquename\",\n body,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { GenerateReportReq, GenerateReportResp } from \"./types.js\";\n\nconst BASE = \"/api/v1/reports\";\n\n/**\n * Отчёты (**OpenAPI** тег **Report**): генерация ссылки / доставка по **`GenerateReportReq`**.\n */\nexport class ReportsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `POST /api/v1/reports` — опционально **`profileId`** в query (как в Swagger).\n */\n generate(\n body: GenerateReportReq,\n options?: { profileId?: string | null; signal?: AbortSignal },\n ): Promise<GenerateReportResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: { profileId: options?.profileId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/reports/{profileId}` */\n generateForProfile(\n profileId: string,\n body: GenerateReportReq,\n options?: { signal?: AbortSignal },\n ): Promise<GenerateReportResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(profileId)}`,\n body,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { DeleteResponse } from \"../contacts/types.js\";\nimport { TorrowItemCoreFacade } from \"../common/item-social-facet-base.js\";\nimport type { LoyaltySystemPersonalListQuery } from \"../loyalty/loyalty-personal-list-query.js\";\nimport type { LoyaltyCardItem } from \"../loyalty-cards/types.js\";\nimport type {\n CreateLoyaltyCardReq,\n GetParticipationCountResp,\n GetLoyaltySystemsStatisticsReq,\n GetLoyaltySystemsStatisticsResp,\n LoyaltyParticipantsQuery,\n LoyaltySystemItem,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/loyaltysystems\";\n\n/**\n * Программы лояльности (**OpenAPI** **LoyaltySystem**): CRUD, персональный список, выпуск карты, статистика.\n * Общий item-слой — {@link TorrowItemCoreFacade} (без эндпоинтов, которых нет в Swagger loyaltysystems).\n */\nexport class LoyaltySystemsFacade extends TorrowItemCoreFacade<LoyaltySystemItem, LoyaltyParticipantsQuery> {\n constructor(http: HttpClient) {\n super(http, BASE);\n }\n\n /** `POST /api/v1/loyaltysystems` */\n create(\n body: LoyaltySystemItem,\n options?: { parentId?: string | null; profileId?: string | null; signal?: AbortSignal },\n ): Promise<LoyaltySystemItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n query: { parentId: options?.parentId, profileId: options?.profileId },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/loyaltysystems/{torrowId}` */\n update(\n body: LoyaltySystemItem,\n torrowId: string,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<LoyaltySystemItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/loyaltysystems/{torrowId}` */\n delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n }\n\n /** `GET /api/v1/loyaltysystems/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildItems?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<LoyaltySystemItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildItems: options?.includeChildItems,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltysystems/personallist` */\n listPersonal(\n options?: LoyaltySystemPersonalListQuery & { signal?: AbortSignal },\n ): Promise<LoyaltySystemItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `DELETE /api/v1/loyaltysystems/personallist/{torrowId}` */\n deleteFromPersonalList(torrowId: string, options?: { signal?: AbortSignal }): Promise<void> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/personallist/${encodePathSegment(torrowId)}`,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/loyaltysystems/{loyaltySystemId}/loyaltycard` — выпуск **`LoyaltyCardItem`** под программой. */\n createLoyaltyCard(\n loyaltySystemId: string,\n body: CreateLoyaltyCardReq,\n options?: { signal?: AbortSignal },\n ): Promise<LoyaltyCardItem> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(loyaltySystemId)}/loyaltycard`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/loyaltysystems/statistics` */\n postStatistics(\n body: GetLoyaltySystemsStatisticsReq,\n options?: { securityToken?: string | null; signal?: AbortSignal },\n ): Promise<GetLoyaltySystemsStatisticsResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/statistics`,\n query: { securityToken: options?.securityToken },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltysystems/{torrowId}/participants/count` */\n getParticipantsCount(\n torrowId: string,\n query?: {\n participantStateList?: LoyaltyParticipantsQuery[\"participantStateList\"];\n participantTypeList?: LoyaltyParticipantsQuery[\"participantTypeList\"];\n },\n options?: { signal?: AbortSignal },\n ): Promise<GetParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/participants/count`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { DeleteResponse, NotificationWay } from \"../contacts/types.js\";\nimport { TorrowItemCoreFacade } from \"../common/item-social-facet-base.js\";\nimport type { LoyaltyPersonalListQuery } from \"../loyalty/loyalty-personal-list-query.js\";\nimport type {\n GetTimetableStatisticsRequest,\n GetTimetableStatisticsResponse,\n} from \"../services/types.js\";\nimport type {\n AccountingTransaction,\n BalanceValue,\n CreateLoyaltyCardSubscriptionReq,\n GetParticipationCountResp,\n LoyaltyCardItem,\n LoyaltyCardSubscription,\n LoyaltyParticipantsQuery,\n LoyaltyTransactionsQuery,\n ObjectInfo,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/loyaltycards\";\n\nconst LOYALTY_CARD_SOCIAL_OPTS = { withGroupListEndpoint: false as const };\n\n/**\n * Карты лояльности (**OpenAPI** **LoyaltyCard**). Создание — через **`LoyaltySystems.createLoyaltyCard`**;\n * здесь CRUD-часть (без `POST` корня), персональный список, presigned image.\n * Общий item-слой — {@link TorrowItemCoreFacade} (`GET .../group/list` в OpenAPI нет → {@link TorrowItemFacadeOptions.withGroupListEndpoint}).\n */\nexport class LoyaltyCardsFacade extends TorrowItemCoreFacade<LoyaltyCardItem, LoyaltyParticipantsQuery> {\n constructor(http: HttpClient) {\n super(http, BASE, LOYALTY_CARD_SOCIAL_OPTS);\n }\n\n /** `POST /api/v1/loyaltycards/{loyaltyCardId}/subscription` */\n createSubscription(\n loyaltyCardId: string,\n body: CreateLoyaltyCardSubscriptionReq,\n options?: { signal?: AbortSignal },\n ): Promise<LoyaltyCardSubscription> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(loyaltyCardId)}/subscription`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/participants/count` */\n getParticipantsCount(\n torrowId: string,\n query?: {\n participantStateList?: LoyaltyParticipantsQuery[\"participantStateList\"];\n participantTypeList?: LoyaltyParticipantsQuery[\"participantTypeList\"];\n },\n options?: { signal?: AbortSignal },\n ): Promise<GetParticipationCountResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/participants/count`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/balance` */\n getBalance(\n torrowId: string,\n options?: { balanceDate?: string | Date | null; securityToken?: string | null; signal?: AbortSignal },\n ): Promise<BalanceValue[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/balance`,\n query: {\n balanceDate: options?.balanceDate,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/transactions` */\n listTransactions(\n torrowId: string,\n query?: LoyaltyTransactionsQuery,\n options?: { signal?: AbortSignal },\n ): Promise<AccountingTransaction[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/transactions`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/subscriptions/{subscriptionId}/balance` */\n getSubscriptionBalance(\n torrowId: string,\n subscriptionId: string,\n options?: { balanceDate?: string | Date | null; securityToken?: string | null; signal?: AbortSignal },\n ): Promise<BalanceValue[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/subscriptions/${encodePathSegment(subscriptionId)}/balance`,\n query: {\n balanceDate: options?.balanceDate,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}/subscriptions/{subscriptionId}/transactions` */\n getSubscriptionTransactions(\n torrowId: string,\n subscriptionId: string,\n query?: LoyaltyTransactionsQuery,\n options?: { signal?: AbortSignal },\n ): Promise<AccountingTransaction[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/subscriptions/${encodePathSegment(subscriptionId)}/transactions`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/loyaltycards/{torrowId}` */\n update(\n body: LoyaltyCardItem,\n torrowId: string,\n options?: {\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<LoyaltyCardItem> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n checkVersion: options?.checkVersion,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/loyaltycards/{torrowId}` */\n delete(\n torrowId: string,\n options: {\n cascade: boolean;\n withPinnedItems: boolean;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n cascade: options.cascade,\n withPinnedItems: options.withPinnedItems,\n versionToCheck: options.versionToCheck,\n isNeedAnnouncement: options.isNeedAnnouncement,\n },\n signal: options.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/{torrowId}` */\n getById(\n torrowId: string,\n options?: {\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n includeChildItems?: boolean | null;\n includeBalance?: boolean | null;\n securityToken?: string | null;\n signal?: AbortSignal;\n },\n ): Promise<LoyaltyCardItem> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n includeChildItems: options?.includeChildItems,\n includeBalance: options?.includeBalance,\n securityToken: options?.securityToken,\n },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/loyaltycards/personallist` */\n listPersonal(\n options?: LoyaltyPersonalListQuery & { signal?: AbortSignal },\n ): Promise<LoyaltyCardItem[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/personallist`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `DELETE /api/v1/loyaltycards/personallist/{torrowId}` */\n deleteFromPersonalList(torrowId: string, options?: { signal?: AbortSignal }): Promise<void> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/personallist/${encodePathSegment(torrowId)}`,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/loyaltycards/timetable/statistics` */\n getTimetableStatistics(\n body: GetTimetableStatisticsRequest,\n options?: { signal?: AbortSignal },\n ): Promise<GetTimetableStatisticsResponse> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/timetable/statistics`,\n body,\n signal: options?.signal,\n });\n }\n\n /**\n * `PUT /api/v1/loyaltycards/{itemId}/notificationwaylist` — в OpenAPI есть у **loyaltycards**, но не у **loyaltysystems**,\n * поэтому метод не вынесен в общий {@link TorrowItemCoreFacade}.\n */\n updateNotificationWayList(\n itemId: string,\n ways: NotificationWay[],\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<ObjectInfo> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(itemId)}/notificationwaylist`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body: ways,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type { TorrowObject, UserSettingsInfo } from \"./types.js\";\n\nconst BASE = \"/api/v1/user/settings\";\n\n/**\n * Настройки пользователя (User API).\n * OpenAPI: `GET /api/v1/user/settings`, `PUT /api/v1/user/settings/update`.\n */\nexport class UserSettingsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/user/settings` — текущее значение `UserSettingsInfo`. */\n get(options?: { signal?: AbortSignal }): Promise<UserSettingsInfo> {\n return this.http.requestJson({\n method: \"GET\",\n path: BASE,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/settings/update` — сохранить настройки. */\n update(body: UserSettingsInfo, options?: { signal?: AbortSignal }): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/update`,\n body,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type {\n Account,\n AddProfileResp,\n CompleteAddingAccountReq,\n CompleteDeletingUserReq,\n CompleteDeletingUserResp,\n ContactItem,\n DeleteResponse,\n DeleteUserAccountReq,\n DeleteUserAccountResp,\n DeliveryChannel,\n DeviceInfo,\n DeviceSettingsInfo,\n DeviceType,\n InitAddingAccountReq,\n InitAddingAccountResp,\n InitDeletingUserResp,\n LoyaltyCardItem,\n NotificationWay,\n RegisterUserForAccountResp,\n RegistrationUserInfo,\n TimetableCase,\n TimetableFilter,\n TorrowObject,\n UserAccountsQuery,\n UserCalendar,\n UserDeliveryWay,\n UserTimetableQuery,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/user\";\n\nexport class UserFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/user/loyaltycard` */\n getLoyaltyCard(options?: { signal?: AbortSignal }): Promise<LoyaltyCardItem> {\n return this.http.requestJson({ method: \"GET\", path: `${BASE}/loyaltycard`, signal: options?.signal });\n }\n\n /** `GET /api/v1/user/accounts` */\n listAccounts(query?: UserAccountsQuery, options?: { signal?: AbortSignal }): Promise<Account[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/accounts`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/user/accounts/add/init` */\n initAddAccount(body: InitAddingAccountReq, options?: { signal?: AbortSignal }): Promise<InitAddingAccountResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/accounts/add/init`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/user/accounts/add/complete` */\n completeAddAccount(body: CompleteAddingAccountReq, options?: { signal?: AbortSignal }): Promise<Account> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/accounts/add/complete`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/user/accounts/delete` */\n deleteAccount(body: DeleteUserAccountReq, options?: { signal?: AbortSignal }): Promise<DeleteUserAccountResp> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/accounts/delete`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/devices` */\n listDevices(\n query?: { deviceTypes?: DeviceType[] },\n options?: { signal?: AbortSignal },\n ): Promise<DeviceInfo[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/devices`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/user/devices/{deviceId}` */\n deleteDevice(deviceId: string, options?: { signal?: AbortSignal }): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/devices/${encodePathSegment(deviceId)}`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/devices/{deviceId}/settings` */\n getDeviceSettings(deviceId: string, options?: { signal?: AbortSignal }): Promise<DeviceSettingsInfo> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/devices/${encodePathSegment(deviceId)}/settings`,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/devices/{deviceId}/settings` */\n updateDeviceSettings(\n deviceId: string,\n settings: string,\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/devices/${encodePathSegment(deviceId)}/settings`,\n query: { settings },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/defaultprofile` */\n getDefaultProfile(options?: { signal?: AbortSignal }): Promise<ContactItem> {\n return this.http.requestJson({ method: \"GET\", path: `${BASE}/defaultprofile`, signal: options?.signal });\n }\n\n /** `PUT /api/v1/user/defaultprofile` */\n setDefaultProfileByContactId(contactId: string, options?: { signal?: AbortSignal }): Promise<AddProfileResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/defaultprofile`,\n body: contactId,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/user/defaultprofile` */\n createDefaultProfile(body: ContactItem, options?: { signal?: AbortSignal }): Promise<AddProfileResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/defaultprofile`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/deliveryways` */\n listDeliveryWays(\n query?: { deliveryChannelList?: DeliveryChannel[] },\n options?: { signal?: AbortSignal },\n ): Promise<UserDeliveryWay[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/deliveryways`,\n query: { ...(query ?? {}) },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/defaultnotificationways` */\n listDefaultNotificationWays(options?: { signal?: AbortSignal }): Promise<NotificationWay[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/defaultnotificationways`,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/defaultnotificationways` */\n updateDefaultNotificationWays(\n body: NotificationWay[],\n options?: { versionToCheck?: number; isNeedAnnouncement?: boolean; signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/defaultnotificationways`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/place` */\n updatePlace(\n query: { profileId?: string; placeId?: number },\n options?: { signal?: AbortSignal },\n ): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/place`,\n query,\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/user/register` */\n register(\n body: RegistrationUserInfo,\n options?: { signal?: AbortSignal },\n ): Promise<RegisterUserForAccountResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/register`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/timetable` */\n getTimetable(\n body: TimetableFilter,\n query?: UserTimetableQuery,\n options?: { signal?: AbortSignal },\n ): Promise<TimetableCase[]> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/timetable`,\n query: { ...(query ?? {}) },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/calendars` */\n listCalendars(options?: { signal?: AbortSignal }): Promise<UserCalendar[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/calendars`,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/user/calendars/update` */\n updateCalendars(body: UserCalendar[], options?: { signal?: AbortSignal }): Promise<TorrowObject> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/calendars/update`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/user/delete/init` */\n initDelete(options?: { signal?: AbortSignal }): Promise<InitDeletingUserResp> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/delete/init`,\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/user/delete/complete` */\n completeDelete(\n body: CompleteDeletingUserReq,\n options?: { signal?: AbortSignal },\n ): Promise<CompleteDeletingUserResp> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/delete/complete`,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/user/count` */\n count(options?: { signal?: AbortSignal }): Promise<number> {\n return this.http.requestJson({ method: \"GET\", path: `${BASE}/count`, signal: options?.signal });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { BlockReason, BlockReasonListQuery } from \"./types.js\";\n\nconst BASE = \"/api/v1/blockreason\";\n\n/**\n * Справочник причин блокировки (**OpenAPI** `/api/v1/blockreason`).\n */\nexport class BlockReasonsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/blockreason` — создать; ответ: числовой id. */\n create(body: BlockReason, options?: { signal?: AbortSignal }): Promise<number> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/blockreason/{id}` */\n getById(\n id: number,\n options?: { lng?: string | null; signal?: AbortSignal },\n ): Promise<BlockReason> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(String(id))}`,\n query: { lng: options?.lng },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/blockreason/all` */\n listAll(query?: BlockReasonListQuery, options?: { signal?: AbortSignal }): Promise<BlockReason[]> {\n const { signal } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/all`,\n query: { ...(query ?? {}) },\n signal,\n });\n }\n\n /** `DELETE /api/v1/blockreason/{id}` — ответ: число (код/количество по контракту API). */\n delete(id: number, options?: { signal?: AbortSignal }): Promise<number> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(String(id))}`,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { PersonalListQuery } from \"../common/personal-list.js\";\nimport type { AddExternalAuthReq, AddExternalAuthResp, DeleteResponse, ExternalAuth } from \"./types.js\";\n\nconst BASE = \"/api/v1/externalauths\";\n\n/** Внешняя авторизация (`/api/v1/externalauths`). */\nexport class ExternalAuthsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/externalauths` */\n add(body: AddExternalAuthReq, options?: { signal?: AbortSignal }): Promise<AddExternalAuthResp> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/externalauths/{torrowId}` */\n getById(\n torrowId: string,\n options?: { includeDeleted?: boolean | null; signal?: AbortSignal },\n ): Promise<ExternalAuth> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: { includeDeleted: options?.includeDeleted },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/externalauths/all` */\n listAll(\n options?: PersonalListQuery & { includeDeleted?: boolean | null; signal?: AbortSignal },\n ): Promise<ExternalAuth[]> {\n const { signal, ...rest } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/all`,\n query: { ...rest },\n signal,\n });\n }\n\n /** `DELETE /api/v1/externalauths/{externalAuthId}` */\n delete(\n externalAuthId: string,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(externalAuthId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { GetTorrowIdResp, TorrowObjectType } from \"./types.js\";\n\nconst BASE = \"/api/v1/idgenerator\";\n\n/** Выдача Torrow id по типу объекта — `GET /api/v1/idgenerator/{objectType}`. */\nexport class IdGeneratorFacade {\n constructor(private readonly http: HttpClient) {}\n\n getNextId(objectType: TorrowObjectType, options?: { signal?: AbortSignal }): Promise<GetTorrowIdResp> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(String(objectType))}`,\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type { DeleteResponse, Integration } from \"./types.js\";\n\nconst BASE = \"/api/v1/integrations\";\n\n/** Интеграции (`/api/v1/integrations`). */\nexport class IntegrationsFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /api/v1/integrations` */\n create(body: Integration, options?: { signal?: AbortSignal }): Promise<Integration> {\n return this.http.requestJson({\n method: \"POST\",\n path: BASE,\n body,\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/integrations/{torrowId}` */\n update(\n body: Integration,\n torrowId: string,\n options?: { checkVersion?: boolean | null; signal?: AbortSignal },\n ): Promise<Integration> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}`,\n query: { checkVersion: options?.checkVersion },\n body,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/integrations/list` */\n list(\n options?: {\n integrationIds?: string[] | null;\n includeDeleted?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<Integration[]> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/list`,\n query: {\n integrationIds: options?.integrationIds,\n includeDeleted: options?.includeDeleted,\n },\n signal: options?.signal,\n });\n }\n\n /** `DELETE /api/v1/integrations/{integrationId}` */\n delete(\n integrationId: string,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(integrationId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport type {\n DeleteResponse,\n Feedback,\n ItemFeedback,\n ItemViewSortCondition,\n ParticipationResp,\n UserFeedback,\n} from \"./types.js\";\n\nconst BASE = \"/api/v1/item\";\n\n/**\n * Кросс-доменные операции **Item** (отзывы, шаринг-сессия, uniquename).\n * Не путать с CRUD конкретных типов (`contacts`, `services`, …).\n */\nexport class ItemFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `PUT /api/v1/item/activateshareitemsession/{shareItemSessionId}` */\n activateShareItemSession(\n shareItemSessionId: string,\n options?: { userProfileId?: string | null; code?: string | null; signal?: AbortSignal },\n ): Promise<ParticipationResp> {\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/activateshareitemsession/${encodePathSegment(shareItemSessionId)}`,\n query: { userProfileId: options?.userProfileId, code: options?.code },\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/item/uniquename/{uniqueName}` — ответ: строка (часто id / url по контракту). */\n getByUniqueName(uniqueName: string, options?: { signal?: AbortSignal }): Promise<string> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/uniquename/${encodePathSegment(uniqueName)}`,\n signal: options?.signal,\n });\n }\n\n /** `GET /api/v1/item/{torrowId}/userfeedback` */\n getUserFeedback(\n torrowId: string,\n options?: {\n throwExceptionIfNotFound?: boolean | null;\n versionToCheck?: number | null;\n includeDeleted?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<UserFeedback> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/userfeedback`,\n query: {\n throwExceptionIfNotFound: options?.throwExceptionIfNotFound,\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/item/{torrowId}/userfeedback` */\n putUserFeedback(\n torrowId: string,\n options?: {\n profileId?: string | null;\n score?: number | null;\n header?: string | null;\n text?: string | null;\n surveyResponse?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<UserFeedback> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/userfeedback`,\n query: { ...query },\n signal,\n });\n }\n\n /** `DELETE /api/v1/item/{torrowId}/userfeedback` */\n deleteUserFeedback(\n torrowId: string,\n options?: {\n profileId?: string | null;\n messageId?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<DeleteResponse> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}/userfeedback`,\n query: { ...query },\n signal,\n });\n }\n\n /** `GET /api/v1/item/{torrowId}/feedbacks` */\n listFeedbacks(\n torrowId: string,\n options?: {\n createDateFrom?: string | Date | null;\n createDateTo?: string | Date | null;\n scoreFrom?: number | null;\n scoreTo?: number | null;\n profileIdsFilter?: string[] | null;\n take?: number | null;\n skip?: number | null;\n lmfrom?: string | Date | null;\n lmto?: string | Date | null;\n includeDeleted?: boolean | null;\n sort?: ItemViewSortCondition | null;\n signal?: AbortSignal;\n },\n ): Promise<ItemFeedback[]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks`,\n query: { ...query },\n signal,\n });\n }\n\n /** `POST /api/v1/item/{torrowId}/feedbacks/newmessage` */\n postFeedbackNewMessage(\n torrowId: string,\n options?: {\n profileId?: string | null;\n header?: string | null;\n text?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<Feedback> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/newmessage`,\n query: { ...query },\n signal,\n });\n }\n\n /** `GET /api/v1/item/{torrowId}/feedbacks/{messageId}` */\n getFeedback(\n torrowId: string,\n messageId: string,\n options?: { versionToCheck?: number | null; includeDeleted?: boolean | null; signal?: AbortSignal },\n ): Promise<Feedback> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n includeDeleted: options?.includeDeleted,\n },\n signal: options?.signal,\n });\n }\n\n /** `PUT /api/v1/item/{torrowId}/feedbacks/{messageId}` */\n updateFeedback(\n torrowId: string,\n messageId: string,\n options?: {\n profileId?: string | null;\n header?: string | null;\n text?: string | null;\n versionToCheck?: number | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<Feedback> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"PUT\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}`,\n query: { ...query },\n signal,\n });\n }\n\n /** `DELETE /api/v1/item/{torrowId}/feedbacks/{messageId}` */\n deleteFeedback(\n torrowId: string,\n messageId: string,\n options?: { versionToCheck?: number | null; isNeedAnnouncement?: boolean | null; signal?: AbortSignal },\n ): Promise<DeleteResponse> {\n return this.http.requestJson({\n method: \"DELETE\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}`,\n query: {\n versionToCheck: options?.versionToCheck,\n isNeedAnnouncement: options?.isNeedAnnouncement,\n },\n signal: options?.signal,\n });\n }\n\n /** `POST /api/v1/item/{torrowId}/feedbacks/{messageId}/reply` */\n replyToFeedback(\n torrowId: string,\n messageId: string,\n options?: {\n profileId?: string | null;\n header?: string | null;\n text?: string | null;\n checkVersion?: boolean | null;\n isNeedAnnouncement?: boolean | null;\n signal?: AbortSignal;\n },\n ): Promise<Feedback> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"POST\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}/reply`,\n query: { ...query },\n signal,\n });\n }\n\n /** `GET /api/v1/item/{torrowId}/feedbacks/{messageId}/replies` */\n listFeedbackReplies(\n torrowId: string,\n messageId: string,\n options?: {\n createDateFrom?: string | Date | null;\n createDateTo?: string | Date | null;\n profileIdsFilter?: string[] | null;\n take?: number | null;\n skip?: number | null;\n lmfrom?: string | Date | null;\n lmto?: string | Date | null;\n includeDeleted?: boolean | null;\n sort?: ItemViewSortCondition | null;\n signal?: AbortSignal;\n },\n ): Promise<ItemFeedback[]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(torrowId)}/feedbacks/${encodePathSegment(messageId)}/replies`,\n query: { ...query },\n signal,\n });\n }\n}\n","import { buildAuthHeaders } from \"../../http/auth.js\";\nimport type { HttpClient } from \"../../http/HttpClient.js\";\nimport { encodePathSegment } from \"../../util/path.js\";\nimport { joinBaseUrlAndPath } from \"../../util/url.js\";\nimport type { ResolvedTorrowClientConfig } from \"../../TorrowClientConfig.js\";\nimport { DEFAULT_TORROW_API_BASE_URL } from \"../../TorrowClientConfig.js\";\n\nconst BASE = \"/api/v1/u\";\n\n/** Литерал для `scripts/gap-openapi-facades.mjs` (совпадение с `GET /api/v1/u/{shortUrl}`). */\nconst _GAP_SDK_PATH_REDIRECT = \"/api/v1/u/{p}\";\nvoid _GAP_SDK_PATH_REDIRECT;\n\n/**\n * Короткие ссылки (`/api/v1/u/*`).\n * `getFull` — JSON-строка цели; `getRedirectLocation` — `Location` при `redirect: manual` (302).\n */\nexport class ShortUrlFacade {\n constructor(\n private readonly http: HttpClient,\n private readonly config: ResolvedTorrowClientConfig,\n ) {}\n\n /** `GET /api/v1/u/{shortUrl}/full` */\n getFull(shortUrl: string, options?: { signal?: AbortSignal }): Promise<string> {\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/${encodePathSegment(shortUrl)}/full`,\n signal: options?.signal,\n });\n }\n\n /**\n * `GET /api/v1/u/{shortUrl}` — обычно **302 Redirect**.\n * Возвращает заголовок `Location` без следования редиректу.\n */\n async getRedirectLocation(shortUrl: string, options?: { signal?: AbortSignal }): Promise<string | null> {\n const fetchFn = this.config.fetch ?? globalThis.fetch;\n const origin = this.config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL;\n const url = joinBaseUrlAndPath(origin, `${BASE}/${encodePathSegment(shortUrl)}`);\n const authHeaders = await buildAuthHeaders(this.config);\n const res = await fetchFn(url, {\n method: \"GET\",\n redirect: \"manual\",\n headers: {\n Accept: \"*/*\",\n ...authHeaders,\n ...this.config.defaultHeaders,\n },\n signal: options?.signal,\n });\n return res.headers.get(\"Location\");\n }\n}\n","import type { HttpClient } from \"../../http/HttpClient.js\";\nimport type { DictionarySortCondition, Hobby, Place } from \"./types.js\";\n\nconst BASE = \"/api/v1/thesaurus\";\n\n/** Справочники мест и хобби (`/api/v1/thesaurus/*`). */\nexport class ThesaurusFacade {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/v1/thesaurus/places` */\n listPlaces(\n options?: {\n lat?: number | null;\n lon?: number | null;\n r?: number | null;\n txt?: string | null;\n lng?: string | null;\n take?: number | null;\n skip?: number | null;\n includeDeleted?: boolean | null;\n sort?: DictionarySortCondition | null;\n signal?: AbortSignal;\n },\n ): Promise<Place[]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/places`,\n query: { ...query },\n signal,\n });\n }\n\n /** `GET /api/v1/thesaurus/hobbies` */\n listHobbies(\n options?: {\n lng?: string | null;\n take?: number | null;\n skip?: number | null;\n includeDeleted?: boolean | null;\n sort?: DictionarySortCondition | null;\n signal?: AbortSignal;\n },\n ): Promise<Hobby[]> {\n const { signal, ...query } = options ?? {};\n return this.http.requestJson({\n method: \"GET\",\n path: `${BASE}/hobbies`,\n query: { ...query },\n signal,\n });\n }\n}\n","import { HttpClient } from \"./http/HttpClient.js\";\nimport { RawClient } from \"./raw/RawClient.js\";\nimport { CalendarsFacade } from \"./resources/calendars/CalendarsFacade.js\";\nimport { CasesFacade } from \"./resources/cases/CasesFacade.js\";\nimport { ContactsFacade } from \"./resources/contacts/ContactsFacade.js\";\nimport { ContextsFacade } from \"./resources/contexts/ContextsFacade.js\";\nimport { NotesFacade } from \"./resources/notes/NotesFacade.js\";\nimport { RelationsFacade } from \"./resources/relations/RelationsFacade.js\";\nimport { ResourcesFacade } from \"./resources/resources/ResourcesFacade.js\";\nimport { ServicesFacade } from \"./resources/services/ServicesFacade.js\";\nimport { AuthFacade } from \"./resources/auth/AuthFacade.js\";\nimport { ProfilesFacade } from \"./resources/user-profiles/ProfilesFacade.js\";\nimport { ViewsFacade } from \"./resources/views/ViewsFacade.js\";\nimport { SearchFacade } from \"./resources/search/SearchFacade.js\";\nimport { ActionHistoryFacade } from \"./resources/action-history/ActionHistoryFacade.js\";\nimport { AccountingTransactionsFacade } from \"./resources/accounting-transactions/AccountingTransactionsFacade.js\";\nimport { AnnouncementsFacade } from \"./resources/announcements/AnnouncementsFacade.js\";\nimport { ExportImportFacade } from \"./resources/export-import/ExportImportFacade.js\";\nimport { ReportsFacade } from \"./resources/reports/ReportsFacade.js\";\nimport { LoyaltySystemsFacade } from \"./resources/loyalty-systems/LoyaltySystemsFacade.js\";\nimport { LoyaltyCardsFacade } from \"./resources/loyalty-cards/LoyaltyCardsFacade.js\";\nimport { UserSettingsFacade } from \"./resources/user-settings/UserSettingsFacade.js\";\nimport { UserFacade } from \"./resources/user/UserFacade.js\";\nimport { BlockReasonsFacade } from \"./resources/block-reason/BlockReasonsFacade.js\";\nimport { ExternalAuthsFacade } from \"./resources/external-auths/ExternalAuthsFacade.js\";\nimport { IdGeneratorFacade } from \"./resources/id-generator/IdGeneratorFacade.js\";\nimport { IntegrationsFacade } from \"./resources/integrations/IntegrationsFacade.js\";\nimport { ItemFacade } from \"./resources/item/ItemFacade.js\";\nimport { ShortUrlFacade } from \"./resources/short-url/ShortUrlFacade.js\";\nimport { ThesaurusFacade } from \"./resources/thesaurus/ThesaurusFacade.js\";\nimport {\n DEFAULT_TORROW_API_BASE_URL,\n type ResolvedTorrowClientConfig,\n type TorrowClientConfig,\n} from \"./TorrowClientConfig.js\";\n\nexport type { ResolvedTorrowClientConfig, TorrowClientConfig } from \"./TorrowClientConfig.js\";\nexport { DEFAULT_TORROW_API_BASE_URL } from \"./TorrowClientConfig.js\";\n\n/**\n * Main entry: config, `raw` REST, domain facades (item CRUD + `listPersonal`), {@link AuthFacade}, {@link RelationsFacade}, {@link ViewsFacade}, {@link ProfilesFacade}, {@link SearchFacade},\n * {@link ActionHistoryFacade}, {@link AccountingTransactionsFacade}, {@link AnnouncementsFacade}, {@link ExportImportFacade}, {@link ReportsFacade},\n * {@link LoyaltySystemsFacade}, {@link LoyaltyCardsFacade}, {@link UserSettingsFacade}, {@link BlockReasonsFacade},\n * {@link ExternalAuthsFacade}, {@link IntegrationsFacade}, {@link IdGeneratorFacade}, {@link ItemFacade}, {@link ThesaurusFacade}, {@link ShortUrlFacade}.\n */\nexport class TorrowClient {\n readonly config: ResolvedTorrowClientConfig;\n readonly http: HttpClient;\n readonly raw: RawClient;\n readonly contacts: ContactsFacade;\n readonly notes: NotesFacade;\n readonly contexts: ContextsFacade;\n /** API domain `Resource` (`/api/v1/resources`), не каталог `src/resources/`. */\n readonly resourceItems: ResourcesFacade;\n readonly services: ServicesFacade;\n readonly cases: CasesFacade;\n readonly calendars: CalendarsFacade;\n /** Поиск по API (тег OpenAPI **Search**): advised items, текстовый поиск по типам, заказы под родителем. */\n readonly search: SearchFacade;\n /** История действий (`/api/v1/actionhistory`). */\n readonly actionHistory: ActionHistoryFacade;\n /** Учётные транзакции (`/api/v1/accountingtransactions`). */\n readonly accountingTransactions: AccountingTransactionsFacade;\n /** Объявления (`/api/v1/announcements`). */\n readonly announcements: AnnouncementsFacade;\n /** Экспорт/импорт графа (`/api/v1/export`, `import`, `importbyuniquename`). */\n readonly exportImport: ExportImportFacade;\n /** Генерация отчётов (`/api/v1/reports`). */\n readonly reports: ReportsFacade;\n /** Программы лояльности (`/api/v1/loyaltysystems`). */\n readonly loyaltySystems: LoyaltySystemsFacade;\n /** Карты лояльности (`/api/v1/loyaltycards`); создание карты — **`loyaltySystems.createLoyaltyCard`**. */\n readonly loyaltyCards: LoyaltyCardsFacade;\n /** Настройки пользователя (`/api/v1/user/settings`). */\n readonly userSettings: UserSettingsFacade;\n /** User endpoints (`/api/v1/user/*`): accounts/devices/default profile/delivery/register/calendars/timetable. */\n readonly user: UserFacade;\n /** Include/exclude в иерархии и группах, mind map (`includeToParent`, `saveToMindMap`, …). */\n readonly relations: RelationsFacade;\n /** Пользовательские и закреплённые представления под родителем (`views/user`, `views/pinned`). */\n readonly views: ViewsFacade;\n /** Профили пользователя Torrow (`/api/v1/user/profiles`), не CRUD `/api/v1/contacts`. */\n readonly profiles: ProfilesFacade;\n /** AuthIdentity: `refresh`, `requestToken`, `revoke`, `sendCode`, `createSession` — без Bearer основного клиента. */\n readonly auth: AuthFacade;\n /** Справочник причин блокировки (`/api/v1/blockreason`). */\n readonly blockReasons: BlockReasonsFacade;\n /** Внешняя авторизация (`/api/v1/externalauths`). */\n readonly externalAuths: ExternalAuthsFacade;\n /** Интеграции (`/api/v1/integrations`). */\n readonly integrations: IntegrationsFacade;\n /** Генерация id (`/api/v1/idgenerator`). */\n readonly idGenerator: IdGeneratorFacade;\n /** Отзывы и шаринг-сессии (`/api/v1/item/...`). */\n readonly item: ItemFacade;\n /** Тезаурус мест/хобби (`/api/v1/thesaurus`). */\n readonly thesaurus: ThesaurusFacade;\n /** Короткие ссылки (`/api/v1/u`). */\n readonly shortUrl: ShortUrlFacade;\n\n constructor(config: TorrowClientConfig) {\n this.config = {\n ...config,\n baseUrl: config.baseUrl ?? DEFAULT_TORROW_API_BASE_URL,\n };\n this.http = new HttpClient(this.config);\n this.raw = new RawClient(this.http);\n this.contacts = new ContactsFacade(this.http);\n this.notes = new NotesFacade(this.http);\n this.contexts = new ContextsFacade(this.http);\n this.resourceItems = new ResourcesFacade(this.http);\n this.services = new ServicesFacade(this.http);\n this.cases = new CasesFacade(this.http);\n this.calendars = new CalendarsFacade(this.http);\n this.search = new SearchFacade(this.http);\n this.actionHistory = new ActionHistoryFacade(this.http);\n this.accountingTransactions = new AccountingTransactionsFacade(this.http);\n this.announcements = new AnnouncementsFacade(this.http);\n this.exportImport = new ExportImportFacade(this.http);\n this.reports = new ReportsFacade(this.http);\n this.loyaltySystems = new LoyaltySystemsFacade(this.http);\n this.loyaltyCards = new LoyaltyCardsFacade(this.http);\n this.userSettings = new UserSettingsFacade(this.http);\n this.user = new UserFacade(this.http);\n this.relations = new RelationsFacade(this.http);\n this.views = new ViewsFacade(this.http);\n this.profiles = new ProfilesFacade(this.http);\n this.auth = new AuthFacade(this.config);\n this.blockReasons = new BlockReasonsFacade(this.http);\n this.externalAuths = new ExternalAuthsFacade(this.http);\n this.integrations = new IntegrationsFacade(this.http);\n this.idGenerator = new IdGeneratorFacade(this.http);\n this.item = new ItemFacade(this.http);\n this.thesaurus = new ThesaurusFacade(this.http);\n this.shortUrl = new ShortUrlFacade(this.http, this.config);\n }\n}\n","import type {\n ServiceItem,\n SessionDurationProperties,\n StepDescription,\n} from \"./types.js\";\n\n/**\n * Совпадает с `ServiceCheckInWizardStepType` в **torrow-apps** (`libs/domain-models`).\n * `stepType` в `StepDescription` приходит как **число** из API.\n */\nexport const ServiceCheckInWizardStepType = {\n Unknown: 0,\n Time: 1,\n Resource: 2,\n Payment: 3,\n} as const;\n\n/**\n * Имена параметров в `stepParameterList` шага типа «Ресурс».\n * Эталон: `libs/domain-models/.../service-check-in-wizard-step-parameter-name.enum.ts`.\n */\nexport const ServiceCheckInWizardStepParameterName = {\n HiddenStep: \"HiddenStep\",\n HideResourceDetail: \"HideResourceDetail\",\n ResourceGroupId: \"ResourceGroupId\",\n AutoChoiceResource: \"AutoChoiceResource\",\n} as const;\n\n/** Режим UI выбора времени (как в `RegisterCheckInToTimeProcessHelper.getStepListByStepDescription`, ветка Time). */\nexport type TimeStepUiMode =\n | \"selectDate\"\n | \"selectDateRange\"\n | \"selectTimeBegin\"\n | \"selectTime\";\n\nexport function sortStepDescriptionsByOrder(\n list: ServiceItem[\"stepDescriptionList\"],\n): StepDescription[] {\n if (!list?.length) {\n return [];\n }\n return [...list].sort((a, b) => (a.stepOrder ?? 0) - (b.stepOrder ?? 0));\n}\n\nexport function getStepParameter(\n step: StepDescription,\n parameterName: string,\n): string | undefined {\n const p = step.stepParameterList?.find((x) => x.parameterName === parameterName);\n return p?.parameterValue ?? undefined;\n}\n\nexport function getResourceGroupIdFromStep(step: StepDescription): string | undefined {\n return getStepParameter(step, ServiceCheckInWizardStepParameterName.ResourceGroupId);\n}\n\nexport function isStepFlag(step: StepDescription, parameterName: string): boolean {\n return getStepParameter(step, parameterName) === \"true\";\n}\n\n/**\n * Определяет, какой виджет времени показывать для шага `Time`, по `sessionDurationProperties` услуги.\n * Логика выровнена с **torrow-apps** `register-check-in-to-time.process.helper.ts` (`getStepListByStepDescription`, case Time).\n */\nexport function getTimeStepUiMode(\n session: SessionDurationProperties | undefined,\n): TimeStepUiMode {\n const sessionDurationType = session?.sessionDurationType;\n const sessionPrecisionType = session?.sessionPrecisionType;\n\n const isSelectDate =\n sessionPrecisionType === \"Date\" &&\n sessionDurationType !== \"SessionDurationNone\" &&\n sessionDurationType !== \"Custom\";\n const isSelectDateRange =\n sessionPrecisionType === \"Date\" && sessionDurationType === \"Custom\";\n const isSelectDateAndTimeBegin =\n sessionPrecisionType === \"DateTime\" &&\n sessionDurationType !== \"SessionDurationNone\" &&\n sessionDurationType !== \"Custom\";\n const isSelectDateRangeAndTimeBeginAndTimeEnd =\n sessionPrecisionType === \"DateTime\" && sessionDurationType === \"Custom\";\n\n if (isSelectDate) {\n return \"selectDate\";\n }\n if (isSelectDateRange) {\n return \"selectDateRange\";\n }\n if (isSelectDateAndTimeBegin || isSelectDateRangeAndTimeBeginAndTimeEnd) {\n return \"selectTimeBegin\";\n }\n return \"selectTime\";\n}\n","import {\n ServiceCheckInWizardStepParameterName,\n ServiceCheckInWizardStepType,\n getResourceGroupIdFromStep,\n getTimeStepUiMode,\n isStepFlag,\n sortStepDescriptionsByOrder,\n type TimeStepUiMode,\n} from \"./booking-wizard-hints.js\";\nimport type { ServiceItem } from \"./types.js\";\n\nfunction isExistsStrict(n: number | undefined): n is number {\n return n !== undefined && n !== null;\n}\n\n/**\n * Как в **torrow-apps** `RegisterCheckInToTimeProcessHelper.getSkipConditionForResourceStep`:\n * шаг выбора ресурса не показывается при вырожденных лимитах группы.\n */\nexport function shouldSkipResourceStep(min: number | undefined, max: number | undefined): boolean {\n const maxIsNull = max === 0;\n const maxIsOne = max === 1;\n const minMoreThenOne = isExistsStrict(min) && min > 1;\n const minIsNegative = isExistsStrict(min) && min < 0;\n const maxIsNegative = isExistsStrict(max) && max < 0;\n return maxIsNull || (maxIsOne && minMoreThenOne) || minIsNegative || maxIsNegative;\n}\n\nexport type BookingWizardExpandedStep =\n | {\n kind: \"time\";\n /** Порядок среди развёрнутых шагов (1-based). */\n sequence: number;\n stepOrder: number;\n /** Совпадает с именами ветки Time в `getStepListByStepDescription` (WizardStepTypeEnum). */\n wizardStepType: TimeStepUiMode;\n }\n | {\n kind: \"resource\";\n sequence: number;\n stepOrder: number;\n resourceGroupId: string;\n resourceGroupName?: string | null;\n isStepHidden: boolean;\n isResourceDetailHidden: boolean;\n autoChoiceResource: boolean;\n }\n | {\n kind: \"payment\";\n sequence: number;\n stepOrder: number;\n };\n\n/**\n * Разворачивает `service.stepDescriptionList` в шаги UI (время / ресурс / оплата) по правилам\n * **`RegisterCheckInToTimeProcessHelper.getStepListByStepDescription`** без NGXS и без `anyResourceSelected`.\n * Пропуски: нет `ResourceGroupId`, неизвестная группа, `shouldSkipResourceStep`.\n *\n * Шаг **Payment** в мобильном FSM обрабатывается отдельно (`choosePaymentMethod`); здесь он отражает\n * порядок в `stepDescriptionList` для headless-сценариев и агентов.\n */\nexport function expandBookingWizardSteps(service: ServiceItem): BookingWizardExpandedStep[] {\n const ordered = sortStepDescriptionsByOrder(service.stepDescriptionList);\n const out: BookingWizardExpandedStep[] = [];\n let seq = 0;\n for (const step of ordered) {\n const st = step.stepType ?? ServiceCheckInWizardStepType.Unknown;\n if (st === ServiceCheckInWizardStepType.Time) {\n const wizardStepType = getTimeStepUiMode(service.sessionDurationProperties);\n out.push({\n kind: \"time\",\n sequence: ++seq,\n stepOrder: step.stepOrder ?? seq,\n wizardStepType,\n });\n continue;\n }\n if (st === ServiceCheckInWizardStepType.Resource) {\n const resourceGroupId = getResourceGroupIdFromStep(step);\n if (!resourceGroupId) continue;\n const rg = service.resourceGroupList?.find((g) => g.groupId === resourceGroupId);\n if (!rg) continue;\n if (shouldSkipResourceStep(rg.minResources ?? undefined, rg.maxResources ?? undefined)) continue;\n out.push({\n kind: \"resource\",\n sequence: ++seq,\n stepOrder: step.stepOrder ?? seq,\n resourceGroupId,\n resourceGroupName: rg.groupName,\n isStepHidden: isStepFlag(step, ServiceCheckInWizardStepParameterName.HiddenStep),\n isResourceDetailHidden: isStepFlag(step, ServiceCheckInWizardStepParameterName.HideResourceDetail),\n autoChoiceResource: isStepFlag(step, ServiceCheckInWizardStepParameterName.AutoChoiceResource),\n });\n continue;\n }\n if (st === ServiceCheckInWizardStepType.Payment) {\n out.push({ kind: \"payment\", sequence: ++seq, stepOrder: step.stepOrder ?? seq });\n }\n }\n return out;\n}\n","import type { CaseItem } from \"./types.js\";\n\n/**\n * Как в **torrow-apps** `PaymentProcessState.normalizePaymentUrl`: если в ответе нет схемы,\n * подставить `https://` (частые относительные/безсхемные URL от провайдера).\n */\nexport function normalizePaymentUrl(url: string | null | undefined): string | undefined {\n if (url == null || url.trim() === \"\") return undefined;\n const u = url.trim();\n if (u.startsWith(\"http://\") || u.startsWith(\"https://\")) return u;\n return `https://${u}`;\n}\n\n/** Сырое значение из DTO без нормализации. */\nexport function getTicketPaymentUrlRaw(caseItem: CaseItem | undefined | null): string | undefined {\n const raw = caseItem?.personalInfo?.ticketResource?.ticketProperties?.paymentUrl;\n return raw == null || raw === \"\" ? undefined : raw;\n}\n\n/**\n * URL оплаты из **`CaseItem.personalInfo.ticketResource.ticketProperties.paymentUrl`**\n * (вид владельца/участника после `createOrder` + загрузка кейса).\n * Для гостя с токеном — тот же путь после `GET .../cases/{id}` с `securityToken` / `caseParticipantId`.\n */\nexport function getTicketPaymentUrl(caseItem: CaseItem | undefined | null): string | undefined {\n return normalizePaymentUrl(getTicketPaymentUrlRaw(caseItem));\n}\n"],"mappings":";AAIO,IAAM,8BAA8B;;;ACI3C,eAAsB,iBACpB,QACiC;AACjC,QAAM,UAAkC,CAAC;AACzC,QAAM,QAAQ,MAAM,OAAO,iBAAiB;AAC5C,MAAI,OAAO;AACT,YAAQ,gBAAgB,UAAU,KAAK;AAAA,EACzC;AACA,SAAO;AACT;;;ACjBA,SAAS,iBAAiB,MAAmC;AAC3D,MAAI,SAAS,QAAQ,OAAO,SAAS,UAAU;AAC7C,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,UAAU,YAAY,EAAE,MAAM,SAAS,GAAG;AACrD,WAAO,EAAE;AAAA,EACX;AACA,MAAI,OAAO,EAAE,UAAU,YAAY,EAAE,MAAM,SAAS,GAAG;AACrD,WAAO,EAAE;AAAA,EACX;AACA,MAAI,OAAO,EAAE,YAAY,YAAY,EAAE,QAAQ,SAAS,GAAG;AACzD,WAAO,EAAE;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAmC;AACtD,MAAI,SAAS,QAAQ,OAAO,SAAS,UAAU;AAC7C,WAAO;AAAA,EACT;AACA,QAAM,IAAK,KAAiC;AAC5C,SAAO,OAAO,MAAM,WAAW,IAAI;AACrC;AAEO,IAAM,kBAAN,MAAM,yBAAwB,MAAM;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,MAMT;AACD,UAAM,UAAU,iBAAiB,KAAK,IAAI;AAC1C,UAAM,OAAO,YAAY,KAAK,IAAI;AAClC,UAAM,UAAU,iBAAgB,aAAa,KAAK,QAAQ,KAAK,KAAK,SAAS,IAAI;AACjF,UAAM,SAAS,EAAE,OAAO,KAAK,MAAM,CAAC;AACpC,SAAK,OAAO;AACZ,SAAK,SAAS,KAAK;AACnB,SAAK,OAAO,KAAK;AACjB,SAAK,MAAM,KAAK;AAChB,SAAK,YAAY,KAAK;AACtB,SAAK,eAAe;AACpB,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,OAAe,aACb,QACA,KACA,cACA,MACQ;AACR,UAAM,QAAQ,CAAC,QAAQ,MAAM,IAAI,GAAG;AACpC,QAAI,MAAM;AACR,YAAM,KAAK,QAAQ,IAAI,EAAE;AAAA,IAC3B;AACA,QAAI,cAAc;AAChB,YAAM,KAAK,YAAY;AAAA,IACzB;AACA,WAAO,MAAM,KAAK,UAAK;AAAA,EACzB;AACF;;;ACnEA,IAAM,iBACJ;AAEK,SAAS,sBAAsB,MAAuB;AAC3D,MAAI,SAAS,IAAI;AACf,WAAO;AAAA,EACT;AACA,SAAO,KAAK,MAAM,MAAM,CAAC,MAAc,UAAmB;AACxD,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AACA,WAAO,eAAe,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;AAAA,EACxD,CAAC;AACH;AAEO,SAAS,kBAAkB,MAAuB;AACvD,SAAO,KAAK,UAAU,MAAM,CAAC,MAAc,UAAmB;AAC5D,QAAI,iBAAiB,MAAM;AACzB,aAAO,MAAM,YAAY;AAAA,IAC3B;AACA,WAAO;AAAA,EACT,CAAC;AACH;;;ACtBO,SAAS,iBAAiB,mBAAoD;AACnF,QAAM,cAAwB,CAAC;AAC/B,aAAW,QAAQ,OAAO,KAAK,iBAAiB,GAAG;AACjD,UAAM,QAAQ,kBAAkB,IAAI;AACpC,QAAI,UAAU,QAAW;AACvB;AAAA,IACF;AACA,QAAI,UAAU,MAAM;AAClB;AAAA,IACF;AACA,QAAI,iBAAiB,MAAM;AACzB,kBAAY,KAAK,GAAG,IAAI,IAAI,mBAAmB,MAAM,YAAY,CAAC,CAAC,EAAE;AAAA,IACvE,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,iBAAW,OAAO,OAAO;AACvB,oBAAY,KAAK,iBAAiB,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,MACpD;AAAA,IACF,OAAO;AACL,kBAAY,KAAK,GAAG,IAAI,IAAI,mBAAmB,OAAO,KAAK,CAAC,CAAC,EAAE;AAAA,IACjE;AAAA,EACF;AACA,SAAO,YAAY,KAAK,GAAG;AAC7B;;;ACtBO,SAAS,mBAAmB,SAAiB,MAAsB;AACxE,QAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE;AACvC,QAAM,IAAI,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AAChD,SAAO,GAAG,IAAI,GAAG,CAAC;AACpB;;;ACeA,IAAM,YAAY;AAMX,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,QAA4B;AAA5B;AAAA,EAA6B;AAAA,EAA7B;AAAA,EAE7B,MAAM,YAAyB,MAAmC;AAChE,UAAM,EAAE,OAAO,UAAU,WAAW,MAAM,IAAI,KAAK;AACnD,UAAM,MAAM,KAAK,SAAS,KAAK,MAAM,KAAK,KAAK;AAC/C,UAAM,cAAc,MAAM,iBAAiB,KAAK,MAAM;AACtD,UAAM,UAAkC;AAAA,MACtC,QAAQ;AAAA,MACR,GAAG;AAAA,MACH,GAAG,KAAK,OAAO;AAAA,MACf,GAAG,KAAK;AAAA,IACV;AACA,QAAI,KAAK,OAAO,WAAW;AACzB,cAAQ,YAAY,IAAI,KAAK,OAAO;AAAA,IACtC;AAEA,UAAM,YACJ,KAAK,SAAS,UAAa,KAAK,WAAW,SAAS,KAAK,WAAW;AACtE,QAAI,WAAW;AACb,cAAQ,cAAc,IAAI;AAAA,IAC5B;AAEA,UAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,MAC7B,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,MAAM,YAAY,kBAAkB,KAAK,IAAI,IAAI;AAAA,MACjD,QAAQ,KAAK;AAAA,IACf,CAAC;AAED,UAAM,YAAY,IAAI,QAAQ,IAAI,cAAc,KAAK;AACrD,UAAM,OAAO,MAAM,IAAI,KAAK;AAE5B,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,UAAU,kBAAkB,MAAM,IAAI,QAAQ,IAAI,cAAc,CAAC;AACvE,YAAM,IAAI,gBAAgB;AAAA,QACxB,QAAQ,IAAI;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,SAAS,IAAI;AACf,aAAO;AAAA,IACT;AACA,WAAO,sBAAsB,IAAI;AAAA,EACnC;AAAA,EAEQ,SAAS,MAAc,OAAyC;AACtE,UAAM,SAAS,KAAK,OAAO,WAAW;AACtC,UAAM,WAAW,mBAAmB,QAAQ,IAAI;AAChD,UAAM,IAA6B,EAAE,GAAG,MAAM;AAC9C,QAAI,KAAK,OAAO,kBAAkB,UAAa,KAAK,OAAO,kBAAkB,IAAI;AAC/E,QAAE,gBAAgB,KAAK,OAAO;AAAA,IAChC;AACA,UAAM,KAAK,iBAAiB,CAAC;AAC7B,QAAI,CAAC,IAAI;AACP,aAAO;AAAA,IACT;AACA,UAAM,SAAS,SAAS,SAAS,GAAG,IAAI,MAAM;AAC9C,WAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,EAAE;AAAA,EAClC;AACF;AAEA,SAAS,kBAAkB,MAAc,aAAqC;AAC5E,QAAM,KAAK,eAAe;AAC1B,MAAI,GAAG,SAAS,SAAS,KAAM,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAAI;AAC1E,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;AC7FO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAE7B,QACE,QACA,MACA,SACY;AACZ,WAAO,KAAK,KAAK,YAAe,EAAE,QAAQ,MAAM,GAAG,QAAQ,CAAC;AAAA,EAC9D;AAAA,EAEA,IAAiB,MAAc,SAAyC;AACtE,WAAO,KAAK,QAAW,OAAO,MAAM,OAAO;AAAA,EAC7C;AAAA,EAEA,KAAkB,MAAc,SAAyC;AACvE,WAAO,KAAK,QAAW,QAAQ,MAAM,OAAO;AAAA,EAC9C;AAAA,EAEA,IAAiB,MAAc,SAAyC;AACtE,WAAO,KAAK,QAAW,OAAO,MAAM,OAAO;AAAA,EAC7C;AAAA,EAEA,MAAmB,MAAc,SAAyC;AACxE,WAAO,KAAK,QAAW,SAAS,MAAM,OAAO;AAAA,EAC/C;AAAA,EAEA,OAAoB,MAAc,SAAyC;AACzE,WAAO,KAAK,QAAW,UAAU,MAAM,OAAO;AAAA,EAChD;AACF;;;ACpCO,SAAS,kBAAkB,IAAoB;AACpD,SAAO,mBAAmB,EAAE;AAC9B;;;AC+DO,IAAe,uBAAf,MAGL;AAAA,EACU,YACW,MACA,UACA,aAAsC,CAAC,GAC1D;AAHmB;AACA;AACA;AAAA,EAClB;AAAA,EAHkB;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAIrB,gBACE,UACA,MACA,SACuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cACE,UACA,QACA,SAC2B;AAC3B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,sBACE,UACA,WACA,SACuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,iBACE,UACA,MACA,SACuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,mBACE,UACA,gBACA,SACuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,iBACE,UACA,OACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,sBACE,UACA,MACA,SACoC;AACpC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,wBACE,UACA,sBACA,iBACA,SAKqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC,kBAAkB,kBAAkB,oBAAoB,CAAC;AAAA,MAC9G,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cACE,UACA,WACA,SACwB;AACxB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO,EAAE,aAAa,SAAS,YAAY;AAAA,MAC3C,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,oBAAoB,UAAkB,SAA4D;AAChG,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,SACE,UACA,MACA,SACqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,WACE,UACA,MACA,SACqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,WACE,UACA,MACA,SAKuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,UACE,UACA,OACA,SACuB;AACvB,QAAI,KAAK,WAAW,0BAA0B,OAAO;AACnD,YAAM,IAAI,MAAM,+EAA+E;AAAA,IACjG;AACA,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aACE,UACA,MACA,SAQ6B;AAC7B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO;AAAA,QACL,UAAU,SAAS;AAAA,QACnB,MAAM,SAAS;AAAA,QACf,OAAO,SAAS;AAAA,QAChB,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBAAgB,MAA0B,SAAiE;AACzG,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ;AAAA,MACtB;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,kBAAkB,MAA4B,SAA0D;AACtG,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ;AAAA,MACtB;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBACE,UACA,MACA,SAC6B;AAC7B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,kBACE,UACA,MACA,SACsB;AACtB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eACE,UACA,MACA,SAC6B;AAC7B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBACE,UACA,MACA,SACsB;AACtB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,UACA,WACA,SACwB;AACxB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO,EAAE,aAAa,SAAS,YAAY;AAAA,MAC3C,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,UACA,WACA,SACwB;AACxB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MACE,UACA,MACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,UACA,YACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,UACA,YACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cACE,UACA,YACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO,EAAE,aAAa,SAAS,YAAY;AAAA,MAC3C,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,wBACE,MACA,SACsC;AACtC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ;AAAA,MACtB;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,QACA,OACA,SACqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,MAAM,CAAC;AAAA,MACnD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,oBACE,QACA,eACA,SACqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,MAAM,CAAC;AAAA,MACnD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,2BACE,QACA,WACA,SAKqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,MAAM,CAAC;AAAA,MACnD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,SACE,QACA,MACA,SAC6B;AAC7B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,MAAM,CAAC;AAAA,MACnD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YAAY,UAAkB,SAAqD;AACjF,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,iBACE,QACA,YACA,SACuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,MAAM,CAAC;AAAA,MACnD,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBAAgB,YAAoB,SAAoD;AACtF,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,eAAe,kBAAkB,UAAU,CAAC;AAAA,MAClE,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aAAa,UAAkB,SAAuD;AACpF,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eACE,UACA,SAOqB;AACrB,UAAM,QAAiC;AAAA,MACrC,QAAQ,SAAS;AAAA,MACjB,UAAU,SAAS;AAAA,MACnB,UAAU,SAAS;AAAA,IACrB;AACA,QAAI,KAAK,WAAW,0BAA0B;AAC5C,YAAM,gBAAgB,SAAS;AAAA,IACjC;AACA,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cACE,UACA,MACA,SACwB;AACxB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,mBACE,UACA,MACA,SACuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,2BACE,QACA,MACA,SACqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,MAAM,CAAC;AAAA,MACnD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aACE,UACA,SACmB;AACnB,QAAI,CAAC,KAAK,WAAW,oBAAoB;AACvC,YAAM,IAAI,MAAM,2EAA2E;AAAA,IAC7F;AACA,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO,EAAE,SAAS,SAAS,QAAQ;AAAA,MACnC,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eACE,UACA,SAOqB;AACrB,QAAI,CAAC,KAAK,WAAW,oBAAoB;AACvC,YAAM,IAAI,MAAM,6EAA6E;AAAA,IAC/F;AACA,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO;AAAA,QACL,QAAQ,SAAS;AAAA,QACjB,UAAU,SAAS;AAAA,QACnB,UAAU,SAAS;AAAA,QACnB,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;AAMO,IAAe,mBAAf,cAA+C,qBAGpD;AAAA,EACU,YACR,MACA,UACA,aAAsC,CAAC,GACvC;AACA,UAAM,MAAM,UAAU,UAAU;AAAA,EAClC;AAAA;AAAA,EAGA,sBACE,UACA,MACA,SACuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,8BACE,UACA,SACoC;AACpC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,iCACE,UACA,OACA,SACoC;AACpC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,SACE,UACA,OACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,WACE,UACA,OACA,SACwB;AACxB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eACE,UACA,MACA,SAC6B;AAC7B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cACE,UACA,MACA,SAC6B;AAC7B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACrD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,iBACE,QACA,YACA,SACqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,MAAM,CAAC;AAAA,MACnD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBACE,QACA,WACA,SACqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,MAAM,CAAC;AAAA,MACnD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,0BACE,QACA,MACA,SACqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,MAAM,CAAC;AAAA,MACnD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MACE,QACA,SAQqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,MAAM,CAAC;AAAA,MACnD,OAAO;AAAA,QACL,UAAU,SAAS;AAAA,QACnB,YAAY,SAAS;AAAA,QACrB,UAAU,SAAS;AAAA,QACnB,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QACE,QACA,SACqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,QAAQ,IAAI,kBAAkB,MAAM,CAAC;AAAA,MACnD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AC56BO,SAAS,oBAAoB,SAAqE;AACvG,QAAM,IAAI,WAAW,CAAC;AACtB,SAAO;AAAA,IACL,YAAY,EAAE;AAAA,IACd,MAAM,EAAE;AAAA,IACR,MAAM,EAAE;AAAA,IACR,QAAQ,EAAE;AAAA,IACV,MAAM,EAAE;AAAA,IACR,gBAAgB,EAAE;AAAA,IAClB,MAAM,EAAE;AAAA,IACR,gBAAgB,EAAE;AAAA,IAClB,cAAc,EAAE;AAAA,EAClB;AACF;;;ACpBA,IAAM,OAAO;AAGN,IAAM,kBAAN,cAA8B,iBAA+B;AAAA,EAClE,YAAY,MAAkB;AAC5B,UAAM,MAAM,MAAM,EAAE,0BAA0B,OAAO,oBAAoB,MAAM,CAAC;AAAA,EAClF;AAAA;AAAA,EAGA,OACE,MACA,SAKuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,QACL,UAAU,SAAS;AAAA,QACnB,WAAW,SAAS;AAAA,MACtB;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,MACA,UACA,SAMuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,IAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,cAAc,SAAS;AAAA,QACvB,oBAAoB,SAAS;AAAA,QAC7B,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,UACA,SAOyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,IAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,iBAAiB,QAAQ;AAAA,QACzB,gBAAgB,QAAQ;AAAA,QACxB,oBAAoB,QAAQ;AAAA,MAC9B;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QACE,UACA,SAOuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,IAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,QACzB,mBAAmB,SAAS;AAAA,QAC5B,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aAAa,SAAiF;AAC5F,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI,WAAW,CAAC;AACxC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,IAAI;AAAA,MACb,OAAO,EAAE,GAAG,KAAK;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aACE,YACA,MACA,SAC0B;AAC1B,UAAM,EAAE,QAAQ,GAAG,UAAU,IAAI,WAAW,CAAC;AAC7C,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,IAAI,IAAI,kBAAkB,UAAU,CAAC;AAAA,MAC9C,OAAO,oBAAoB,SAAS;AAAA,MACpC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,uBACE,MACA,SACyC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,IAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,YACA,SACA,SACiB;AACjB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,IAAI,IAAI,kBAAkB,UAAU,CAAC;AAAA,MAC9C,OAAO,EAAE,WAAW,SAAS,UAAU;AAAA,MACvC,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,4BACE,YACA,SACA,SACiB;AACjB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,IAAI,IAAI,kBAAkB,UAAU,CAAC;AAAA,MAC9C,OAAO,EAAE,WAAW,SAAS,UAAU;AAAA,MACvC,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,8BACE,YACA,SACA,SACiB;AACjB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,IAAI,IAAI,kBAAkB,UAAU,CAAC;AAAA,MAC9C,OAAO,EAAE,WAAW,SAAS,UAAU;AAAA,MACvC,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,YACA,SACA,SACiB;AACjB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,IAAI,IAAI,kBAAkB,UAAU,CAAC;AAAA,MAC9C,OAAO,EAAE,WAAW,SAAS,UAAU;AAAA,MACvC,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AClLA,IAAMA,QAAO;AAKN,IAAM,cAAN,cAA0B,iBAA2B;AAAA,EAC1D,YAAY,MAAkB;AAC5B,UAAM,MAAMA,KAAI;AAAA,EAClB;AAAA;AAAA,EAIA,OACE,MACA,SAUmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN,OAAO;AAAA,QACL,UAAU,SAAS;AAAA,QACnB,WAAW,SAAS;AAAA,QACpB,uBAAuB,SAAS;AAAA,QAChC,kBAAkB,SAAS;AAAA,QAC3B,UAAU,SAAS;AAAA,QACnB,YAAY,SAAS;AAAA,QACrB,qBAAqB,SAAS;AAAA,MAChC;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBACE,MACA,SAKmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN,OAAO;AAAA,QACL,UAAU,SAAS;AAAA,QACnB,WAAW,SAAS;AAAA,MACtB;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,MACA,UACA,SAOmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,WAAW,SAAS;AAAA,QACpB,cAAc,SAAS;AAAA,QACvB,oBAAoB,SAAS;AAAA,QAC7B,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,UACA,SAOyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,iBAAiB,QAAQ;AAAA,QACzB,gBAAgB,QAAQ;AAAA,QACxB,oBAAoB,QAAQ;AAAA,MAC9B;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QACE,UACA,SAUmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,WAAW,SAAS;AAAA,QACpB,0BAA0B,SAAS;AAAA,QACnC,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,QACzB,mBAAmB,SAAS;AAAA,QAC5B,eAAe,SAAS;AAAA,QACxB,mBAAmB,SAAS;AAAA,MAC9B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aAAa,SAA6E;AACxF,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI,WAAW,CAAC;AACxC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb,OAAO,EAAE,GAAG,KAAK;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBAAgB,MAA0B,SAAiE;AACzG,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,kBAAkB,MAA4B,SAA0D;AACtG,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGS,gBACP,YACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,eAAe,kBAAkB,UAAU,CAAC;AAAA,MACzD,OAAO,EAAE,WAAW,SAAS,UAAU;AAAA,MACvC,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,cACE,UACA,OAMA,SACyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,qBACE,UACA,OACA,SACgC;AAChC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,uBACE,UACA,mBACA,SAC8B;AAC9B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC,qBAAqB,kBAAkB,iBAAiB,CAAC;AAAA,MACrG,OAAO,EAAE,eAAe,SAAS,cAAc;AAAA,MAC/C,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,yBACE,UACA,OACA,SACwC;AACxC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,qCACE,UACA,OACA,SACwC;AACxC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,2BACE,UACA,mBACA,MACA,SAM0B;AAC1B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC,qBAAqB,kBAAkB,iBAAiB,CAAC;AAAA,MACrG,OAAO;AAAA,QACL,aAAa,SAAS;AAAA,QACtB,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,oCACE,UACA,mBACA,SAQ0B;AAC1B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC,qBAAqB,kBAAkB,iBAAiB,CAAC;AAAA,MACrG,OAAO;AAAA,QACL,aAAa,SAAS;AAAA,QACtB,WAAW,SAAS;AAAA,QACpB,oBAAoB,SAAS;AAAA,QAC7B,gBAAgB,SAAS;AAAA,QACzB,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,yBACE,UACA,MACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cACE,UACA,MACA,SAC0B;AAC1B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,SAAS,SAAS,QAAQ;AAAA,MACnC;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aACE,UACA,MACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,mBACE,UACA,MACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,WAAW,SAAS,UAAU;AAAA,MACvC;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,uBACE,UACA,MACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cACE,UACA,MACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,oBACE,UACA,MACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,mBACE,UACA,MACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,0BACE,UACA,MACA,SAC0B;AAC1B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,WAAW,SAAS,UAAU;AAAA,MACvC;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,6BACE,UACA,MACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,yBACE,UACA,MACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,wBACE,UACA,MACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,WACE,UACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,WAAW,SAAS,WAAW,aAAa,SAAS,YAAY;AAAA,MAC1E,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,UACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,WAAW,SAAS,WAAW,aAAa,SAAS,YAAY;AAAA,MAC1E,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,SACE,UACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,WAAW,SAAS,WAAW,aAAa,SAAS,YAAY;AAAA,MAC1E,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,WACE,UACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,WAAW,SAAS,WAAW,aAAa,SAAS,YAAY;AAAA,MAC1E,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aACE,UACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,WAAW,SAAS,WAAW,aAAa,SAAS,YAAY;AAAA,MAC1E,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,WACE,UACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,WAAW,SAAS,WAAW,aAAa,SAAS,YAAY;AAAA,MAC1E,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,qBACE,UACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,WAAW,SAAS,WAAW,aAAa,SAAS,YAAY;AAAA,MAC1E,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,WACE,UACA,SAMmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,WAAW,SAAS;AAAA,QACpB,aAAa,SAAS;AAAA,QACtB,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,UAAU,UAAkB,MAAoB,SAAuD;AACrG,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAEF;;;AC/mBA,IAAMC,QAAO;AAEb,IAAM,sBAA+C;AAAA,EACnD,0BAA0B;AAAA,EAC1B,oBAAoB;AACtB;AAKO,IAAM,iBAAN,cAA6B,iBAA8B;AAAA,EAChE,YAAY,MAAkB;AAC5B,UAAM,MAAMA,OAAM,mBAAmB;AAAA,EACvC;AAAA;AAAA,EAGA,OACE,MACA,SAKsB;AACtB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN,OAAO;AAAA,QACL,UAAU,SAAS;AAAA,QACnB,WAAW,SAAS;AAAA,MACtB;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,MACA,UACA,SAMsB;AACtB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,cAAc,SAAS;AAAA,QACvB,oBAAoB,SAAS;AAAA,QAC7B,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QACE,UACA,SAOsB;AACtB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,QACzB,mBAAmB,SAAS;AAAA,QAC5B,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OACE,UACA,SAOyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,iBAAiB,QAAQ;AAAA,QACzB,gBAAgB,QAAQ;AAAA,QACxB,oBAAoB,QAAQ;AAAA,MAC9B;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aACE,SACwB;AACxB,UAAM,EAAE,QAAQ,eAAe,GAAG,KAAK,IAAI,WAAW,CAAC;AACvD,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb,OAAO,EAAE,GAAG,MAAM,cAAc;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aACE,WACA,MACA,SAC0B;AAC1B,UAAM,EAAE,QAAQ,GAAG,UAAU,IAAI,WAAW,CAAC;AAC7C,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C,OAAO,oBAAoB,SAAS;AAAA,MACpC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,uBACE,MACA,SACyC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,sBACE,MACA,SACoC;AACpC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,wBACE,MACA,SACsC;AACtC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,UACA,MACA,SACiB;AACjB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,iBAAiB,SAAS,gBAAgB;AAAA,MACnD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,qBACE,SACA,SAC2B;AAC3B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,wBACE,WACA,MACA,SACsC;AACtC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AC9OA,IAAMC,QAAO;AAGN,IAAM,iBAAN,cAA6B,iBAA8B;AAAA,EAChE,YAAY,MAAkB;AAC5B,UAAM,MAAMA,OAAM,EAAE,0BAA0B,OAAO,oBAAoB,MAAM,CAAC;AAAA,EAClF;AAAA;AAAA,EAGA,OACE,MACA,SAIsB;AACtB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN,OAAO,EAAE,WAAW,SAAS,UAAU;AAAA,MACvC;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,MACA,UACA,SAKsB;AACtB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,cAAc,SAAS;AAAA,QACvB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,UACA,SAOyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,iBAAiB,QAAQ;AAAA,QACzB,gBAAgB,QAAQ;AAAA,QACxB,oBAAoB,QAAQ;AAAA,MAC9B;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QACE,UACA,SAOsB;AACtB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,QACzB,mBAAmB,SAAS;AAAA,QAC5B,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aAAa,SAAgF;AAC3F,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI,WAAW,CAAC;AACxC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb,OAAO,EAAE,GAAG,KAAK;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACzGA,IAAMC,QAAO;AAGN,IAAM,cAAN,cAA0B,iBAA2B;AAAA,EAC1D,YAAY,MAAkB;AAC5B,UAAM,MAAMA,OAAM,EAAE,0BAA0B,OAAO,oBAAoB,MAAM,CAAC;AAAA,EAClF;AAAA;AAAA,EAGA,OACE,MACA,SAKmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN,OAAO;AAAA,QACL,UAAU,SAAS;AAAA,QACnB,WAAW,SAAS;AAAA,MACtB;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,MACA,UACA,SAKmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,cAAc,SAAS;AAAA,QACvB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,UACA,SAOyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,iBAAiB,QAAQ;AAAA,QACzB,gBAAgB,QAAQ;AAAA,QACxB,oBAAoB,QAAQ;AAAA,MAC9B;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QACE,UACA,SAOmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,QACzB,mBAAmB,SAAS;AAAA,QAC5B,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aAAa,SAA6E;AACxF,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI,WAAW,CAAC;AACxC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb,OAAO,EAAE,GAAG,KAAK;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,UACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,QAAQ,SAAS,OAAO;AAAA,MACjC,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cACE,UACA,SAMqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,QAAQ,SAAS;AAAA,QACjB,UAAU,SAAS;AAAA,QACnB,UAAU,SAAS;AAAA,MACrB;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAEF;;;ACxIA,IAAM,cAAkD;AAAA,EACtD,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AACb;AAMO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAErB,KAAK,QAAoC;AAC/C,WAAO,YAAY,MAAM;AAAA,EAC3B;AAAA;AAAA,EAGA,gBACE,QACA,UACA,MACA,SAC6B;AAC7B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACzD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eACE,QACA,UACA,MACA,SAC6B;AAC7B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACzD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,kBACE,QACA,UACA,MACA,SACsB;AACtB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACzD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBACE,QACA,UACA,MACA,SACsB;AACtB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MACzD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBACE,QACA,MACA,SAC6B;AAC7B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,kBACE,QACA,MACA,SACsB;AACtB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cACE,QACA,QACA,MACA,SACwB;AACxB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC,IAAI,kBAAkB,MAAM,CAAC;AAAA,MACvD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;ACnIO,IAAM,8BAA8B;AAAA,EACzC,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,kCAAkC;AAAA,EAClC,sCAAsC;AAAA,EACtC,+BAA+B;AAAA,EAC/B,8BAA8B;AAAA,EAC9B,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxB,2BAA2B;AAC7B;AAiCO,IAAM,gCAAgC;AAAA,EAC3C,WAAW;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,CAAC,4BAA4B,WAAW,4BAA4B,eAAe;AAAA,IAC7F,iBAAiB;AAAA,EACnB;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,CAAC,4BAA4B,UAAU,4BAA4B,cAAc;AAAA,IAC3F,iBAAiB;AAAA,EACnB;AAAA,EACA,2CAA2C;AAAA,IACzC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,CAAC,4BAA4B,4BAA4B;AAAA,EACrE;AAAA,EACA,qCAAqC;AAAA,IACnC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,CAAC,4BAA4B,sBAAsB;AAAA,EAC/D;AAAA,EACA,2BAA2B;AAAA,IACzB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,CAAC,4BAA4B,yBAAyB;AAAA,EAClE;AAAA,EACA,6BAA6B;AAAA,IAC3B,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,CAAC,4BAA4B,kBAAkB;AAAA,EAC3D;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,CAAC,4BAA4B,UAAU;AAAA,EACnD;AAAA,EACA,2BAA2B;AAAA,IACzB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU,CAAC,4BAA4B,yBAAyB;AAAA,EAClE;AAAA,EACA,wBAAwB;AAAA,IACtB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ,CAAC,4BAA4B,wBAAwB,4BAA4B,4BAA4B;AAAA,EACvH;AAAA,EACA,6BAA6B;AAAA,IAC3B,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ,CAAC,4BAA4B,4BAA4B;AAAA,EACnE;AAAA,EACA,mCAAmC;AAAA,IACjC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,MACR,4BAA4B;AAAA,MAC5B,4BAA4B;AAAA,MAC5B,4BAA4B;AAAA,IAC9B;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY,4BAA4B;AAAA,IACxC,YAAY,4BAA4B;AAAA,EAC1C;AACF;AA0BA,SAAS,cAAc,OAA4C;AACjE,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ;AACxE;AAEA,SAAS,cAAc,KAAa,QAAgB,kBAAkB,OAA2B;AAC/F,MAAI,iBAAiB;AACnB,UAAM,WAAW,IAAI,YAAY;AACjC,UAAM,cAAc,OAAO,YAAY;AACvC,QAAI,CAAC,SAAS,SAAS,WAAW,EAAG,QAAO;AAC5C,WAAO,IAAI,MAAM,GAAG,IAAI,SAAS,OAAO,MAAM;AAAA,EAChD;AACA,MAAI,CAAC,IAAI,SAAS,MAAM,EAAG,QAAO;AAClC,SAAO,IAAI,MAAM,GAAG,IAAI,SAAS,OAAO,MAAM;AAChD;AAEA,SAAS,oBACP,MACA,QACA,SACoB;AACpB,aAAW,OAAO,MAAM;AACtB,UAAM,SAAS,cAAc,KAAK,QAAQ,SAAS,mBAAmB,KAAK;AAC3E,QAAI,WAAW,OAAW,QAAO;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,cAAc,KAA6C;AAClE,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,OAAO,SAAS,IAAI,KAAK,GAAG,EAAE;AAC5C,SAAO,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,QAAQ;AACvD;AAEA,SAAS,oBAAoB,KAAiC;AAC5D,QAAM,WAAW,8BAA8B,kCAAkC;AACjF,aAAW,UAAU,UAAU;AAC7B,UAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,WAAW,MAAM,GAAG,CAAC;AACxD,QAAI,QAAQ,CAAC,GAAG;AACd,YAAM,MAAM,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AACxC,UAAI,OAAO,SAAS,GAAG,KAAK,MAAM,EAAG,QAAO;AAAA,IAC9C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,KAAa,YAAkE;AAC/G,QAAM,UAAU,WAAW,QAAQ,uBAAuB,MAAM;AAChE,QAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,QAAQ,OAAO,SAAS,CAAC;AAC5D,MAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAG,QAAO;AACrC,QAAM,QAAQ,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AAC1C,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;AAClD,SAAO,EAAE,OAAO,OAAO,MAAM,CAAC,EAAE;AAClC;AAEA,SAAS,oBAAoB,SAAyB;AACpD,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,QAAQ,WAAW,SAAS,EAAG,QAAO,WAAW,QAAQ,MAAM,UAAU,MAAM,CAAC;AACpF,MAAI,QAAQ,WAAW,QAAQ,EAAG,QAAO,UAAU,QAAQ,MAAM,SAAS,MAAM,CAAC;AACjF,SAAO;AACT;AAEA,SAAS,oBAAoB,SAAyB;AACpD,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,QAAQ,WAAW,UAAU,EAAG,QAAO,UAAU,QAAQ,MAAM,WAAW,MAAM,CAAC;AACrF,MAAI,QAAQ,WAAW,SAAS,EAAG,QAAO,SAAS,QAAQ,MAAM,UAAU,MAAM,CAAC;AAClF,SAAO;AACT;AAKO,SAAS,8BAA8B,MAAsE;AAClH,QAAM,WAAW,QAAQ,CAAC;AAC1B,QAAM,SAAmC,CAAC;AAC1C,QAAM,UAAU;AAEhB,aAAW,UAAU,OAAO,OAAO,6BAA6B,GAAiC;AAC/F,QAAI,OAAO,SAAS,YAAY,OAAO,SAAS,eAAe;AAC7D,YAAM,MAAM,OAAO,SAChB,IAAI,CAAC,WAAW,oBAAoB,UAAU,QAAQ,EAAE,iBAAiB,OAAO,mBAAmB,MAAM,CAAC,CAAC,EAC3G,KAAK,CAAC,MAAM,MAAM,MAAS;AAC9B,UAAI,OAAO,SAAS,UAAU;AAC5B,YAAI,KAAK,KAAK,EAAG,SAAQ,OAAO,KAAK,IAAI,IAAI,KAAK;AAAA,MACpD,OAAO;AACL,cAAM,QAAQ,cAAc,GAAG;AAC/B,YAAI,UAAU,OAAW,SAAQ,OAAO,KAAK,IAAI;AAAA,MACnD;AAAA,IACF;AACA,QAAI,OAAO,SAAS,gBAAgB;AAClC,YAAM,SAAS,SAAS,KAAK,CAAC,QAAQ,OAAO,OAAO,KAAK,CAAC,UAAU,IAAI,SAAS,KAAK,CAAC,CAAC;AACxF,UAAI,OAAQ,SAAQ,OAAO,KAAK,IAAI;AAAA,IACtC;AAAA,EACF;AAEA,MAAI,oCAAwD,OAAO;AACnE,MAAI,sCAAsC,QAAW;AACnD,eAAW,OAAO,UAAU;AAC1B,0CAAoC,oBAAoB,GAAG;AAC3D,UAAI,sCAAsC,OAAW;AAAA,IACvD;AAAA,EACF;AACA,MAAI,sCAAsC,QAAW;AACnD,YAAQ,oCAAoC;AAAA,EAC9C;AAEA,QAAM,gBAAgB,oBAAI,IAA6D;AACvF,QAAM,kBAAkB,8BAA8B;AACtD,aAAW,OAAO,UAAU;AAC1B,UAAM,UAAU,yBAAyB,KAAK,gBAAgB,UAAU;AACxE,QAAI,SAAS;AACX,oBAAc,IAAI,QAAQ,OAAO;AAAA,QAC/B,OAAO,QAAQ;AAAA,QACf,GAAI,cAAc,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,QACzC,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,MAChC,CAAC;AAAA,IACH;AACA,UAAM,UAAU,yBAAyB,KAAK,gBAAgB,UAAU;AACxE,QAAI,SAAS;AACX,oBAAc,IAAI,QAAQ,OAAO;AAAA,QAC/B,OAAO,QAAQ;AAAA,QACf,GAAI,cAAc,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,QACzC,MAAM,oBAAoB,QAAQ,KAAK;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,iBAAiB,CAAC,GAAG,cAAc,OAAO,CAAC,EAC9C,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI;AACjC,MAAI,eAAe,OAAQ,SAAQ,iBAAiB;AACpD,SAAO;AACT;AAMO,SAAS,yBACd,QACA,SAUU;AACV,QAAM,OAAiB,CAAC;AACxB,QAAM,qBAAsB,OAAO,OAAO,6BAA6B,EAAiC;AAAA,IACtG,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,SAAS;AAAA,EAC3C;AACA,aAAW,UAAU,oBAAoB;AACvC,UAAM,QAAQ,OAAO,OAAO,KAAK;AACjC,UAAM,cAAc,OAAO,SAAS,CAAC;AACrC,QAAI,OAAO,SAAS,UAAU;AAC5B,UAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC7C,aAAK,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,EAAE;AAAA,MAC3C;AAAA,IACF,WAAW,cAAc,OAAO,UAAU,WAAW,QAAQ,MAAS,GAAG;AACvE,WAAK,KAAK,GAAG,KAAK,GAAG,WAAW,EAAE;AAAA,IACpC;AAAA,EACF;AAEA,aAAW,aAAa,OAAO,kBAAkB,CAAC,GAAG;AACnD,QAAI,CAAC,cAAc,UAAU,KAAK,EAAG;AACrC,QAAI,UAAU,MAAM,KAAK,GAAG;AAC1B,WAAK;AAAA,QACH,GAAG,UAAU,KAAK,KAAK,CAAC,GAAG,8BAA8B,eAAe,UAAU,GAAG,UAAU,KAAK;AAAA,MACtG;AAAA,IACF;AACA,QAAI,UAAU,MAAM,KAAK,GAAG;AAC1B,WAAK;AAAA,QACH,GAAG,oBAAoB,UAAU,IAAI,CAAC,GAAG,8BAA8B,eAAe,UAAU,GAAG,UAAU,KAAK;AAAA,MACpH;AAAA,IACF;AAAA,EACF;AACA,MAAI,cAAc,OAAO,iCAAiC,GAAG;AAC3D,SAAK;AAAA,MACH,GAAG,OAAO,iCAAiC,IACzC,SAAS,+BAA+B,4BAA4B,6BACtE;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,wBAAwB;AACjC,SAAK,KAAK,8BAA8B,uBAAuB,OAAO,CAAC,CAAC;AAAA,EAC1E;AACA,MAAI,OAAO,6BAA6B;AACtC,SAAK,KAAK,8BAA8B,4BAA4B,OAAO,CAAC,CAAC;AAAA,EAC/E;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,KAAsB;AAClD,aAAW,UAAU,OAAO,OAAO,6BAA6B,GAAiC;AAC/F,QAAI,OAAO,SAAS,YAAY,OAAO,SAAS,eAAe;AAC7D,YAAM,UAAU,OAAO,SAAS;AAAA,QAC9B,CAAC,WAAW,cAAc,KAAK,QAAQ,OAAO,mBAAmB,KAAK,MAAM;AAAA,MAC9E;AACA,UAAI,QAAS,QAAO;AAAA,IACtB;AACA,QAAI,OAAO,SAAS,gBAAgB;AAClC,UAAI,OAAO,OAAO,KAAK,CAAC,UAAU,IAAI,SAAS,KAAK,CAAC,EAAG,QAAO;AAAA,IACjE;AACA,QAAI,OAAO,SAAS,aAAa;AAC/B,YAAM,cAAc,OAAO,SAAS,KAAK,CAAC,WAAW,IAAI,MAAM,IAAI,OAAO,SAAS,MAAM,GAAG,CAAC,MAAM,IAAI;AACvG,UAAI,YAAa,QAAO;AAAA,IAC1B;AACA,QAAI,OAAO,SAAS,aAAa;AAC/B,UACE,yBAAyB,KAAK,OAAO,UAAU,MAAM,UACrD,yBAAyB,KAAK,OAAO,UAAU,MAAM,QACrD;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,yBACd,UACA,QACA,SACU;AACV,QAAM,WAAW,YAAY,CAAC;AAC9B,QAAM,uBAAuB,SAAS,OAAO,CAAC,QAAQ,CAAC,qBAAqB,GAAG,CAAC;AAChF,QAAM,eAAe,yBAAyB,QAAQ,OAAO;AAC7D,SAAO,CAAC,GAAG,sBAAsB,GAAG,YAAY;AAClD;AAqCO,SAAS,8BAA8B,MAAsE;AAClH,QAAM,SAAS,8BAA8B,IAAI;AACjD,QAAM,SAAS,cAAc,oBAAoB,QAAQ,CAAC,GAAG,4BAA4B,MAAM,CAAC;AAChG,SAAO;AAAA,IACL,eAAe,OAAO;AAAA,IACtB;AAAA,EACF;AACF;AAGO,SAAS,0BACd,UACA,UACU;AACV,QAAM,WAAW,YAAY,CAAC;AAC9B,QAAM,aAAa,SAAS;AAAA,IAC1B,CAAC,QACC,cAAc,KAAK,4BAA4B,UAAU,MAAM,UAC/D,cAAc,KAAK,4BAA4B,MAAM,MAAM;AAAA,EAC/D;AACA,QAAM,UAAoB,CAAC;AAC3B,MAAI,cAAc,SAAS,aAAa,GAAG;AACzC,YAAQ,KAAK,GAAG,SAAS,aAAa,GAAG,4BAA4B,UAAU,EAAE;AAAA,EACnF;AACA,MAAI,cAAc,SAAS,MAAM,GAAG;AAClC,YAAQ,KAAK,GAAG,SAAS,MAAM,GAAG,4BAA4B,MAAM,EAAE;AAAA,EACxE;AACA,SAAO,CAAC,GAAG,YAAY,GAAG,OAAO;AACnC;;;AC9aA,IAAMC,QAAO;AAMN,IAAM,kBAAN,cAA8B,iBAA+B;AAAA,EAClE,YAAY,MAAkB;AAC5B,UAAM,MAAMA,OAAM,EAAE,0BAA0B,OAAO,oBAAoB,MAAM,CAAC;AAAA,EAClF;AAAA,EAEQ,kBAAkB,MAAqC;AAC7D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,kBAAkB,8BAA8B,KAAK,IAAI;AAAA,IAC3D;AAAA,EACF;AAAA,EAEQ,kBAAkB,MAAqC;AAC7D,UAAM,EAAE,kBAAkB,GAAG,QAAQ,IAAI;AACzC,UAAM,WAAW,mBAAmB,0BAA0B,QAAQ,MAAM,gBAAgB,IAAI,QAAQ;AACxG,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,OACE,MACA,SAKuB;AACvB,WAAO,KAAK,KACT,YAA6B;AAAA,MAC5B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN,OAAO;AAAA,QACL,UAAU,SAAS;AAAA,QACnB,WAAW,SAAS;AAAA,MACtB;AAAA,MACA,MAAM,KAAK,kBAAkB,IAAI;AAAA,MACjC,QAAQ,SAAS;AAAA,IACnB,CAAC,EACA,KAAK,CAAC,SAAS,KAAK,kBAAkB,IAAI,CAAC;AAAA,EAChD;AAAA;AAAA,EAGA,OACE,MACA,UACA,SAMuB;AACvB,WAAO,KAAK,KACT,YAA6B;AAAA,MAC5B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,WAAW,SAAS;AAAA,QACpB,cAAc,SAAS;AAAA,QACvB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM,KAAK,kBAAkB,IAAI;AAAA,MACjC,QAAQ,SAAS;AAAA,IACnB,CAAC,EACA,KAAK,CAAC,SAAS,KAAK,kBAAkB,IAAI,CAAC;AAAA,EAChD;AAAA;AAAA,EAGA,OACE,UACA,SAOyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,iBAAiB,QAAQ;AAAA,QACzB,gBAAgB,QAAQ;AAAA,QACxB,oBAAoB,QAAQ;AAAA,MAC9B;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QACE,UACA,SASuB;AACvB,WAAO,KAAK,KACT,YAA6B;AAAA,MAC5B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,QACzB,YAAY,SAAS;AAAA,QACrB,sBAAsB,SAAS;AAAA,QAC/B,mBAAmB,SAAS;AAAA,QAC5B,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC,EACA,KAAK,CAAC,SAAS,KAAK,kBAAkB,IAAI,CAAC;AAAA,EAChD;AAAA,EAEQ,gCACN,UAC0B;AAC1B,WAAO,sBAAsB,YAAY,SAAS,mBAC9C,SAAS,mBACT,8BAA8B,SAAS,IAAI;AAAA,EACjD;AAAA,EAEA,MAAM,oBACJ,YACA,SASmC;AACnC,UAAM,WAAW,MAAM,KAAK,QAAQ,YAAY,OAAO;AACvD,WAAO,KAAK,gCAAgC,QAAQ;AAAA,EACtD;AAAA,EAEA,MAAM,uBACJ,YACA,eACA,SAYuB;AACvB,UAAM,WAAW,MAAM,KAAK,QAAQ,YAAY;AAAA,MAC9C,gBAAgB,SAAS;AAAA,MACzB,YAAY,SAAS;AAAA,MACrB,sBAAsB,SAAS;AAAA,MAC/B,mBAAmB,SAAS;AAAA,MAC5B,eAAe,SAAS;AAAA,MACxB,QAAQ,SAAS;AAAA,IACnB,CAAC;AAED,UAAM,kBAAkB,SAAS,mBAAmB;AACpD,UAAM,eAAyC,kBAC3C;AAAA,MACE,GAAG,KAAK,gCAAgC,QAAQ;AAAA,MAChD,GAAG;AAAA,IACL,IACA,EAAE,GAAG,cAAc;AAEvB,aAAS,mBAAmB;AAC5B,aAAS,OAAO,0BAA0B,SAAS,MAAM,YAAY;AAErE,WAAO,KAAK,OAAO,UAAU,YAAY;AAAA,MACvC,WAAW,SAAS;AAAA,MACpB,cAAc,SAAS;AAAA,MACvB,oBAAoB,SAAS;AAAA,MAC7B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,oBACE,YACA,UACA,SACuB;AACvB,WAAO,KAAK,uBAAuB,YAAY,UAAU;AAAA,MACvD,GAAG;AAAA,MACH,iBAAiB;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aAAa,SAAiF;AAC5F,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI,WAAW,CAAC;AACxC,WAAO,KAAK,KACT,YAA+B;AAAA,MAC9B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb,OAAO,EAAE,GAAG,KAAK;AAAA,MACjB;AAAA,IACF,CAAC,EACA,KAAK,CAAC,UAAU,MAAM,IAAI,CAAC,SAAS,KAAK,kBAAkB,IAAI,CAAC,CAAC;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,aACE,YACA,MACA,SAC0B;AAC1B,UAAM,EAAE,QAAQ,GAAG,UAAU,IAAI,WAAW,CAAC;AAC7C,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,UAAU,CAAC;AAAA,MAC9C,OAAO,oBAAoB,SAAS;AAAA,MACpC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,YACE,YACA,SAM2B;AAC3B,UAAM,EAAE,QAAQ,MAAM,IAAI,UAAU,IAAI;AACxC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,UAAU,CAAC;AAAA,MAC9C,OAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI;AAAA,QACJ;AAAA,MACF;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,UACE,YACA,MACA,SACwB;AACxB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,UAAU,CAAC;AAAA,MAC9C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,YACA,MACA,SAC0B;AAC1B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,UAAU,CAAC;AAAA,MAC9C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,uBACE,MACA,SACyC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;ACzSA,IAAMC,QAAO;AAGN,IAAM,iBAAN,cAA6B,iBAA8B;AAAA,EAChE,YAAY,MAAkB;AAC5B,UAAM,MAAMA,OAAM,EAAE,0BAA0B,OAAO,oBAAoB,MAAM,CAAC;AAAA,EAClF;AAAA,EAEQ,iBAAiB,SAAsC;AAC7D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,kBAAkB,8BAA8B,QAAQ,IAAI;AAAA,IAC9D;AAAA,EACF;AAAA,EAEQ,iBAAiB,SAAsC;AAC7D,UAAM,EAAE,kBAAkB,GAAG,QAAQ,IAAI;AACzC,UAAM,WAAW,mBAAmB,yBAAyB,QAAQ,MAAM,gBAAgB,IAAI,QAAQ;AACvG,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,OACE,MACA,SAKsB;AACtB,WAAO,KAAK,KACT,YAA4B;AAAA,MAC7B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN,OAAO;AAAA,QACL,UAAU,SAAS;AAAA,QACnB,WAAW,SAAS;AAAA,MACtB;AAAA,MACA,MAAM,KAAK,iBAAiB,IAAI;AAAA,MAChC,QAAQ,SAAS;AAAA,IACjB,CAAC,EACA,KAAK,CAAC,SAAS,KAAK,iBAAiB,IAAI,CAAC;AAAA,EAC/C;AAAA;AAAA,EAGA,OACE,MACA,UACA,SAMsB;AACtB,WAAO,KAAK,KACT,YAA4B;AAAA,MAC7B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,WAAW,SAAS;AAAA,QACpB,cAAc,SAAS;AAAA,QACvB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM,KAAK,iBAAiB,IAAI;AAAA,MAChC,QAAQ,SAAS;AAAA,IACjB,CAAC,EACA,KAAK,CAAC,SAAS,KAAK,iBAAiB,IAAI,CAAC;AAAA,EAC/C;AAAA;AAAA,EAGA,OACE,UACA,SAOyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,iBAAiB,QAAQ;AAAA,QACzB,gBAAgB,QAAQ;AAAA,QACxB,oBAAoB,QAAQ;AAAA,MAC9B;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QACE,UACA,SAQsB;AACtB,WAAO,KAAK,KACT,YAA4B;AAAA,MAC7B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,WAAW,SAAS;AAAA,QACpB,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,QACzB,mBAAmB,SAAS;AAAA,QAC5B,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACjB,CAAC,EACA,KAAK,CAAC,SAAS,KAAK,iBAAiB,IAAI,CAAC;AAAA,EAC/C;AAAA;AAAA,EAGQ,+BACN,SACyB;AACzB,UAAM,WACJ,sBAAsB,WAAW,QAAQ,mBACrC,QAAQ,mBACR,8BAA8B,QAAQ,IAAI;AAChD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,oBACJ,WACA,SAQkC;AAClC,UAAM,UAAU,MAAM,KAAK,QAAQ,WAAW,OAAO;AACrD,WAAO,KAAK,+BAA+B,OAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,uBACJ,WACA,eACA,SAUsB;AACtB,UAAM,UAAU,MAAM,KAAK,QAAQ,WAAW;AAAA,MAC5C,WAAW,SAAS;AAAA,MACpB,gBAAgB,SAAS;AAAA,MACzB,mBAAmB,SAAS;AAAA,MAC5B,eAAe,SAAS;AAAA,MACxB,QAAQ,SAAS;AAAA,IACnB,CAAC;AAED,UAAM,kBAAkB,SAAS,mBAAmB;AACpD,UAAM,eAAyC,kBAC3C;AAAA,MACE,GAAG,KAAK,+BAA+B,OAAO;AAAA,MAC9C,GAAG;AAAA,IACL,IACA,EAAE,GAAG,cAAc;AAEvB,YAAQ,mBAAmB;AAC3B,YAAQ,OAAO,yBAAyB,QAAQ,MAAM,YAAY;AAElE,WAAO,KAAK,OAAO,SAAS,WAAW;AAAA,MACrC,WAAW,SAAS;AAAA,MACpB,cAAc,SAAS;AAAA,MACvB,oBAAoB,SAAS;AAAA,MAC7B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,oBACE,WACA,UACA,SACsB;AACtB,WAAO,KAAK,uBAAuB,WAAW,UAAU;AAAA,MACtD,GAAG;AAAA,MACH,iBAAiB;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YACE,WACA,MACA,SACoB;AACpB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aACE,WACA,MACA,SAC0B;AAC1B,UAAM,EAAE,QAAQ,GAAG,UAAU,IAAI,WAAW,CAAC;AAC7C,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C,OAAO,oBAAoB,SAAS;AAAA,MACpC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBACE,MACA,SACqC;AACrC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,uBACE,MACA,SACyC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,mBACE,WACA,MACA,SACiC;AACjC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,qBACE,WACA,MACA,SACiC;AACjC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,oBACE,WACA,MACA,SACyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oCACE,WACA,MACA,SACqC;AACrC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aAAa,SAAgF;AAC3F,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI,WAAW,CAAC;AACxC,WAAO,KAAK,KACT,YAA8B;AAAA,MAC/B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb,OAAO,EAAE,GAAG,KAAK;AAAA,MACjB;AAAA,IACA,CAAC,EACA,KAAK,CAAC,UAAU,MAAM,IAAI,CAAC,SAAS,KAAK,iBAAiB,IAAI,CAAC,CAAC;AAAA,EACrE;AAAA;AAAA,EAGA,cACE,WACA,MACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C,OAAO,EAAE,WAAW,SAAS,UAAU;AAAA,MACvC;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eACE,WACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C,OAAO,EAAE,QAAQ,SAAS,QAAQ,WAAW,SAAS,UAAU;AAAA,MAChE,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,iBACE,WACA,MACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,kBACE,WACA,MACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,mBACE,WACA,MACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,qBACE,WACA,MACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;ACrcA,IAAMC,QAAO;AASN,IAAM,aAAN,MAAiB;AAAA,EACL;AAAA,EAEjB,YAAY,QAAoC;AAC9C,SAAK,WAAW,IAAI,WAAW;AAAA,MAC7B,SAAS,OAAO;AAAA,MAChB,OAAO,OAAO;AAAA,MACd,gBAAgB,OAAO;AAAA,MACvB,WAAW,OAAO;AAAA,IACpB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QAAQ,MAAkB,SAAwD;AAChF,WAAO,KAAK,SAAS,YAAY;AAAA,MAC/B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aAAa,MAAgB,SAAwD;AACnF,WAAO,KAAK,SAAS,YAAY;AAAA,MAC/B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,MAAiB,SAAmD;AACzE,WAAO,KAAK,SAAS,YAAY;AAAA,MAC/B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,SAAS,MAAmB,SAA2D;AACrF,WAAO,KAAK,SAAS,YAAY;AAAA,MAC/B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cACE,MACA,SACgC;AAChC,WAAO,KAAK,SAAS,YAAY;AAAA,MAC/B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AC3EA,IAAMC,QAAO;AAMN,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAG7B,KAAK,SAA8D;AACjE,WAAO,KAAK,KAAK,YAAY,EAAE,QAAQ,OAAO,MAAMA,OAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,MAAmB,SAA6D;AAClF,WAAO,KAAK,KAAK,YAAY,EAAE,QAAQ,QAAQ,MAAMA,OAAM,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,WAAmB,SAA6D;AAC7F,WAAO,KAAK,KAAK,YAAY,EAAE,QAAQ,OAAO,MAAMA,OAAM,MAAM,WAAW,QAAQ,SAAS,OAAO,CAAC;AAAA,EACtG;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBACE,WACA,MACA,SACsC;AACtC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,WAAmB,SAAgE;AACxF,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,KAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;ACnDA,IAAMC,eAA8C;AAAA,EAClD,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAClB;AAMO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAErB,KAAK,QAAgC;AAC3C,WAAOA,aAAY,MAAM;AAAA,EAC3B;AAAA,EAEQ,WAAW,QAAwB,UAA0B;AACnE,WAAO,GAAG,KAAK,KAAK,MAAM,CAAC,IAAI,kBAAkB,QAAQ,CAAC;AAAA,EAC5D;AAAA;AAAA,EAGQ,iBAAiB,QAA2C;AAClE,WAAO,WAAW,aAAa,WAAW;AAAA,EAC5C;AAAA;AAAA,EAGA,kBACE,QACA,UACA,SAC6B;AAC7B,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI,WAAW,CAAC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,CAAC;AAAA,MAC1C,OAAO,EAAE,GAAG,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBACE,QACA,UACA,MACA,SAC6B;AAC7B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,CAAC;AAAA,MAC1C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,QACA,SAC6B;AAC7B,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI,WAAW,CAAC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,KAAK,MAAM,CAAC;AAAA,MAC1B,OAAO,EAAE,GAAG,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,QACA,UACA,SACA,SAC2B;AAC3B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,CAAC,eAAe,kBAAkB,OAAO,CAAC;AAAA,MACnF,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eACE,QACA,UACA,SACA,SACyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,CAAC,eAAe,kBAAkB,OAAO,CAAC;AAAA,MACnF,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,kBACE,QACA,UACA,MACA,SAC6B;AAC7B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,CAAC;AAAA,MAC1C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,oBACE,QACA,UACA,SAC6B;AAC7B,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI,WAAW,CAAC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,CAAC;AAAA,MAC1C,OAAO,EAAE,GAAG,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,iBACE,QACA,UACA,SACA,SACyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,CAAC,iBAAiB,kBAAkB,OAAO,CAAC;AAAA,MACrF,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cACE,QACA,UACA,SACA,SAC2B;AAC3B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,CAAC,iBAAiB,kBAAkB,OAAO,CAAC;AAAA,MACrF,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,kBACE,QACA,UACA,MACA,SACkC;AAClC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,CAAC;AAAA,MAC1C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,oBACE,QACA,UACA,MACA,SACkC;AAClC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,CAAC;AAAA,MAC1C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,QACA,UACA,SACA,SACqB;AACrB,UAAM,EAAE,QAAQ,MAAM,IAAI,WAAW,CAAC;AACtC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,CAAC,eAAe,kBAAkB,OAAO,CAAC;AAAA,MACnF,OAAO,EAAE,MAAM;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cACE,QACA,UACA,SACA,SACqB;AACrB,UAAM,EAAE,QAAQ,MAAM,IAAI,WAAW,CAAC;AACtC,UAAM,MAAM,KAAK,iBAAiB,MAAM;AACxC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAG,KAAK,WAAW,QAAQ,QAAQ,CAAC,UAAU,GAAG,IAAI,kBAAkB,OAAO,CAAC;AAAA,MACrF,OAAO,EAAE,MAAM;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACnOA,IAAMC,SAAO;AAMN,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAG7B,aACE,OACA,SACuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OACE,UACA,MACA,OACA,SACqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,SACE,OACA,SACwB;AACxB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAA6B,SAAyD;AAC1F,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,UACE,OACA,SACyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAA6B,SAAyD;AAC1F,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,UACE,OACA,SACyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,SACE,OACA,SACwB;AACxB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AC5HA,IAAMC,SAAO;AAGN,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAG7B,KACE,OACA,SAC8B;AAC9B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;ACXA,IAAMC,SAAO;AAKN,IAAM,+BAAN,MAAmC;AAAA,EACxC,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAG7B,OACE,MACA,SACgC;AAChC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN,OAAO,EAAE,eAAe,SAAS,cAAc;AAAA,MAC/C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,MACA,UACA,SAMgC;AAChC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,cAAc,SAAS;AAAA,QACvB,oBAAoB,SAAS;AAAA,QAC7B,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,UACA,SAMyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,QAC7B,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YACE,UACA,OACA,SAMgC;AAChC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL;AAAA,QACA,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,QAC7B,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,WACE,UACA,SACyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,aAAa,SAAS;AAAA,QACtB,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,iBACE,UACA,OACA,SACkC;AAClC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AC9HA,IAAMC,SAAO;AAKN,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAG7B,KAAK,OAAgC,SAAiE;AACpG,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,MACA,SACyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AC1BO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAG7B,eAAe,MAAqB,SAA0D;AAC5F,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eAAe,MAA2B,SAAyD;AACjG,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,mBACE,MACA,SACqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AC3CA,IAAMC,SAAO;AAKN,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA;AAAA;AAAA,EAK7B,SACE,MACA,SAC6B;AAC7B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN,OAAO,EAAE,WAAW,SAAS,UAAU;AAAA,MACvC;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,mBACE,WACA,MACA,SAC6B;AAC7B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,SAAS,CAAC;AAAA,MAC7C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AC1BA,IAAMC,SAAO;AAMN,IAAM,uBAAN,cAAmC,qBAAkE;AAAA,EAC1G,YAAY,MAAkB;AAC5B,UAAM,MAAMA,MAAI;AAAA,EAClB;AAAA;AAAA,EAGA,OACE,MACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN,OAAO,EAAE,UAAU,SAAS,UAAU,WAAW,SAAS,UAAU;AAAA,MACpE;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,MACA,UACA,SAK4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,cAAc,SAAS;AAAA,QACvB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,UACA,SAOyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,iBAAiB,QAAQ;AAAA,QACzB,gBAAgB,QAAQ;AAAA,QACxB,oBAAoB,QAAQ;AAAA,MAC9B;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QACE,UACA,SAO4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,QACzB,mBAAmB,SAAS;AAAA,QAC5B,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aACE,SAC8B;AAC9B,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI,WAAW,CAAC;AACxC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAG,KAAK;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,uBAAuB,UAAkB,SAAmD;AAC1F,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,iBAAiB,kBAAkB,QAAQ,CAAC;AAAA,MACzD,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,kBACE,iBACA,MACA,SAC0B;AAC1B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,eAAe,CAAC;AAAA,MACnD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eACE,MACA,SAC0C;AAC1C,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,eAAe,SAAS,cAAc;AAAA,MAC/C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,qBACE,UACA,OAIA,SACoC;AACpC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AC3JA,IAAMC,SAAO;AAEb,IAAM,2BAA2B,EAAE,uBAAuB,MAAe;AAOlE,IAAM,qBAAN,cAAiC,qBAAgE;AAAA,EACtG,YAAY,MAAkB;AAC5B,UAAM,MAAMA,QAAM,wBAAwB;AAAA,EAC5C;AAAA;AAAA,EAGA,mBACE,eACA,MACA,SACkC;AAClC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,aAAa,CAAC;AAAA,MACjD;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,qBACE,UACA,OAIA,SACoC;AACpC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,WACE,UACA,SACyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,aAAa,SAAS;AAAA,QACtB,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,iBACE,UACA,OACA,SACkC;AAClC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,uBACE,UACA,gBACA,SACyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC,kBAAkB,kBAAkB,cAAc,CAAC;AAAA,MAC/F,OAAO;AAAA,QACL,aAAa,SAAS;AAAA,QACtB,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,4BACE,UACA,gBACA,OACA,SACkC;AAClC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC,kBAAkB,kBAAkB,cAAc,CAAC;AAAA,MAC/F,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,MACA,UACA,SAK0B;AAC1B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,cAAc,SAAS;AAAA,QACvB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,UACA,SAOyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,iBAAiB,QAAQ;AAAA,QACzB,gBAAgB,QAAQ;AAAA,QACxB,oBAAoB,QAAQ;AAAA,MAC9B;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QACE,UACA,SAQ0B;AAC1B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,QACzB,mBAAmB,SAAS;AAAA,QAC5B,gBAAgB,SAAS;AAAA,QACzB,eAAe,SAAS;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aACE,SAC4B;AAC5B,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI,WAAW,CAAC;AACxC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAG,KAAK;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,uBAAuB,UAAkB,SAAmD;AAC1F,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,iBAAiB,kBAAkB,QAAQ,CAAC;AAAA,MACzD,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,uBACE,MACA,SACyC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,0BACE,QACA,MACA,SACqB;AACrB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,MAAM,CAAC;AAAA,MAC1C,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AC5PA,IAAMC,SAAO;AAMN,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAG7B,IAAI,SAA+D;AACjE,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,MAAwB,SAA2D;AACxF,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;ACEA,IAAMC,SAAO;AAEN,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAG7B,eAAe,SAA8D;AAC3E,WAAO,KAAK,KAAK,YAAY,EAAE,QAAQ,OAAO,MAAM,GAAGA,MAAI,gBAAgB,QAAQ,SAAS,OAAO,CAAC;AAAA,EACtG;AAAA;AAAA,EAGA,aAAa,OAA2B,SAAwD;AAC9F,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eAAe,MAA4B,SAAoE;AAC7G,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,mBAAmB,MAAgC,SAAsD;AACvG,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cAAc,MAA4B,SAAoE;AAC5G,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,OACA,SACuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aAAa,UAAkB,SAA6D;AAC1F,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,YAAY,kBAAkB,QAAQ,CAAC;AAAA,MACpD,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,kBAAkB,UAAkB,SAAiE;AACnG,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,YAAY,kBAAkB,QAAQ,CAAC;AAAA,MACpD,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,qBACE,UACA,UACA,SACuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,YAAY,kBAAkB,QAAQ,CAAC;AAAA,MACpD,OAAO,EAAE,SAAS;AAAA,MAClB,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,kBAAkB,SAA0D;AAC1E,WAAO,KAAK,KAAK,YAAY,EAAE,QAAQ,OAAO,MAAM,GAAGA,MAAI,mBAAmB,QAAQ,SAAS,OAAO,CAAC;AAAA,EACzG;AAAA;AAAA,EAGA,6BAA6B,WAAmB,SAA6D;AAC3G,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,qBAAqB,MAAmB,SAA6D;AACnG,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,iBACE,OACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,4BAA4B,SAAgE;AAC1F,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,8BACE,MACA,SACuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,OACA,SACuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,SACE,MACA,SACqC;AACrC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aACE,MACA,OACA,SAC0B;AAC1B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cAAc,SAA6D;AACzE,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBAAgB,MAAsB,SAA2D;AAC/F,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,WAAW,SAAmE;AAC5E,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eACE,MACA,SACmC;AACnC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,SAAqD;AACzD,WAAO,KAAK,KAAK,YAAY,EAAE,QAAQ,OAAO,MAAM,GAAGA,MAAI,UAAU,QAAQ,SAAS,OAAO,CAAC;AAAA,EAChG;AACF;;;ACjRA,IAAMC,SAAO;AAKN,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAG7B,OAAO,MAAmB,SAAqD;AAC7E,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QACE,IACA,SACsB;AACtB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC9C,OAAO,EAAE,KAAK,SAAS,IAAI;AAAA,MAC3B,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QAAQ,OAA8B,SAA4D;AAChG,UAAM,EAAE,OAAO,IAAI,WAAW,CAAC;AAC/B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAI,SAAS,CAAC,EAAG;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,IAAY,SAAqD;AACtE,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC9C,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;ACjDA,IAAMC,SAAO;AAGN,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAG7B,IAAI,MAA0B,SAAkE;AAC9F,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QACE,UACA,SACuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,gBAAgB,SAAS,eAAe;AAAA,MACjD,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QACE,SACyB;AACzB,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI,WAAW,CAAC;AACxC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAG,KAAK;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,gBACA,SACyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,cAAc,CAAC;AAAA,MAClD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AC1DA,IAAMC,SAAO;AAGN,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAE7B,UAAU,YAA8B,SAA8D;AACpG,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,OAAO,UAAU,CAAC,CAAC;AAAA,MACtD,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;ACbA,IAAMC,SAAO;AAGN,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAG7B,OAAO,MAAmB,SAA0D;AAClF,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAMA;AAAA,MACN;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,MACA,UACA,SACsB;AACtB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,cAAc,SAAS,aAAa;AAAA,MAC7C;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,KACE,SAKwB;AACxB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,MAC3B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OACE,eACA,SACyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,aAAa,CAAC;AAAA,MACjD,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACF;;;AC1DA,IAAMC,SAAO;AAMN,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAG7B,yBACE,oBACA,SAC4B;AAC5B,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,6BAA6B,kBAAkB,kBAAkB,CAAC;AAAA,MAC/E,OAAO,EAAE,eAAe,SAAS,eAAe,MAAM,SAAS,KAAK;AAAA,MACpE,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBAAgB,YAAoB,SAAqD;AACvF,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,eAAe,kBAAkB,UAAU,CAAC;AAAA,MACzD,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBACE,UACA,SAMuB;AACvB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO;AAAA,QACL,0BAA0B,SAAS;AAAA,QACnC,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,MAC3B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBACE,UACA,SAUuB;AACvB,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI,WAAW,CAAC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,GAAG,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,mBACE,UACA,SAOyB;AACzB,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI,WAAW,CAAC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,GAAG,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cACE,UACA,SAcyB;AACzB,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI,WAAW,CAAC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,GAAG,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,uBACE,UACA,SAQmB;AACnB,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI,WAAW,CAAC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,OAAO,EAAE,GAAG,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,UACA,WACA,SACmB;AACnB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC,cAAc,kBAAkB,SAAS,CAAC;AAAA,MACtF,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,MAC3B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eACE,UACA,WACA,SAQmB;AACnB,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI,WAAW,CAAC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC,cAAc,kBAAkB,SAAS,CAAC;AAAA,MACtF,OAAO,EAAE,GAAG,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,eACE,UACA,WACA,SACyB;AACzB,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC,cAAc,kBAAkB,SAAS,CAAC;AAAA,MACtF,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,oBAAoB,SAAS;AAAA,MAC/B;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,gBACE,UACA,WACA,SAQmB;AACnB,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI,WAAW,CAAC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC,cAAc,kBAAkB,SAAS,CAAC;AAAA,MACtF,OAAO,EAAE,GAAG,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,oBACE,UACA,WACA,SAYyB;AACzB,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI,WAAW,CAAC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC,cAAc,kBAAkB,SAAS,CAAC;AAAA,MACtF,OAAO,EAAE,GAAG,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC3PA,IAAMC,SAAO;AAUN,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YACmB,MACA,QACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA;AAAA,EAInB,QAAQ,UAAkB,SAAqD;AAC7E,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGC,MAAI,IAAI,kBAAkB,QAAQ,CAAC;AAAA,MAC5C,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoB,UAAkB,SAA4D;AACtG,UAAM,UAAU,KAAK,OAAO,SAAS,WAAW;AAChD,UAAM,SAAS,KAAK,OAAO,WAAW;AACtC,UAAM,MAAM,mBAAmB,QAAQ,GAAGA,MAAI,IAAI,kBAAkB,QAAQ,CAAC,EAAE;AAC/E,UAAM,cAAc,MAAM,iBAAiB,KAAK,MAAM;AACtD,UAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,MAC7B,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,GAAG;AAAA,QACH,GAAG,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AACD,WAAO,IAAI,QAAQ,IAAI,UAAU;AAAA,EACnC;AACF;;;AClDA,IAAMC,SAAO;AAGN,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA;AAAA,EAG7B,WACE,SAYkB;AAClB,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI,WAAW,CAAC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAG,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,YACE,SAQkB;AAClB,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI,WAAW,CAAC;AACzC,WAAO,KAAK,KAAK,YAAY;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,GAAGA,MAAI;AAAA,MACb,OAAO,EAAE,GAAG,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACPO,IAAM,eAAN,MAAmB;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YAAY,QAA4B;AACtC,SAAK,SAAS;AAAA,MACZ,GAAG;AAAA,MACH,SAAS,OAAO,WAAW;AAAA,IAC7B;AACA,SAAK,OAAO,IAAI,WAAW,KAAK,MAAM;AACtC,SAAK,MAAM,IAAI,UAAU,KAAK,IAAI;AAClC,SAAK,WAAW,IAAI,eAAe,KAAK,IAAI;AAC5C,SAAK,QAAQ,IAAI,YAAY,KAAK,IAAI;AACtC,SAAK,WAAW,IAAI,eAAe,KAAK,IAAI;AAC5C,SAAK,gBAAgB,IAAI,gBAAgB,KAAK,IAAI;AAClD,SAAK,WAAW,IAAI,eAAe,KAAK,IAAI;AAC5C,SAAK,QAAQ,IAAI,YAAY,KAAK,IAAI;AACtC,SAAK,YAAY,IAAI,gBAAgB,KAAK,IAAI;AAC9C,SAAK,SAAS,IAAI,aAAa,KAAK,IAAI;AACxC,SAAK,gBAAgB,IAAI,oBAAoB,KAAK,IAAI;AACtD,SAAK,yBAAyB,IAAI,6BAA6B,KAAK,IAAI;AACxE,SAAK,gBAAgB,IAAI,oBAAoB,KAAK,IAAI;AACtD,SAAK,eAAe,IAAI,mBAAmB,KAAK,IAAI;AACpD,SAAK,UAAU,IAAI,cAAc,KAAK,IAAI;AAC1C,SAAK,iBAAiB,IAAI,qBAAqB,KAAK,IAAI;AACxD,SAAK,eAAe,IAAI,mBAAmB,KAAK,IAAI;AACpD,SAAK,eAAe,IAAI,mBAAmB,KAAK,IAAI;AACpD,SAAK,OAAO,IAAI,WAAW,KAAK,IAAI;AACpC,SAAK,YAAY,IAAI,gBAAgB,KAAK,IAAI;AAC9C,SAAK,QAAQ,IAAI,YAAY,KAAK,IAAI;AACtC,SAAK,WAAW,IAAI,eAAe,KAAK,IAAI;AAC5C,SAAK,OAAO,IAAI,WAAW,KAAK,MAAM;AACtC,SAAK,eAAe,IAAI,mBAAmB,KAAK,IAAI;AACpD,SAAK,gBAAgB,IAAI,oBAAoB,KAAK,IAAI;AACtD,SAAK,eAAe,IAAI,mBAAmB,KAAK,IAAI;AACpD,SAAK,cAAc,IAAI,kBAAkB,KAAK,IAAI;AAClD,SAAK,OAAO,IAAI,WAAW,KAAK,IAAI;AACpC,SAAK,YAAY,IAAI,gBAAgB,KAAK,IAAI;AAC9C,SAAK,WAAW,IAAI,eAAe,KAAK,MAAM,KAAK,MAAM;AAAA,EAC3D;AACF;;;AC9HO,IAAM,+BAA+B;AAAA,EAC1C,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AACX;AAMO,IAAM,wCAAwC;AAAA,EACnD,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,oBAAoB;AACtB;AASO,SAAS,4BACd,MACmB;AACnB,MAAI,CAAC,MAAM,QAAQ;AACjB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,aAAa,MAAM,EAAE,aAAa,EAAE;AACzE;AAEO,SAAS,iBACd,MACA,eACoB;AACpB,QAAM,IAAI,KAAK,mBAAmB,KAAK,CAAC,MAAM,EAAE,kBAAkB,aAAa;AAC/E,SAAO,GAAG,kBAAkB;AAC9B;AAEO,SAAS,2BAA2B,MAA2C;AACpF,SAAO,iBAAiB,MAAM,sCAAsC,eAAe;AACrF;AAEO,SAAS,WAAW,MAAuB,eAAgC;AAChF,SAAO,iBAAiB,MAAM,aAAa,MAAM;AACnD;AAMO,SAAS,kBACd,SACgB;AAChB,QAAM,sBAAsB,SAAS;AACrC,QAAM,uBAAuB,SAAS;AAEtC,QAAM,eACJ,yBAAyB,UACzB,wBAAwB,yBACxB,wBAAwB;AAC1B,QAAM,oBACJ,yBAAyB,UAAU,wBAAwB;AAC7D,QAAM,2BACJ,yBAAyB,cACzB,wBAAwB,yBACxB,wBAAwB;AAC1B,QAAM,0CACJ,yBAAyB,cAAc,wBAAwB;AAEjE,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AACA,MAAI,mBAAmB;AACrB,WAAO;AAAA,EACT;AACA,MAAI,4BAA4B,yCAAyC;AACvE,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AClFA,SAAS,eAAe,GAAoC;AAC1D,SAAO,MAAM,UAAa,MAAM;AAClC;AAMO,SAAS,uBAAuB,KAAyB,KAAkC;AAChG,QAAM,YAAY,QAAQ;AAC1B,QAAM,WAAW,QAAQ;AACzB,QAAM,iBAAiB,eAAe,GAAG,KAAK,MAAM;AACpD,QAAM,gBAAgB,eAAe,GAAG,KAAK,MAAM;AACnD,QAAM,gBAAgB,eAAe,GAAG,KAAK,MAAM;AACnD,SAAO,aAAc,YAAY,kBAAmB,iBAAiB;AACvE;AAmCO,SAAS,yBAAyB,SAAmD;AAC1F,QAAM,UAAU,4BAA4B,QAAQ,mBAAmB;AACvE,QAAM,MAAmC,CAAC;AAC1C,MAAI,MAAM;AACV,aAAW,QAAQ,SAAS;AAC1B,UAAM,KAAK,KAAK,YAAY,6BAA6B;AACzD,QAAI,OAAO,6BAA6B,MAAM;AAC5C,YAAM,iBAAiB,kBAAkB,QAAQ,yBAAyB;AAC1E,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,UAAU,EAAE;AAAA,QACZ,WAAW,KAAK,aAAa;AAAA,QAC7B;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,QAAI,OAAO,6BAA6B,UAAU;AAChD,YAAM,kBAAkB,2BAA2B,IAAI;AACvD,UAAI,CAAC,gBAAiB;AACtB,YAAM,KAAK,QAAQ,mBAAmB,KAAK,CAAC,MAAM,EAAE,YAAY,eAAe;AAC/E,UAAI,CAAC,GAAI;AACT,UAAI,uBAAuB,GAAG,gBAAgB,QAAW,GAAG,gBAAgB,MAAS,EAAG;AACxF,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,UAAU,EAAE;AAAA,QACZ,WAAW,KAAK,aAAa;AAAA,QAC7B;AAAA,QACA,mBAAmB,GAAG;AAAA,QACtB,cAAc,WAAW,MAAM,sCAAsC,UAAU;AAAA,QAC/E,wBAAwB,WAAW,MAAM,sCAAsC,kBAAkB;AAAA,QACjG,oBAAoB,WAAW,MAAM,sCAAsC,kBAAkB;AAAA,MAC/F,CAAC;AACD;AAAA,IACF;AACA,QAAI,OAAO,6BAA6B,SAAS;AAC/C,UAAI,KAAK,EAAE,MAAM,WAAW,UAAU,EAAE,KAAK,WAAW,KAAK,aAAa,IAAI,CAAC;AAAA,IACjF;AAAA,EACF;AACA,SAAO;AACT;;;AC9FO,SAAS,oBAAoB,KAAoD;AACtF,MAAI,OAAO,QAAQ,IAAI,KAAK,MAAM,GAAI,QAAO;AAC7C,QAAM,IAAI,IAAI,KAAK;AACnB,MAAI,EAAE,WAAW,SAAS,KAAK,EAAE,WAAW,UAAU,EAAG,QAAO;AAChE,SAAO,WAAW,CAAC;AACrB;AAGO,SAAS,uBAAuB,UAA2D;AAChG,QAAM,MAAM,UAAU,cAAc,gBAAgB,kBAAkB;AACtE,SAAO,OAAO,QAAQ,QAAQ,KAAK,SAAY;AACjD;AAOO,SAAS,oBAAoB,UAA2D;AAC7F,SAAO,oBAAoB,uBAAuB,QAAQ,CAAC;AAC7D;","names":["BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","DOMAIN_BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE","BASE"]}