{"version":3,"file":"sinequa-components-search-form.mjs","sources":["../../../projects/components/search-form/search-form.component.ts","../../../projects/components/search-form/search-form.component.html","../../../projects/components/search-form/messages/en.ts","../../../projects/components/search-form/messages/fr.ts","../../../projects/components/search-form/messages/de.ts","../../../projects/components/search-form/messages/index.ts","../../../projects/components/search-form/sinequa-components-search-form.ts"],"sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, inject, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, TemplateRef, ViewChild } from \"@angular/core\";\nimport { AppService, FormatService, Query } from \"@sinequa/core/app-utils\";\nimport { LoginService } from \"@sinequa/core/login\";\nimport { FacetEventType, FacetService } from \"@sinequa/components/facet\";\nimport { BsSearchModule, SearchService } from \"@sinequa/components/search\";\nimport { filter, Subscription } from \"rxjs\";\nimport { CommonModule } from \"@angular/common\";\nimport { FormControl, FormGroup, FormsModule, NonNullableFormBuilder, ReactiveFormsModule } from \"@angular/forms\";\nimport { IntlModule, IntlService } from \"@sinequa/core/intl\";\nimport { Expr, ExprParser, UtilsModule, VoiceRecognitionService } from \"@sinequa/components/utils\";\nimport { UserPreferences } from \"@sinequa/components/user-settings\";\nimport { compareFilters } from \"@sinequa/core/web-services\";\nimport { NotificationsService } from \"@sinequa/core/notification\";\n\n@Component({\n    selector: 'sq-search-form',\n    templateUrl: './search-form.component.html',\n    styleUrls: ['./search-form.component.scss'],\n    imports: [CommonModule, ReactiveFormsModule, FormsModule, IntlModule, UtilsModule, BsSearchModule],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SearchFormComponent implements OnInit, OnChanges, OnDestroy {\n  @Input() query: Query;\n  @Input() searchRoute = \"search\";\n  @Input() autoApply = true;\n  @Input() autoSubmit = true;\n  @Input() showFilterCount = false;\n  @Input() enableVoiceRecognition = true;\n  @Input() enableNeuralSearch = true;\n  @Input() neuralSearchPref = \"neural-search\";\n  @Input() persistedFiltersPref = \"persisted-filters\";\n\n  @Output(\"search\") searchEvent = new EventEmitter<boolean>();\n  @Output(\"expanded\") expandedEvent = new EventEmitter<boolean>();\n\n  @ContentChild(TemplateRef, {static: false}) dropdown: TemplateRef<any>;\n\n  @ViewChild('searchInput') searchInput: ElementRef<HTMLInputElement>;\n\n  hovered = false;\n  expanded: boolean;\n  filterCount: number;\n\n  editedQuery: Query;\n  canApply: boolean;\n\n  voiceState = false;\n\n  fb = inject(NonNullableFormBuilder);\n  form: FormGroup;\n  searchControl = new FormControl();\n\n  formatService = inject(FormatService);\n  intlService = inject(IntlService);\n  notificationService = inject(NotificationsService);\n\n  constructor(\n    public searchService: SearchService,\n    public facetService: FacetService,\n    public loginService: LoginService,\n    public appService: AppService,\n    public voiceService: VoiceRecognitionService,\n    public prefs: UserPreferences,\n    public cdRef: ChangeDetectorRef\n  ) {}\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if(changes.query) {\n      this.editedQuery = this.query.copy();\n      this.filterCount = this.query.getFilterCount(undefined);\n      this.canApply = false;\n      this.searchControl.setValue(this.editedQuery.text);\n    }\n  }\n\n  ngOnInit() {\n    this.form = this.fb.group({\n      search: this.searchControl\n    });\n\n    this.sub = this.facetService.events\n      .pipe(filter(e => e.query === this.editedQuery && (e.type === FacetEventType.AddFilter || e.type === FacetEventType.RemoveFilter || e.type === FacetEventType.ClearFilters)))\n      .subscribe(() => this.onFiltersChanged());\n\n    this.voiceService.init();\n\n    this.sub.add(this.voiceService.text.subscribe(value => {\n      this.editedQuery.text = value;\n      this.searchControl.setValue(value);\n    }));\n    this.sub.add(this.voiceService.started.subscribe(state => {\n      this.voiceState = state;\n      if(!state && this.editedQuery.text) {\n        this.applyFilters(); // Apply the new query text and close the view\n      }\n    }));\n  }\n\n  sub: Subscription;\n  ngOnDestroy(): void {\n    this.sub.unsubscribe();\n  }\n\n  /**\n   * Filters might be changed from different external component (facets, filter editor...)\n   * This method aims at catching these changes, updating the state accordingly,\n   * and applying filters automatically, if possible (we are on a search route)\n   */\n  onFiltersChanged() {\n    this.editedQuery = this.editedQuery.copy(); // Copy the edited query to trigger change detection\n    this.filterCount = this.editedQuery.getFilterCount(undefined);\n    this.canApply = this.editedQuery.text !== this.query.text\n      || this.editedQuery.scope !== this.query.scope\n      || !compareFilters(this.editedQuery.filters, this.query.filters);\n    if(this.canApply && this.autoApply && this.searchService.isSearchRouteActive()) {\n      this.applyFilters(false); // Apply filters, but leave view open\n    }\n    else {\n      this.cdRef.detectChanges();\n    }\n  }\n\n\n  /**\n   * Apply the current edited query to the input query and trigger\n   * a new search.\n   * @param collapse whether to collapse the form\n   */\n  applyFilters(collapse = true) {\n    // Check if the search control is valid\n    if(this.searchControl.valid === false) {\n      this.notificationService.error(\"msg#searchForm.invalidQuery\");\n      return; // Do not apply if the input is invalid\n    }\n\n    // Determine if the text has changed compared to the input query\n    const isTextSearch = (this.query.text || '') !== (this.editedQuery.text || '');\n\n    this.query.text = this.editedQuery.text;\n    this.query.filters = this.editedQuery.filters;\n    this.query.scope = this.editedQuery.scope;\n\n    if(!this.query.text?.trim()) {\n      delete this.query.queryId;\n      delete this.query.text;\n      delete this.query.sort; // Prevent 500 error if no text but orderby text\n    }\n\n    delete this.query.basket; // If a basket was open, we want to go back to a regular search\n    delete this.query.page; // If pagination occurred, we want to reset that\n\n    if(this.appService.isNeural()) { // (Un)Set the query.neuralSearch flag\n      if(this.neuralSearch) {\n        delete this.query.neuralSearch;\n      }\n      else {\n        this.query.neuralSearch = false;\n      }\n    }\n\n    this.canApply = false; // Hide the hide button (if it was shown)\n\n    if(!this.expanded !== collapse) { // Collapse\n      this.expanded = !collapse;\n      this.expandedEvent.emit(this.expanded);\n    }\n\n    if (!this.persistedFilters && isTextSearch) {\n      delete this.query.filters;\n    }\n\n    this.search(isTextSearch); // Actually search\n  }\n\n  /**\n   * Trigger a new search with the current query (unless it is not\n   * the global search service query).\n   * In any case emit a search event, so that the parent component\n   * can process the search in a custom way.\n   * @param isSearchTextEvent\n   */\n  search(isSearchTextEvent: boolean) {\n    if(this.query === this.searchService.query) {\n      if(isSearchTextEvent) {\n        this.searchService.searchText(this.searchRoute);\n      }\n      else {\n        this.searchService.search({path: this.searchRoute});\n      }\n    }\n    this.searchEvent.emit(isSearchTextEvent);\n  }\n\n  /**\n   * Clear the edited text and filters and trigger onFiltersChanged()\n   */\n  clearForm() {\n    if(this.canApply) {\n      this.canApply = false;\n      this.editedQuery.filters = this.query.filters;\n    }\n    delete this.editedQuery.text;\n    // when strict refine is checked (admin panel), remove the queryId on clear\n    delete this.query.queryId;\n\n    this.searchControl.setValue(undefined);\n    this.searchInput.nativeElement.focus();\n    this.cdRef.detectChanges();\n  }\n\n  /**\n   * Expand the form, and update its state\n   */\n  expand() {\n    if(!this.expanded) {\n      this.expanded = true; // Expand if click while already focused\n      this.expandedEvent.emit(this.expanded);\n      this.filterCount = this.editedQuery.getFilterCount(undefined);\n      this.cdRef.detectChanges();\n    }\n  }\n\n\n  // Template event handlers\n\n  onInputEnter() {\n    if(this.autoSubmit) {\n      this.applyFilters();\n    }\n  }\n\n  onInputFocus() {\n    this.expand(); // Expand on focus\n  }\n\n  onInputText() {\n    this.expand(); // Expand on typing text\n  }\n\n  onInputClick() {\n    this.expand(); // Expand on click (while already focused)\n  }\n\n  /**\n   * Handles the input change event for the search control.\n   *\n   * This method is triggered whenever the value of the search control changes.\n   * It parses the input value using the `ExprParser` and sets the appropriate\n   * errors on the search control based on the parsing result.\n   *\n   * - If the parsing result is an instance of `Expr`, it sets the result in the event.\n   * - If the parsing result is an error, it sets the error in the event and marks the search control as incorrect.\n   *\n   * @returns {void}\n   */\n  onInputChange() {\n    if (this.searchControl.value) {\n      const result = ExprParser.parse(this.searchControl.value, { appService: this.appService, formatService: this.formatService, intlService: this.intlService }, { enabledFieldedSearch: false });\n      const event = result instanceof Expr ? { result: result } : { error: result };\n      this.searchControl.setErrors(event.error ? { incorrect: true } : null);\n    }\n  }\n\n  onClickOutside() {\n    if(this.expanded) {\n      this.expanded = false; // Collapse the form when we the user clicks outside\n      this.expandedEvent.emit(false);\n    }\n  }\n\n  onFilterCountClick() {\n    delete this.editedQuery.filters;\n    this.onFiltersChanged();\n    this.searchInput.nativeElement.focus();\n  }\n\n  onScopeChange() {\n    this.onFiltersChanged();\n    this.searchInput.nativeElement.focus();\n  }\n\n\n  // Voice recognition\n  toggleVoice() {\n    this.voiceService.toggleRecognition();\n  }\n\n\n  // Neural search\n  get neuralSearch(): boolean {\n    return this.prefs.get(this.neuralSearchPref) !== false; // if undefined, default is true\n  }\n\n  set neuralSearch(val: boolean) {\n    if(val) {\n      this.prefs.delete(this.neuralSearchPref);\n    }\n    else {\n      this.prefs.set(this.neuralSearchPref, false); // if set, neural-search can only be false\n    }\n  }\n\n  toggleNeuralSearch() {\n    this.neuralSearch = !this.neuralSearch;\n    if (this.editedQuery?.text) {\n      this.applyFilters();\n    }\n  }\n\n  // Whether filters are persisted to new text queries\n  get persistedFilters(): boolean {\n    return this.prefs.get(this.persistedFiltersPref) !== false; // if undefined, default is true\n  }\n\n  set persistedFilters(val: boolean) {\n    if(val) {\n      this.prefs.delete(this.persistedFiltersPref);\n    }\n    else {\n      this.prefs.set(this.persistedFiltersPref, false); // if set, neural-search can only be false\n    }\n  }\n\n  toggleFiltersPersist() {\n    this.persistedFilters = !this.persistedFilters;\n  }\n}\n","<form novalidate [formGroup]=\"form\" class=\"form-control\" [ngClass]=\"{expanded: expanded}\" (sqClickOutside)=\"onClickOutside()\" (mouseenter)=\"hovered=true\" (mouseleave)=\"hovered=false\">\n\n  <fieldset class=\"search-input-container d-flex align-items-center\" [disabled]=\"!loginService.complete\" [attr.aria-disabled]=\"!loginService.complete\">\n\n    <div class=\"me-2 text-muted\">\n      <i class=\"fas fa-fw fa-search\"></i>\n    </div>\n\n    <!-- Scope selector -->\n    <sq-scope [query]=\"editedQuery\" (queryChange)=\"onScopeChange()\"></sq-scope>\n\n    <!-- Search input -->\n    <input #searchInput\n      id=\"searchInput\" name=\"searchInput\"\n      type=\"text\" spellcheck=\"false\" autocomplete=\"off\"\n      formControlName=\"search\"\n      class=\"search-input pe-2\"\n      [placeholder]=\"(voiceState? 'msg#searchForm.listening' : 'msg#searchForm.searchFor') | sqMessage\"\n      [(ngModel)]=\"editedQuery.text\"\n      (ngModelChange)=\"onInputChange()\"\n      (focus)=\"onInputFocus()\"\n      (click)=\"onInputClick()\"\n      (input)=\"onInputText()\"\n      (keyup.enter)=\"onInputEnter()\"\n      (keyup.shift.enter)=\"onInputEnter()\"> <!-- keyup.shift.enter is necessary for iOS13+: https://github.com/angular/angular/issues/32963 -->\n\n\n    <!-- Toggle voice recognition -->\n    <button type=\"button\" *ngIf=\"hovered\"\n      class=\"btn no-shadow p-0 me-1\"\n      [sqTooltip]=\"(persistedFilters ? 'msg#searchForm.persistedFiltersOn' : 'msg#searchForm.persistedFiltersOff') | sqMessage\"\n      (click)=\"toggleFiltersPersist()\">\n      <i class=\"fas fa-fw fa-filter\" [ngClass]=\"persistedFilters ? 'light-green' : 'text-muted'\"></i>\n    </button>\n\n    <!-- Clear Button (not displayed when expanded to avoid the confusion of users trying to close the box) -->\n    <button type=\"button\" *ngIf=\"editedQuery.text\"\n      class=\"btn no-shadow p-0\"\n      [sqTooltip]=\"'msg#searchForm.clearAll' | sqMessage\"\n      (click)=\"clearForm()\">\n      <i class=\"fas fa-fw fa-times text-muted\"></i>\n    </button>\n\n    <!-- Toggle voice recognition -->\n    <button type=\"button\" *ngIf=\"enableVoiceRecognition && voiceService.available\"\n      class=\"btn no-shadow p-0 me-1\"\n      [sqTooltip]=\"'msg#searchForm.voiceRecognition' | sqMessage\"\n      (click)=\"toggleVoice()\">\n      <i class=\"fas fa-fw fa-microphone\" [ngClass]=\"voiceState ? 'light-green' : 'text-muted'\"></i>\n    </button>\n\n    <!-- Neural search Button -->\n    <button type=\"button\" *ngIf=\"enableNeuralSearch && appService.isNeural()\" class=\"btn p-0 me-2\"\n      [sqTooltip]=\"(neuralSearch? 'msg#searchForm.neural.on' : 'msg#searchForm.neural.off') | sqMessage\"\n      [disabled]=\"!loginService.complete\"\n      (click)=\"toggleNeuralSearch()\">\n      <i class=\"fas fa-fw fa-brain\" [ngClass]=\"neuralSearch ? 'light-green' : 'text-muted'\"></i>\n    </button>\n\n    <!-- Apply Button -->\n    <button type=\"button\" *ngIf=\"canApply\"\n      class=\"btn btn-sm btn-primary fw-bold rounded-4 py-0 px-2 me-1\"\n      [sqTooltip]=\"'msg#searchForm.applyTitle' | sqMessage\"\n      (click)=\"applyFilters()\">\n      {{'msg#searchForm.apply' | sqMessage}}\n    </button>\n\n    <!-- Filter count -->\n    <button *ngIf=\"showFilterCount && filterCount\"\n      type=\"button\"\n      class=\"p-0 text-muted bg-transparent border-0 position-relative me-3\"\n      [sqTooltip]=\"'msg#searchForm.filterCount' | sqMessage:{value: filterCount}\"\n      (click)=\"onFilterCountClick()\">\n      <i class=\"fas fa-filter\"></i>\n      <span class=\"position-absolute bottom-0 badge rounded-pill bg-danger\"\n            style=\"font-size: 10px; left: 0.75rem;\">\n        {{filterCount}}\n      </span>\n    </button>\n\n  </fieldset>\n\n  <div *ngIf=\"expanded\">\n    <ng-container\n      [ngTemplateOutlet]=\"dropdown\"\n      [ngTemplateOutletContext]=\"{$implicit: editedQuery}\">\n    </ng-container>\n  </div>\n\n</form>\n","export default {\n  \"searchForm\": {\n    \"search\": \"Search\",\n    \"searchFor\": \"Search for...\",\n    \"clearAll\": \"Clear Search\",\n    \"clear\": \"Clear\",\n    \"voiceRecognition\": \"Vocal search\",\n    \"persistedFiltersOn\": \"Filters kept upon new seach\",\n    \"persistedFiltersOff\": \"Filters removed upon new seach\",\n    \"listening\": \"Listening in progress...\",\n    \"filterCount\": \"{value} {value, plural, one {active filter} other {active filters}} (click to clear)\",\n    \"apply\": \"Apply\",\n    \"applyTitle\": \"Apply the new filters\",\n    \"neural\": {\n      \"on\": \"Neural Search is activated\",\n      \"off\": \"Neural Search is off\"\n    },\n    \"invalidQuery\": \"Invalid search query\"\n  }\n}\n","export default {\n  \"searchForm\": {\n    \"search\": \"Rechercher\",\n    \"searchFor\": \"Rechercher ...\",\n    \"clearAll\": \"Effacer la recherche\",\n    \"clear\": \"Effacer\",\n    \"voiceRecognition\": \"Recherche vocale\",\n    \"persistedFiltersOn\": \"Filtres conservés lors d'une nouvelle recherche\",\n    \"persistedFiltersOff\": \"Filtres retirés lors d'une nouvelle recherche\",\n    \"listening\": \"Ecoute en cours...\",\n    \"filterCount\": \"{value} {value, plural, one {filtre actif} other {filtres actifs}} (cliquer pour effacer)\",\n    \"apply\": \"Appliquer\",\n    \"applyTitle\": \"Appliquer les nouveaux filtres\",\n    \"neural\": {\n      \"on\": \"Neural Search est activé\",\n      \"off\": \"Neural Search est désactivé\"\n    },\n    \"invalidQuery\": \"Requête de recherche invalide\"\n  }\n}\n","export default {\n  \"searchForm\": {\n    \"search\": \"Suche\",\n    \"searchFor\": \"Suche nach...\",\n    \"clearAll\": \"Suche löschen\",\n    \"clear\": \"Löschen\",\n    \"voiceRecognition\": \"Sprachsuche\",\n    \"persistedFiltersOn\": \"Filter werden bei neuer Suche beibehalten\",\n    \"persistedFiltersOff\": \"Filter bei neuer Suche entfernt\",\n    \"listening\": \"Anhören läuft...\",\n    \"filterCount\": \"{value} {value, plural, one {aktiven Filter} other {aktive Filter}} (zum Löschen klicken)\",\n    \"apply\": \"Apply\",\n    \"applyTitle\": \"Wenden Sie die neuen Filter an\",\n    \"neural\": {\n      \"on\": \"Neural Search ist aktiviert\",\n      \"off\": \"Neural Search ist deaktiviert\"\n    },\n    \"invalidQuery\": \"Ungültige Suchanfrage\"\n  }\n}\n","import {Utils} from \"@sinequa/core/base\";\nimport _enSearchForm from \"./en\";\nimport _frSearchForm from \"./fr\";\nimport _deSearchForm from \"./de\";\n\nconst enSearchForm = Utils.merge({}, _enSearchForm);\nconst frSearchForm = Utils.merge({}, _frSearchForm);\nconst deSearchForm = Utils.merge({}, _deSearchForm);\n\nexport { enSearchForm, frSearchForm, deSearchForm };\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;MAqBa,mBAAmB,CAAA;AAmC9B,IAAA,WAAA,CACS,aAA4B,EAC5B,YAA0B,EAC1B,YAA0B,EAC1B,UAAsB,EACtB,YAAqC,EACrC,KAAsB,EACtB,KAAwB,EAAA;QANxB,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,KAAK,GAAL,KAAK;QAxCL,IAAA,CAAA,WAAW,GAAG,QAAQ;QACtB,IAAA,CAAA,SAAS,GAAG,IAAI;QAChB,IAAA,CAAA,UAAU,GAAG,IAAI;QACjB,IAAA,CAAA,eAAe,GAAG,KAAK;QACvB,IAAA,CAAA,sBAAsB,GAAG,IAAI;QAC7B,IAAA,CAAA,kBAAkB,GAAG,IAAI;QACzB,IAAA,CAAA,gBAAgB,GAAG,eAAe;QAClC,IAAA,CAAA,oBAAoB,GAAG,mBAAmB;AAEjC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAW;AACvC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAW;QAM/D,IAAA,CAAA,OAAO,GAAG,KAAK;QAOf,IAAA,CAAA,UAAU,GAAG,KAAK;AAElB,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAAC,sBAAsB,CAAC;AAEnC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,WAAW,EAAE;AAEjC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,oBAAoB,CAAC;IAU/C;AAEH,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAG,OAAO,CAAC,KAAK,EAAE;YAChB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACpC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC;AACvD,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;YACrB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACpD;IACF;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YACxB,MAAM,EAAE,IAAI,CAAC;AACd,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;AAC1B,aAAA,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,IAAI,KAAA,iBAAA,mCAAiC,CAAC,CAAC,IAAI,KAAA,oBAAA,sCAAoC,CAAC,CAAC,IAAI,KAAA,oBAAA,mCAAiC,CAAC;aAC3K,SAAS,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAE3C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AAExB,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAG;AACpD,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,KAAK;AAC7B,YAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpC,CAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,IAAG;AACvD,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;YACvB,IAAG,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AAClC,gBAAA,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB;QACF,CAAC,CAAC,CAAC;IACL;IAGA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;IACxB;AAEA;;;;AAIG;IACH,gBAAgB,GAAA;QACd,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,SAAS,CAAC;AAC7D,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC;eAChD,IAAI,CAAC,WAAW,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC;AACtC,eAAA,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAClE,QAAA,IAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,EAAE;AAC9E,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC3B;aACK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;QAC5B;IACF;AAGA;;;;AAIG;IACH,YAAY,CAAC,QAAQ,GAAG,IAAI,EAAA;;QAE1B,IAAG,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,KAAK,EAAE;AACrC,YAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,6BAA6B,CAAC;AAC7D,YAAA,OAAO;QACT;;QAGA,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC;QAE9E,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI;QACvC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO;QAC7C,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK;QAEzC,IAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;AAC3B,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO;AACzB,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI;AACtB,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACzB;AAEA,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AACzB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAEvB,IAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE;AAC7B,YAAA,IAAG,IAAI,CAAC,YAAY,EAAE;AACpB,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY;YAChC;iBACK;AACH,gBAAA,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK;YACjC;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,IAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE;AAC9B,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,QAAQ;YACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxC;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,YAAY,EAAE;AAC1C,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO;QAC3B;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC5B;AAEA;;;;;;AAMG;AACH,IAAA,MAAM,CAAC,iBAA0B,EAAA;QAC/B,IAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;YAC1C,IAAG,iBAAiB,EAAE;gBACpB,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;YACjD;iBACK;AACH,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAC,CAAC;YACrD;QACF;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAC1C;AAEA;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,IAAG,IAAI,CAAC,QAAQ,EAAE;AAChB,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;YACrB,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO;QAC/C;AACA,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI;;AAE5B,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO;AAEzB,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC;AACtC,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,EAAE;AACtC,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;IAC5B;AAEA;;AAEG;IACH,MAAM,GAAA;AACJ,QAAA,IAAG,CAAC,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;YACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,SAAS,CAAC;AAC7D,YAAA,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;QAC5B;IACF;;IAKA,YAAY,GAAA;AACV,QAAA,IAAG,IAAI,CAAC,UAAU,EAAE;YAClB,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB;AAEA;;;;;;;;;;;AAWG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC5B,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;YAC7L,MAAM,KAAK,GAAG,MAAM,YAAY,IAAI,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;YAC7E,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QACxE;IACF;IAEA,cAAc,GAAA;AACZ,QAAA,IAAG,IAAI,CAAC,QAAQ,EAAE;AAChB,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAChC;IACF;IAEA,kBAAkB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO;QAC/B,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,EAAE;IACxC;IAEA,aAAa,GAAA;QACX,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,EAAE;IACxC;;IAIA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE;IACvC;;AAIA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,KAAK,CAAC;IACzD;IAEA,IAAI,YAAY,CAAC,GAAY,EAAA;QAC3B,IAAG,GAAG,EAAE;YACN,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAC1C;aACK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC/C;IACF;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY;AACtC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;YAC1B,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;;AAGA,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,KAAK,CAAC;IAC7D;IAEA,IAAI,gBAAgB,CAAC,GAAY,EAAA;QAC/B,IAAG,GAAG,EAAE;YACN,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC;QAC9C;aACK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QACnD;IACF;IAEA,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,gBAAgB;IAChD;+GAhTW,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAchB,WAAW,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnC3B,+4HA0FA,8vBDxEc,YAAY,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,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,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,UAAU,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,2XAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGxF,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,WAGjB,CAAC,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,EAAA,eAAA,EACjF,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+4HAAA,EAAA,MAAA,EAAA,CAAA,usBAAA,CAAA,EAAA;;sBAGhD;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA,MAAM;uBAAC,QAAQ;;sBACf,MAAM;uBAAC,UAAU;;sBAEjB,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,WAAW,EAAE,EAAC,MAAM,EAAE,KAAK,EAAC;;sBAEzC,SAAS;uBAAC,aAAa;;;AErC1B,oBAAe;AACb,IAAA,YAAY,EAAE;AACZ,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,WAAW,EAAE,eAAe;AAC5B,QAAA,UAAU,EAAE,cAAc;AAC1B,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,kBAAkB,EAAE,cAAc;AAClC,QAAA,oBAAoB,EAAE,6BAA6B;AACnD,QAAA,qBAAqB,EAAE,gCAAgC;AACvD,QAAA,WAAW,EAAE,0BAA0B;AACvC,QAAA,aAAa,EAAE,sFAAsF;AACrG,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,YAAY,EAAE,uBAAuB;AACrC,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,4BAA4B;AAClC,YAAA,KAAK,EAAE;AACR,SAAA;AACD,QAAA,cAAc,EAAE;AACjB;CACF;;ACnBD,oBAAe;AACb,IAAA,YAAY,EAAE;AACZ,QAAA,QAAQ,EAAE,YAAY;AACtB,QAAA,WAAW,EAAE,gBAAgB;AAC7B,QAAA,UAAU,EAAE,sBAAsB;AAClC,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,kBAAkB,EAAE,kBAAkB;AACtC,QAAA,oBAAoB,EAAE,iDAAiD;AACvE,QAAA,qBAAqB,EAAE,+CAA+C;AACtE,QAAA,WAAW,EAAE,oBAAoB;AACjC,QAAA,aAAa,EAAE,2FAA2F;AAC1G,QAAA,OAAO,EAAE,WAAW;AACpB,QAAA,YAAY,EAAE,gCAAgC;AAC9C,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,0BAA0B;AAChC,YAAA,KAAK,EAAE;AACR,SAAA;AACD,QAAA,cAAc,EAAE;AACjB;CACF;;ACnBD,oBAAe;AACb,IAAA,YAAY,EAAE;AACZ,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,WAAW,EAAE,eAAe;AAC5B,QAAA,UAAU,EAAE,eAAe;AAC3B,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,kBAAkB,EAAE,aAAa;AACjC,QAAA,oBAAoB,EAAE,2CAA2C;AACjE,QAAA,qBAAqB,EAAE,iCAAiC;AACxD,QAAA,WAAW,EAAE,kBAAkB;AAC/B,QAAA,aAAa,EAAE,2FAA2F;AAC1G,QAAA,OAAO,EAAE,OAAO;AAChB,QAAA,YAAY,EAAE,gCAAgC;AAC9C,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,6BAA6B;AACnC,YAAA,KAAK,EAAE;AACR,SAAA;AACD,QAAA,cAAc,EAAE;AACjB;CACF;;ACdD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,aAAa;AAClD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,aAAa;AAClD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,aAAa;;ACPlD;;AAEG;;;;"}