{"version":3,"file":"eydrian-api-engine.mjs","sources":["../../../projects/api-engine/src/lib/api-error-message/api-error-message.component.ts","../../../projects/api-engine/src/lib/api-error-message/api-error-message.module.ts","../../../projects/api-engine/src/lib/configuration/configuration.service.ts","../../../projects/api-engine/src/lib/models/timestamps.model.ts","../../../projects/api-engine/src/lib/models/api.models.ts","../../../projects/api-engine/src/lib/models/api-search-params.model.ts","../../../projects/api-engine/src/lib/models/error.model.ts","../../../projects/api-engine/src/lib/models/user.model.ts","../../../projects/api-engine/src/lib/api-service/api.service.ts","../../../projects/api-engine/src/lib/storage/storage.service.ts","../../../projects/api-engine/src/lib/authentication/authentication.service.ts","../../../projects/api-engine/src/lib/broadcast/broadcast.service.ts","../../../projects/api-engine/src/lib/api-service/api-interceptor.service.ts","../../../projects/api-engine/src/public_api.ts","../../../projects/api-engine/src/eydrian-api-engine.ts"],"sourcesContent":["import {\n  ChangeDetectionStrategy,\n  Component,\n  Input,\n  OnChanges,\n  SimpleChanges,\n} from '@angular/core';\n\nimport {\n  ErrorField,\n} from '../models';\n\n@Component({\n  selector: 'api-ng-error-message, api-error-message',\n  template: '<div [class.visible]=\"error?.message\">{{error?.message}}</div>',\n  styleUrls: [ './api-error-message.component.scss' ],\n  changeDetection: ChangeDetectionStrategy.Default,\n  standalone: false,\n})\nexport class ApiErrorMessageComponent implements OnChanges {\n  @Input() public error: ErrorField | null | undefined = null;\n  public errorState = false;\n\n  public ngOnChanges(changes: SimpleChanges): void {\n    this.errorState = !!changes['error'].currentValue?.message;\n  }\n\n}\n","import {\n  CommonModule,\n} from '@angular/common';\nimport {\n  NgModule,\n} from '@angular/core';\n\nimport {\n  ApiErrorMessageComponent,\n} from './api-error-message.component';\n\n@NgModule({\n  imports: [ CommonModule ],\n  declarations: [ ApiErrorMessageComponent ],\n  exports: [ ApiErrorMessageComponent ],\n})\nexport class ApiErrorMessageModule { }\n","import {\n  Inject,\n  Injectable,\n} from '@angular/core';\n\nimport {\n  IConfiguration,\n} from '../models/configuration.model';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class ConfigurationService {\n  public readonly apiURL: string;\n  public readonly storagePrefix: string;\n  public readonly production: boolean;\n  public xsrfEndpoint: string | null = null;\n\n  constructor(\n    @Inject('configuration') public configuration: IConfiguration,\n  ) {\n    this.apiURL = configuration.apiURL;\n    this.storagePrefix = configuration.storagePrefix;\n    this.production = configuration.production;\n    this.xsrfEndpoint = configuration.xsrfEndpoint ?\n      configuration.xsrfEndpoint : null;\n  }\n}\n","export interface ITimeStamp {\n  by: string;\n  at: Date;\n}\nexport interface ITimeStamps {\n  created: ITimeStamp;\n  updated: ITimeStamp;\n}\n\nexport class TimeStamps implements ITimeStamps {\n  public readonly created: ITimeStamp;\n  public readonly updated: ITimeStamp;\n\n  constructor(timestamps: ITimeStamps) {\n    this.created = {\n      ...timestamps.created,\n      at: new Date(timestamps.created.at),\n    };\n    this.updated = {\n      ...timestamps.updated,\n      at: new Date(timestamps.updated.at),\n    };\n  }\n}\n","import {\n  ITimeStamps,\n  TimeStamps,\n} from './timestamps.model';\n\nexport interface IMarkModel {\n  deleted: boolean;\n}\n\nexport interface IApiModel {\n  readonly _id: string;\n  readonly timestamps: Readonly<ITimeStamps>;\n}\n\nexport interface IApiDeletedModel extends IApiModel {\n  readonly mark: Readonly<IMarkModel>;\n}\n\nexport type IApiUpdateModel<T extends IApiModel> = Partial<T> & { readonly _id: string };\n\nexport type IApiCreateModel<T extends IApiModel> = Partial<Omit<T, '_id' | 'timestamps'>>;\n\nexport abstract class ApiModel implements IApiModel {\n  public readonly _id: string;\n  public readonly timestamps: Readonly<ITimeStamps>;\n\n  constructor(model: IApiModel) {\n    this._id = model._id;\n    this.timestamps = new TimeStamps(model.timestamps);\n  }\n}\n\nexport interface IApiMeta {\n  readonly count: number;\n  readonly limit: number;\n  readonly offset: number;\n  readonly total: number;\n}\n\nexport interface IApiResponse<T> {\n  readonly meta: IApiMeta;\n  readonly data: T[];\n}\n\nexport interface IApiXsrfResponse {\n  xsrfToken: string;\n}\n","import {\n  HttpParams,\n} from '@angular/common/http';\n\nexport type IApiQueryFilter = Record<string, string | number>;\n\nexport type IApiSort = Record<string, 1 | -1>;\nexport interface IApiSearchParams {\n  q?: string;\n  limit?: number;\n  offset?: number;\n  sort?: IApiSort;\n  filter?: IApiQueryFilter;\n}\n\nexport class APISearchParams implements IApiSearchParams {\n  public q?: string;\n  public limit?: number;\n  public offset?: number;\n  public sort?: IApiSort;\n  public filter?: IApiQueryFilter;\n\n  constructor(params: IApiSearchParams | null = null) {\n    this.q = params?.q ?? this.q;\n    this.limit = params?.limit ?? this.limit;\n    this.offset = params?.offset ?? this.offset;\n    this.filter = params?.filter ? { ...params.filter } : this.filter;\n    this.sort = params?.sort ? { ...params.sort } : this.sort;\n  }\n\n  public toHttpParams(): HttpParams {\n    let params = new HttpParams();\n\n    if (this.q) {\n      params = params.set('q', this.q);\n    }\n    if (typeof this.limit !== 'undefined') {\n      params = params.set('limit', this.limit.toFixed(0));\n    }\n    if (typeof this.offset !== 'undefined') {\n      params = params.set('offset', this.offset.toFixed(0));\n    }\n    if (this.sort) {\n      params = params.set('sort', JSON.stringify(this.sort));\n    }\n    if (this.filter) {\n      params = params.set('filter', JSON.stringify(this.filter));\n    }\n\n    return params;\n  }\n}\n","export interface ErrorField {\n    readonly kind?: string;\n    readonly message: string;\n    readonly name?: string;\n    readonly path?: string;\n    readonly properties?: Record<string, unknown>;\n    readonly value?: string;\n}\n\nexport interface IApiError {\n    readonly status?: number;\n    readonly id?: string;\n    readonly message?: string;\n    readonly fields: Record<string, ErrorField>;\n    readonly errors?: IApiError[];\n}\n\n\nexport class ApiError implements IApiError {\n  public readonly status?: number;\n  public readonly id?: string;\n  public readonly message?: string;\n  public readonly fields: Record<string, ErrorField> = {};\n  public readonly errors?: IApiError[];\n\n  constructor(err?: IApiError, status?: number) {\n    this.status = status;\n    if (err) {\n      this.id = err.id;\n      this.message = err.message;\n      this.fields = { ...err.fields };\n      if (err.errors && err.errors.length > 0) {\n        this.errors = err.errors.map(e => new ApiError(e, status));\n      }\n    }\n  }\n}\n","import {\n  ApiModel,\n  IApiModel,\n} from './api.models';\n\nexport interface ICreateUser {\n  firstName: string;\n  lastName: string;\n  email: string;\n  username: string;\n  roles: string[];\n  password: string;\n}\n\nexport type IUser = IApiModel & ICreateUser;\nexport type ILoginUser = Omit<IUser, 'ITimestamps'>;\n\nexport class User extends ApiModel implements IUser {\n  public firstName: string;\n  public lastName: string;\n  public email: string;\n  public username: string;\n  public roles: string[] = [];\n  public password: string;\n\n  constructor(model: IUser) {\n    super(model);\n\n    this.firstName = model.firstName;\n    this.lastName = model.lastName;\n    this.email = model.email;\n    this.username = model.username;\n    this.roles = [ ...model.roles ];\n    this.password = model.password;\n  }\n\n  public static newFrom(model: IUser | null = null): ICreateUser {\n    return {\n      firstName: model?.firstName ?? '',\n      lastName: model?.lastName ?? '',\n      email: model?.email ?? '',\n      username: model?.username ?? '',\n      roles: [ ...model?.roles ?? [] ],\n      password: model?.password ?? '',\n    };\n  }\n\n  public addRole(role: string): void {\n    this.roles.push(role.trim());\n  }\n\n\n  public removeRole(role: string): void {\n    const index = this.roles.indexOf(role.trim());\n\n    if (index >= 0) {\n      this.roles.splice(index, 1);\n    }\n  }\n\n}\n","import {\n  HttpClient,\n  HttpHeaders,\n} from '@angular/common/http';\nimport {\n  Injectable,\n  Injector,\n} from '@angular/core';\nimport {\n  Observable,\n} from 'rxjs';\n\nimport {\n  ConfigurationService,\n} from '../configuration/configuration.service';\nimport {\n  APISearchParams,\n  IApiCreateModel,\n  IApiModel,\n  IApiResponse,\n  IApiSearchParams,\n  IApiUpdateModel,\n} from '../models';\n\n// TODO: make abstract => fix specs\n@Injectable({\n  providedIn: 'root',\n})\nexport abstract class ApiService<T extends IApiModel> {\n  protected readonly httpClient: HttpClient;\n  protected readonly apiURL: string;\n  protected url = '';\n  protected readonly configuration: ConfigurationService;\n\n  constructor(\n    protected injector: Injector,\n  ) {\n    this.httpClient = this.injector.get<HttpClient>(HttpClient);\n    this.configuration = this.injector.get<ConfigurationService>(ConfigurationService);\n    this.apiURL = this.configuration.apiURL;\n  }\n\n  public get(params: IApiSearchParams | null = null, path: string | null = null): Observable<IApiResponse<T>> {\n    const url = this.getUrl(path);\n\n    return this.httpClient.get<IApiResponse<T>>(\n      url,\n      {\n        headers: this.setHeaders(),\n        params: (new APISearchParams(params)).toHttpParams(),\n      },\n    );\n  }\n\n  public getById(id: string, path?: string): Observable<T> {\n    const url = this.getUrl(path) + id;\n\n    return this.httpClient.get<T>(\n      url,\n      {\n        headers: this.setHeaders(),\n      },\n    );\n  }\n  public getElement(path?: string): Observable<T> {\n    const url = this.getUrl(path);\n\n    return this.httpClient.get<T>(\n      url,\n      {\n        headers: this.setHeaders(),\n      },\n    );\n  }\n\n  public put(body: IApiUpdateModel<T>, path?: string): Observable<T> {\n    const url = this.getUrl(path);\n\n    return this.httpClient.put<T>(\n      url,\n      body,\n      {\n        headers: this.setHeaders(),\n      },\n    );\n  }\n\n  public post(body: IApiCreateModel<T>, path?: string): Observable<T> {\n    const url = this.getUrl(path);\n\n    return this.httpClient.post<T>(\n      url,\n      body,\n      {\n        headers: this.setHeaders(),\n      },\n    );\n  }\n\n  public delete(id: string, path?: string): Observable<T> {\n    const url = this.getUrl(path) + id;\n\n    return this.httpClient.delete<T>(\n      url,\n      {\n        headers: this.setHeaders(),\n      },\n    );\n  }\n\n  public save(model: IApiUpdateModel<T> | IApiCreateModel<T>): Observable<T> {\n    if (this.hasId(model)) {\n      return this.put(model, this.url + model._id);\n    } else {\n      return this.post(model, this.url);\n    }\n  }\n\n  protected getUrl(path: string | null = null): string {\n    return `${ this.apiURL }${ path ? path : this.url }`;\n  }\n\n  protected setHeaders(): HttpHeaders {\n    const headersConfig = new HttpHeaders({\n      'Content-Type': 'application/json',\n      'Accept': 'application/json',\n    });\n\n    return headersConfig;\n  }\n\n  private hasId(model: IApiCreateModel<T> | IApiUpdateModel<T>): model is IApiUpdateModel<T> {\n    return typeof (model as IApiUpdateModel<T>)._id === 'string';\n  }\n}\n","import {\n  Inject,\n  Injectable,\n} from '@angular/core';\n\nimport {\n  IConfiguration,\n  IUser,\n} from '../models';\n\nexport interface IRouteState {\n  name: string;\n  params: string;\n}\n\ninterface IWindowMock {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  eventHandlers: any;\n  localStorage: boolean;\n}\n\nfunction _window(): Window {\n  return window;\n}\n\nconst $windowMock: IWindowMock = {\n  eventHandlers: {},\n  localStorage: false,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getStorage($window: Window, storageType: 'localStorage' | 'sessionStorage'): Storage | null {\n  const keyLength = 10;\n  let supported = false;\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    supported = !!$window && !!$window[storageType];\n  } catch (e) {\n    return null;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const $storage: Storage = $window[storageType] as Storage;\n\n  supported = supported && typeof $storage.setItem === 'function' &&\n    typeof $storage.removeItem === 'function';\n\n  if (supported) {\n\n    const randValue = new Array<string>(keyLength)\n      .fill('')\n      .map((_elem: string) => String.fromCharCode(Math.floor(Math.random() * 26) + 97));\n\n    const key = '__' + randValue;\n    try {\n      $storage.setItem(key, key);\n      $storage.removeItem(key);\n    } catch (_e) {\n\n      /* istanbul ignore next */\n      return null;\n    }\n  } else {\n    return null;\n  }\n\n  return $storage;\n}\nexport abstract class StorageService {\n\n  private readonly $window = _window();\n  private readonly $storage: Storage | null;\n  private readonly type: 'localStorage' | 'sessionStorage' | null;\n  private readonly storagePrefix: string;\n  private readonly serialize = JSON.stringify;\n  private readonly deserialize = JSON.parse;\n\n  constructor(\n    type: 'localStorage' | 'sessionStorage' | null,\n    @Inject('configuration') public readonly configuration: IConfiguration,\n  ) {\n    this.storagePrefix = this.configuration.storagePrefix;\n    this.type = type;\n\n    if (this.type) {\n      this.$storage = getStorage(this.$window, this.type);\n    } else {\n      // This is added to add behavior for testing when no storage is available\n      this.$window = $windowMock as unknown as Window;\n      this.$storage = getStorage(this.$window, 'localStorage');\n    }\n  }\n\n  public isSupported(): boolean {\n    return this.$storage !== null;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  public get<T = any>(key: string): T | null {\n    if (this.hasValidStorage(this.$storage)) {\n      const item = this.$storage.getItem(this.storagePrefix + key);\n      return item ? this.deserialize(item) : null;\n    } else {\n      return null;\n    }\n  }\n\n  public store<T>(key: string, value: T | null): void {\n    if (this.hasValidStorage(this.$storage)) {\n      const item = this.serialize(value);\n      this.$storage.setItem(this.storagePrefix + key, item);\n    }\n  }\n\n  public delete(key: string): void {\n    if (this.hasValidStorage(this.$storage)) {\n      this.$storage.removeItem(this.storagePrefix + key);\n    }\n  }\n\n  public signout(): void {\n    this.reset();\n  }\n\n  public signin(user: IUser, token: string | null): void {\n    this.store('user', user);\n    if (token) {\n      this.store('token', token);\n    }\n  }\n\n  public getUser<T = IUser>(): T | null {\n    return this.get('user');\n  }\n\n  public getToken(): string | null {\n    return this.get('token');\n  }\n\n  public removeToken(): void {\n    this.delete('token');\n  }\n\n  public updateToken(token: string): void {\n    this.store('token', token);\n  }\n\n  public getFilter(): Record<string, string> | null {\n    return this.get<Record<string, string>>('filter');\n  }\n\n  public storeFilter(filter: Record<string, string>): void {\n    this.store('filter', filter);\n  }\n\n  public getState(): IRouteState | null {\n    return this.get<IRouteState>('state');\n  }\n\n  public storeState(value: string, params: string): void {\n    const state: IRouteState = {\n      name: value,\n      params: params,\n    };\n\n    this.store('state', state);\n  }\n\n  public reset(): void {\n    if (this.hasValidStorage(this.$storage)) {\n      Object.keys(this.$storage)\n        .filter(key => key.includes(this.storagePrefix))\n        .map(key => key.replace(this.storagePrefix, ''))\n        .forEach(key => this.delete(key));\n    }\n  }\n\n  private hasValidStorage(storage: Storage | null): storage is Storage {\n    return storage !== null;\n  }\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class LocalStorageService extends StorageService {\n  constructor(\n    @Inject('configuration') public configuration: IConfiguration,\n  ) {\n    super('localStorage', configuration);\n  }\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class SessionStorageService extends StorageService {\n  constructor(\n    @Inject('configuration') public configuration: IConfiguration,\n  ) {\n    super('sessionStorage', configuration);\n  }\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class MockNoStorageService extends StorageService {\n  constructor(\n    @Inject('configuration') public configuration: IConfiguration,\n  ) {\n    super(null, configuration);\n  }\n}\n","import {\n  Injectable,\n} from '@angular/core';\n\nimport {\n  ILoginUser,\n} from '../models';\nimport {\n  LocalStorageService,\n} from '../storage/storage.service';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class AuthenticationService {\n  private user: ILoginUser | null = null;\n  private token: string | null = null;\n  public redirectState = 'home';\n\n  constructor(\n    private readonly storage: LocalStorageService,\n  ) {\n    this.user = this.storage.getUser();\n\n    this.token = this.storage.getToken();\n  }\n\n  public setRedirectState(state: string): void {\n    this.redirectState = state;\n  }\n\n  public getUser(): ILoginUser | null {\n    return this.user;\n  }\n\n  public getToken(): string | null {\n    return this.token;\n  }\n\n  public isAuthenticated(): boolean {\n    return this.user !== null && this.token !== null;\n  }\n\n  public isAuthorized(permissions: string | string[] | null = null): boolean {\n    if (permissions) {\n      const roles: string[] =\n        this.isPermissionString(permissions) ? [ permissions ] : permissions;\n      if (roles.length === 0) {\n        return true;\n      } else {\n        if (this.hasUser(this.user) && this.isPermissionArray(this.user.roles)) {\n          const userRoles = this.user.roles;\n          return roles.some((role: string) => userRoles.includes(role));\n        } else {\n          return false;\n        }\n      }\n    } else {\n      return true;\n    }\n  }\n\n  public hasRole(permissions: string | string[] | null = null): boolean {\n    return this.isAuthorized(permissions);\n  }\n\n  public signin(user: ILoginUser, token: string | null = null): void {\n    this.user = user;\n    this.token = token;\n    this.storage.signin(user, token);\n  }\n\n  public signout(): void {\n    this.user = null;\n    this.token = null;\n    this.storage.signout();\n  }\n\n  private hasUser(user: ILoginUser | null): user is ILoginUser {\n    return user !== null;\n  }\n\n  private isPermissionString(permissions: string | string[]): permissions is string {\n    return typeof permissions === 'string';\n  }\n\n  private isPermissionArray(permissions?: string[]): permissions is string[] {\n    return typeof permissions !== 'undefined' && Array.isArray(permissions);\n  }\n}\n","import {\n  Injectable,\n} from '@angular/core';\nimport {\n  Observable,\n  Subject,\n} from 'rxjs';\nimport {\n  filter,\n  map,\n} from 'rxjs/operators';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ninterface BroadcastEvent<T = any> {\n  key: string;\n  data: T;\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class BroadcastService {\n  private readonly _eventBus: Subject<BroadcastEvent>;\n\n  constructor() {\n    this._eventBus = new Subject<BroadcastEvent>();\n  }\n\n  public broadcast<T>(key: string, data?: T): void {\n    this._eventBus.next({ key, data });\n  }\n\n  public on<T>(key: string): Observable<T> {\n    return this._eventBus.asObservable()\n      .pipe(\n        filter((event: BroadcastEvent) => event.key === key),\n        map((event: BroadcastEvent) => <T>event.data),\n      );\n  }\n}\n","import {\n  HttpClient,\n  HttpErrorResponse,\n  HttpEvent,\n  HttpHandler,\n  HttpHeaders,\n  HttpInterceptor,\n  HttpRequest,\n} from '@angular/common/http';\nimport {\n  Injectable,\n} from '@angular/core';\nimport {\n  Observable,\n  throwError,\n} from 'rxjs';\nimport {\n  catchError,\n  mergeMap,\n} from 'rxjs/operators';\n\nimport {\n  AuthenticationService,\n} from '../authentication/authentication.service';\nimport {\n  BroadcastService,\n} from '../broadcast/broadcast.service';\nimport {\n  ConfigurationService,\n} from '../configuration/configuration.service';\nimport {\n  ApiError,\n  IApiXsrfResponse,\n} from '../models';\n\nexport const ApiBroadcastMessages = {\n  unauthenticated: {\n    id: 'app:unauthenticated',\n    message: 'User is not authenticated',\n  },\n  unauthorized: {\n    id: 'app:unauthorized',\n    message: 'User is not authorized',\n  },\n  notfound: {\n    id: 'app:notfound',\n  },\n  serverError: {\n    id: 'app:serverError',\n  },\n};\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class ApiInterceptorService implements HttpInterceptor {\n  private readonly xsrfProtected: boolean;\n  private readonly protectedMethods = [ 'POST', 'PUT', 'DELETE' ];\n\n  constructor(\n    private readonly authentication: AuthenticationService,\n    private readonly broadcastService: BroadcastService,\n    private readonly configuration: ConfigurationService,\n    private readonly httpClient: HttpClient,\n  ) {\n    this.xsrfProtected = this.configuration.xsrfEndpoint !== null;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n    const authReq = req.clone({\n      headers: this.appendAuthorization(req.headers),\n    });\n\n    if (this.protectedMethods.includes(req.method) && this.xsrfProtected) {\n      const endPoint = `${ this.configuration.apiURL }${ this.configuration.xsrfEndpoint }`;\n\n      return this.httpClient.get<IApiXsrfResponse>(endPoint, { withCredentials: true })\n        .pipe(\n          mergeMap(response => {\n            const xsrfAuthReq = req.clone({\n              headers: this.appendXsrfAuthorization(authReq.headers, response.xsrfToken),\n              withCredentials: true,\n            });\n            return this.next(xsrfAuthReq, next);\n          }),\n        );\n    } else {\n      return this.next(authReq, next);\n    }\n\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private next<T = any>(req: HttpRequest<T>, next: HttpHandler): Observable<HttpEvent<T>> {\n    return next.handle(req).pipe(\n      catchError((err) => this.parseError(err)),\n    );\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private parseError(errorResponse: any): Observable<never> {\n    if (errorResponse instanceof HttpErrorResponse) {\n      const err = this.extractError(errorResponse);\n      return throwError(err);\n    } else {\n      const errMsg = errorResponse.message ?\n        errorResponse.message :\n        errorResponse.toString();\n      return throwError(errMsg);\n    }\n  }\n\n  private appendAuthorization(header: HttpHeaders): HttpHeaders {\n    if (this.authentication.getToken()) {\n      header = header\n        .append('Authorization', `Bearer ${ this.authentication.getToken() }`);\n    }\n\n    return header;\n  }\n  private appendXsrfAuthorization(header: HttpHeaders, token: string): HttpHeaders {\n    return header\n      .append('X-XSRF-TOKEN', token);\n  }\n\n  protected extractError(error: HttpErrorResponse): ApiError {\n    const err = error.error && error.error.error ? error.error.error : error.error;\n\n    switch (error.status) {\n      case 401:\n        this.emitUnauthenticated();\n        break;\n      case 403:\n        this.emitUnauthorized();\n        break;\n      case 404:\n        this.emitNotFound(err.message);\n        break;\n      case 500:\n        this.emitServerError(err.message);\n        break;\n      // TODO: fill others\n      default: {\n        break;\n      }\n    }\n\n    return new ApiError(err, error.status);\n  }\n\n  private emitUnauthenticated(): void {\n    this.broadcastService.broadcast(\n      ApiBroadcastMessages.unauthenticated.id,\n      ApiBroadcastMessages.unauthenticated.message,\n    );\n  }\n\n  private emitUnauthorized(): void {\n    this.broadcastService.broadcast(\n      ApiBroadcastMessages.unauthorized.id,\n      ApiBroadcastMessages.unauthorized.message,\n    );\n  }\n\n  private emitNotFound(data: string): void {\n    this.broadcastService.broadcast(ApiBroadcastMessages.notfound.id, data);\n  }\n\n  private emitServerError(data: string): void {\n    this.broadcastService.broadcast(ApiBroadcastMessages.serverError.id, data);\n  }\n\n}\n","/*\n * Public API Surface of api-engine\n */\n\nexport * from './lib/index';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.LocalStorageService","i1.AuthenticationService","i2.BroadcastService","i3.ConfigurationService"],"mappings":";;;;;;;;;MAmBa,wBAAwB,CAAA;AAPrC,IAAA,WAAA,GAAA;QAQkB,IAAK,CAAA,KAAA,GAAkC,IAAI;QACpD,IAAU,CAAA,UAAA,GAAG,KAAK;AAM1B;AAJQ,IAAA,WAAW,CAAC,OAAsB,EAAA;AACvC,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,OAAO;;8GALjD,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,qJALzB,gEAAgE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,sOAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,OAAA,EAAA,CAAA,CAAA;;2FAK/D,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yCAAyC,YACzC,gEAAgE,EAAA,eAAA,EAEzD,uBAAuB,CAAC,OAAO,cACpC,KAAK,EAAA,MAAA,EAAA,CAAA,sOAAA,CAAA,EAAA;8BAGD,KAAK,EAAA,CAAA;sBAApB;;;MCJU,qBAAqB,CAAA;8GAArB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,EAHhB,YAAA,EAAA,CAAA,wBAAwB,CAD7B,EAAA,OAAA,EAAA,CAAA,YAAY,aAEZ,wBAAwB,CAAA,EAAA,CAAA,CAAA;AAExB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAJrB,YAAY,CAAA,EAAA,CAAA,CAAA;;2FAIZ,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBALjC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAE,YAAY,CAAE;oBACzB,YAAY,EAAE,CAAE,wBAAwB,CAAE;oBAC1C,OAAO,EAAE,CAAE,wBAAwB,CAAE;AACtC,iBAAA;;;MCHY,oBAAoB,CAAA;AAM/B,IAAA,WAAA,CACkC,aAA6B,EAAA;QAA7B,IAAa,CAAA,aAAA,GAAb,aAAa;QAHxC,IAAY,CAAA,YAAA,GAAkB,IAAI;AAKvC,QAAA,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM;AAClC,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,aAAa;AAChD,QAAA,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,UAAU;AAC1C,QAAA,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,YAAY;AAC5C,YAAA,aAAa,CAAC,YAAY,GAAG,IAAI;;AAb1B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,kBAOrB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAPd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA,CAAA;;2FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BAQI,MAAM;2BAAC,eAAe;;;MCVd,UAAU,CAAA;AAIrB,IAAA,WAAA,CAAY,UAAuB,EAAA;QACjC,IAAI,CAAC,OAAO,GAAG;YACb,GAAG,UAAU,CAAC,OAAO;YACrB,EAAE,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;SACpC;QACD,IAAI,CAAC,OAAO,GAAG;YACb,GAAG,UAAU,CAAC,OAAO;YACrB,EAAE,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;SACpC;;AAEJ;;MCDqB,QAAQ,CAAA;AAI5B,IAAA,WAAA,CAAY,KAAgB,EAAA;AAC1B,QAAA,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG;QACpB,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC;;AAErD;;MCfY,eAAe,CAAA;AAO1B,IAAA,WAAA,CAAY,SAAkC,IAAI,EAAA;QAChD,IAAI,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM;QACjE,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI;;IAGpD,YAAY,GAAA;AACjB,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAE7B,QAAA,IAAI,IAAI,CAAC,CAAC,EAAE;YACV,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;;AAElC,QAAA,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE;AACrC,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;;AAErD,QAAA,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE;AACtC,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;;AAEvD,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AACb,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;AAExD,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;AAG5D,QAAA,OAAO,MAAM;;AAEhB;;MCjCY,QAAQ,CAAA;IAOnB,WAAY,CAAA,GAAe,EAAE,MAAe,EAAA;QAH5B,IAAM,CAAA,MAAA,GAA+B,EAAE;AAIrD,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO;YAC1B,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE;AAC/B,YAAA,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;;;;AAIjE;;ACnBK,MAAO,IAAK,SAAQ,QAAQ,CAAA;AAQhC,IAAA,WAAA,CAAY,KAAY,EAAA;QACtB,KAAK,CAAC,KAAK,CAAC;QAJP,IAAK,CAAA,KAAA,GAAa,EAAE;AAMzB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;AAChC,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ;AAC9B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ;QAC9B,IAAI,CAAC,KAAK,GAAG,CAAE,GAAG,KAAK,CAAC,KAAK,CAAE;AAC/B,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ;;AAGzB,IAAA,OAAO,OAAO,CAAC,KAAA,GAAsB,IAAI,EAAA;QAC9C,OAAO;AACL,YAAA,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE;AACjC,YAAA,QAAQ,EAAE,KAAK,EAAE,QAAQ,IAAI,EAAE;AAC/B,YAAA,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;AACzB,YAAA,QAAQ,EAAE,KAAK,EAAE,QAAQ,IAAI,EAAE;YAC/B,KAAK,EAAE,CAAE,GAAG,KAAK,EAAE,KAAK,IAAI,EAAE,CAAE;AAChC,YAAA,QAAQ,EAAE,KAAK,EAAE,QAAQ,IAAI,EAAE;SAChC;;AAGI,IAAA,OAAO,CAAC,IAAY,EAAA;QACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;;AAIvB,IAAA,UAAU,CAAC,IAAY,EAAA;AAC5B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAE7C,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;;;AAIhC;;ACpCD;MAIsB,UAAU,CAAA;AAM9B,IAAA,WAAA,CACY,QAAkB,EAAA;QAAlB,IAAQ,CAAA,QAAA,GAAR,QAAQ;QAJV,IAAG,CAAA,GAAA,GAAG,EAAE;QAMhB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAa,UAAU,CAAC;QAC3D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAuB,oBAAoB,CAAC;QAClF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM;;AAGlC,IAAA,GAAG,CAAC,MAAA,GAAkC,IAAI,EAAE,OAAsB,IAAI,EAAA;QAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AAE7B,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CACxB,GAAG,EACH;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;YAC1B,MAAM,EAAE,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE;AACrD,SAAA,CACF;;IAGI,OAAO,CAAC,EAAU,EAAE,IAAa,EAAA;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;AAElC,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CACxB,GAAG,EACH;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;AAC3B,SAAA,CACF;;AAEI,IAAA,UAAU,CAAC,IAAa,EAAA;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AAE7B,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CACxB,GAAG,EACH;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;AAC3B,SAAA,CACF;;IAGI,GAAG,CAAC,IAAwB,EAAE,IAAa,EAAA;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAE7B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CACxB,GAAG,EACH,IAAI,EACJ;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;AAC3B,SAAA,CACF;;IAGI,IAAI,CAAC,IAAwB,EAAE,IAAa,EAAA;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAE7B,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CACzB,GAAG,EACH,IAAI,EACJ;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;AAC3B,SAAA,CACF;;IAGI,MAAM,CAAC,EAAU,EAAE,IAAa,EAAA;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;AAElC,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAC3B,GAAG,EACH;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;AAC3B,SAAA,CACF;;AAGI,IAAA,IAAI,CAAC,KAA8C,EAAA;AACxD,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;;aACvC;YACL,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;;;IAI3B,MAAM,CAAC,OAAsB,IAAI,EAAA;AACzC,QAAA,OAAO,GAAI,IAAI,CAAC,MAAO,CAAA,EAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,GAAI,EAAE;;IAG5C,UAAU,GAAA;AAClB,QAAA,MAAM,aAAa,GAAG,IAAI,WAAW,CAAC;AACpC,YAAA,cAAc,EAAE,kBAAkB;AAClC,YAAA,QAAQ,EAAE,kBAAkB;AAC7B,SAAA,CAAC;AAEF,QAAA,OAAO,aAAa;;AAGd,IAAA,KAAK,CAAC,KAA8C,EAAA;AAC1D,QAAA,OAAO,OAAQ,KAA4B,CAAC,GAAG,KAAK,QAAQ;;8GAxG1C,UAAU,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAV,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFlB,MAAM,EAAA,CAAA,CAAA;;2FAEE,UAAU,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACND,SAAS,OAAO,GAAA;AACd,IAAA,OAAO,MAAM;AACf;AAEA,MAAM,WAAW,GAAgB;AAC/B,IAAA,aAAa,EAAE,EAAE;AACjB,IAAA,YAAY,EAAE,KAAK;CACpB;AAED;AACA,SAAS,UAAU,CAAC,OAAe,EAAE,WAA8C,EAAA;IACjF,MAAM,SAAS,GAAG,EAAE;IACpB,IAAI,SAAS,GAAG,KAAK;AACrB,IAAA,IAAI;;QAEF,SAAS,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;;IAC/C,OAAO,CAAC,EAAE;AACV,QAAA,OAAO,IAAI;;;AAIb,IAAA,MAAM,QAAQ,GAAY,OAAO,CAAC,WAAW,CAAY;IAEzD,SAAS,GAAG,SAAS,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,UAAU;AAC7D,QAAA,OAAO,QAAQ,CAAC,UAAU,KAAK,UAAU;IAE3C,IAAI,SAAS,EAAE;AAEb,QAAA,MAAM,SAAS,GAAG,IAAI,KAAK,CAAS,SAAS;aAC1C,IAAI,CAAC,EAAE;aACP,GAAG,CAAC,CAAC,KAAa,KAAK,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAEnF,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,SAAS;AAC5B,QAAA,IAAI;AACF,YAAA,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;AAC1B,YAAA,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;;QACxB,OAAO,EAAE,EAAE;;AAGX,YAAA,OAAO,IAAI;;;SAER;AACL,QAAA,OAAO,IAAI;;AAGb,IAAA,OAAO,QAAQ;AACjB;AACsB,IAAA,cAAc,GAA7B,MAAe,cAAc,CAAA;IASlC,WACE,CAAA,IAA8C,EACrB,aAA6C,EAAA;QAA7B,IAAa,CAAA,aAAA,GAAb,aAAa;QATvC,IAAO,CAAA,OAAA,GAAG,OAAO,EAAE;AAInB,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,SAAS;AAC1B,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,KAAK;QAMvC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa;AACrD,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAEhB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AACb,YAAA,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;;aAC9C;;AAEL,YAAA,IAAI,CAAC,OAAO,GAAG,WAAgC;YAC/C,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;;;IAIrD,WAAW,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI;;;AAIxB,IAAA,GAAG,CAAU,GAAW,EAAA;QAC7B,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACvC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC;AAC5D,YAAA,OAAO,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI;;aACtC;AACL,YAAA,OAAO,IAAI;;;IAIR,KAAK,CAAI,GAAW,EAAE,KAAe,EAAA;QAC1C,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAClC,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE,IAAI,CAAC;;;AAIlD,IAAA,MAAM,CAAC,GAAW,EAAA;QACvB,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACvC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC;;;IAI/C,OAAO,GAAA;QACZ,IAAI,CAAC,KAAK,EAAE;;IAGP,MAAM,CAAC,IAAW,EAAE,KAAoB,EAAA;AAC7C,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC;QACxB,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC;;;IAIvB,OAAO,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;;IAGlB,QAAQ,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;;IAGnB,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;;AAGf,IAAA,WAAW,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC;;IAGrB,SAAS,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,GAAG,CAAyB,QAAQ,CAAC;;AAG5C,IAAA,WAAW,CAAC,MAA8B,EAAA;AAC/C,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC;;IAGvB,QAAQ,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,GAAG,CAAc,OAAO,CAAC;;IAGhC,UAAU,CAAC,KAAa,EAAE,MAAc,EAAA;AAC7C,QAAA,MAAM,KAAK,GAAgB;AACzB,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,MAAM,EAAE,MAAM;SACf;AAED,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC;;IAGrB,KAAK,GAAA;QACV,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACvC,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;AACtB,iBAAA,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;AAC9C,iBAAA,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;AAC9C,iBAAA,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;;;AAI/B,IAAA,eAAe,CAAC,OAAuB,EAAA;QAC7C,OAAO,OAAO,KAAK,IAAI;;;AA9GL,cAAc,GAAA,UAAA,CAAA;AAW/B,IAAA,OAAA,CAAA,CAAA,EAAA,MAAM,CAAC,eAAe,CAAC;AAXN,CAAA,EAAA,cAAc,CAgHnC;AAKK,MAAO,mBAAoB,SAAQ,cAAc,CAAA;AACrD,IAAA,WAAA,CACkC,aAA6B,EAAA;AAE7D,QAAA,KAAK,CAAC,cAAc,EAAE,aAAa,CAAC;QAFJ,IAAa,CAAA,aAAA,GAAb,aAAa;;AAFpC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,kBAEpB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAFd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA,CAAA;;2FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BAGI,MAAM;2BAAC,eAAe;;AASrB,MAAO,qBAAsB,SAAQ,cAAc,CAAA;AACvD,IAAA,WAAA,CACkC,aAA6B,EAAA;AAE7D,QAAA,KAAK,CAAC,gBAAgB,EAAE,aAAa,CAAC;QAFN,IAAa,CAAA,aAAA,GAAb,aAAa;;AAFpC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,kBAEtB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAFd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA,CAAA;;2FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BAGI,MAAM;2BAAC,eAAe;;AASrB,MAAO,oBAAqB,SAAQ,cAAc,CAAA;AACtD,IAAA,WAAA,CACkC,aAA6B,EAAA;AAE7D,QAAA,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC;QAFM,IAAa,CAAA,aAAA,GAAb,aAAa;;AAFpC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,kBAErB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAFd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA,CAAA;;2FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BAGI,MAAM;2BAAC,eAAe;;;MCnMd,qBAAqB,CAAA;AAKhC,IAAA,WAAA,CACmB,OAA4B,EAAA;QAA5B,IAAO,CAAA,OAAA,GAAP,OAAO;QALlB,IAAI,CAAA,IAAA,GAAsB,IAAI;QAC9B,IAAK,CAAA,KAAA,GAAkB,IAAI;QAC5B,IAAa,CAAA,aAAA,GAAG,MAAM;QAK3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;QAElC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;;AAG/B,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACnC,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;;IAGrB,OAAO,GAAA;QACZ,OAAO,IAAI,CAAC,IAAI;;IAGX,QAAQ,GAAA;QACb,OAAO,IAAI,CAAC,KAAK;;IAGZ,eAAe,GAAA;QACpB,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;;IAG3C,YAAY,CAAC,cAAwC,IAAI,EAAA;QAC9D,IAAI,WAAW,EAAE;AACf,YAAA,MAAM,KAAK,GACT,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,GAAG,CAAE,WAAW,CAAE,GAAG,WAAW;AACtE,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,gBAAA,OAAO,IAAI;;iBACN;gBACL,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACtE,oBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK;AACjC,oBAAA,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAY,KAAK,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;;qBACxD;AACL,oBAAA,OAAO,KAAK;;;;aAGX;AACL,YAAA,OAAO,IAAI;;;IAIR,OAAO,CAAC,cAAwC,IAAI,EAAA;AACzD,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;;AAGhC,IAAA,MAAM,CAAC,IAAgB,EAAE,KAAA,GAAuB,IAAI,EAAA;AACzD,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;;IAG3B,OAAO,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;;AAGhB,IAAA,OAAO,CAAC,IAAuB,EAAA;QACrC,OAAO,IAAI,KAAK,IAAI;;AAGd,IAAA,kBAAkB,CAAC,WAA8B,EAAA;AACvD,QAAA,OAAO,OAAO,WAAW,KAAK,QAAQ;;AAGhC,IAAA,iBAAiB,CAAC,WAAsB,EAAA;QAC9C,OAAO,OAAO,WAAW,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;;8GAzE9D,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA,CAAA;;2FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCQY,gBAAgB,CAAA;AAG3B,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,OAAO,EAAkB;;IAGzC,SAAS,CAAI,GAAW,EAAE,IAAQ,EAAA;QACvC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;;AAG7B,IAAA,EAAE,CAAI,GAAW,EAAA;AACtB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY;aAC/B,IAAI,CACH,MAAM,CAAC,CAAC,KAAqB,KAAK,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,EACpD,GAAG,CAAC,CAAC,KAAqB,KAAQ,KAAK,CAAC,IAAI,CAAC,CAC9C;;8GAhBM,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA;;2FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACeY,MAAA,oBAAoB,GAAG;AAClC,IAAA,eAAe,EAAE;AACf,QAAA,EAAE,EAAE,qBAAqB;AACzB,QAAA,OAAO,EAAE,2BAA2B;AACrC,KAAA;AACD,IAAA,YAAY,EAAE;AACZ,QAAA,EAAE,EAAE,kBAAkB;AACtB,QAAA,OAAO,EAAE,wBAAwB;AAClC,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,EAAE,EAAE,cAAc;AACnB,KAAA;AACD,IAAA,WAAW,EAAE;AACX,QAAA,EAAE,EAAE,iBAAiB;AACtB,KAAA;;MAMU,qBAAqB,CAAA;AAIhC,IAAA,WAAA,CACmB,cAAqC,EACrC,gBAAkC,EAClC,aAAmC,EACnC,UAAsB,EAAA;QAHtB,IAAc,CAAA,cAAA,GAAd,cAAc;QACd,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB;QAChB,IAAa,CAAA,aAAA,GAAb,aAAa;QACb,IAAU,CAAA,UAAA,GAAV,UAAU;QANZ,IAAgB,CAAA,gBAAA,GAAG,CAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAE;QAQ7D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,KAAK,IAAI;;;IAIxD,SAAS,CAAC,GAAqB,EAAE,IAAiB,EAAA;AACvD,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC;YACxB,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC;AAC/C,SAAA,CAAC;AAEF,QAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;AACpE,YAAA,MAAM,QAAQ,GAAG,CAAI,EAAA,IAAI,CAAC,aAAa,CAAC,MAAO,CAAA,EAAI,IAAI,CAAC,aAAa,CAAC,YAAa,EAAE;AAErF,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAmB,QAAQ,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;AAC7E,iBAAA,IAAI,CACH,QAAQ,CAAC,QAAQ,IAAG;AAClB,gBAAA,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC;AAC5B,oBAAA,OAAO,EAAE,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC;AAC1E,oBAAA,eAAe,EAAE,IAAI;AACtB,iBAAA,CAAC;gBACF,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;aACpC,CAAC,CACH;;aACE;YACL,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;;;;IAM3B,IAAI,CAAU,GAAmB,EAAE,IAAiB,EAAA;QAC1D,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAC1B,UAAU,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAC1C;;;AAIK,IAAA,UAAU,CAAC,aAAkB,EAAA;AACnC,QAAA,IAAI,aAAa,YAAY,iBAAiB,EAAE;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;AAC5C,YAAA,OAAO,UAAU,CAAC,GAAG,CAAC;;aACjB;AACL,YAAA,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO;gBAClC,aAAa,CAAC,OAAO;gBACrB,aAAa,CAAC,QAAQ,EAAE;AAC1B,YAAA,OAAO,UAAU,CAAC,MAAM,CAAC;;;AAIrB,IAAA,mBAAmB,CAAC,MAAmB,EAAA;AAC7C,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE;AAClC,YAAA,MAAM,GAAG;AACN,iBAAA,MAAM,CAAC,eAAe,EAAE,CAAA,OAAA,EAAW,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAG,CAAE,CAAA,CAAC;;AAG1E,QAAA,OAAO,MAAM;;IAEP,uBAAuB,CAAC,MAAmB,EAAE,KAAa,EAAA;AAChE,QAAA,OAAO;AACJ,aAAA,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC;;AAGxB,IAAA,YAAY,CAAC,KAAwB,EAAA;QAC7C,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;AAE9E,QAAA,QAAQ,KAAK,CAAC,MAAM;AAClB,YAAA,KAAK,GAAG;gBACN,IAAI,CAAC,mBAAmB,EAAE;gBAC1B;AACF,YAAA,KAAK,GAAG;gBACN,IAAI,CAAC,gBAAgB,EAAE;gBACvB;AACF,YAAA,KAAK,GAAG;AACN,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;gBAC9B;AACF,YAAA,KAAK,GAAG;AACN,gBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;gBACjC;;YAEF,SAAS;gBACP;;;QAIJ,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC;;IAGhC,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAC7B,oBAAoB,CAAC,eAAe,CAAC,EAAE,EACvC,oBAAoB,CAAC,eAAe,CAAC,OAAO,CAC7C;;IAGK,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAC7B,oBAAoB,CAAC,YAAY,CAAC,EAAE,EACpC,oBAAoB,CAAC,YAAY,CAAC,OAAO,CAC1C;;AAGK,IAAA,YAAY,CAAC,IAAY,EAAA;AAC/B,QAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;;AAGjE,IAAA,eAAe,CAAC,IAAY,EAAA;AAClC,QAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC;;8GAnHjE,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA,CAAA;;2FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACtDD;;AAEG;;ACFH;;AAEG;;;;"}