{"version":3,"file":"c8y-ngx-components-register-device.mjs","sources":["../../register-device/register-device.service.ts","../../register-device/extensible/base-device-registration.model.ts","../../register-device/bulk/bulk-device-registration-modal.component.ts","../../register-device/bulk/bulk-device-registration-modal.component.html","../../register-device/general/general-device-registration.component.ts","../../register-device/general/general-device-registration.component.html","../../register-device/general/general-device-registration-button.component.ts","../../register-device/general/general-device-registration-button.component.html","../../register-device/dropdown/register-device-extension.service.ts","../../register-device/dropdown/register-device-dropdown.component.ts","../../register-device/dropdown/register-device-dropdown.component.html","../../register-device/device-registration-view.component.ts","../../register-device/device-registration-view.component.html","../../register-device/register-device-navigation.factory.ts","../../register-device/extensible/base-extensible-device-registration.service.ts","../../register-device/extensible/single/extensible-device-registration.service.ts","../../register-device/extensible/single/extensible-device-registration-stepper.component.ts","../../register-device/extensible/single/extensible-device-registration-stepper.component.html","../../register-device/extensible/single/extensible-device-registration-modal.component.ts","../../register-device/extensible/single/extensible-device-registration-modal.component.html","../../register-device/extensible/single/extensible-device-registration-button.component.ts","../../register-device/extensible/single/extensible-device-registration-button.component.html","../../register-device/extensible/bulk/extensible-bulk-device-registration.service.ts","../../register-device/extensible/bulk/extensible-bulk-device-registration-modal.component.ts","../../register-device/extensible/bulk/extensible-bulk-device-registration-modal.component.html","../../register-device/extensible/bulk/extensible-bulk-device-registration-button.component.ts","../../register-device/extensible/bulk/extensible-bulk-device-registration-button.component.html","../../register-device/bulk/bulk-device-registration-button.component.ts","../../register-device/bulk/bulk-device-registration-button.component.html","../../register-device/register-device.factory.ts","../../register-device/register-device.module.ts","../../register-device/c8y-ngx-components-register-device.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n  DeviceRegistrationService,\n  DeviceRegistrationStatus,\n  IDeviceRegistration,\n  IDeviceRegistrationAccept,\n  IDeviceRegistrationCreate,\n  IDeviceRegistrationLimit,\n  IResult,\n  Paging\n} from '@c8y/client';\nimport { get, pick } from 'lodash-es';\nimport { BehaviorSubject, forkJoin, from, Observable, Subject } from 'rxjs';\nimport { AlertService, gettext, IRealtimeDeviceBootstrap } from '@c8y/ngx-components';\nimport { finalize, map, mergeMap, takeLast, takeUntil } from 'rxjs/operators';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class RegisterDeviceService {\n  readonly _loading: Subject<boolean> = new Subject();\n  readonly _limit: BehaviorSubject<IDeviceRegistrationLimit> = new BehaviorSubject({\n    isReached: false\n  });\n  readonly _deviceRegistrationRequests: BehaviorSubject<{\n    data: IDeviceRegistration[];\n    paging?: Paging<IDeviceRegistration>;\n  }> = new BehaviorSubject({ data: [] });\n  readonly deviceRegistrationRequests$: Observable<{\n    data: IDeviceRegistration[];\n    paging?: Paging<IDeviceRegistration>;\n  }> = this._deviceRegistrationRequests.asObservable();\n  readonly loading$: Observable<boolean> = this._loading.asObservable();\n  readonly limit$: Observable<IDeviceRegistrationLimit> = this._limit.asObservable();\n  paging: Paging<IDeviceRegistration>;\n\n  private readonly deviceRegUrl = '/deviceregistration';\n  private endSubscriptions: Subject<void> = new Subject();\n\n  constructor(\n    private router: Router,\n    private deviceRegService: DeviceRegistrationService,\n    private alertService: AlertService\n  ) {}\n\n  isDeviceRegistration(): boolean {\n    return get(this.router, 'url') === this.deviceRegUrl;\n  }\n\n  internalListUpdate(\n    deviceRequests: IDeviceRegistration[],\n    pagingObject?: Paging<IDeviceRegistration>\n  ) {\n    let { paging, data } = this._deviceRegistrationRequests.getValue();\n    if (pagingObject) {\n      paging = pagingObject;\n    }\n    data = [...data, ...deviceRequests].filter(deviceReq => deviceReq.type !== 'c8y_DataBroker');\n    this._deviceRegistrationRequests.next({ data, paging });\n  }\n\n  onDeviceBootstrap(bsData: IRealtimeDeviceBootstrap) {\n    const { id, status } = bsData;\n    this._deviceRegistrationRequests.next({\n      data: this.updateStatusById(id, status)\n    });\n  }\n\n  list(pageSize = 100) {\n    this._loading.next(true);\n    this._deviceRegistrationRequests.next({ data: [], paging: undefined });\n\n    from(this.deviceRegService.list({ pageSize, withTotalPages: true }))\n      .pipe(\n        takeUntil(this.endSubscriptions),\n        finalize(() => this.limit())\n      )\n      .subscribe(\n        res => {\n          const { data, paging } = res;\n          this.internalListUpdate(data, paging);\n          this._loading.next(false);\n        },\n        err => {\n          this._loading.next(false);\n          this.alertService.addServerFailure(err);\n        }\n      );\n  }\n\n  createMultiple(newDeviceRequests: IDeviceRegistrationCreate[]) {\n    if (newDeviceRequests && newDeviceRequests.length > 0) {\n      this._loading.next(true);\n      const newRequests$ = newDeviceRequests.map(element => {\n        return from(\n          this.deviceRegService.create(element).catch((err: IResult<IDeviceRegistration>) => ({\n            res: err.res,\n            data: { ...err.data, id: element.id }\n          }))\n        );\n      });\n\n      const groupedRequests: {\n        success: IDeviceRegistration[];\n        failed: IDeviceRegistration[];\n      } = {\n        success: [],\n        failed: []\n      };\n\n      return forkJoin(newRequests$).pipe(\n        mergeMap(resp =>\n          resp.map(el => {\n            el.res.ok\n              ? groupedRequests.success.push(el.data)\n              : groupedRequests.failed.push(el.data);\n            return groupedRequests;\n          })\n        ),\n        takeLast(1),\n        finalize(() => {\n          this.internalListUpdate(groupedRequests.success);\n          this._loading.next(false);\n        })\n      );\n    }\n  }\n\n  remove(id: string) {\n    this._loading.next(true);\n    from(this.deviceRegService.delete(id))\n      .pipe(takeUntil(this.endSubscriptions))\n      .subscribe(\n        () => {\n          this._deviceRegistrationRequests.next({\n            data: this.removeDeviceRegistrationRequestById(id)\n          });\n          this._loading.next(false);\n          this.alertService.success(gettext('Device registration cancelled.'));\n        },\n        err => {\n          this._loading.next(false);\n          this.alertService.addServerFailure(err);\n        }\n      );\n  }\n\n  accept(request: IDeviceRegistration) {\n    this._loading.next(true);\n    const payload = pick(request, ['id', 'securityToken']);\n    from(this.deviceRegService.accept(payload))\n      .pipe(takeUntil(this.endSubscriptions))\n      .subscribe(\n        () => {\n          this._deviceRegistrationRequests.next({\n            data: this.removeDeviceRegistrationRequestById(payload.id)\n          });\n          this.limit();\n          this._loading.next(false);\n          this.alertService.success(gettext('Device registration accepted.'));\n        },\n        err => {\n          this._loading.next(false);\n          this.alertService.addServerFailure(err);\n        }\n      );\n  }\n\n  acceptAll() {\n    const acceptedDeviceRequests: IDeviceRegistrationAccept[] = [];\n    const failedDeviceRequests: IDeviceRegistrationAccept[] = [];\n    this._loading.next(true);\n\n    from(this.deviceRegService.acceptAll())\n      .pipe(\n        takeUntil(this.endSubscriptions),\n        map(({ data }) => {\n          data.map(deviceRegistrationRequest => {\n            if (deviceRegistrationRequest.successful) {\n              acceptedDeviceRequests.push(deviceRegistrationRequest);\n              this.removeDeviceRegistrationRequestById(deviceRegistrationRequest.id);\n            } else {\n              failedDeviceRequests.push(deviceRegistrationRequest);\n            }\n          });\n          return data;\n        }),\n        finalize(() => {\n          // update rendered list with successful accepted device registrations\n          // see: this.updateStatusById(...)\n          this.internalListUpdate([]);\n          this.limit();\n          this._loading.next(false);\n          if (failedDeviceRequests.length > 0) {\n            this.alertService.warning(\n              gettext('Could not accept all pending registration requests.'),\n              JSON.stringify(\n                {\n                  failedDeviceRequests,\n                  acceptedDeviceRequests\n                },\n                undefined,\n                2\n              )\n            );\n          } else {\n            this.alertService.success(gettext('Accepted all pending registration requests.'));\n          }\n        })\n      )\n      .subscribe(\n        () => {\n          // empty by design\n        },\n        err => {\n          this._loading.next(false);\n          this.alertService.addServerFailure(err);\n        }\n      );\n  }\n\n  limit() {\n    from(this.deviceRegService.limit())\n      .pipe(takeUntil(this.endSubscriptions))\n      .subscribe(\n        res => this._limit.next(res.data),\n        err => this.alertService.addServerFailure(err)\n      );\n  }\n\n  getRequestByStatus(status: DeviceRegistrationStatus): IDeviceRegistration[] {\n    return this._deviceRegistrationRequests.getValue().data.filter(req => req.status === status);\n  }\n\n  ngOnDestroy(): void {\n    this.endSubscriptions.next();\n    this.endSubscriptions.complete();\n  }\n\n  private updateStatusById(id: string, status: DeviceRegistrationStatus) {\n    const items = this._deviceRegistrationRequests.getValue().data;\n    const matchingElementIndex = items.findIndex(element => element.id === id);\n    if (matchingElementIndex >= 0) {\n      items[matchingElementIndex].status = status;\n    }\n    return items;\n  }\n\n  private removeDeviceRegistrationRequestById(id: string) {\n    const items = this._deviceRegistrationRequests.getValue().data;\n    const matchingElementIndex = items.findIndex(element => element.id === id);\n    if (matchingElementIndex >= 0) {\n      items.splice(matchingElementIndex, 1);\n    }\n    this._loading.next(false);\n    return items;\n  }\n}\n","export interface ApplicationExtension {\n  name: string;\n  description: string;\n  type: string;\n}\n\nexport interface ExtensibleDeviceRegistrationProvider extends ApplicationExtension {\n  contextPath: string;\n}\n\nexport const PRODUCT_EXPERIENCE_BASE_REGISTRATION = {\n  EVENT: 'deviceRegistration',\n  COMPONENT: {\n    BULK: 'bulk-registration',\n    EXTENSIBLE_BULK: 'bulk-extensible-registration',\n    EXTENSIBLE_SINGLE: 'single-extensible-registration'\n  },\n  RESULT: { SUCCESS: 'registrationSuccess', FAILURE: 'registrationFailure' }\n} as const;\n","import { Component, ViewChild } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport {\n  DeviceRegistrationBulkService,\n  FeatureService,\n  IDeviceRegistrationBulkResult\n} from '@c8y/client';\nimport { C8yJSONSchema, C8yStepper, GainsightService, gettext } from '@c8y/ngx-components';\nimport { FormlyFieldConfig } from '@ngx-formly/core';\nimport { saveAs } from 'file-saver';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { PRODUCT_EXPERIENCE_BASE_REGISTRATION } from '../extensible/base-device-registration.model';\nimport { BulkFailedResult } from '../extensible/bulk/extensible-bulk-device-registration.model';\nimport { RegisterDeviceService } from '../register-device.service';\n\nconst registerDeviceBulkSchema: object = {\n  $schema: 'https://json-schema.org/draft/2019-09/schema',\n  type: 'object',\n  properties: {\n    csvBulkFile: {\n      type: 'array',\n      title: gettext('CSV file upload'),\n      description: gettext(\n        'You can use file upload component to let users send files. This input accepts only a single CSV file.'\n      ),\n      contentMediaType: 'csv'\n    }\n  },\n  required: ['csvBulkFile'],\n  additionalProperties: false\n};\n\nconst simpleCsvHeaders: string[] = ['ID', 'PATH'];\nconst csvHeaders: string[] = [\n  'ID',\n  'TYPE',\n  'NAME',\n  'ICCID',\n  'IDTYPE',\n  'PATH',\n  'SHELL',\n  'AUTH_TYPE'\n];\nconst fullCsvHeaders: string[] = [...csvHeaders, 'CREDENTIALS'];\nexport const ESTCsvHeaders: string[] = [...csvHeaders, 'ENROLLMENT_OTP'];\n\n@Component({\n  selector: 'bulk-device-registration',\n  templateUrl: 'bulk-device-registration-modal.component.html'\n})\nexport class BulkDeviceRegistrationModalComponent {\n  @ViewChild(C8yStepper, { static: true }) stepper: C8yStepper;\n  message: string;\n  success: boolean;\n  pending: boolean;\n  result: IDeviceRegistrationBulkResult;\n  failedResult: BulkFailedResult;\n  form = new FormGroup({});\n  model = {};\n  template: FormlyFieldConfig[];\n  certificateAuthorityFeatureEnabled = this.featureService\n    .detail('certificate-authority')\n    .then(({ data }) => data.active);\n\n  constructor(\n    private jsonschema: C8yJSONSchema,\n    private deviceRegistrationService: DeviceRegistrationBulkService,\n    private registerDeviceService: RegisterDeviceService,\n    private bsModalRef: BsModalRef,\n    private gainsightService: GainsightService,\n    private featureService: FeatureService\n  ) {}\n\n  ngOnInit() {\n    this.template = [this.jsonschema.toFieldConfig(registerDeviceBulkSchema)];\n  }\n\n  upload() {\n    this.pending = true;\n    const file = this.getFile(this.model);\n    this.deviceRegistrationService\n      .create(file)\n      .then(({ res, data }) => {\n        if (res.status < 400) {\n          this.result = data;\n          this.success = data.numberOfFailed === 0 && data.numberOfSuccessful === data.numberOfAll;\n          this.message = this.success\n            ? gettext('Device registration created.')\n            : (this.message = gettext('Device registration failed.'));\n          if (this.success) {\n            this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n              result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.SUCCESS,\n              component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.BULK\n            });\n          } else {\n            this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n              result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,\n              component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.BULK\n            });\n          }\n        } else {\n          this.failedResult = data as unknown as BulkFailedResult;\n          this.message = gettext('Device registration failed.');\n          this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n            result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,\n            component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.BULK\n          });\n        }\n        this.model = {};\n        this.pending = false;\n        this.stepper.next();\n      })\n      .catch(() => {\n        this.message = gettext('Error occurred while processing the uploaded file.');\n        this.pending = false;\n        this.stepper.next();\n      });\n  }\n\n  downloadSimple() {\n    return this.download(simpleCsvHeaders, gettext('Simple bulk registration - template.csv'));\n  }\n\n  downloadFull() {\n    return this.download(fullCsvHeaders, gettext('Full bulk registration - template.csv'));\n  }\n\n  downloadEst() {\n    return this.download(ESTCsvHeaders, gettext('EST registration - template.csv'));\n  }\n\n  download(headers: string[], fileName: string) {\n    const headerRaw = headers.map(header => `\"${header}\"`).join(';');\n    const binaryFile = new Blob([headerRaw], { type: 'text/csv' });\n    saveAs(binaryFile, fileName);\n  }\n\n  complete() {\n    this.registerDeviceService.list();\n    this.bsModalRef.hide();\n  }\n\n  cancel() {\n    this.bsModalRef.hide();\n  }\n\n  private getFile(model): File {\n    const csvBulkFile = (model as any)?.csvBulkFile;\n    return csvBulkFile ? csvBulkFile[0]?.file : undefined;\n  }\n}\n","<c8y-modal\n  [title]=\"'Bulk device registration' | translate\"\n  [headerClasses]=\"'dialog-header'\"\n  [customFooter]=\"true\"\n>\n  <ng-container c8y-modal-title>\n    <i c8yIcon=\"upload\"></i>\n  </ng-container>\n\n  <c8y-stepper [hideStepProgress]=\"true\" linear id=\"modal-body\">\n    <cdk-step>\n      <p class=\"modal-subtitle sticky-top\" translate>Register devices in bulk</p>\n\n      <c8y-form-group class=\"d-block p-24 p-t-16 p-b-0 m-b-0\">\n        <formly-form [form]=\"form\" [fields]=\"template\" [model]=\"model\"></formly-form>\n      </c8y-form-group>\n\n      <div class=\"p-24 m-t-0 bg-level-1\">\n          <div class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\">\n            <div>\n              <p class=\"m-b-8 text-medium\">\n                <strong translate>Simple registration</strong>\n              </p>\n              <small class=\"text-muted\" translate>\n                Creates all registration requests at once, then each one needs to go through regular\n                acceptance process.\n              </small>\n            </div>\n            <div class=\"m-b-16 m-t-16\">\n              <a\n                title=\"{{ 'Download template' | translate }}\"\n                class=\"btn btn-default btn-sm\"\n                target=\"_self\"\n                (click)=\"downloadSimple()\"\n              >\n                <i c8yIcon=\"download\" translate></i>\n                {{ 'Download template' | translate }}\n              </a>\n            </div>\n          </div>\n          <div class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\">\n            <div>\n              <p class=\"m-b-8 text-medium\">\n                <strong translate>Full registration</strong>\n              </p>\n              <small class=\"text-muted\" translate>\n                Creates all device credentials and devices using provided list of property values.\n                Devices can start communicating with the platform immediately.\n              </small>\n            </div>\n            <div class=\"m-b-16 m-t-16\">\n              <a\n                title=\"{{ 'Download template' | translate }}\"\n                class=\"btn btn-default btn-sm\"\n                target=\"_self\"\n                (click)=\"downloadFull()\"\n              >\n                <i c8yIcon=\"download\" translate></i>\n                {{ 'Download template' | translate }}\n              </a>\n            </div>\n          </div>\n          <div class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\" *ngIf=\"certificateAuthorityFeatureEnabled | async\">\n            <div>\n              <p class=\"m-b-8 text-medium\">\n                <strong translate>Full registration with device certificate creation</strong>\n              </p>\n              <small class=\"text-muted\" translate>\n                Creates device certificates and devices using the provided list of property values. Once the certificates are provisioned, the devices can immediately start communicating with the platform\n              </small>\n            </div>\n            <div class=\"m-b-16 m-t-16\">\n              <a\n                title=\"{{ 'Download template' | translate }}\"\n                class=\"btn btn-default btn-sm\"\n                target=\"_self\"\n                (click)=\"downloadEst()\"\n              >\n                <i c8yIcon=\"download\"></i>\n                {{ 'Download template' | translate }}\n              </a>\n            </div>\n          </div>\n      </div>\n\n      <c8y-stepper-buttons\n        class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n        [showButtons]=\"{ cancel: true, next: true }\"\n        [disabled]=\"form.invalid\"\n        [pending]=\"pending\"\n        (onCancel)=\"cancel()\"\n        (onNext)=\"upload()\"\n        [labels]=\"{ next: 'Upload' }\"\n      ></c8y-stepper-buttons>\n    </cdk-step>\n\n    <cdk-step state=\"final\">\n      <div class=\"m-24\">\n        <div *ngIf=\"success; else warning\">\n          <c8y-operation-result\n            text=\"{{ message | translate }}\"\n            [size]=\"84\"\n            [vertical]=\"true\"\n            type=\"success\"\n            class=\"lead\"\n          ></c8y-operation-result>\n        </div>\n        <ng-template #warning>\n          <c8y-operation-result\n            text=\"{{ message | translate }}\"\n            [size]=\"84\"\n            [vertical]=\"true\"\n            type=\"error\"\n            class=\"lead\"\n          ></c8y-operation-result>\n        </ng-template>\n        <c8y-list-group class=\"separator-top m-t-16\">\n          <ng-container *ngIf=\"result; else failedResponse\">\n            <c8y-li *ngIf=\"success; else fail\">\n              <c8y-li-icon class=\"text-success\" icon=\"check-circle\"></c8y-li-icon>\n              <p>{{ 'All devices have been processed.' | translate }}</p>\n              <c8y-li-collapse>\n                <pre><code>{{ result | json }}</code></pre>\n              </c8y-li-collapse>\n            </c8y-li>\n            <ng-template #fail>\n              <c8y-li>\n                <c8y-li-icon class=\"text-danger\" icon=\"ban\"></c8y-li-icon>\n                <p\n                  ngNonBindable\n                  [translateParams]=\"{ count: result?.numberOfFailed, total: result?.numberOfAll }\"\n                  translate\n                >\n                  Failed to process {{ count }} out of {{ total }}.\n                </p>\n                <c8y-li-collapse>\n                  <pre><code>{{ result | json }}</code></pre>\n                </c8y-li-collapse>\n              </c8y-li>\n            </ng-template>\n          </ng-container>\n          <ng-template #failedResponse>\n            <c8y-li>\n              <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n              <small>{{ failedResult?.message | translate }}</small>\n              <c8y-li-collapse>\n                <pre><code>{{ failedResult | json }}</code></pre>\n              </c8y-li-collapse>\n            </c8y-li>\n          </ng-template>\n        </c8y-list-group>\n      </div>\n      <c8y-stepper-buttons\n        class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n        [showButtons]=\"{ next: true }\"\n        (onNext)=\"complete()\"\n        [labels]=\"{ next: success ? 'Close' : 'Cancel' }\"\n      ></c8y-stepper-buttons>\n    </cdk-step>\n  </c8y-stepper>\n</c8y-modal>\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  OnDestroy\n} from '@angular/core';\nimport { FormlyFieldConfig, FormlyFormOptions } from '@ngx-formly/core';\nimport {\n  TenantUiService,\n  gettext,\n  C8yStepper,\n  memoize,\n  GainsightService\n} from '@c8y/ngx-components';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { from, Observable, Subject, defer, BehaviorSubject } from 'rxjs';\nimport { filter, shareReplay, switchMap, takeUntil, tap } from 'rxjs/operators';\nimport {\n  DeviceRegistrationBulkService,\n  FeatureService,\n  IManagedObject,\n  InventoryService,\n  IResultList,\n  ITenant,\n  TenantService\n} from '@c8y/client';\nimport { RegisterDeviceService } from '../register-device.service';\nimport { CdkStep } from '@angular/cdk/stepper';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { ESTCsvHeaders } from '../bulk/bulk-device-registration-modal.component';\n\ninterface GeneralDeviceRegistrationModelType {\n  id: string;\n  tenant?: { id: string };\n  group?: { id: string; name?: string };\n  oneTimePassword?: string;\n}\n\n@Component({\n  selector: 'c8y-general-device-registration',\n  templateUrl: 'general-device-registration.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class GeneralDeviceRegistrationComponent implements AfterViewInit, OnDestroy {\n  readonly MANAGEMENT = 'management';\n  readonly FILTER: object = {\n    withTotalPages: true,\n    pageSize: 25\n  };\n\n  useEST$ = new BehaviorSubject<boolean>(false);\n  certificateAuthorityFeatureEnabled = this.featureService\n    .detail('certificate-authority')\n    .then(({ data }) => data.active);\n\n  form = new FormGroup({});\n  model = {\n    devicesToCreate: [{} as GeneralDeviceRegistrationModelType]\n  };\n  options: FormlyFormOptions = {\n    formState: {\n      canLoadTenants: true,\n      useEST: this.useEST$.getValue()\n    }\n  };\n\n  PRODUCT_EXPERIENCE = {\n    EVENT: 'deviceRegistration',\n    COMPONENT: 'single-general-registration',\n    RESULT: { SUCCESS: 'registrationSuccess', FAILURE: 'registrationFailure' }\n  };\n\n  isLoading$: Observable<boolean>;\n  success: { id: string }[] = [];\n  failed: { id: string; message?: string; details?: any }[] = [];\n\n  fields: FormlyFieldConfig[] = [\n    {\n      type: 'array',\n      key: 'devicesToCreate',\n      props: {\n        addText: gettext('Add device'),\n        addTextDataCy: 'add-device'\n      },\n      fieldArray: {\n        fieldGroup: [\n          {\n            key: 'id',\n            type: 'string',\n            focus: true,\n            props: {\n              placeholder: '0123ab32fcd',\n              label: gettext('Device ID'),\n              required: true\n            },\n            validators: {\n              unique: {\n                expression: (control: FormControl) => {\n                  const found = (\n                    control.root.get('devicesToCreate').value as Array<{ id: string }>\n                  ).filter(el => el.id === control.value);\n                  return found.length === 0;\n                },\n                message: () => gettext('Device ID duplicates are not allowed')\n              }\n            }\n          },\n          {\n            key: 'tenant',\n            type: 'typeahead',\n            expressions: {\n              hide: field => {\n                const formState = field.options?.formState;\n                if (!formState?.canLoadTenants) {\n                  field.formControl.setValue(null);\n                }\n                return !formState?.canLoadTenants || false;\n              }\n            },\n            defaultValue: { id: this.MANAGEMENT },\n            props: {\n              label: gettext('Add to tenant'),\n              required: true,\n              c8yForOptions: this.canLoadTenants$().pipe(\n                filter(canLoad => canLoad),\n                switchMap(() => this.getTenants$())\n              ) as Observable<IResultList<ITenant>>,\n              container: 'body',\n              displayProperty: 'id',\n              valueProperties: ['id']\n            },\n            hooks: {\n              onInit: _field =>\n                this.canLoadTenants$().pipe(\n                  tap(canLoad => {\n                    this.options.formState.canLoadTenants = canLoad;\n                    this.cd.detectChanges();\n                  })\n                )\n            }\n          },\n          {\n            key: 'group',\n            type: 'typeahead',\n            expressions: {\n              'props.disabled': (field: FormlyFieldConfig) => {\n                const formState = field.options?.formState;\n                const model = field.model;\n                if (formState?.canLoadTenants) {\n                  if (model?.tenant?.id !== this.MANAGEMENT) {\n                    field.formControl.setValue(null);\n                  }\n                  return !(model?.tenant?.id === this.MANAGEMENT);\n                }\n                delete field?.props?.description;\n                return false;\n              }\n            },\n            props: {\n              disabled: false,\n              label: gettext('Add to group'),\n              description: gettext(\n                'You can add device to specific group for management tenant only.'\n              ),\n              container: 'body',\n              displayProperty: 'name',\n              valueProperties: ['id'],\n              c8yForOptions: this.getGroups$()\n            },\n            hooks: {\n              onInit: _field =>\n                this.canLoadTenants$().pipe(\n                  tap(canLoad => {\n                    this.options.formState.canLoadTenants = canLoad;\n                    this.cd.detectChanges();\n                  })\n                )\n            }\n          },\n          {\n            key: 'oneTimePassword',\n            type: 'string',\n            expressions: {\n              hide: field => !field.options?.formState?.useEST\n            },\n            props: {\n              placeholder: 'TruDN3H45L0',\n              label: gettext('One-time password'),\n              required: true\n            },\n            hooks: {\n              onInit: _field =>\n                this.useEST$.pipe(\n                  tap(useEST => {\n                    this.options.formState.useEST = useEST;\n                    this.cd.detectChanges();\n                  })\n                )\n            }\n          }\n        ]\n      }\n    }\n  ];\n\n  private destroy$: Subject<void> = new Subject();\n  private lastCreatedDevices: GeneralDeviceRegistrationModelType[] = [];\n\n  constructor(\n    private tenantUIService: TenantUiService,\n    private tenantService: TenantService,\n    private registerDeviceService: RegisterDeviceService,\n    private inventoryService: InventoryService,\n    private cd: ChangeDetectorRef,\n    public bsModalRef: BsModalRef,\n    private gainsightService: GainsightService,\n    private deviceRegistrationService: DeviceRegistrationBulkService,\n    private featureService: FeatureService\n  ) {\n    this.isLoading$ = this.registerDeviceService.loading$;\n  }\n\n  ngAfterViewInit() {\n    this.cd.detectChanges();\n  }\n\n  ngOnDestroy() {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  registerDevice(eventObject: { stepper: C8yStepper; step: CdkStep }) {\n    !this.useEST$.getValue() ? this.create(eventObject) : this.registerByEst(eventObject);\n  }\n\n  fixErrors(event: { stepper: C8yStepper; step: CdkStep }, failedRequests: any) {\n    if (failedRequests && failedRequests.length > 0) {\n      this.options.resetModel({\n        devicesToCreate: [\n          ...this.lastCreatedDevices.filter(el =>\n            failedRequests.map(data => data.id).includes(el.id)\n          )\n        ]\n      });\n      this.cd.detectChanges();\n    }\n    event?.stepper.previous();\n  }\n\n  private create(eventObject: { stepper: C8yStepper; step: CdkStep }) {\n    if (this.model?.devicesToCreate?.length > 0) {\n      this.lastCreatedDevices = [...this.model.devicesToCreate];\n\n      const dataToSend = this.model.devicesToCreate.map(\n        (el: GeneralDeviceRegistrationModelType) => {\n          const { id, tenant, group } = el;\n          let data: { id: string; tenantId?: string; groupId?: string } = { id };\n\n          if (tenant?.id) {\n            data = { ...data, tenantId: tenant.id };\n          }\n\n          if (group?.id) {\n            data = { ...data, groupId: group.id };\n          }\n\n          return data;\n        }\n      );\n\n      this.registerDeviceService\n        .createMultiple(dataToSend)\n        .pipe(takeUntil(this.destroy$))\n        .subscribe(requests => {\n          this.success = requests.success;\n          if (this.success.length > 0) {\n            this.gainsightService.triggerEvent(this.PRODUCT_EXPERIENCE.EVENT, {\n              result: this.PRODUCT_EXPERIENCE.RESULT.SUCCESS,\n              component: this.PRODUCT_EXPERIENCE.COMPONENT\n            });\n          }\n\n          this.failed = requests.failed;\n          if (this.failed.length > 0) {\n            this.gainsightService.triggerEvent(this.PRODUCT_EXPERIENCE.EVENT, {\n              result: this.PRODUCT_EXPERIENCE.RESULT.FAILURE,\n              component: this.PRODUCT_EXPERIENCE.COMPONENT\n            });\n          }\n\n          if (eventObject) {\n            eventObject.stepper.next();\n          }\n        });\n    }\n  }\n\n  private registerByEst(eventObject: { stepper: C8yStepper; step: CdkStep }) {\n    this.lastCreatedDevices = [...this.model.devicesToCreate];\n    this.deviceRegistrationService\n      .create(this.convertObjectToCSVFile(this.model.devicesToCreate))\n      .then(({ res, data }) => {\n        if (res.status < 400) {\n          this.failed = data.failedCreationList.map(value => {\n            return {\n              id: value.deviceId,\n              message: value.failureReason\n            };\n          });\n          const failedIds = new Set(this.failed.map(item => item.id));\n          this.success = this.model.devicesToCreate.filter(item => !failedIds.has(item.id));\n        }\n        eventObject.stepper.next();\n      })\n      .catch(() => {\n        eventObject.stepper.next();\n      });\n  }\n\n  private convertObjectToCSVFile(data: any): File {\n    const fullCsvHeaders = ESTCsvHeaders;\n\n    const csvHeaders = fullCsvHeaders.join(';') + '\\n';\n    const dataToSend = data.map(el => {\n      return {\n        ID: el.id,\n        AUTH_TYPE: 'CERTIFICATES',\n        ENROLLMENT_OTP: el.oneTimePassword,\n        PATH: el.group?.id || '',\n        TENANT: el.tenant?.id || ''\n      };\n    });\n\n    const csvRows = dataToSend\n      .map(row => fullCsvHeaders.map(header => row[header] ?? '').join(';'))\n      .join('\\n');\n\n    const csvContent = csvHeaders + csvRows;\n    const blob = new Blob([csvContent], { type: 'text/csv' });\n    return new File([blob], `ESTRegistrationFile.csv`, { type: 'text/csv' });\n  }\n\n  @memoize()\n  private canLoadTenants$(): Observable<boolean> {\n    return defer(() => from(this.tenantUIService.isManagementTenant())).pipe(shareReplay(1));\n  }\n\n  @memoize()\n  private getTenants$(): Observable<IResultList<ITenant>> {\n    return defer(() => from(this.tenantService.list(this.FILTER))).pipe(shareReplay(1));\n  }\n\n  @memoize()\n  private getGroups$(): Observable<IResultList<IManagedObject>> {\n    return defer(() =>\n      from(\n        this.inventoryService.listQuery(\n          { __filter: { __has: 'c8y_IsDeviceGroup' }, __orderby: [{ name: 1 }] },\n          { ...this.FILTER }\n        )\n      )\n    ).pipe(shareReplay(1));\n  }\n}\n","<c8y-modal\n  [title]=\"'Register devices' | translate\"\n  [headerClasses]=\"'dialog-header'\"\n  [customFooter]=\"true\"\n>\n  <ng-container c8y-modal-title>\n    <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n  </ng-container>\n  <c8y-stepper [hideStepProgress]=\"true\" linear c8y-modal-body>\n    <cdk-step [stepControl]=\"form\">\n      <div class=\"text-center sticky-top bg-component\">\n        <p class=\"text-medium text-16 separator-bottom p-16\" translate>Register general devices</p>\n        <label\n          class=\"c8y-switch m-24 a-i-center\"\n          title=\"{{ 'Create device certificates during device registration' | translate }}\"\n          for=\"useEST\"\n          *ngIf=\"certificateAuthorityFeatureEnabled | async\"\n        >\n          <input\n            type=\"checkbox\"\n            name=\"useEST\"\n            id=\"useEST\"\n            [ngModel]=\"useEST$.getValue()\"\n            (ngModelChange)=\"useEST$.next($event)\"\n          />\n          <span></span>\n          <span class=\"control-label\">{{ 'Create device certificates during device registration' | translate }}</span>\n          <button\n            type=\"button\"\n            class=\"btn-help\"\n            [attr.aria-label]=\"'Help' | translate\"\n            popover=\"{{ 'The device registration process includes creating device certificates, which are issued by the tenant\\'s Certificate Authority (CA).' | translate }}\"\n            placement=\"right\"\n            triggers=\"focus\"\n            container=\"body\"\n          ></button>\n        </label>\n      </div>\n      <div>\n        <formly-form\n          [form]=\"form\"\n          [fields]=\"fields\"\n          [model]=\"model\"\n          [options]=\"options\"\n          class=\"formly-group-array-cols d-block p-l-24 p-b-24 min-height-fit p-r-8\"\n          [ngClass]=\"{'p-t-24' : !(certificateAuthorityFeatureEnabled | async)}\"\n        ></formly-form>\n      </div>\n      <c8y-stepper-buttons\n        (onNext)=\"registerDevice($event)\"\n        (onCancel)=\"bsModalRef.hide()\"\n        [showButtons]=\"{ cancel: true, next: true }\"\n        [disabled]=\"!form?.valid\"\n        [pending]=\"isLoading$ | async\"\n        class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n      ></c8y-stepper-buttons>\n    </cdk-step>\n    <cdk-step state=\"final\">\n      <div class=\"p-24 min-height-fit\">\n        <c8y-operation-result\n          *ngIf=\"success.length === 1 && failed.length === 0\"\n          text=\"{{ 'Device registered' | translate }}\"\n          [size]=\"84\"\n          [vertical]=\"true\"\n          type=\"success\"\n          class=\"lead\"\n        ></c8y-operation-result>\n        <c8y-operation-result\n          *ngIf=\"success.length === 0 && failed.length === 1\"\n          text=\"{{ 'Failed to register device' | translate }}\"\n          [size]=\"84\"\n          [vertical]=\"true\"\n          type=\"error\"\n          class=\"lead\"\n        ></c8y-operation-result>\n\n        <ng-container *ngIf=\"success.length > 1 || failed.length > 1\">\n          <c8y-operation-result\n            *ngIf=\"failed.length === 0\"\n            [text]=\"\n              '{{ successfulDevicesCount }} devices registered'\n                | translate: { successfulDevicesCount: success.length }\n            \"\n            [size]=\"84\"\n            [vertical]=\"true\"\n            type=\"success\"\n            class=\"lead\"\n          ></c8y-operation-result>\n          <c8y-operation-result\n            *ngIf=\"success.length === 0\"\n            [text]=\"\n              '{{ failedDevicesCount }} devices failed to register'\n                | translate: { failedDevicesCount: failed.length }\n            \"\n            [size]=\"84\"\n            [vertical]=\"true\"\n            type=\"error\"\n            class=\"lead\"\n          ></c8y-operation-result>\n        </ng-container>\n\n        <div *ngIf=\"success.length > 0 && failed.length > 0\" class=\"p-l-24 p-r-24 text-center\">\n          <c8y-operation-result\n            text=\"{{ 'Several devices failed to register' | translate }}\"\n            [size]=\"84\"\n            [vertical]=\"true\"\n            type=\"error\"\n            class=\"lead\"\n          ></c8y-operation-result>\n          <p\n            ngNonBindable\n            translate\n            [translateParams]=\"{ count: failed.length, total: failed.length + success.length }\"\n            class=\"p-b-16 text-danger\"\n          >\n            Registration failed for {{ count }} devices out of {{ total }}.\n          </p>\n        </div>\n\n        <div class=\"m-b-8 p-l-24 p-r-24\" *ngIf=\"success.length > 0\" translate>\n          Turn on the registered device(s) and wait for connection(s) to be established. Once a\n          device is connected, its status will change to \"Pending acceptance\". You will need to\n          approve it by clicking on the \"Accept\" button.\n        </div>\n\n        <c8y-list-group class=\"separator-top m-t-16\">\n          <c8y-li *ngFor=\"let fail of failed\">\n            <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n            <p>{{ fail?.id }}</p>\n            <small>{{ fail?.message | translate }}</small>\n            <c8y-li-collapse>\n              <pre><code>{{ fail?.details | json }}</code></pre>\n            </c8y-li-collapse>\n          </c8y-li>\n\n          <c8y-li *ngFor=\"let s of success\">\n            <c8y-li-icon class=\"text-success\" [icon]=\"'check-circle'\"></c8y-li-icon>\n            {{ s?.id }}\n          </c8y-li>\n        </c8y-list-group>\n      </div>\n      <c8y-stepper-buttons\n        class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n        (onCustom)=\"bsModalRef.hide()\"\n        (onBack)=\"fixErrors($event, failed)\"\n        [showButtons]=\"{ back: failed.length > 0, custom: true }\"\n        [labels]=\"{ back: 'Fix errors', custom: 'Close' }\"\n      ></c8y-stepper-buttons>\n    </cdk-step>\n  </c8y-stepper>\n</c8y-modal>\n","import { Component } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { GeneralDeviceRegistrationComponent } from './general-device-registration.component';\n\n@Component({\n  selector: 'c8y-general-device-registration-button',\n  templateUrl: 'general-device-registration-button.component.html'\n})\nexport class GeneralDeviceRegistrationButtonComponent {\n  constructor(private modalService: BsModalService) {}\n\n  async open() {\n    this.modalService.show(GeneralDeviceRegistrationComponent, {\n      class: 'modal-md',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      ignoreBackdropClick: true\n    });\n  }\n}\n","<button title=\"{{ 'General' | translate }}\" type=\"button\" (click)=\"open()\">\n  <i c8yIcon=\"c8y-device-connect\"></i>\n  {{ 'General' | translate }}\n</button>\n","import { Injectable, InjectionToken, Injector } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n  ExtensionFactory,\n  ExtensionPointWithoutStateForPlugins,\n  fromTriggerOnce,\n  GenericHookType,\n  hookGeneric,\n  PluginsResolveService,\n  GenericHookOptions\n} from '@c8y/ngx-components';\nimport { flatten } from 'lodash';\nimport { Observable } from 'rxjs';\nimport { shareReplay, startWith } from 'rxjs/operators';\nimport { RegisterDeviceItem } from './RegisterDeviceItem';\n\n/**\n * An extension HOOK can use either a pure value:\n * ```typescript\n *  { provide: HOOK_X, useValue: { ...hookValue }, multi: true }\n * ```\n *\n * Or an array to directly register multiple:\n * ```typescript\n *  { provide: HOOK_X, useValue: [{ ...hookValues }], multi: true }\n * ```\n *\n * Or an ExtensionFactory which allows to define a get() function. This function\n * gets called on each navigation with the current route and can return values\n * async (observable or promise).\n * ```typescript\n *  { provide: HOOK_X, useFactory: { get: (route) => doSomethingAsync(route) }, multi: true }\n * ```\n */\nexport type RegisterDeviceExtension =\n  | RegisterDeviceItem\n  | RegisterDeviceItem[]\n  | ExtensionFactory<RegisterDeviceItem>;\n/**\n * A hook to use for Multi Provider extension.\n * @deprecated Consider using the `hookDeviceRegistration` function instead.\n */\nexport const HOOK_DEVICE_REGISTRATION = new InjectionToken<RegisterDeviceExtension>(\n  'HOOK_DEVICE_REGISTRATION'\n);\n\n/**\n * You can either provide a single `RegisterDeviceExtension` as parameter:\n * ```typescript\n *  hookDeviceRegistration(...)\n * ```\n *\n * Or an array to directly register multiple:\n * ```typescript\n *  hookDeviceRegistration([...])\n * ```\n *\n * Or you provide an Service that implements `ExtensionFactory<RegisterDeviceExtension>`\n * ```typescript\n *  export class MyDeviceRegistrationFactory implements ExtensionFactory<RegisterDeviceExtension> {...}\n *  ...\n *  hookDeviceRegistration(MyDeviceRegistrationFactory)\n * ```\n * A typed alternative to `HOOK_DEVICE_REGISTRATION`.\n * @param registration The `RegisterDeviceExtension`'s or `ExtensionFactory` to be provided.\n * @returns An `Provider` to be provided in your module.\n */\nexport function hookDeviceRegistration(\n  registration: GenericHookType<RegisterDeviceExtension>,\n  options?: Partial<GenericHookOptions>\n) {\n  return hookGeneric<RegisterDeviceExtension>(registration, HOOK_DEVICE_REGISTRATION, options);\n}\n\n/**\n * A service which defines device registration options.\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class RegisterDeviceExtensionService extends ExtensionPointWithoutStateForPlugins<RegisterDeviceItem> {\n  constructor(\n    rootInjector: Injector,\n    private router: Router,\n    plugins: PluginsResolveService\n  ) {\n    super(rootInjector, plugins);\n    this.items$ = this.setupItemsObservable();\n  }\n\n  protected setupItemsObservable(): Observable<RegisterDeviceItem[]> {\n    return fromTriggerOnce<RegisterDeviceItem>(this.router, this.refresh$, [\n      () =>\n        flatten(\n          this.injectors.map(injector => injector.get(HOOK_DEVICE_REGISTRATION, [], { self: true }))\n        ),\n      () => this.factories\n    ]).pipe(startWith([]), shareReplay(1));\n  }\n}\n","import { Component } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { RegisterDeviceService } from '../register-device.service';\nimport { RegisterDeviceExtensionService } from './register-device-extension.service';\n\n@Component({\n  selector: 'c8y-register-device-dropdown',\n  templateUrl: './register-device-dropdown.component.html'\n})\nexport class RegisterDeviceDropdownComponent {\n  single$ = this.registerDeviceExtensionService.items$.pipe(\n    map(items =>\n      items.filter(item => item.category === 'single').sort((a, b) => b.priority - a.priority)\n    )\n  );\n\n  bulk$ = this.registerDeviceExtensionService.items$.pipe(\n    map(items =>\n      items.filter(item => item.category === 'bulk').sort((a, b) => b.priority - a.priority)\n    )\n  );\n\n  limit$: Observable<boolean> = this.registerDeviceService.limit$.pipe(\n    map(limit => limit.isReached)\n  );\n\n  constructor(\n    private registerDeviceExtensionService: RegisterDeviceExtensionService,\n    private registerDeviceService: RegisterDeviceService\n  ) {}\n}\n","<div class=\"dropdown\" dropdown>\n  <button\n    *ngIf=\"!(limit$ | async); else disable\"\n    title=\"{{ 'Register device' | translate }}\"\n    type=\"button\"\n    class=\"dropdown-toggle c8y-dropdown d-flex a-i-center\"\n    dropdownToggle\n    aria-haspopup=\"true\"\n    data-cy=\"register-device--dropdown-button\"\n  >\n    <span class=\"text-truncate\" translate>Register device</span>\n    <i [c8yIcon]=\"'caret-down'\" class=\"m-l-4 text-primary\"></i>\n  </button>\n  <ng-template #disable>\n    <button\n      title=\"{{ 'Device registration disabled' | translate }}\"\n      type=\"button\"\n      class=\"btn btn-clean d-flex p-l-8\"\n      disabled\n    >\n      <span class=\"text-truncate\" translate>Register device</span>\n      <i [c8yIcon]=\"'caret-down'\"></i>\n    </button>\n  </ng-template>\n\n  <!-- dropdown for normal screen sizes -->\n  <ul class=\"dropdown-menu dropdown-menu-right hidden-xs\" data-cy=\"register-device--dropdown\" *dropdownMenu>\n    <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n  </ul>\n\n  <!-- fake dropdown for mobile screen sizes. *dropdownMenu is missing by design! -->\n  <ul class=\"dropdown-menu dropdown-menu visible-xs\">\n    <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n  </ul>\n\n  <ng-template #dropdown>\n    <ng-container *ngIf=\"single$ | async as single\">\n      <li class=\"dropdown-header\" *ngIf=\"single.length > 0\" translate data-cy=\"single-group\">Single registration</li>\n      <li *ngFor=\"let item of single\">\n        <ng-container *c8yOutlet=\"item.template\"></ng-container>\n      </li>\n    </ng-container>\n    <ng-container *ngIf=\"bulk$ | async as bulk\">\n      <li class=\"dropdown-header\" *ngIf=\"bulk.length > 0\" translate data-cy=\"bulk-group\">Bulk registration</li>\n      <li *ngFor=\"let item of bulk\">\n        <ng-container *c8yOutlet=\"item.template\"></ng-container>\n      </li>\n    </ng-container>\n  </ng-template>\n</div>\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport {\n  DeviceRegistrationSecurityMode,\n  DeviceRegistrationStatus,\n  IDeviceRegistration,\n  IDeviceRegistrationLimit,\n  Paging\n} from '@c8y/client';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { filter, map, switchMap, takeUntil } from 'rxjs/operators';\nimport {\n  DeviceBootstrapRealtimeService,\n  IRealtimeDeviceBootstrap,\n  TenantUiService,\n  ModalService,\n  Status,\n  gettext,\n  OptionsService\n} from '@c8y/ngx-components';\nimport { RegisterDeviceService } from './register-device.service';\nimport { sortBy } from 'lodash-es';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n  selector: 'c8y-device-registration-view',\n  templateUrl: 'device-registration-view.component.html'\n})\nexport class DeviceRegistrationViewComponent implements OnInit, OnDestroy {\n  deviceRequests$: Observable<{\n    data: IDeviceRegistration[];\n    paging?: Paging<IDeviceRegistration>;\n  }>;\n  limit$: Observable<IDeviceRegistrationLimit>;\n  limitReachedInfo$: Observable<string>;\n  requireSecurityToken = false;\n  isManagementTenant = false;\n  isLoading = false;\n  gridOrList: 'interact-list' | 'interact-grid' = 'interact-grid';\n  status = DeviceRegistrationStatus;\n\n  readonly statusProps = {\n    [DeviceRegistrationStatus.WAITING_FOR_CONNECTION]: {\n      label: gettext('Waiting for connection'),\n      icon: 'unlink',\n      cls: 'text-danger'\n    },\n    [DeviceRegistrationStatus.PENDING_ACCEPTANCE]: {\n      label: gettext('Pending acceptance'),\n      icon: 'circle',\n      cls: 'text-info'\n    },\n    [DeviceRegistrationStatus.ACCEPTED]: {\n      label: gettext('Accepted'),\n      icon: 'check-circle',\n      cls: 'text-success'\n    },\n    [DeviceRegistrationStatus.BLOCKED]: {\n      label: gettext('Blocked'),\n      icon: 'ban',\n      cls: 'text-danger'\n    }\n  };\n\n  private unsubscribe$: Subject<void> = new Subject();\n  private readonly _securityTokenPolicy: BehaviorSubject<DeviceRegistrationSecurityMode> =\n    new BehaviorSubject(DeviceRegistrationSecurityMode.OPTIONAL);\n\n  constructor(\n    private registerDeviceService: RegisterDeviceService,\n    private bootstrapRealtimeService: DeviceBootstrapRealtimeService,\n    private tenantUiService: TenantUiService,\n    private modalService: ModalService,\n    private translateService: TranslateService,\n    private optionsService: OptionsService\n  ) {}\n\n  ngOnInit() {\n    this.loadAll();\n    this.setIsManagementTenant();\n    this.setRequireSecurityToken();\n\n    this.deviceRequests$ = this.registerDeviceService.deviceRegistrationRequests$.pipe(\n      map(req => ({\n        data: sortBy(req.data, [\n          ({ status }) => (status === DeviceRegistrationStatus.PENDING_ACCEPTANCE ? 0 : 1),\n          '-creationTime'\n        ]),\n        paging: req.paging\n      }))\n    );\n    this.limit$ = this.registerDeviceService.limit$;\n    this.limitReachedInfo$ = this.limit$.pipe(\n      filter(deviceRegistrationLimit => deviceRegistrationLimit.isReached),\n      switchMap(({ limit }) =>\n        this.translateService.stream(\n          gettext(\n            'You reached the limit of {{ maxDevices }} devices. No more devices can be registered.'\n          ),\n          { maxDevices: limit }\n        )\n      )\n    );\n    this.registerDeviceService.loading$\n      .pipe(takeUntil(this.unsubscribe$))\n      .subscribe(value => (this.isLoading = value));\n\n    this.bootstrapRealtimeService\n      .onUpdate$()\n      .pipe(takeUntil(this.unsubscribe$))\n      .subscribe((bootstrap: IRealtimeDeviceBootstrap) => {\n        this.registerDeviceService.onDeviceBootstrap(bootstrap);\n      });\n  }\n\n  ngOnDestroy() {\n    this.unsubscribe$.next();\n    this.unsubscribe$.complete();\n  }\n\n  updateList(data) {\n    this.registerDeviceService.internalListUpdate(data);\n  }\n\n  async delete(id: string) {\n    const confirmed = await this.modalService.confirm(\n      gettext('Cancel device registration'),\n      this.translateService.instant(\n        gettext(\n          'You are about to cancel device registration for ID \"{{id}}\". Do you want to proceed?'\n        ),\n        { id }\n      ),\n      Status.DANGER,\n      {\n        ok: gettext('Cancel registration'),\n        cancel: gettext('Close')\n      }\n    );\n\n    if (confirmed) {\n      this.registerDeviceService.remove(id);\n    }\n  }\n\n  accept(request: IDeviceRegistration) {\n    this.registerDeviceService.accept(request);\n  }\n\n  acceptAll() {\n    this.registerDeviceService.acceptAll();\n  }\n\n  canAcceptAll() {\n    const pendingRequests = this.registerDeviceService.getRequestByStatus(\n      DeviceRegistrationStatus.PENDING_ACCEPTANCE\n    );\n    return !(pendingRequests.length > 0 && !this.requireSecurityToken);\n  }\n\n  loadAll() {\n    this.registerDeviceService.list();\n  }\n\n  displayMode(listClass: 'interact-list' | 'interact-grid') {\n    this.gridOrList = listClass;\n  }\n\n  async setRequireSecurityToken() {\n    const mode: DeviceRegistrationSecurityMode =\n      (await this.optionsService.getTenantOption<DeviceRegistrationSecurityMode>(\n        'device-registration',\n        'security-token.policy',\n        DeviceRegistrationSecurityMode.OPTIONAL\n      )) as DeviceRegistrationSecurityMode;\n    this._securityTokenPolicy.next(mode);\n    this.requireSecurityToken = mode === DeviceRegistrationSecurityMode.REQUIRED;\n  }\n\n  async setIsManagementTenant() {\n    this.isManagementTenant = await this.tenantUiService.isManagementTenant();\n  }\n\n  shouldShowSecurityTokenInput(data: IDeviceRegistration) {\n    return (\n      data &&\n      data.status === DeviceRegistrationStatus.PENDING_ACCEPTANCE &&\n      this.showTokenInputBasedOnSecurityMode()\n    );\n  }\n\n  showTokenInputBasedOnSecurityMode() {\n    return this._securityTokenPolicy.getValue() !== DeviceRegistrationSecurityMode.IGNORED;\n  }\n}\n","<ng-container *ngIf=\"deviceRequests$ | async as deviceRequestList\">\n  <c8y-title>\n    {{ 'Device registration' | translate }}\n    <small *ngIf=\"deviceRequestList.data.length === 1\">1 {{ 'new device' | translate }}</small>\n    <small *ngIf=\"deviceRequestList.data.length > 1\">\n      {{ deviceRequestList.data.length }} {{ 'new devices' | translate }}\n    </small>\n  </c8y-title>\n\n  <c8y-breadcrumb>\n    <c8y-breadcrumb-item\n      [icon]=\"'exchange'\"\n      [label]=\"'Devices' | translate\"\n    ></c8y-breadcrumb-item>\n    <c8y-breadcrumb-item\n      [icon]=\"'c8y-device-connect'\"\n      [label]=\"'Device registration' | translate\"\n    ></c8y-breadcrumb-item>\n  </c8y-breadcrumb>\n\n  <c8y-action-bar-item\n    [placement]=\"'left'\"\n    itemClass=\"navbar-form hidden-xs\"\n  >\n    <c8y-list-display-switch (onListClassChange)=\"displayMode($event)\"></c8y-list-display-switch>\n  </c8y-action-bar-item>\n\n  <ng-container *ngIf=\"limit$ | async as limitStatus\">\n    <c8y-action-bar-item\n      [placement]=\"'right'\"\n      [priority]=\"10\"\n    >\n      <button\n        class=\"btn btn-link\"\n        title=\"{{ 'Accept all' | translate }}\"\n        type=\"button\"\n        *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n        (click)=\"acceptAll()\"\n        [disabled]=\"canAcceptAll() || limitStatus?.isReached\"\n      >\n        <i [c8yIcon]=\"'check'\"></i>\n        {{ 'Accept all' | translate }}\n      </button>\n    </c8y-action-bar-item>\n\n    <c8y-action-bar-item\n      [placement]=\"'right'\"\n      [priority]=\"9\"\n    >\n      <button\n        class=\"btn btn-link\"\n        title=\"{{ 'Reload' | translate }}\"\n        type=\"button\"\n        (click)=\"loadAll()\"\n        [disabled]=\"isLoading\"\n      >\n        <i\n          [c8yIcon]=\"'refresh'\"\n          [ngClass]=\"{ 'icon-spin': isLoading }\"\n        ></i>\n        {{ 'Reload' | translate }}\n      </button>\n    </c8y-action-bar-item>\n\n    <c8y-action-bar-item\n      [placement]=\"'right'\"\n      *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n    >\n      <c8y-register-device-dropdown></c8y-register-device-dropdown>\n    </c8y-action-bar-item>\n\n    <c8y-help\n      src=\"/docs/device-management-application/registering-devices/#registering-devices\"\n    ></c8y-help>\n\n    <ng-container *ngIf=\"deviceRequestList.data.length > 0; else noData\">\n      <div\n        class=\"card-group\"\n        [ngClass]=\"gridOrList\"\n      >\n        <!-- START interact-list sticky header START -->\n        <div\n          class=\"page-sticky-header hidden-xs\"\n          *ngIf=\"gridOrList === 'interact-list'\"\n        >\n          <div class=\"d-flex\">\n            <div class=\"card-header p-l-40\">\n              <p translate>Device</p>\n            </div>\n            <div class=\"card-block card-column-30 p-l-0 m-l-8\">\n              <p translate>Status</p>\n            </div>\n            <div\n              class=\"card-block card-column-30 p-0\"\n              *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n            >\n              <p translate>Security token</p>\n              <button\n                class=\"btn-help\"\n                [attr.aria-label]=\"'Help' | translate\"\n                popover=\"{{\n                  'Security token is required if the connected device uses it.' | translate\n                }}\"\n                placement=\"right\"\n                triggers=\"focus\"\n                container=\"body\"\n                type=\"button\"\n              ></button>\n            </div>\n            <div class=\"card-footer card-column-50\">\n              <div\n                class=\"d-contents\"\n                *ngIf=\"isManagementTenant; else noManagement\"\n              >\n                <div class=\"card-column-50\">\n                  {{ 'Created' | translate }}\n                </div>\n                <div class=\"card-column-30\">\n                  {{ 'By`user`' | translate }}\n                </div>\n                <div class=\"card-column-20\">\n                  {{ 'Tenant ID' | translate }}\n                </div>\n              </div>\n              <ng-template #noManagement>\n                <div class=\"d-contents\">\n                  <div class=\"card-column-50\">\n                    {{ 'Created' | translate }}\n                  </div>\n                  <div class=\"card-column-50\">\n                    {{ 'By`user`' | translate }}\n                  </div>\n                </div>\n              </ng-template>\n            </div>\n            <div\n              class=\"card-actions-group\"\n              style=\"min-width: 176px\"\n            >\n              <div class=\"btn btn-xs invisible\">\n                <!--EMPTY by design-->\n              </div>\n            </div>\n          </div>\n        </div>\n        <!-- END interact-list sticky header END -->\n\n        <div\n          class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\"\n          *ngIf=\"limitStatus?.isReached\"\n        >\n          <p\n            class=\"alert alert-warning center-block\"\n            role=\"alert\"\n          >\n            <strong>\n              {{ limitReachedInfo$ | async }}\n            </strong>\n            <br />\n            <span translate>Please contact your platform administrator.</span>\n          </p>\n        </div>\n\n        <ng-container *ngFor=\"let singleRequest of deviceRequestList.data\">\n          <div class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n            <div class=\"card\">\n              <div class=\"card-header separator\">\n                <div class=\"card-icon\">\n                  <i\n                    [class]=\"statusProps[singleRequest.status].cls\"\n                    [c8yIcon]=\"statusProps[singleRequest.status].icon\"\n                  ></i>\n                </div>\n                <p\n                  class=\"card-title text-truncate\"\n                  title=\"{{ singleRequest.id }}\"\n                >\n                  {{ singleRequest.id }}\n                </p>\n              </div>\n\n              <div class=\"card-block text-center card-column-30\">\n                <span\n                  class=\"text-label-small\"\n                  translate\n                >\n                  Status\n                </span>\n                <p>\n                  <i\n                    class=\"icon-spin text-primary\"\n                    c8yIcon=\"refresh\"\n                    *ngIf=\"singleRequest.status === status.WAITING_FOR_CONNECTION\"\n                  ></i>\n                  {{ statusProps[singleRequest.status].label | translate }}\n                </p>\n              </div>\n\n              <ng-container *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n                <div\n                  class=\"card-block text-center card-column-30 p-t-0\"\n                  [ngClass]=\"{ 'p-b-0': !shouldShowSecurityTokenInput(singleRequest) }\"\n                  *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n                >\n                  <ng-container *ngIf=\"shouldShowSecurityTokenInput(singleRequest)\">\n                    <span\n                      class=\"text-label-small\"\n                      *ngIf=\"gridOrList !== 'interact-list'\"\n                      translate\n                    >\n                      Security token\n                    </span>\n                    <input\n                      class=\"form-control\"\n                      type=\"text\"\n                      [(ngModel)]=\"singleRequest.securityToken\"\n                      [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'A1e3gh5ds' }\"\n                      [required]=\"requireSecurityToken\"\n                    />\n                  </ng-container>\n                </div>\n\n                <div\n                  class=\"card-actions-group d-flex a-i-center j-c-center\"\n                  style=\"min-width: 176px\"\n                >\n                  <button\n                    class=\"btn btn-sm\"\n                    title=\"{{\n                      singleRequest.status === status.PENDING_ACCEPTANCE\n                        ? ('Remove' | translate)\n                        : ('Cancel' | translate)\n                    }}\"\n                    type=\"button\"\n                    [ngClass]=\"{\n                      'btn-danger': singleRequest.status === status.PENDING_ACCEPTANCE,\n                      'btn-default': singleRequest.status !== status.PENDING_ACCEPTANCE\n                    }\"\n                    (click)=\"delete(singleRequest.id)\"\n                    [disabled]=\"isLoading\"\n                  >\n                    <span *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\">\n                      {{ 'Remove' | translate }}\n                    </span>\n                    <span *ngIf=\"singleRequest.status !== status.PENDING_ACCEPTANCE\">\n                      {{ 'Cancel' | translate }}\n                    </span>\n                  </button>\n                  <button\n                    class=\"btn btn-primary btn-sm\"\n                    title=\"{{ 'Accept' | translate }}\"\n                    type=\"button\"\n                    (click)=\"accept(singleRequest)\"\n                    *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\"\n                    [disabled]=\"\n                      isLoading ||\n                      limitStatus?.isReached ||\n                      (!singleRequest.securityToken && requireSecurityToken)\n                    \"\n                  >\n                    {{ 'Accept' | translate }}\n                  </button>\n                </div>\n              </ng-container>\n\n              <div class=\"card-footer separator text-center card-column-50\">\n                <small\n                  class=\"d-contents\"\n                  *ngIf=\"isManagementTenant; else noManagement\"\n                >\n                  <div\n                    class=\"d-contents\"\n                    *ngIf=\"singleRequest.creationTime && singleRequest.owner\"\n                  >\n                    <span class=\"card-column-50\">\n                      <span\n                        class=\"text-label-small m-l-4 m-r-4\"\n                        translate\n                      >\n                        Created on`date`\n                      </span>\n                      <span data-cy=\"device-registration--creation-date\">\n                        {{ singleRequest.creationTime | c8yDate }}\n                      </span>\n                    </span>\n                    <span class=\"card-column-30 text-truncate\">\n                      <span\n                        class=\"text-label-small m-l-4 m-r-4\"\n                        translate\n                      >\n                        by`user`\n                      </span>\n                      <span\n                        title=\"{{ singleRequest.owner }}\"\n                        data-cy=\"device-registration--created-by\"\n                      >\n                        {{ singleRequest.owner }}\n                      </span>\n                    </span>\n                    <span class=\"card-column-20\">\n                      <span\n                        class=\"text-label-small m-l-4 m-r-4\"\n                        translate\n                      >\n                        in`tenant`\n                      </span>\n                      <span>{{ singleRequest.tenantId }}</span>\n                    </span>\n                  </div>\n                  <div\n                    class=\"d-contents\"\n                    *ngIf=\"!singleRequest.creationTime || !singleRequest.owner\"\n                  >\n                    <div class=\"card-column-50\"></div>\n                    <div class=\"card-column-30\"></div>\n                    <span\n                      class=\"text-label-small\"\n                      translate\n                    >\n                      Created in`tenant`\n                    </span>\n                    <div class=\"card-column-20\">\n                      <span>\n                        {{ singleRequest.tenantId }}\n                      </span>\n                    </div>\n                  </div>\n                </small>\n                <ng-template #noManagement>\n                  <small class=\"d-contents\">\n                    <span class=\"card-column-50\">\n                      <span\n                        class=\"text-label-small m-l-4 m-r-4\"\n                        translate\n                      >\n                        Created on`date`\n                      </span>\n                      <span data-cy=\"device-registration--creation-date\">\n                        {{ singleRequest.creationTime | c8yDate }}\n                      </span>\n                    </span>\n                    <span class=\"card-column-50 text-truncate\">\n                      <span\n                        class=\"text-label-small m-l-4 m-r-4\"\n                        translate\n                      >\n                        by`user`\n                      </span>\n                      <span\n                        title=\"{{ singleRequest.owner }}\"\n                        data-cy=\"device-registration--created-by\"\n                      >\n                        {{ singleRequest.owner }}\n                      </span>\n                    </span>\n                  </small>\n                </ng-template>\n              </div>\n            </div>\n          </div>\n        </ng-container>\n      </div>\n      <c8y-load-more\n        [paging]=\"deviceRequestList.paging\"\n        [hidden]=\"true\"\n        (onLoad)=\"updateList($event)\"\n      ></c8y-load-more>\n    </ng-container>\n\n    <ng-template #noData>\n      <div class=\"c8y-empty-state m-t-40 text-center\">\n        <h1 class=\"c8y-icon c8y-icon-device-connect c8y-icon-duocolor\"></h1>\n        <ng-container *ngIf=\"limitStatus?.isReached; else limitNotReached\">\n          <h3>\n            {{ limitReachedInfo$ | async }}\n          </h3>\n          <p translate>Please contact your platform administrator.</p>\n        </ng-container>\n        <ng-template #limitNotReached>\n          <h3 translate>No pending registrations to display.</h3>\n          <p\n            *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n            translate\n          >\n            Use the \"Register device\" dropdown in the top right corner.\n          </p>\n        </ng-template>\n      </div>\n    </ng-template>\n  </ng-container>\n</ng-container>\n","import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory, Permissions } from '@c8y/ngx-components';\n\n@Injectable()\nexport class RegisterDeviceNavigationFactory implements NavigatorNodeFactory {\n  constructor(private permissions: Permissions) {}\n  get() {\n    const userHasPermission = this.permissions.hasAnyRole([\n      Permissions.ROLE_DEVICE_CONTROL_ADMIN,\n      Permissions.ROLE_DEVICE_CONTROL_READ\n    ]);\n    const nav: NavigatorNode[] = [];\n    if (userHasPermission) {\n      nav.push(\n        new NavigatorNode({\n          label: gettext('Registration'),\n          icon: 'c8y-device-connect',\n          path: '/deviceregistration',\n          parent: gettext('Devices'),\n          preventDuplicates: true,\n          priority: 3000\n        })\n      );\n    }\n    return nav;\n  }\n}\n","import { ApplicationService, ApplicationType, IApplication } from '@c8y/client';\nimport { AppStateService, gettext } from '@c8y/ngx-components';\nimport { flatMap } from 'lodash-es';\nimport {\n  ApplicationExtension,\n  ExtensibleDeviceRegistrationProvider\n} from './base-device-registration.model';\n\nexport class BaseExtensibleDeviceRegistrationService {\n  constructor(\n    protected applicationService: ApplicationService,\n    protected stateService: AppStateService\n  ) {}\n\n  protected getMetadataUrl(contextPath: string): string {\n    return `${this.getServiceBaseUrl(contextPath)}/metadata`;\n  }\n\n  protected getServiceBaseUrl(contextPath: string): string {\n    if (!contextPath || contextPath.length === 0) {\n      throw new Error(\n        gettext('The URL of the microservice is misconfigured. A context path is missing.')\n      );\n    }\n    return `/service/${contextPath}/deviceRegistration`;\n  }\n\n  protected async getDeviceRegistrationProviders(\n    bulk: boolean\n  ): Promise<ExtensibleDeviceRegistrationProvider[]> {\n    let providers: ExtensibleDeviceRegistrationProvider[] = [];\n    const microservices = await this.listMicroservicesByUser();\n    if (microservices && microservices.length > 0) {\n      providers = this.getProvidersFromManifestExtensions(microservices, bulk).concat(\n        this.getProvidersFromExtensions(microservices, bulk)\n      );\n    }\n    return providers;\n  }\n\n  private async listMicroservicesByUser() {\n    const { data } = await this.applicationService.listByUser(\n      this.stateService?.currentUser?.value?.userName,\n      {\n        dropOverwrittenApps: true,\n        noPaging: true,\n        pageSize: 100,\n        withTotalPages: true\n      }\n    );\n    return data?.filter(({ type }) => type === ApplicationType.MICROSERVICE);\n  }\n\n  private getProvidersFromManifestExtensions(\n    applications: IApplication[],\n    bulk: boolean\n  ): ExtensibleDeviceRegistrationProvider[] {\n    return flatMap(applications, application => {\n      return application?.manifest?.extensions?.map(extension => {\n        return { ...extension, contextPath: application.contextPath } as ApplicationExtension;\n      });\n    }).filter(provider => this.appSupportingExtensibleDeviceRegistrationForm(provider, bulk));\n  }\n\n  private getProvidersFromExtensions(\n    applications: IApplication[],\n    bulk: boolean\n  ): ExtensibleDeviceRegistrationProvider[] {\n    return flatMap(applications, application => {\n      return application.extensions?.map(extension => {\n        return {\n          ...extension,\n          contextPath: application.contextPath\n        } as ExtensibleDeviceRegistrationProvider;\n      });\n    }).filter(provider => this.appSupportingExtensibleDeviceRegistrationForm(provider, bulk));\n  }\n\n  private appSupportingExtensibleDeviceRegistrationForm(\n    extension: ExtensibleDeviceRegistrationProvider,\n    bulk: boolean\n  ): boolean {\n    if (bulk) {\n      return extension?.type === 'extensibleBulkDeviceRegistration';\n    } else {\n      return extension?.type === 'extensibleDeviceRegistration';\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { ApplicationService, FetchClient, IResult } from '@c8y/client';\nimport { AppStateService, gettext } from '@c8y/ngx-components';\nimport { BaseExtensibleDeviceRegistrationService } from '../base-extensible-device-registration.service';\nimport { ExtensibleDeviceRegistrationSchema } from './extensible-device-registration.model';\nimport { ExtensibleDeviceRegistrationProvider } from '../base-device-registration.model';\n\n@Injectable()\nexport class ExtensibleDeviceRegistrationService extends BaseExtensibleDeviceRegistrationService {\n  constructor(\n    protected applicationService: ApplicationService,\n    protected stateService: AppStateService,\n    private client: FetchClient\n  ) {\n    super(applicationService, stateService);\n  }\n\n  async getSchema(contextPath: string): Promise<ExtensibleDeviceRegistrationSchema> {\n    const response = await this.client.fetch(this.getMetadataUrl(contextPath), {\n      params: { lang: this.stateService.state.lang }\n    });\n    const data = await response.json();\n\n    if (!data || !data.c8y_DeviceRegistration) {\n      throw new Error(\n        gettext(\n          'The response of the microservice is incomplete. The device registration information is missing.'\n        )\n      );\n    }\n\n    return data.c8y_DeviceRegistration;\n  }\n\n  getDeviceRegistrationProviders(): Promise<ExtensibleDeviceRegistrationProvider[]> {\n    return super.getDeviceRegistrationProviders(false);\n  }\n\n  async registerDevice(contextPath: string, model: any): Promise<IResult<any>> {\n    const method = 'POST';\n    const body = JSON.stringify(model);\n    const headers = { 'content-type': 'application/json', accept: 'application/json' };\n    const res = await this.client.fetch(this.getServiceBaseUrl(contextPath), {\n      method,\n      body,\n      headers\n    });\n    const data = await res.json();\n    return { res, data };\n  }\n}\n","import { Component, Input, OnInit, ViewChild } from '@angular/core';\nimport { C8yStepper, GainsightService, gettext } from '@c8y/ngx-components';\nimport { FormGroup } from '@angular/forms';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { ExtensibleDeviceRegistrationService } from './extensible-device-registration.service';\nimport { RegisterDeviceService } from '../../register-device.service';\nimport { FormlyFieldConfig } from '@ngx-formly/core';\nimport { STEP_STATE } from '@angular/cdk/stepper';\nimport { PRODUCT_EXPERIENCE_BASE_REGISTRATION } from '../base-device-registration.model';\n\n@Component({\n  selector: 'c8y-extensible-device-registration-stepper',\n  templateUrl: 'extensible-device-registration-stepper.component.html'\n})\nexport class ExtensibleDeviceRegistrationStepperComponent implements OnInit {\n  message: string;\n  errorMessage: string;\n  pendingStatus = false;\n  forms: FormGroup[] = [];\n  model: any = {};\n  @ViewChild(C8yStepper, { static: true })\n  stepper: C8yStepper;\n\n  @Input() contextPath: string;\n  @Input() labels: string[];\n  @Input() steps: FormlyFieldConfig[][];\n\n  private readonly SERVER_ERROR = gettext('Cannot register your device.');\n  private readonly SUCCESSFUL_REGISTRATION = gettext('Your device was successfully registered.');\n  private readonly NO_CONNECTION = gettext('Unable to reach the microservice.');\n\n  constructor(\n    private customProviderService: ExtensibleDeviceRegistrationService,\n    private registerDeviceService: RegisterDeviceService,\n    private bsModalRef: BsModalRef,\n    private gainsightService: GainsightService\n  ) {}\n\n  ngOnInit() {\n    this.steps.forEach(() => this.forms.push(new FormGroup({})));\n  }\n\n  async save() {\n    this.pendingStatus = true;\n    this.errorMessage = null;\n    const { res, data } = await this.customProviderService\n      .registerDevice(this.contextPath, this.model)\n      .catch(() => {\n        return {\n          res: undefined,\n          data: undefined\n        };\n      })\n      .finally(() => {\n        this.pendingStatus = false;\n        this.stepper.next();\n      });\n\n    if (res && data) {\n      if (res.status >= 400 && res.status < 500) {\n        this.handleError(data.message || this.SERVER_ERROR);\n      } else if (res.status >= 500) {\n        this.handleError(this.SERVER_ERROR);\n      } else {\n        this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n          result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.SUCCESS,\n          component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.EXTENSIBLE_SINGLE\n        });\n        this.message = this.SUCCESSFUL_REGISTRATION;\n      }\n    } else {\n      this.handleError(this.NO_CONNECTION);\n    }\n  }\n\n  close() {\n    this.bsModalRef.hide();\n  }\n\n  complete() {\n    this.registerDeviceService.list();\n    this.bsModalRef.hide();\n  }\n\n  goToFirstStep() {\n    this.stepper.selectedIndex = 0;\n  }\n\n  isRegistrationStep() {\n    return this.stepper.selectedIndex === this.steps.length - 1;\n  }\n\n  finalStepStatus() {\n    if (this.stepper.selectedIndex === this.steps.length) {\n      if (this.errorMessage) {\n        return STEP_STATE.ERROR;\n      } else {\n        return STEP_STATE.DONE;\n      }\n    } else {\n      return STEP_STATE.NUMBER;\n    }\n  }\n\n  private handleError(message: string) {\n    this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n      result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,\n      component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.EXTENSIBLE_SINGLE\n    });\n    this.errorMessage = message;\n  }\n}\n","<c8y-stepper\n  [disableProgressButtons]=\"true\"\n  [disableDefaultIcons]=\"{ edit: true, done: false }\"\n  [customClasses]=\"['m-40', 'm-t-8', 'm-b-16']\"\n>\n  <cdk-step *ngFor=\"let step of steps; let i = index\" [stepControl]=\"forms[i]\" [label]=\"labels[i]\">\n    <c8y-form-group class=\"form-group p-24 p-b-0 p-t-16\">\n      <formly-form [form]=\"forms[i]\" [fields]=\"step\" [model]=\"model\"></formly-form>\n    </c8y-form-group>\n    <c8y-stepper-buttons\n      class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n      *ngIf=\"isRegistrationStep()\"\n      [showButtons]=\"{ cancel: true, back: true, next: true }\"\n      [labels]=\"{ next: 'Register' }\"\n      (onCancel)=\"close()\"\n      (onNext)=\"save()\"\n      [pending]=\"pendingStatus\"\n      [disabled]=\"forms[i].invalid\"\n    ></c8y-stepper-buttons>\n    <c8y-stepper-buttons\n      class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n      *ngIf=\"!isRegistrationStep()\"\n      [showButtons]=\"{ cancel: true, back: i !== 0, next: true }\"\n      [disabled]=\"forms[i].invalid\"\n      (onCancel)=\"close()\"\n    ></c8y-stepper-buttons>\n  </cdk-step>\n  <cdk-step [state]=\"finalStepStatus()\" label=\"{{ 'Summary' | translate }}\">\n    <c8y-operation-result\n      *ngIf=\"!errorMessage; else errorInfo\"\n      text=\"{{ message | translate }}\"\n      [size]=\"84\"\n      [vertical]=\"true\"\n      type=\"success\"\n      class=\"lead\"\n      data-cy=\"success\"\n    ></c8y-operation-result>\n    <ng-template #errorInfo>\n      <c8y-operation-result\n        text=\"{{ errorMessage | translate }}\"\n        [size]=\"84\"\n        [vertical]=\"true\"\n        type=\"error\"\n        class=\"lead\"\n        data-cy=\"error\"\n      ></c8y-operation-result>\n    </ng-template>\n    <c8y-stepper-buttons\n      class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n      [showButtons]=\"{ cancel: errorMessage, back: errorMessage, next: !errorMessage }\"\n      [labels]=\"{ back: 'Fix issue', next: 'Close' }\"\n      (onCancel)=\"close()\"\n      (onNext)=\"complete()\"\n      (onBack)=\"goToFirstStep()\"\n    ></c8y-stepper-buttons>\n  </cdk-step>\n</c8y-stepper>\n","import { Component, OnInit } from '@angular/core';\nimport { C8yJSONSchema, gettext } from '@c8y/ngx-components';\nimport { ExtensibleDeviceRegistrationService } from './extensible-device-registration.service';\nimport { ExtensibleDeviceRegistrationSchema } from './extensible-device-registration.model';\nimport { JSONSchema7 } from 'json-schema';\nimport { FormlyFieldConfig } from '@ngx-formly/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\n\n@Component({\n  selector: 'extensible-device-registration-modal',\n  templateUrl: 'extensible-device-registration-modal.component.html'\n})\nexport class ExtensibleDeviceRegistrationModalComponent implements OnInit {\n  title: string;\n  loadingErrorMessage: string;\n  pages: FormlyFieldConfig[][];\n  labels: string[] = [];\n  contextPath: string;\n\n  constructor(\n    public bsModalRef: BsModalRef,\n    private jsonschema: C8yJSONSchema,\n    private registrationService: ExtensibleDeviceRegistrationService\n  ) {}\n\n  async ngOnInit() {\n    const { title, pages }: ExtensibleDeviceRegistrationSchema = await this.registrationService\n      .getSchema(this.contextPath)\n      .catch(error => {\n        this.loadingErrorMessage =\n          error?.message || gettext('Cannot fetch a form definition from the microservice.');\n        return {\n          title: gettext('Error')\n        };\n      });\n    this.title = title;\n    this.pages = pages?.map((step: JSONSchema7) => {\n      this.labels.push(step.title);\n      return [this.jsonschema.toFieldConfig(step) as FormlyFieldConfig];\n    });\n  }\n}\n","<c8y-modal\n  [title]=\"title | translate\"\n  [headerClasses]=\"'dialog-header'\"\n  [customFooter]=\"true\"\n>\n  <ng-container c8y-modal-title>\n    <span class=\"c8y-icon c8y-icon-device-connect\"></span>\n  </ng-container>\n  <ng-container *ngIf=\"pages as steps; else loadingOrError\">\n    <c8y-extensible-device-registration-stepper\n      c8y-modal-body\n      [steps]=\"steps\"\n      [labels]=\"labels\"\n      [contextPath]=\"contextPath\"\n    ></c8y-extensible-device-registration-stepper>\n  </ng-container>\n  <ng-template #loadingOrError>\n    <ng-container *ngIf=\"loadingErrorMessage; else loading\">\n      <c8y-operation-result\n        class=\"lead text-regular\"\n        type=\"error\"\n        text=\"{{ loadingErrorMessage | translate }}\"\n        [size]=\"84\"\n        [vertical]=\"true\"\n        data-cy=\"error\"\n      ></c8y-operation-result>\n      <div class=\"modal-footer\">\n        <button\n          class=\"btn btn-default\"\n          title=\"{{ 'Close' | translate }}\"\n          type=\"button\"\n          (click)=\"bsModalRef.hide()\"\n        >\n          {{ 'Close' | translate }}\n        </button>\n      </div>\n    </ng-container>\n    <ng-template #loading>\n      <div class=\"modal-header modal-header-info text-center\">\n        <c8y-loading\n          class=\"text-center\"\n          layout=\"application\"\n          [message]=\"'Loading the registration form definition…' | translate\"\n        ></c8y-loading>\n      </div>\n    </ng-template>\n  </ng-template>\n</c8y-modal>\n","import { Component, OnInit } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ExtensibleDeviceRegistrationService } from './extensible-device-registration.service';\nimport { ExtensibleDeviceRegistrationModalComponent } from './extensible-device-registration-modal.component';\nimport { ExtensibleDeviceRegistrationProvider } from '../base-device-registration.model';\n\n@Component({\n  selector: 'extensible-device-registration-provider',\n  templateUrl: 'extensible-device-registration-button.component.html'\n})\nexport class ExtensibleDeviceRegistrationButtonComponent implements OnInit {\n  providersMetaData: Promise<ExtensibleDeviceRegistrationProvider[]>;\n\n  constructor(\n    private deviceRegistrationService: ExtensibleDeviceRegistrationService,\n    private modalService: BsModalService\n  ) {}\n\n  ngOnInit() {\n    this.providersMetaData = this.deviceRegistrationService.getDeviceRegistrationProviders();\n  }\n\n  click(providerMetaData: ExtensibleDeviceRegistrationProvider) {\n    const { name, contextPath } = providerMetaData;\n    this.modalService.show(ExtensibleDeviceRegistrationModalComponent, {\n      initialState: { name, contextPath } as Partial<ExtensibleDeviceRegistrationModalComponent>,\n      class: 'modal-sm',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      ignoreBackdropClick: true\n    });\n  }\n}\n","<div *ngFor=\"let provider of providersMetaData | async\">\n  <button title=\"{{ provider.name | translate }}\" type=\"button\" (click)=\"click(provider)\">\n    <i c8yIcon=\"c8y-device-connect\"></i>\n    {{ provider.name | translate }}\n  </button>\n</div>\n","import { Injectable } from '@angular/core';\nimport { ApplicationService, FetchClient, IResult } from '@c8y/client';\nimport { AppStateService, gettext } from '@c8y/ngx-components';\nimport { BulkDescription, BulkResult } from './extensible-bulk-device-registration.model';\nimport { BaseExtensibleDeviceRegistrationService } from '../base-extensible-device-registration.service';\nimport { ExtensibleDeviceRegistrationProvider } from '../base-device-registration.model';\n\n@Injectable()\nexport class BulkExtensibleDeviceRegistrationService extends BaseExtensibleDeviceRegistrationService {\n  constructor(\n    protected applicationService: ApplicationService,\n    protected stateService: AppStateService,\n    private client: FetchClient\n  ) {\n    super(applicationService, stateService);\n  }\n\n  getDeviceRegistrationProviders(): Promise<ExtensibleDeviceRegistrationProvider[]> {\n    return super.getDeviceRegistrationProviders(true);\n  }\n\n  async getBulkDescription(contextPath: string): Promise<BulkDescription> {\n    const res = await this.client.fetch(this.getMetadataUrl(contextPath), {\n      params: { lang: this.stateService.state.lang }\n    });\n    const { c8y_DeviceRegistration } = await res.json();\n\n    if (!c8y_DeviceRegistration || !c8y_DeviceRegistration.bulk) {\n      throw new Error(\n        gettext(\n          'The response of the microservice is incomplete. The bulk registration information is missing.'\n        )\n      );\n    }\n\n    return c8y_DeviceRegistration.bulk;\n  }\n\n  async upload(csv: File, contextPath): Promise<IResult<BulkResult>> {\n    const method = 'POST';\n    const body = this.createBinaryRequestBody(csv);\n    const res = await this.client.fetch(this.getBulkUrl(contextPath), { method, body });\n    const data = await res.json();\n    return { res, data };\n  }\n\n  getBulkUrl(contextPath: string): string {\n    return `${this.getServiceBaseUrl(contextPath)}/bulk`;\n  }\n\n  private createBinaryRequestBody(file: any): FormData {\n    const body = new FormData();\n    const newFile = new File([file], file.name, { type: 'text/csv' });\n    body.append('file', newFile, newFile.name);\n    return body;\n  }\n}\n","import { Component, OnInit, ViewChild } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { IResult } from '@c8y/client';\nimport { C8yJSONSchema, C8yStepper, GainsightService, gettext } from '@c8y/ngx-components';\nimport { FormlyFieldConfig } from '@ngx-formly/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { RegisterDeviceService } from '../../register-device.service';\nimport { PRODUCT_EXPERIENCE_BASE_REGISTRATION } from '../base-device-registration.model';\nimport {\n  BulkDescription,\n  BulkFailedResult,\n  BulkFileExample,\n  BulkResult\n} from './extensible-bulk-device-registration.model';\nimport { BulkExtensibleDeviceRegistrationService } from './extensible-bulk-device-registration.service';\nconst extensibleDeviceRegistrationBulkSchema: object = {\n  $schema: 'https://json-schema.org/draft/2019-09/schema',\n  type: 'object',\n  properties: {\n    csvBulkFile: {\n      type: 'array',\n      title: gettext('CSV file upload'),\n      description: gettext(\n        'You can use file upload component to let users send files. This input accepts only a single CSV file.'\n      ),\n      contentMediaType: 'csv'\n    }\n  },\n  required: ['csvBulkFile'],\n  additionalProperties: false\n};\n\n@Component({\n  selector: 'extensible-device-registration-modal-component',\n  templateUrl: 'extensible-bulk-device-registration-modal.component.html'\n})\nexport class ExtensibleBulkDeviceRegistrationModalComponent implements OnInit {\n  @ViewChild(C8yStepper, { static: true }) stepper: C8yStepper;\n  title: string;\n  examples: BulkFileExample[];\n  message: string;\n  success: boolean;\n  loadingError = false;\n  pending = false;\n  contextPath: string;\n  result: BulkResult | BulkFailedResult;\n  form = new FormGroup({});\n  model = {};\n  template: FormlyFieldConfig[];\n\n  constructor(\n    private jsonschema: C8yJSONSchema,\n    private bulkExtensibleDeviceRegistrationService: BulkExtensibleDeviceRegistrationService,\n    private registerDeviceService: RegisterDeviceService,\n    private bsModalRef: BsModalRef,\n    private gainsightService: GainsightService\n  ) {}\n\n  async ngOnInit() {\n    const { title, exampleFileUrls }: BulkDescription =\n      await this.bulkExtensibleDeviceRegistrationService\n        .getBulkDescription(this.contextPath)\n        .catch(error => {\n          this.message = error.message;\n          this.loadingError = true;\n\n          return {\n            title: gettext('Error'),\n            exampleFileUrls: []\n          };\n        });\n\n    this.title = title;\n    this.template = [this.jsonschema.toFieldConfig(extensibleDeviceRegistrationBulkSchema)];\n    this.examples = exampleFileUrls;\n  }\n\n  async upload() {\n    this.pending = true;\n    const { res, data }: IResult<BulkResult> = await this.bulkExtensibleDeviceRegistrationService\n      .upload(this.getFile(this.model), this.contextPath)\n      .catch(() => {\n        return {\n          res: undefined,\n          data: undefined\n        };\n      })\n      .finally(() => {\n        this.pending = false;\n        this.stepper.next();\n      });\n\n    this.result = data;\n    this.success = res?.status < 400;\n\n    if (this.success) {\n      this.message = gettext('Device registration created.');\n      this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n        result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.SUCCESS,\n        component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.EXTENSIBLE_BULK\n      });\n      this.model = {};\n    }\n\n    if (res) {\n      if (res.status >= 400 && res.status < 500) {\n        this.message = gettext('Device registration failed.');\n        this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n          result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,\n          component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.EXTENSIBLE_BULK\n        });\n      } else if (res.status >= 500) {\n        this.message = gettext('Error occurred while processing the uploaded file.');\n        this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {\n          result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,\n          component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.EXTENSIBLE_BULK\n        });\n      }\n    } else {\n      this.message = gettext('No internet connection. Unable to reach the microservice.');\n    }\n  }\n\n  getFile(model) {\n    const csvBulkFile = (model as any)?.csvBulkFile;\n    return csvBulkFile ? csvBulkFile[0]?.file : undefined;\n  }\n\n  complete() {\n    this.registerDeviceService.list();\n    this.bsModalRef.hide();\n  }\n\n  cancel() {\n    this.bsModalRef.hide();\n  }\n}\n","<c8y-modal\n  [title]=\"title | translate\"\n  [headerClasses]=\"'dialog-header'\"\n  [customFooter]=\"true\"\n>\n  <ng-container c8y-modal-title>\n    <i c8yIcon=\"c8y-device-connect\"></i>\n  </ng-container>\n  <c8y-stepper [hideStepProgress]=\"true\" linear class=\"p-t-16\" c8y-modal-body>\n    <ng-container *ngIf=\"!loadingError\">\n      <cdk-step>\n        <div class=\"sticky-top bg-component separator-bottom\">\n          <p\n            class=\"p-l-24 p-r-24 p-t-16 p-b-16 m-b-0 separator-bottom text-16 text-medium text-center bg-component\"\n            translate\n          >\n            Register devices in bulk\n          </p>\n          <c8y-form-group class=\"p-24 p-t-16 p-b-8 m-b-0\">\n            <formly-form [form]=\"form\" [fields]=\"template\" [model]=\"model\"></formly-form>\n          </c8y-form-group>\n        </div>\n        <div\n          *ngFor=\"let example of examples\"\n          class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\"\n        >\n          <p class=\"m-b-8 text-medium\">\n            {{ example.title | translate }}\n          </p>\n          <p class=\"small m-b-8\">{{ example.description | translate }}</p>\n          <a\n            title=\"{{ 'Download template' | translate }}\"\n            class=\"btn btn-default btn-sm\"\n            target=\"_self\"\n            [href]=\"example.url\"\n            download=\"{{ 'Example bulk registration - template.csv' | translate }}\"\n          >\n            <i c8yIcon=\"download\"></i>\n            <span translate>Download template</span>\n          </a>\n        </div>\n        <c8y-stepper-buttons\n          class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n          [showButtons]=\"{ cancel: true, next: true }\"\n          [disabled]=\"form.invalid\"\n          [pending]=\"pending\"\n          (onCancel)=\"cancel()\"\n          (onNext)=\"upload()\"\n          [labels]=\"{ next: 'Upload' }\"\n        ></c8y-stepper-buttons>\n      </cdk-step>\n    </ng-container>\n    <cdk-step state=\"final\">\n      <div class=\"p-24\">\n        <div *ngIf=\"success; else fail\">\n          <c8y-operation-result\n            text=\"{{ message | translate }}\"\n            [size]=\"84\"\n            [vertical]=\"true\"\n            type=\"success\"\n            class=\"lead\"\n            data-cy=\"success\"\n          ></c8y-operation-result>\n          <c8y-list-group class=\"separator-top m-t-16\">\n            <c8y-li>\n              <c8y-li-icon class=\"text-success\" [icon]=\"'check-circle'\"></c8y-li-icon>\n              <p translate>File successfully uploaded.</p>\n              <c8y-li-collapse>\n                <pre><code>{{ result | json }}</code></pre>\n              </c8y-li-collapse>\n            </c8y-li>\n          </c8y-list-group>\n        </div>\n        <ng-template #fail>\n          <c8y-operation-result\n            text=\"{{ message | translate }}\"\n            [size]=\"84\"\n            [vertical]=\"true\"\n            type=\"error\"\n            class=\"lead\"\n            data-cy=\"error\"\n          ></c8y-operation-result>\n          <c8y-list-group *ngIf=\"result\" class=\"separator-top m-t-16\">\n            <c8y-li>\n              <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n              <p translate>Bulk operation failed.</p>\n              <c8y-li-collapse>\n                <pre><code>{{ result | json }}</code></pre>\n              </c8y-li-collapse>\n            </c8y-li>\n          </c8y-list-group>\n        </ng-template>\n      </div>\n      <c8y-stepper-buttons\n        class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-component\"\n        [showButtons]=\"{ next: true }\"\n        (onNext)=\"complete()\"\n        [labels]=\"{ next: success ? 'Complete' : 'Cancel' }\"\n      ></c8y-stepper-buttons>\n    </cdk-step>\n  </c8y-stepper>\n</c8y-modal>\n","import { Component, OnInit } from '@angular/core';\nimport { BulkExtensibleDeviceRegistrationService } from './extensible-bulk-device-registration.service';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ExtensibleBulkDeviceRegistrationModalComponent } from './extensible-bulk-device-registration-modal.component';\nimport { ExtensibleDeviceRegistrationProvider } from '../base-device-registration.model';\n\n@Component({\n  selector: 'extensible-device-registration-component',\n  templateUrl: 'extensible-bulk-device-registration-button.component.html'\n})\nexport class ExtensibleBulkDeviceRegistrationButtonComponent implements OnInit {\n  bulkProvidersMetaData: Promise<ExtensibleDeviceRegistrationProvider[]>;\n\n  constructor(\n    private bulkExtensibleDeviceRegistrationService: BulkExtensibleDeviceRegistrationService,\n    private modalService: BsModalService\n  ) {}\n\n  ngOnInit() {\n    this.bulkProvidersMetaData =\n      this.bulkExtensibleDeviceRegistrationService.getDeviceRegistrationProviders();\n  }\n\n  click(contextPath) {\n    this.modalService.show(ExtensibleBulkDeviceRegistrationModalComponent, {\n      initialState: { contextPath } as Partial<ExtensibleBulkDeviceRegistrationModalComponent>,\n      class: 'modal-sm',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      ignoreBackdropClick: true\n    });\n  }\n}\n","<div *ngFor=\"let provider of bulkProvidersMetaData | async\">\n  <button\n    title=\"{{ provider.name | translate }}\"\n    type=\"button\"\n    (click)=\"click(provider.contextPath)\"\n  >\n    <i c8yIcon=\"upload\"></i>\n    {{ provider.name | translate }}\n  </button>\n</div>\n","import { Component } from '@angular/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { BulkDeviceRegistrationModalComponent } from './bulk-device-registration-modal.component';\nimport { ExtensibleDeviceRegistrationProvider } from '../extensible/base-device-registration.model';\n\n@Component({\n  selector: 'extensible-device-registration-component',\n  templateUrl: 'bulk-device-registration-button.component.html'\n})\nexport class BulkDeviceRegistrationButtonComponent {\n  bulkProvidersMetaData: Promise<ExtensibleDeviceRegistrationProvider[]>;\n\n  constructor(private modalService: BsModalService) {}\n\n  click() {\n    this.modalService.show(BulkDeviceRegistrationModalComponent, {\n      class: 'modal-sm',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      ignoreBackdropClick: true\n    });\n  }\n}\n","<button title=\"{{ 'General' | translate }}\" type=\"button\" (click)=\"click()\">\n  <i c8yIcon=\"upload\"></i>\n  {{ 'General' | translate }}\n</button>\n","import { Injectable } from '@angular/core';\nimport { GeneralDeviceRegistrationButtonComponent } from './general/general-device-registration-button.component';\nimport { ExtensibleDeviceRegistrationButtonComponent } from './extensible/single/extensible-device-registration-button.component';\nimport { ExtensibleBulkDeviceRegistrationButtonComponent } from './extensible/bulk/extensible-bulk-device-registration-button.component';\nimport { BulkDeviceRegistrationButtonComponent } from './bulk/bulk-device-registration-button.component';\nimport { RegisterDeviceItem, RegisterDeviceFactory } from './dropdown/RegisterDeviceItem';\n\n@Injectable()\nexport class DeviceRegistrationFactory implements RegisterDeviceFactory {\n  get() {\n    return [\n      {\n        template: GeneralDeviceRegistrationButtonComponent,\n        priority: 100,\n        category: 'single'\n      } as RegisterDeviceItem,\n      {\n        template: ExtensibleDeviceRegistrationButtonComponent,\n        priority: 50,\n        category: 'single'\n      } as RegisterDeviceItem,\n      {\n        template: ExtensibleBulkDeviceRegistrationButtonComponent,\n        priority: 50,\n        category: 'bulk'\n      } as RegisterDeviceItem,\n      {\n        template: BulkDeviceRegistrationButtonComponent,\n        priority: 100,\n        category: 'bulk'\n      } as RegisterDeviceItem\n    ];\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport {\n  CommonModule,\n  CoreModule,\n  DeviceBootstrapRealtimeService,\n  DynamicFormsModule,\n  hookNavigator,\n  StepperModule\n} from '@c8y/ngx-components';\nimport { DeviceRegistrationViewComponent } from './device-registration-view.component';\nimport { GeneralDeviceRegistrationComponent } from './general/general-device-registration.component';\nimport { GeneralDeviceRegistrationButtonComponent } from './general/general-device-registration-button.component';\nimport { RegisterDeviceNavigationFactory } from './register-device-navigation.factory';\nimport { ExtensibleDeviceRegistrationButtonComponent } from './extensible/single/extensible-device-registration-button.component';\nimport { ExtensibleDeviceRegistrationModalComponent } from './extensible/single/extensible-device-registration-modal.component';\nimport { ExtensibleDeviceRegistrationService } from './extensible/single/extensible-device-registration.service';\nimport { ExtensibleDeviceRegistrationStepperComponent } from './extensible/single/extensible-device-registration-stepper.component';\nimport { ExtensibleBulkDeviceRegistrationModalComponent } from './extensible/bulk/extensible-bulk-device-registration-modal.component';\nimport { BulkExtensibleDeviceRegistrationService } from './extensible/bulk/extensible-bulk-device-registration.service';\nimport { BulkDeviceRegistrationModalComponent } from './bulk/bulk-device-registration-modal.component';\nimport { ExtensibleBulkDeviceRegistrationButtonComponent } from './extensible/bulk/extensible-bulk-device-registration-button.component';\nimport { BulkDeviceRegistrationButtonComponent } from './bulk/bulk-device-registration-button.component';\nimport { RegisterDeviceDropdownComponent } from './dropdown/register-device-dropdown.component';\nimport { hookDeviceRegistration } from './dropdown/register-device-extension.service';\nimport { DeviceRegistrationFactory } from './register-device.factory';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\n\nconst deviceRegistrationRoutes: Routes = [\n  {\n    path: 'deviceregistration',\n    component: DeviceRegistrationViewComponent\n  }\n];\n\n@NgModule({\n  imports: [\n    BsDropdownModule,\n    PopoverModule,\n    CommonModule,\n    CoreModule,\n    StepperModule,\n    DynamicFormsModule,\n    RouterModule.forChild(deviceRegistrationRoutes)\n  ],\n  declarations: [\n    DeviceRegistrationViewComponent,\n    GeneralDeviceRegistrationComponent,\n    GeneralDeviceRegistrationButtonComponent,\n    BulkDeviceRegistrationModalComponent,\n    BulkDeviceRegistrationButtonComponent,\n    ExtensibleDeviceRegistrationButtonComponent,\n    ExtensibleDeviceRegistrationModalComponent,\n    ExtensibleDeviceRegistrationStepperComponent,\n    ExtensibleBulkDeviceRegistrationModalComponent,\n    ExtensibleBulkDeviceRegistrationButtonComponent,\n    RegisterDeviceDropdownComponent\n  ],\n  providers: [\n    hookDeviceRegistration(DeviceRegistrationFactory),\n    hookNavigator(RegisterDeviceNavigationFactory),\n    DeviceBootstrapRealtimeService,\n    ExtensibleDeviceRegistrationService,\n    BulkExtensibleDeviceRegistrationService\n  ]\n})\nexport class RegisterDeviceModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i3","i1","i3.RegisterDeviceService","i5","i6","i7","i8","i9","i2","i1.RegisterDeviceExtensionService","i2.RegisterDeviceService","i4","i1.RegisterDeviceService","i7.RegisterDeviceDropdownComponent","i1.ExtensibleDeviceRegistrationService","i3.ExtensibleDeviceRegistrationService","i5.ExtensibleDeviceRegistrationStepperComponent","i2.BulkExtensibleDeviceRegistrationService","i1.BulkExtensibleDeviceRegistrationService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;MAoBa,qBAAqB,CAAA;AAoBhC,IAAA,WAAA,CACU,MAAc,EACd,gBAA2C,EAC3C,YAA0B,EAAA;QAF1B,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;QACd,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAA2B;QAC3C,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;AAtB3B,QAAA,IAAA,CAAA,QAAQ,GAAqB,IAAI,OAAO,EAAE,CAAC;QAC3C,IAAM,CAAA,MAAA,GAA8C,IAAI,eAAe,CAAC;AAC/E,YAAA,SAAS,EAAE,KAAK;AACjB,SAAA,CAAC,CAAC;QACM,IAA2B,CAAA,2BAAA,GAG/B,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;AAC9B,QAAA,IAAA,CAAA,2BAA2B,GAG/B,IAAI,CAAC,2BAA2B,CAAC,YAAY,EAAE,CAAC;AAC5C,QAAA,IAAA,CAAA,QAAQ,GAAwB,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;AAC7D,QAAA,IAAA,CAAA,MAAM,GAAyC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAGlE,IAAY,CAAA,YAAA,GAAG,qBAAqB,CAAC;AAC9C,QAAA,IAAA,CAAA,gBAAgB,GAAkB,IAAI,OAAO,EAAE,CAAC;KAMpD;IAEJ,oBAAoB,GAAA;AAClB,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC;KACtD;IAED,kBAAkB,CAChB,cAAqC,EACrC,YAA0C,EAAA;AAE1C,QAAA,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,2BAA2B,CAAC,QAAQ,EAAE,CAAC;QACnE,IAAI,YAAY,EAAE;YAChB,MAAM,GAAG,YAAY,CAAC;SACvB;QACD,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,cAAc,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;QAC7F,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;KACzD;AAED,IAAA,iBAAiB,CAAC,MAAgC,EAAA;AAChD,QAAA,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;AAC9B,QAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC;YACpC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC;AACxC,SAAA,CAAC,CAAC;KACJ;IAED,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAA;AACjB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AAEvE,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;AACjE,aAAA,IAAI,CACH,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAChC,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAC7B;aACA,SAAS,CACR,GAAG,IAAG;AACJ,YAAA,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;AAC7B,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACtC,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC3B,EACD,GAAG,IAAG;AACJ,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1B,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAC1C,SAAC,CACF,CAAC;KACL;AAED,IAAA,cAAc,CAAC,iBAA8C,EAAA;QAC3D,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;AACrD,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,YAAY,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,IAAG;AACnD,gBAAA,OAAO,IAAI,CACT,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAiC,MAAM;oBAClF,GAAG,EAAE,GAAG,CAAC,GAAG;AACZ,oBAAA,IAAI,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;iBACtC,CAAC,CAAC,CACJ,CAAC;AACJ,aAAC,CAAC,CAAC;AAEH,YAAA,MAAM,eAAe,GAGjB;AACF,gBAAA,OAAO,EAAE,EAAE;AACX,gBAAA,MAAM,EAAE,EAAE;aACX,CAAC;AAEF,YAAA,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAChC,QAAQ,CAAC,IAAI,IACX,IAAI,CAAC,GAAG,CAAC,EAAE,IAAG;gBACZ,EAAE,CAAC,GAAG,CAAC,EAAE;sBACL,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;sBACrC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACzC,gBAAA,OAAO,eAAe,CAAC;aACxB,CAAC,CACH,EACD,QAAQ,CAAC,CAAC,CAAC,EACX,QAAQ,CAAC,MAAK;AACZ,gBAAA,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AACjD,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC3B,CAAC,CACH,CAAC;SACH;KACF;AAED,IAAA,MAAM,CAAC,EAAU,EAAA;AACf,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACnC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;aACtC,SAAS,CACR,MAAK;AACH,YAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC;AACpC,gBAAA,IAAI,EAAE,IAAI,CAAC,mCAAmC,CAAC,EAAE,CAAC;AACnD,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,CAAC;SACtE,EACD,GAAG,IAAG;AACJ,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1B,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAC1C,SAAC,CACF,CAAC;KACL;AAED,IAAA,MAAM,CAAC,OAA4B,EAAA;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACxC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;aACtC,SAAS,CACR,MAAK;AACH,YAAA,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC;gBACpC,IAAI,EAAE,IAAI,CAAC,mCAAmC,CAAC,OAAO,CAAC,EAAE,CAAC;AAC3D,aAAA,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,EAAE,CAAC;AACb,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,CAAC;SACrE,EACD,GAAG,IAAG;AACJ,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1B,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAC1C,SAAC,CACF,CAAC;KACL;IAED,SAAS,GAAA;QACP,MAAM,sBAAsB,GAAgC,EAAE,CAAC;QAC/D,MAAM,oBAAoB,GAAgC,EAAE,CAAC;AAC7D,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEzB,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;AACpC,aAAA,IAAI,CACH,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAChC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAI;AACf,YAAA,IAAI,CAAC,GAAG,CAAC,yBAAyB,IAAG;AACnC,gBAAA,IAAI,yBAAyB,CAAC,UAAU,EAAE;AACxC,oBAAA,sBAAsB,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;AACvD,oBAAA,IAAI,CAAC,mCAAmC,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;iBACxE;qBAAM;AACL,oBAAA,oBAAoB,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;iBACtD;AACH,aAAC,CAAC,CAAC;AACH,YAAA,OAAO,IAAI,CAAC;AACd,SAAC,CAAC,EACF,QAAQ,CAAC,MAAK;;;AAGZ,YAAA,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;AACb,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1B,YAAA,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;AACnC,gBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CACvB,OAAO,CAAC,qDAAqD,CAAC,EAC9D,IAAI,CAAC,SAAS,CACZ;oBACE,oBAAoB;oBACpB,sBAAsB;AACvB,iBAAA,EACD,SAAS,EACT,CAAC,CACF,CACF,CAAC;aACH;iBAAM;gBACL,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,CAAC;aACnF;AACH,SAAC,CAAC,CACH;aACA,SAAS,CACR,MAAK;;SAEJ,EACD,GAAG,IAAG;AACJ,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1B,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAC1C,SAAC,CACF,CAAC;KACL;IAED,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;AAChC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACtC,aAAA,SAAS,CACR,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EACjC,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAC/C,CAAC;KACL;AAED,IAAA,kBAAkB,CAAC,MAAgC,EAAA;QACjD,OAAO,IAAI,CAAC,2BAA2B,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;KAC9F;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;KAClC;IAEO,gBAAgB,CAAC,EAAU,EAAE,MAAgC,EAAA;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,2BAA2B,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC;AAC/D,QAAA,MAAM,oBAAoB,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC3E,QAAA,IAAI,oBAAoB,IAAI,CAAC,EAAE;AAC7B,YAAA,KAAK,CAAC,oBAAoB,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;SAC7C;AACD,QAAA,OAAO,KAAK,CAAC;KACd;AAEO,IAAA,mCAAmC,CAAC,EAAU,EAAA;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,2BAA2B,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC;AAC/D,QAAA,MAAM,oBAAoB,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC3E,QAAA,IAAI,oBAAoB,IAAI,CAAC,EAAE;AAC7B,YAAA,KAAK,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;SACvC;AACD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC1B,QAAA,OAAO,KAAK,CAAC;KACd;+GA7OU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACTM,MAAM,oCAAoC,GAAG;AAClD,IAAA,KAAK,EAAE,oBAAoB;AAC3B,IAAA,SAAS,EAAE;AACT,QAAA,IAAI,EAAE,mBAAmB;AACzB,QAAA,eAAe,EAAE,8BAA8B;AAC/C,QAAA,iBAAiB,EAAE,gCAAgC;AACpD,KAAA;IACD,MAAM,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,qBAAqB,EAAE;CAClE;;ACHV,MAAM,wBAAwB,GAAW;AACvC,IAAA,OAAO,EAAE,8CAA8C;AACvD,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,UAAU,EAAE;AACV,QAAA,WAAW,EAAE;AACX,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC;AACjC,YAAA,WAAW,EAAE,OAAO,CAClB,uGAAuG,CACxG;AACD,YAAA,gBAAgB,EAAE,KAAK;AACxB,SAAA;AACF,KAAA;IACD,QAAQ,EAAE,CAAC,aAAa,CAAC;AACzB,IAAA,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAM,gBAAgB,GAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAClD,MAAM,UAAU,GAAa;IAC3B,IAAI;IACJ,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,OAAO;IACP,WAAW;CACZ,CAAC;AACF,MAAM,cAAc,GAAa,CAAC,GAAG,UAAU,EAAE,aAAa,CAAC,CAAC;AACzD,MAAM,aAAa,GAAa,CAAC,GAAG,UAAU,EAAE,gBAAgB,CAAC,CAAC;MAM5D,oCAAoC,CAAA;IAc/C,WACU,CAAA,UAAyB,EACzB,yBAAwD,EACxD,qBAA4C,EAC5C,UAAsB,EACtB,gBAAkC,EAClC,cAA8B,EAAA;QAL9B,IAAU,CAAA,UAAA,GAAV,UAAU,CAAe;QACzB,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA+B;QACxD,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAAuB;QAC5C,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACtB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;AAbxC,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;QACzB,IAAK,CAAA,KAAA,GAAG,EAAE,CAAC;QAEX,IAAkC,CAAA,kCAAA,GAAG,IAAI,CAAC,cAAc;aACrD,MAAM,CAAC,uBAAuB,CAAC;AAC/B,aAAA,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;KAS/B;IAEJ,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,CAAC;KAC3E;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,yBAAyB;aAC3B,MAAM,CAAC,IAAI,CAAC;aACZ,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAI;AACtB,YAAA,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;AACpB,gBAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACnB,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,KAAK,CAAC,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,CAAC,WAAW,CAAC;AACzF,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;AACzB,sBAAE,OAAO,CAAC,8BAA8B,CAAC;uBACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC,CAAC;AAC5D,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE;oBAChB,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,oCAAoC,CAAC,KAAK,EAAE;AAC7E,wBAAA,MAAM,EAAE,oCAAoC,CAAC,MAAM,CAAC,OAAO;AAC3D,wBAAA,SAAS,EAAE,oCAAoC,CAAC,SAAS,CAAC,IAAI;AAC/D,qBAAA,CAAC,CAAC;iBACJ;qBAAM;oBACL,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,oCAAoC,CAAC,KAAK,EAAE;AAC7E,wBAAA,MAAM,EAAE,oCAAoC,CAAC,MAAM,CAAC,OAAO;AAC3D,wBAAA,SAAS,EAAE,oCAAoC,CAAC,SAAS,CAAC,IAAI;AAC/D,qBAAA,CAAC,CAAC;iBACJ;aACF;iBAAM;AACL,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAmC,CAAC;AACxD,gBAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;gBACtD,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,oCAAoC,CAAC,KAAK,EAAE;AAC7E,oBAAA,MAAM,EAAE,oCAAoC,CAAC,MAAM,CAAC,OAAO;AAC3D,oBAAA,SAAS,EAAE,oCAAoC,CAAC,SAAS,CAAC,IAAI;AAC/D,iBAAA,CAAC,CAAC;aACJ;AACD,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;AAChB,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACrB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACtB,SAAC,CAAC;aACD,KAAK,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,oDAAoD,CAAC,CAAC;AAC7E,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACrB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACtB,SAAC,CAAC,CAAC;KACN;IAED,cAAc,GAAA;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,yCAAyC,CAAC,CAAC,CAAC;KAC5F;IAED,YAAY,GAAA;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,uCAAuC,CAAC,CAAC,CAAC;KACxF;IAED,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,iCAAiC,CAAC,CAAC,CAAC;KACjF;IAED,QAAQ,CAAC,OAAiB,EAAE,QAAgB,EAAA;AAC1C,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAI,CAAA,EAAA,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjE,QAAA,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AAC/D,QAAA,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;KAC9B;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;KACxB;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;KACxB;AAEO,IAAA,OAAO,CAAC,KAAK,EAAA;AACnB,QAAA,MAAM,WAAW,GAAI,KAAa,EAAE,WAAW,CAAC;AAChD,QAAA,OAAO,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;KACvD;+GAnGU,oCAAoC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,6BAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGAApC,oCAAoC,EAAA,QAAA,EAAA,0BAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACpC,UAAU,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnDvB,61MAiKA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,eAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,qBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,EAAA,cAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,cAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FD/Ga,oCAAoC,EAAA,UAAA,EAAA,CAAA;kBAJhD,SAAS;+BACE,0BAA0B,EAAA,QAAA,EAAA,61MAAA,EAAA,CAAA;wPAIK,OAAO,EAAA,CAAA;sBAA/C,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;;;MEP5B,kCAAkC,CAAA;AAqK7C,IAAA,WAAA,CACU,eAAgC,EAChC,aAA4B,EAC5B,qBAA4C,EAC5C,gBAAkC,EAClC,EAAqB,EACtB,UAAsB,EACrB,gBAAkC,EAClC,yBAAwD,EACxD,cAA8B,EAAA;QAR9B,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;QAChC,IAAa,CAAA,aAAA,GAAb,aAAa,CAAe;QAC5B,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAAuB;QAC5C,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAE,CAAA,EAAA,GAAF,EAAE,CAAmB;QACtB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACrB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAA+B;QACxD,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;QA7K/B,IAAU,CAAA,UAAA,GAAG,YAAY,CAAC;AAC1B,QAAA,IAAA,CAAA,MAAM,GAAW;AACxB,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,QAAQ,EAAE,EAAE;SACb,CAAC;AAEF,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAC;QAC9C,IAAkC,CAAA,kCAAA,GAAG,IAAI,CAAC,cAAc;aACrD,MAAM,CAAC,uBAAuB,CAAC;AAC/B,aAAA,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;AAEnC,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;AACzB,QAAA,IAAA,CAAA,KAAK,GAAG;YACN,eAAe,EAAE,CAAC,EAAwC,CAAC;SAC5D,CAAC;AACF,QAAA,IAAA,CAAA,OAAO,GAAsB;AAC3B,YAAA,SAAS,EAAE;AACT,gBAAA,cAAc,EAAE,IAAI;AACpB,gBAAA,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;AAChC,aAAA;SACF,CAAC;AAEF,QAAA,IAAA,CAAA,kBAAkB,GAAG;AACnB,YAAA,KAAK,EAAE,oBAAoB;AAC3B,YAAA,SAAS,EAAE,6BAA6B;YACxC,MAAM,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,qBAAqB,EAAE;SAC3E,CAAC;QAGF,IAAO,CAAA,OAAA,GAAqB,EAAE,CAAC;QAC/B,IAAM,CAAA,MAAA,GAAsD,EAAE,CAAC;AAE/D,QAAA,IAAA,CAAA,MAAM,GAAwB;AAC5B,YAAA;AACE,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,GAAG,EAAE,iBAAiB;AACtB,gBAAA,KAAK,EAAE;AACL,oBAAA,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC;AAC9B,oBAAA,aAAa,EAAE,YAAY;AAC5B,iBAAA;AACD,gBAAA,UAAU,EAAE;AACV,oBAAA,UAAU,EAAE;AACV,wBAAA;AACE,4BAAA,GAAG,EAAE,IAAI;AACT,4BAAA,IAAI,EAAE,QAAQ;AACd,4BAAA,KAAK,EAAE,IAAI;AACX,4BAAA,KAAK,EAAE;AACL,gCAAA,WAAW,EAAE,aAAa;AAC1B,gCAAA,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC;AAC3B,gCAAA,QAAQ,EAAE,IAAI;AACf,6BAAA;AACD,4BAAA,UAAU,EAAE;AACV,gCAAA,MAAM,EAAE;AACN,oCAAA,UAAU,EAAE,CAAC,OAAoB,KAAI;wCACnC,MAAM,KAAK,GACT,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,KACrC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;AACxC,wCAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;qCAC3B;AACD,oCAAA,OAAO,EAAE,MAAM,OAAO,CAAC,sCAAsC,CAAC;AAC/D,iCAAA;AACF,6BAAA;AACF,yBAAA;AACD,wBAAA;AACE,4BAAA,GAAG,EAAE,QAAQ;AACb,4BAAA,IAAI,EAAE,WAAW;AACjB,4BAAA,WAAW,EAAE;gCACX,IAAI,EAAE,KAAK,IAAG;AACZ,oCAAA,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC;AAC3C,oCAAA,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE;AAC9B,wCAAA,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;qCAClC;AACD,oCAAA,OAAO,CAAC,SAAS,EAAE,cAAc,IAAI,KAAK,CAAC;iCAC5C;AACF,6BAAA;AACD,4BAAA,YAAY,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE;AACrC,4BAAA,KAAK,EAAE;AACL,gCAAA,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC;AAC/B,gCAAA,QAAQ,EAAE,IAAI;gCACd,aAAa,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CACxC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,EAC1B,SAAS,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CACA;AACrC,gCAAA,SAAS,EAAE,MAAM;AACjB,gCAAA,eAAe,EAAE,IAAI;gCACrB,eAAe,EAAE,CAAC,IAAI,CAAC;AACxB,6BAAA;AACD,4BAAA,KAAK,EAAE;AACL,gCAAA,MAAM,EAAE,MAAM,IACZ,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CACzB,GAAG,CAAC,OAAO,IAAG;oCACZ,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,GAAG,OAAO,CAAC;AAChD,oCAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AAC1B,iCAAC,CAAC,CACH;AACJ,6BAAA;AACF,yBAAA;AACD,wBAAA;AACE,4BAAA,GAAG,EAAE,OAAO;AACZ,4BAAA,IAAI,EAAE,WAAW;AACjB,4BAAA,WAAW,EAAE;AACX,gCAAA,gBAAgB,EAAE,CAAC,KAAwB,KAAI;AAC7C,oCAAA,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC;AAC3C,oCAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;AAC1B,oCAAA,IAAI,SAAS,EAAE,cAAc,EAAE;wCAC7B,IAAI,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,CAAC,UAAU,EAAE;AACzC,4CAAA,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;yCAClC;AACD,wCAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;qCACjD;AACD,oCAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC;AACjC,oCAAA,OAAO,KAAK,CAAC;iCACd;AACF,6BAAA;AACD,4BAAA,KAAK,EAAE;AACL,gCAAA,QAAQ,EAAE,KAAK;AACf,gCAAA,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC;AAC9B,gCAAA,WAAW,EAAE,OAAO,CAClB,kEAAkE,CACnE;AACD,gCAAA,SAAS,EAAE,MAAM;AACjB,gCAAA,eAAe,EAAE,MAAM;gCACvB,eAAe,EAAE,CAAC,IAAI,CAAC;AACvB,gCAAA,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE;AACjC,6BAAA;AACD,4BAAA,KAAK,EAAE;AACL,gCAAA,MAAM,EAAE,MAAM,IACZ,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CACzB,GAAG,CAAC,OAAO,IAAG;oCACZ,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,GAAG,OAAO,CAAC;AAChD,oCAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AAC1B,iCAAC,CAAC,CACH;AACJ,6BAAA;AACF,yBAAA;AACD,wBAAA;AACE,4BAAA,GAAG,EAAE,iBAAiB;AACtB,4BAAA,IAAI,EAAE,QAAQ;AACd,4BAAA,WAAW,EAAE;AACX,gCAAA,IAAI,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM;AACjD,6BAAA;AACD,4BAAA,KAAK,EAAE;AACL,gCAAA,WAAW,EAAE,aAAa;AAC1B,gCAAA,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC;AACnC,gCAAA,QAAQ,EAAE,IAAI;AACf,6BAAA;AACD,4BAAA,KAAK,EAAE;AACL,gCAAA,MAAM,EAAE,MAAM,IACZ,IAAI,CAAC,OAAO,CAAC,IAAI,CACf,GAAG,CAAC,MAAM,IAAG;oCACX,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;AACvC,oCAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AAC1B,iCAAC,CAAC,CACH;AACJ,6BAAA;AACF,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;SACF,CAAC;AAEM,QAAA,IAAA,CAAA,QAAQ,GAAkB,IAAI,OAAO,EAAE,CAAC;QACxC,IAAkB,CAAA,kBAAA,GAAyC,EAAE,CAAC;QAapE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC;KACvD;IAED,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;KACzB;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;KAC1B;AAED,IAAA,cAAc,CAAC,WAAmD,EAAA;QAChE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;KACvF;IAED,SAAS,CAAC,KAA6C,EAAE,cAAmB,EAAA;QAC1E,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/C,YAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;AACtB,gBAAA,eAAe,EAAE;AACf,oBAAA,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,IAClC,cAAc,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CACpD;AACF,iBAAA;AACF,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;SACzB;AACD,QAAA,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;KAC3B;AAEO,IAAA,MAAM,CAAC,WAAmD,EAAA;QAChE,IAAI,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,GAAG,CAAC,EAAE;YAC3C,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAE1D,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAC/C,CAAC,EAAsC,KAAI;gBACzC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACjC,gBAAA,IAAI,IAAI,GAAwD,EAAE,EAAE,EAAE,CAAC;AAEvE,gBAAA,IAAI,MAAM,EAAE,EAAE,EAAE;oBACd,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;iBACzC;AAED,gBAAA,IAAI,KAAK,EAAE,EAAE,EAAE;oBACb,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;iBACvC;AAED,gBAAA,OAAO,IAAI,CAAC;AACd,aAAC,CACF,CAAC;AAEF,YAAA,IAAI,CAAC,qBAAqB;iBACvB,cAAc,CAAC,UAAU,CAAC;AAC1B,iBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBAC9B,SAAS,CAAC,QAAQ,IAAG;AACpB,gBAAA,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;gBAChC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC3B,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAChE,wBAAA,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO;AAC9C,wBAAA,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,SAAS;AAC7C,qBAAA,CAAC,CAAC;iBACJ;AAED,gBAAA,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC1B,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AAChE,wBAAA,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO;AAC9C,wBAAA,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,SAAS;AAC7C,qBAAA,CAAC,CAAC;iBACJ;gBAED,IAAI,WAAW,EAAE;AACf,oBAAA,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;iBAC5B;AACH,aAAC,CAAC,CAAC;SACN;KACF;AAEO,IAAA,aAAa,CAAC,WAAmD,EAAA;QACvE,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAC1D,QAAA,IAAI,CAAC,yBAAyB;aAC3B,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;aAC/D,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAI;AACtB,YAAA,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;gBACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,IAAG;oBAChD,OAAO;wBACL,EAAE,EAAE,KAAK,CAAC,QAAQ;wBAClB,OAAO,EAAE,KAAK,CAAC,aAAa;qBAC7B,CAAC;AACJ,iBAAC,CAAC,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aACnF;AACD,YAAA,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC7B,SAAC,CAAC;aACD,KAAK,CAAC,MAAK;AACV,YAAA,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC7B,SAAC,CAAC,CAAC;KACN;AAEO,IAAA,sBAAsB,CAAC,IAAS,EAAA;QACtC,MAAM,cAAc,GAAG,aAAa,CAAC;QAErC,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,IAAG;YAC/B,OAAO;gBACL,EAAE,EAAE,EAAE,CAAC,EAAE;AACT,gBAAA,SAAS,EAAE,cAAc;gBACzB,cAAc,EAAE,EAAE,CAAC,eAAe;AAClC,gBAAA,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE;AACxB,gBAAA,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE;aAC5B,CAAC;AACJ,SAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,UAAU;aACvB,GAAG,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aACrE,IAAI,CAAC,IAAI,CAAC,CAAC;AAEd,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AACxC,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AAC1D,QAAA,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAyB,uBAAA,CAAA,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;KAC1E;IAGO,eAAe,GAAA;QACrB,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1F;IAGO,WAAW,GAAA;QACjB,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;KACrF;IAGO,UAAU,GAAA;QAChB,OAAO,KAAK,CAAC,MACX,IAAI,CACF,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAC7B,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EACtE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CACnB,CACF,CACF,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;KACxB;+GA/TU,kCAAkC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,6BAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAlC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kCAAkC,uEC5C/C,g6LAuJA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,eAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,qBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,EAAA,cAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,cAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAN,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAG,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA,EAAA;;ADiMU,UAAA,CAAA;AADP,IAAA,OAAO,EAAE;;;oCACiB,UAAU,CAAA;AAEpC,CAAA,EAAA,kCAAA,CAAA,SAAA,EAAA,iBAAA,EAAA,IAAA,CAAA,CAAA;AAGO,UAAA,CAAA;AADP,IAAA,OAAO,EAAE;;;oCACa,UAAU,CAAA;AAEhC,CAAA,EAAA,kCAAA,CAAA,SAAA,EAAA,aAAA,EAAA,IAAA,CAAA,CAAA;AAGO,UAAA,CAAA;AADP,IAAA,OAAO,EAAE;;;oCACY,UAAU,CAAA;AAS/B,CAAA,EAAA,kCAAA,CAAA,SAAA,EAAA,YAAA,EAAA,IAAA,CAAA,CAAA;4FA/TU,kCAAkC,EAAA,UAAA,EAAA,CAAA;kBAL9C,SAAS;+BACE,iCAAiC,EAAA,eAAA,EAE1B,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,g6LAAA,EAAA,CAAA;qVA8SvC,eAAe,EAAA,EAAA,EAKf,WAAW,EAAA,EAAA,EAKX,UAAU,EAAA,EAAA,EAAA,EAAA,CAAA;;ME1VP,wCAAwC,CAAA;AACnD,IAAA,WAAA,CAAoB,YAA4B,EAAA;QAA5B,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAgB;KAAI;AAEpD,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,kCAAkC,EAAE;AACzD,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,eAAe,EAAE,YAAY;AAC7B,YAAA,cAAc,EAAE,aAAa;AAC7B,YAAA,mBAAmB,EAAE,IAAI;AAC1B,SAAA,CAAC,CAAC;KACJ;+GAVU,wCAAwC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAH,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAxC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wCAAwC,8ECRrD,yKAIA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FDIa,wCAAwC,EAAA,UAAA,EAAA,CAAA;kBAJpD,SAAS;+BACE,wCAAwC,EAAA,QAAA,EAAA,yKAAA,EAAA,CAAA;;;AEiCpD;;;AAGG;MACU,wBAAwB,GAAG,IAAI,cAAc,CACxD,0BAA0B,EAC1B;AAEF;;;;;;;;;;;;;;;;;;;;AAoBG;AACa,SAAA,sBAAsB,CACpC,YAAsD,EACtD,OAAqC,EAAA;IAErC,OAAO,WAAW,CAA0B,YAAY,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC;AAC/F,CAAC;AAED;;AAEG;AAIG,MAAO,8BAA+B,SAAQ,oCAAwD,CAAA;AAC1G,IAAA,WAAA,CACE,YAAsB,EACd,MAAc,EACtB,OAA8B,EAAA;AAE9B,QAAA,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAHrB,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;AAItB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;KAC3C;IAES,oBAAoB,GAAA;QAC5B,OAAO,eAAe,CAAqB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE;AACrE,YAAA,MACE,OAAO,CACL,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,wBAAwB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAC3F;AACH,YAAA,MAAM,IAAI,CAAC,SAAS;AACrB,SAAA,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;KACxC;+GAlBU,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,8BAA8B,cAF7B,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAH1C,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCrEY,+BAA+B,CAAA;IAiB1C,WACU,CAAA,8BAA8D,EAC9D,qBAA4C,EAAA;QAD5C,IAA8B,CAAA,8BAAA,GAA9B,8BAA8B,CAAgC;QAC9D,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAAuB;QAlBtD,IAAO,CAAA,OAAA,GAAG,IAAI,CAAC,8BAA8B,CAAC,MAAM,CAAC,IAAI,CACvD,GAAG,CAAC,KAAK,IACP,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CACzF,CACF,CAAC;QAEF,IAAK,CAAA,KAAA,GAAG,IAAI,CAAC,8BAA8B,CAAC,MAAM,CAAC,IAAI,CACrD,GAAG,CAAC,KAAK,IACP,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CACvF,CACF,CAAC;QAEF,IAAM,CAAA,MAAA,GAAwB,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAClE,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,CAC9B,CAAC;KAKE;+GApBO,+BAA+B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,8BAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAA/B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,+BAA+B,oECV5C,o7DAkDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,qBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FDxCa,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAJ3C,SAAS;+BACE,8BAA8B,EAAA,QAAA,EAAA,o7DAAA,EAAA,CAAA;;;MEoB7B,+BAA+B,CAAA;IAwC1C,WACU,CAAA,qBAA4C,EAC5C,wBAAwD,EACxD,eAAgC,EAChC,YAA0B,EAC1B,gBAAkC,EAClC,cAA8B,EAAA;QAL9B,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAAuB;QAC5C,IAAwB,CAAA,wBAAA,GAAxB,wBAAwB,CAAgC;QACxD,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;QAChC,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAc;QAC1B,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAc,CAAA,cAAA,GAAd,cAAc,CAAgB;QAvCxC,IAAoB,CAAA,oBAAA,GAAG,KAAK,CAAC;QAC7B,IAAkB,CAAA,kBAAA,GAAG,KAAK,CAAC;QAC3B,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;QAClB,IAAU,CAAA,UAAA,GAAsC,eAAe,CAAC;QAChE,IAAM,CAAA,MAAA,GAAG,wBAAwB,CAAC;AAEzB,QAAA,IAAA,CAAA,WAAW,GAAG;AACrB,YAAA,CAAC,wBAAwB,CAAC,sBAAsB,GAAG;AACjD,gBAAA,KAAK,EAAE,OAAO,CAAC,wBAAwB,CAAC;AACxC,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,GAAG,EAAE,aAAa;AACnB,aAAA;AACD,YAAA,CAAC,wBAAwB,CAAC,kBAAkB,GAAG;AAC7C,gBAAA,KAAK,EAAE,OAAO,CAAC,oBAAoB,CAAC;AACpC,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,GAAG,EAAE,WAAW;AACjB,aAAA;AACD,YAAA,CAAC,wBAAwB,CAAC,QAAQ,GAAG;AACnC,gBAAA,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC;AAC1B,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,GAAG,EAAE,cAAc;AACpB,aAAA;AACD,YAAA,CAAC,wBAAwB,CAAC,OAAO,GAAG;AAClC,gBAAA,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC;AACzB,gBAAA,IAAI,EAAE,KAAK;AACX,gBAAA,GAAG,EAAE,aAAa;AACnB,aAAA;SACF,CAAC;AAEM,QAAA,IAAA,CAAA,YAAY,GAAkB,IAAI,OAAO,EAAE,CAAC;QACnC,IAAoB,CAAA,oBAAA,GACnC,IAAI,eAAe,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;KAS3D;IAEJ,QAAQ,GAAA;QACN,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,uBAAuB,EAAE,CAAC;AAE/B,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,2BAA2B,CAAC,IAAI,CAChF,GAAG,CAAC,GAAG,KAAK;AACV,YAAA,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE;gBACrB,CAAC,EAAE,MAAM,EAAE,MAAM,MAAM,KAAK,wBAAwB,CAAC,kBAAkB,GAAG,CAAC,GAAG,CAAC,CAAC;gBAChF,eAAe;aAChB,CAAC;YACF,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,CAAC,CAAC,CACJ,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC;QAChD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CACvC,MAAM,CAAC,uBAAuB,IAAI,uBAAuB,CAAC,SAAS,CAAC,EACpE,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAClB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAC1B,OAAO,CACL,uFAAuF,CACxF,EACD,EAAE,UAAU,EAAE,KAAK,EAAE,CACtB,CACF,CACF,CAAC;QACF,IAAI,CAAC,qBAAqB,CAAC,QAAQ;AAChC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAClC,aAAA,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;AAEhD,QAAA,IAAI,CAAC,wBAAwB;AAC1B,aAAA,SAAS,EAAE;AACX,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAClC,aAAA,SAAS,CAAC,CAAC,SAAmC,KAAI;AACjD,YAAA,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC1D,SAAC,CAAC,CAAC;KACN;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;KAC9B;AAED,IAAA,UAAU,CAAC,IAAI,EAAA;AACb,QAAA,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;KACrD;IAED,MAAM,MAAM,CAAC,EAAU,EAAA;AACrB,QAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAC/C,OAAO,CAAC,4BAA4B,CAAC,EACrC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAC3B,OAAO,CACL,sFAAsF,CACvF,EACD,EAAE,EAAE,EAAE,CACP,EACD,MAAM,CAAC,MAAM,EACb;AACE,YAAA,EAAE,EAAE,OAAO,CAAC,qBAAqB,CAAC;AAClC,YAAA,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;AACzB,SAAA,CACF,CAAC;QAEF,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACvC;KACF;AAED,IAAA,MAAM,CAAC,OAA4B,EAAA;AACjC,QAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC5C;IAED,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,CAAC;KACxC;IAED,YAAY,GAAA;AACV,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,CACnE,wBAAwB,CAAC,kBAAkB,CAC5C,CAAC;AACF,QAAA,OAAO,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;KACpE;IAED,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;KACnC;AAED,IAAA,WAAW,CAAC,SAA4C,EAAA;AACtD,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;KAC7B;AAED,IAAA,MAAM,uBAAuB,GAAA;AAC3B,QAAA,MAAM,IAAI,IACP,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CACxC,qBAAqB,EACrB,uBAAuB,EACvB,8BAA8B,CAAC,QAAQ,CACxC,CAAmC,CAAC;AACvC,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,oBAAoB,GAAG,IAAI,KAAK,8BAA8B,CAAC,QAAQ,CAAC;KAC9E;AAED,IAAA,MAAM,qBAAqB,GAAA;QACzB,IAAI,CAAC,kBAAkB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE,CAAC;KAC3E;AAED,IAAA,4BAA4B,CAAC,IAAyB,EAAA;AACpD,QAAA,QACE,IAAI;AACJ,YAAA,IAAI,CAAC,MAAM,KAAK,wBAAwB,CAAC,kBAAkB;AAC3D,YAAA,IAAI,CAAC,iCAAiC,EAAE,EACxC;KACH;IAED,iCAAiC,GAAA;QAC/B,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,KAAK,8BAA8B,CAAC,OAAO,CAAC;KACxF;+GArKU,+BAA+B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAAJ,IAAA,CAAA,8BAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAR,IAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAQ,IAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAA/B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,+BAA+B,oEC3B5C,w0cAuYA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,OAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,aAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,+BAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FD5Wa,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAJ3C,SAAS;+BACE,8BAA8B,EAAA,QAAA,EAAA,w0cAAA,EAAA,CAAA;;;MEpB7B,+BAA+B,CAAA;AAC1C,IAAA,WAAA,CAAoB,WAAwB,EAAA;QAAxB,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;KAAI;IAChD,GAAG,GAAA;AACD,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;AACpD,YAAA,WAAW,CAAC,yBAAyB;AACrC,YAAA,WAAW,CAAC,wBAAwB;AACrC,SAAA,CAAC,CAAC;QACH,MAAM,GAAG,GAAoB,EAAE,CAAC;QAChC,IAAI,iBAAiB,EAAE;AACrB,YAAA,GAAG,CAAC,IAAI,CACN,IAAI,aAAa,CAAC;AAChB,gBAAA,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC;AAC9B,gBAAA,IAAI,EAAE,oBAAoB;AAC1B,gBAAA,IAAI,EAAE,qBAAqB;AAC3B,gBAAA,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC;AAC1B,gBAAA,iBAAiB,EAAE,IAAI;AACvB,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA,CAAC,CACH,CAAC;SACH;AACD,QAAA,OAAO,GAAG,CAAC;KACZ;+GArBU,+BAA+B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAP,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;mHAA/B,+BAA+B,EAAA,CAAA,CAAA,EAAA;;4FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAD3C,UAAU;;;MCKE,uCAAuC,CAAA;IAClD,WACY,CAAA,kBAAsC,EACtC,YAA6B,EAAA;QAD7B,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB,CAAoB;QACtC,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAiB;KACrC;AAEM,IAAA,cAAc,CAAC,WAAmB,EAAA;QAC1C,OAAO,CAAA,EAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,WAAW,CAAC;KAC1D;AAES,IAAA,iBAAiB,CAAC,WAAmB,EAAA;QAC7C,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5C,MAAM,IAAI,KAAK,CACb,OAAO,CAAC,0EAA0E,CAAC,CACpF,CAAC;SACH;QACD,OAAO,CAAA,SAAA,EAAY,WAAW,CAAA,mBAAA,CAAqB,CAAC;KACrD;IAES,MAAM,8BAA8B,CAC5C,IAAa,EAAA;QAEb,IAAI,SAAS,GAA2C,EAAE,CAAC;AAC3D,QAAA,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC3D,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7C,SAAS,GAAG,IAAI,CAAC,kCAAkC,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,MAAM,CAC7E,IAAI,CAAC,0BAA0B,CAAC,aAAa,EAAE,IAAI,CAAC,CACrD,CAAC;SACH;AACD,QAAA,OAAO,SAAS,CAAC;KAClB;AAEO,IAAA,MAAM,uBAAuB,GAAA;QACnC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CACvD,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAC/C;AACE,YAAA,mBAAmB,EAAE,IAAI;AACzB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,QAAQ,EAAE,GAAG;AACb,YAAA,cAAc,EAAE,IAAI;AACrB,SAAA,CACF,CAAC;AACF,QAAA,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,eAAe,CAAC,YAAY,CAAC,CAAC;KAC1E;IAEO,kCAAkC,CACxC,YAA4B,EAC5B,IAAa,EAAA;AAEb,QAAA,OAAO,OAAO,CAAC,YAAY,EAAE,WAAW,IAAG;YACzC,OAAO,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,SAAS,IAAG;gBACxD,OAAO,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,WAAW,EAA0B,CAAC;AACxF,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,6CAA6C,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;KAC3F;IAEO,0BAA0B,CAChC,YAA4B,EAC5B,IAAa,EAAA;AAEb,QAAA,OAAO,OAAO,CAAC,YAAY,EAAE,WAAW,IAAG;YACzC,OAAO,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,IAAG;gBAC7C,OAAO;AACL,oBAAA,GAAG,SAAS;oBACZ,WAAW,EAAE,WAAW,CAAC,WAAW;iBACG,CAAC;AAC5C,aAAC,CAAC,CAAC;AACL,SAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,6CAA6C,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;KAC3F;IAEO,6CAA6C,CACnD,SAA+C,EAC/C,IAAa,EAAA;QAEb,IAAI,IAAI,EAAE;AACR,YAAA,OAAO,SAAS,EAAE,IAAI,KAAK,kCAAkC,CAAC;SAC/D;aAAM;AACL,YAAA,OAAO,SAAS,EAAE,IAAI,KAAK,8BAA8B,CAAC;SAC3D;KACF;AACF;;AChFK,MAAO,mCAAoC,SAAQ,uCAAuC,CAAA;AAC9F,IAAA,WAAA,CACY,kBAAsC,EACtC,YAA6B,EAC/B,MAAmB,EAAA;AAE3B,QAAA,KAAK,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;QAJ9B,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB,CAAoB;QACtC,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAiB;QAC/B,IAAM,CAAA,MAAA,GAAN,MAAM,CAAa;KAG5B;IAED,MAAM,SAAS,CAAC,WAAmB,EAAA;AACjC,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE;YACzE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;AAC/C,SAAA,CAAC,CAAC;AACH,QAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACzC,MAAM,IAAI,KAAK,CACb,OAAO,CACL,iGAAiG,CAClG,CACF,CAAC;SACH;QAED,OAAO,IAAI,CAAC,sBAAsB,CAAC;KACpC;IAED,8BAA8B,GAAA;AAC5B,QAAA,OAAO,KAAK,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC;KACpD;AAED,IAAA,MAAM,cAAc,CAAC,WAAmB,EAAE,KAAU,EAAA;QAClD,MAAM,MAAM,GAAG,MAAM,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;AACnF,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE;YACvE,MAAM;YACN,IAAI;YACJ,OAAO;AACR,SAAA,CAAC,CAAC;AACH,QAAA,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;AAC9B,QAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;KACtB;+GAzCU,mCAAmC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAO,IAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAP,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;mHAAnC,mCAAmC,EAAA,CAAA,CAAA,EAAA;;4FAAnC,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBAD/C,UAAU;;;MCOE,4CAA4C,CAAA;AAiBvD,IAAA,WAAA,CACU,qBAA0D,EAC1D,qBAA4C,EAC5C,UAAsB,EACtB,gBAAkC,EAAA;QAHlC,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAAqC;QAC1D,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAAuB;QAC5C,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACtB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAlB5C,IAAa,CAAA,aAAA,GAAG,KAAK,CAAC;QACtB,IAAK,CAAA,KAAA,GAAgB,EAAE,CAAC;QACxB,IAAK,CAAA,KAAA,GAAQ,EAAE,CAAC;AAQC,QAAA,IAAA,CAAA,YAAY,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;AACvD,QAAA,IAAA,CAAA,uBAAuB,GAAG,OAAO,CAAC,0CAA0C,CAAC,CAAC;AAC9E,QAAA,IAAA,CAAA,aAAa,GAAG,OAAO,CAAC,mCAAmC,CAAC,CAAC;KAO1E;IAEJ,QAAQ,GAAA;QACN,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAC9D;AAED,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,qBAAqB;aACnD,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC;aAC5C,KAAK,CAAC,MAAK;YACV,OAAO;AACL,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,IAAI,EAAE,SAAS;aAChB,CAAC;AACJ,SAAC,CAAC;aACD,OAAO,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AAC3B,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACtB,SAAC,CAAC,CAAC;AAEL,QAAA,IAAI,GAAG,IAAI,IAAI,EAAE;AACf,YAAA,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;gBACzC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;aACrD;AAAM,iBAAA,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE;AAC5B,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;aACrC;iBAAM;gBACL,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,oCAAoC,CAAC,KAAK,EAAE;AAC7E,oBAAA,MAAM,EAAE,oCAAoC,CAAC,MAAM,CAAC,OAAO;AAC3D,oBAAA,SAAS,EAAE,oCAAoC,CAAC,SAAS,CAAC,iBAAiB;AAC5E,iBAAA,CAAC,CAAC;AACH,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC;aAC7C;SACF;aAAM;AACL,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SACtC;KACF;IAED,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;KACxB;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;KACxB;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC;KAChC;IAED,kBAAkB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;KAC7D;IAED,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACpD,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,OAAO,UAAU,CAAC,KAAK,CAAC;aACzB;iBAAM;gBACL,OAAO,UAAU,CAAC,IAAI,CAAC;aACxB;SACF;aAAM;YACL,OAAO,UAAU,CAAC,MAAM,CAAC;SAC1B;KACF;AAEO,IAAA,WAAW,CAAC,OAAe,EAAA;QACjC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,oCAAoC,CAAC,KAAK,EAAE;AAC7E,YAAA,MAAM,EAAE,oCAAoC,CAAC,MAAM,CAAC,OAAO;AAC3D,YAAA,SAAS,EAAE,oCAAoC,CAAC,SAAS,CAAC,iBAAiB;AAC5E,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;KAC7B;+GAhGU,4CAA4C,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAa,mCAAA,EAAA,EAAA,EAAA,KAAA,EAAAJ,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAAV,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAW,IAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGAA5C,4CAA4C,EAAA,QAAA,EAAA,4CAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAM5C,UAAU,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBvB,orEAyDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,qBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,EAAA,cAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FD3Ca,4CAA4C,EAAA,UAAA,EAAA,CAAA;kBAJxD,SAAS;+BACE,4CAA4C,EAAA,QAAA,EAAA,orEAAA,EAAA,CAAA;gMAUtD,OAAO,EAAA,CAAA;sBADN,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;gBAG9B,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBACG,MAAM,EAAA,CAAA;sBAAd,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;;;MEbK,0CAA0C,CAAA;AAOrD,IAAA,WAAA,CACS,UAAsB,EACrB,UAAyB,EACzB,mBAAwD,EAAA;QAFzD,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACrB,IAAU,CAAA,UAAA,GAAV,UAAU,CAAe;QACzB,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAAqC;QANlE,IAAM,CAAA,MAAA,GAAa,EAAE,CAAC;KAOlB;AAEJ,IAAA,MAAM,QAAQ,GAAA;QACZ,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAuC,MAAM,IAAI,CAAC,mBAAmB;AACxF,aAAA,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;aAC3B,KAAK,CAAC,KAAK,IAAG;AACb,YAAA,IAAI,CAAC,mBAAmB;AACtB,gBAAA,KAAK,EAAE,OAAO,IAAI,OAAO,CAAC,uDAAuD,CAAC,CAAC;YACrF,OAAO;AACL,gBAAA,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;aACxB,CAAC;AACJ,SAAC,CAAC,CAAC;AACL,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,IAAiB,KAAI;YAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAsB,CAAC,CAAC;AACpE,SAAC,CAAC,CAAC;KACJ;+GA5BU,0CAA0C,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAV,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAO,IAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAO,mCAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAA1C,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0CAA0C,4ECZvD,2gDAgDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,eAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,4CAAA,EAAA,QAAA,EAAA,4CAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAR,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FDpCa,0CAA0C,EAAA,UAAA,EAAA,CAAA;kBAJtD,SAAS;+BACE,sCAAsC,EAAA,QAAA,EAAA,2gDAAA,EAAA,CAAA;;;MECrC,2CAA2C,CAAA;IAGtD,WACU,CAAA,yBAA8D,EAC9D,YAA4B,EAAA;QAD5B,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB,CAAqC;QAC9D,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAgB;KAClC;IAEJ,QAAQ,GAAA;QACN,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,yBAAyB,CAAC,8BAA8B,EAAE,CAAC;KAC1F;AAED,IAAA,KAAK,CAAC,gBAAsD,EAAA;AAC1D,QAAA,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC;AAC/C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,0CAA0C,EAAE;AACjE,YAAA,YAAY,EAAE,EAAE,IAAI,EAAE,WAAW,EAAyD;AAC1F,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,eAAe,EAAE,YAAY;AAC7B,YAAA,cAAc,EAAE,aAAa;AAC7B,YAAA,mBAAmB,EAAE,IAAI;AAC1B,SAAA,CAAC,CAAC;KACJ;+GArBU,2CAA2C,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAM,mCAAA,EAAA,EAAA,EAAA,KAAA,EAAAN,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAA3C,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2CAA2C,+ECVxD,sQAMA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAR,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAW,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAX,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAW,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FDIa,2CAA2C,EAAA,UAAA,EAAA,CAAA;kBAJvD,SAAS;+BACE,yCAAyC,EAAA,QAAA,EAAA,sQAAA,EAAA,CAAA;;;AEC/C,MAAO,uCAAwC,SAAQ,uCAAuC,CAAA;AAClG,IAAA,WAAA,CACY,kBAAsC,EACtC,YAA6B,EAC/B,MAAmB,EAAA;AAE3B,QAAA,KAAK,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;QAJ9B,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB,CAAoB;QACtC,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAiB;QAC/B,IAAM,CAAA,MAAA,GAAN,MAAM,CAAa;KAG5B;IAED,8BAA8B,GAAA;AAC5B,QAAA,OAAO,KAAK,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC;KACnD;IAED,MAAM,kBAAkB,CAAC,WAAmB,EAAA;AAC1C,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE;YACpE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;AAC/C,SAAA,CAAC,CAAC;QACH,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEpD,IAAI,CAAC,sBAAsB,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE;YAC3D,MAAM,IAAI,KAAK,CACb,OAAO,CACL,+FAA+F,CAChG,CACF,CAAC;SACH;QAED,OAAO,sBAAsB,CAAC,IAAI,CAAC;KACpC;AAED,IAAA,MAAM,MAAM,CAAC,GAAS,EAAE,WAAW,EAAA;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACpF,QAAA,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;AAC9B,QAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;KACtB;AAED,IAAA,UAAU,CAAC,WAAmB,EAAA;QAC5B,OAAO,CAAA,EAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,OAAO,CAAC;KACtD;AAEO,IAAA,uBAAuB,CAAC,IAAS,EAAA;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAC3C,QAAA,OAAO,IAAI,CAAC;KACb;+GA/CU,uCAAuC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAV,EAAA,CAAA,kBAAA,EAAA,EAAA,EAAA,KAAA,EAAAO,IAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAP,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;mHAAvC,uCAAuC,EAAA,CAAA,CAAA,EAAA;;4FAAvC,uCAAuC,EAAA,UAAA,EAAA,CAAA;kBADnD,UAAU;;;ACQX,MAAM,sCAAsC,GAAW;AACrD,IAAA,OAAO,EAAE,8CAA8C;AACvD,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,UAAU,EAAE;AACV,QAAA,WAAW,EAAE;AACX,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC;AACjC,YAAA,WAAW,EAAE,OAAO,CAClB,uGAAuG,CACxG;AACD,YAAA,gBAAgB,EAAE,KAAK;AACxB,SAAA;AACF,KAAA;IACD,QAAQ,EAAE,CAAC,aAAa,CAAC;AACzB,IAAA,oBAAoB,EAAE,KAAK;CAC5B,CAAC;MAMW,8CAA8C,CAAA;IAczD,WACU,CAAA,UAAyB,EACzB,uCAAgF,EAChF,qBAA4C,EAC5C,UAAsB,EACtB,gBAAkC,EAAA;QAJlC,IAAU,CAAA,UAAA,GAAV,UAAU,CAAe;QACzB,IAAuC,CAAA,uCAAA,GAAvC,uCAAuC,CAAyC;QAChF,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAAuB;QAC5C,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACtB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAb5C,IAAY,CAAA,YAAA,GAAG,KAAK,CAAC;QACrB,IAAO,CAAA,OAAA,GAAG,KAAK,CAAC;AAGhB,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;QACzB,IAAK,CAAA,KAAA,GAAG,EAAE,CAAC;KASP;AAEJ,IAAA,MAAM,QAAQ,GAAA;QACZ,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAC9B,MAAM,IAAI,CAAC,uCAAuC;AAC/C,aAAA,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC;aACpC,KAAK,CAAC,KAAK,IAAG;AACb,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;AAC7B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YAEzB,OAAO;AACL,gBAAA,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;AACvB,gBAAA,eAAe,EAAE,EAAE;aACpB,CAAC;AACJ,SAAC,CAAC,CAAC;AAEP,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,sCAAsC,CAAC,CAAC,CAAC;AACxF,QAAA,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC;KACjC;AAED,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAwB,MAAM,IAAI,CAAC,uCAAuC;AAC1F,aAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;aAClD,KAAK,CAAC,MAAK;YACV,OAAO;AACL,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,IAAI,EAAE,SAAS;aAChB,CAAC;AACJ,SAAC,CAAC;aACD,OAAO,CAAC,MAAK;AACZ,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACrB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACtB,SAAC,CAAC,CAAC;AAEL,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;AAEjC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;YACvD,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,oCAAoC,CAAC,KAAK,EAAE;AAC7E,gBAAA,MAAM,EAAE,oCAAoC,CAAC,MAAM,CAAC,OAAO;AAC3D,gBAAA,SAAS,EAAE,oCAAoC,CAAC,SAAS,CAAC,eAAe;AAC1E,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;SACjB;QAED,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;AACzC,gBAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;gBACtD,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,oCAAoC,CAAC,KAAK,EAAE;AAC7E,oBAAA,MAAM,EAAE,oCAAoC,CAAC,MAAM,CAAC,OAAO;AAC3D,oBAAA,SAAS,EAAE,oCAAoC,CAAC,SAAS,CAAC,eAAe;AAC1E,iBAAA,CAAC,CAAC;aACJ;AAAM,iBAAA,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE;AAC5B,gBAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,oDAAoD,CAAC,CAAC;gBAC7E,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,oCAAoC,CAAC,KAAK,EAAE;AAC7E,oBAAA,MAAM,EAAE,oCAAoC,CAAC,MAAM,CAAC,OAAO;AAC3D,oBAAA,SAAS,EAAE,oCAAoC,CAAC,SAAS,CAAC,eAAe;AAC1E,iBAAA,CAAC,CAAC;aACJ;SACF;aAAM;AACL,YAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,2DAA2D,CAAC,CAAC;SACrF;KACF;AAED,IAAA,OAAO,CAAC,KAAK,EAAA;AACX,QAAA,MAAM,WAAW,GAAI,KAAa,EAAE,WAAW,CAAC;AAChD,QAAA,OAAO,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;KACvD;IAED,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;KACxB;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;KACxB;+GAnGU,8CAA8C,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAgB,uCAAA,EAAA,EAAA,EAAA,KAAA,EAAAf,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGAA9C,8CAA8C,EAAA,QAAA,EAAA,gDAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAC9C,UAAU,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrCvB,8zHAsGA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,eAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,qBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,EAAA,cAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,cAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FDlEa,8CAA8C,EAAA,UAAA,EAAA,CAAA;kBAJ1D,SAAS;+BACE,gDAAgD,EAAA,QAAA,EAAA,8zHAAA,EAAA,CAAA;kOAIjB,OAAO,EAAA,CAAA;sBAA/C,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;;;ME3B5B,+CAA+C,CAAA;IAG1D,WACU,CAAA,uCAAgF,EAChF,YAA4B,EAAA;QAD5B,IAAuC,CAAA,uCAAA,GAAvC,uCAAuC,CAAyC;QAChF,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAgB;KAClC;IAEJ,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,qBAAqB;AACxB,YAAA,IAAI,CAAC,uCAAuC,CAAC,8BAA8B,EAAE,CAAC;KACjF;AAED,IAAA,KAAK,CAAC,WAAW,EAAA;AACf,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,8CAA8C,EAAE;YACrE,YAAY,EAAE,EAAE,WAAW,EAA6D;AACxF,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,eAAe,EAAE,YAAY;AAC7B,YAAA,cAAc,EAAE,aAAa;AAC7B,YAAA,mBAAmB,EAAE,IAAI;AAC1B,SAAA,CAAC,CAAC;KACJ;+GArBU,+CAA+C,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAiB,uCAAA,EAAA,EAAA,EAAA,KAAA,EAAAV,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAA/C,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,+CAA+C,gFCV5D,6RAUA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAR,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAW,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAX,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAW,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FDAa,+CAA+C,EAAA,UAAA,EAAA,CAAA;kBAJ3D,SAAS;+BACE,0CAA0C,EAAA,QAAA,EAAA,6RAAA,EAAA,CAAA;;;MEEzC,qCAAqC,CAAA;AAGhD,IAAA,WAAA,CAAoB,YAA4B,EAAA;QAA5B,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAgB;KAAI;IAEpD,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,oCAAoC,EAAE;AAC3D,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,eAAe,EAAE,YAAY;AAC7B,YAAA,cAAc,EAAE,aAAa;AAC7B,YAAA,mBAAmB,EAAE,IAAI;AAC1B,SAAA,CAAC,CAAC;KACJ;+GAZU,qCAAqC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAV,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAArC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qCAAqC,gFCTlD,8JAIA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FDKa,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBAJjD,SAAS;+BACE,0CAA0C,EAAA,QAAA,EAAA,8JAAA,EAAA,CAAA;;;MEEzC,yBAAyB,CAAA;IACpC,GAAG,GAAA;QACD,OAAO;AACL,YAAA;AACE,gBAAA,QAAQ,EAAE,wCAAwC;AAClD,gBAAA,QAAQ,EAAE,GAAG;AACb,gBAAA,QAAQ,EAAE,QAAQ;AACG,aAAA;AACvB,YAAA;AACE,gBAAA,QAAQ,EAAE,2CAA2C;AACrD,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,QAAQ,EAAE,QAAQ;AACG,aAAA;AACvB,YAAA;AACE,gBAAA,QAAQ,EAAE,+CAA+C;AACzD,gBAAA,QAAQ,EAAE,EAAE;AACZ,gBAAA,QAAQ,EAAE,MAAM;AACK,aAAA;AACvB,YAAA;AACE,gBAAA,QAAQ,EAAE,qCAAqC;AAC/C,gBAAA,QAAQ,EAAE,GAAG;AACb,gBAAA,QAAQ,EAAE,MAAM;AACK,aAAA;SACxB,CAAC;KACH;+GAxBU,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;mHAAzB,yBAAyB,EAAA,CAAA,CAAA,EAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC,UAAU;;;ACsBX,MAAM,wBAAwB,GAAW;AACvC,IAAA;AACE,QAAA,IAAI,EAAE,oBAAoB;AAC1B,QAAA,SAAS,EAAE,+BAA+B;AAC3C,KAAA;CACF,CAAC;MAiCW,oBAAoB,CAAA;+GAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,iBApB7B,+BAA+B;YAC/B,kCAAkC;YAClC,wCAAwC;YACxC,oCAAoC;YACpC,qCAAqC;YACrC,2CAA2C;YAC3C,0CAA0C;YAC1C,4CAA4C;YAC5C,8CAA8C;YAC9C,+CAA+C;AAC/C,YAAA,+BAA+B,aAnB/B,gBAAgB;YAChB,aAAa;YACb,YAAY;YACZ,UAAU;YACV,aAAa;YACb,kBAAkB,EAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,CAAA,EAAA;AAwBT,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,EARpB,SAAA,EAAA;YACT,sBAAsB,CAAC,yBAAyB,CAAC;YACjD,aAAa,CAAC,+BAA+B,CAAC;YAC9C,8BAA8B;YAC9B,mCAAmC;YACnC,uCAAuC;AACxC,SAAA,EAAA,OAAA,EAAA,CA3BC,gBAAgB;YAChB,aAAa;YACb,YAAY;YACZ,UAAU;YACV,aAAa;YACb,kBAAkB;AAClB,YAAA,YAAY,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAA,EAAA,CAAA,CAAA,EAAA;;4FAuBtC,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBA/BhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,gBAAgB;wBAChB,aAAa;wBACb,YAAY;wBACZ,UAAU;wBACV,aAAa;wBACb,kBAAkB;AAClB,wBAAA,YAAY,CAAC,QAAQ,CAAC,wBAAwB,CAAC;AAChD,qBAAA;AACD,oBAAA,YAAY,EAAE;wBACZ,+BAA+B;wBAC/B,kCAAkC;wBAClC,wCAAwC;wBACxC,oCAAoC;wBACpC,qCAAqC;wBACrC,2CAA2C;wBAC3C,0CAA0C;wBAC1C,4CAA4C;wBAC5C,8CAA8C;wBAC9C,+CAA+C;wBAC/C,+BAA+B;AAChC,qBAAA;AACD,oBAAA,SAAS,EAAE;wBACT,sBAAsB,CAAC,yBAAyB,CAAC;wBACjD,aAAa,CAAC,+BAA+B,CAAC;wBAC9C,8BAA8B;wBAC9B,mCAAmC;wBACnC,uCAAuC;AACxC,qBAAA;AACF,iBAAA,CAAA;;;AClED;;AAEG;;;;"}