@theseam/ui-common 2.0.1-beta.99 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/ai/index.d.ts +1 -363
  2. package/carousel/index.d.ts +1 -21
  3. package/data-filters/index.d.ts +30 -6
  4. package/datatable/index.d.ts +3 -299
  5. package/datatable-alterations-display/index.d.ts +1 -61
  6. package/fesm2022/theseam-ui-common-ai.mjs +1 -1368
  7. package/fesm2022/theseam-ui-common-ai.mjs.map +1 -1
  8. package/fesm2022/theseam-ui-common-carousel.mjs +1 -48
  9. package/fesm2022/theseam-ui-common-carousel.mjs.map +1 -1
  10. package/fesm2022/theseam-ui-common-data-filters.mjs +61 -18
  11. package/fesm2022/theseam-ui-common-data-filters.mjs.map +1 -1
  12. package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs +1 -197
  13. package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs.map +1 -1
  14. package/fesm2022/theseam-ui-common-datatable.mjs +4 -668
  15. package/fesm2022/theseam-ui-common-datatable.mjs.map +1 -1
  16. package/fesm2022/theseam-ui-common-file-input.mjs +1 -156
  17. package/fesm2022/theseam-ui-common-file-input.mjs.map +1 -1
  18. package/fesm2022/theseam-ui-common-google-maps.mjs +299 -218
  19. package/fesm2022/theseam-ui-common-google-maps.mjs.map +1 -1
  20. package/fesm2022/theseam-ui-common-icon.mjs +1 -72
  21. package/fesm2022/theseam-ui-common-icon.mjs.map +1 -1
  22. package/fesm2022/theseam-ui-common-table-cell-types.mjs +0 -4
  23. package/fesm2022/theseam-ui-common-table-cell-types.mjs.map +1 -1
  24. package/fesm2022/theseam-ui-common-toggle-group.mjs +81 -112
  25. package/fesm2022/theseam-ui-common-toggle-group.mjs.map +1 -1
  26. package/fesm2022/theseam-ui-common-tooltip.mjs +1 -110
  27. package/fesm2022/theseam-ui-common-tooltip.mjs.map +1 -1
  28. package/fesm2022/theseam-ui-common-utils.mjs +112 -21
  29. package/fesm2022/theseam-ui-common-utils.mjs.map +1 -1
  30. package/fesm2022/theseam-ui-common-widget.mjs +1 -23
  31. package/fesm2022/theseam-ui-common-widget.mjs.map +1 -1
  32. package/file-input/index.d.ts +1 -78
  33. package/google-maps/index.d.ts +35 -23
  34. package/icon/index.d.ts +3 -33
  35. package/package.json +5 -2
  36. package/toggle-group/index.d.ts +42 -18
  37. package/tooltip/index.d.ts +2 -40
  38. package/utils/index.d.ts +38 -6
  39. package/widget/index.d.ts +2 -17
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, forwardRef, Input, Inject, Optional, Component, ChangeDetectionStrategy, signal, ViewChild, HostBinding, NgModule } from '@angular/core';
3
- import { of, combineLatest } from 'rxjs';
3
+ import { of, combineLatest, Subject, merge } from 'rxjs';
4
4
  import { switchMap, startWith, map, shareReplay } from 'rxjs/operators';
5
5
  import * as i1 from '@angular/common';
6
6
  import { CommonModule } from '@angular/common';
@@ -329,15 +329,16 @@ const DefaultToggleButtonsFilterOptions = {
329
329
  exact: false,
330
330
  caseSensitive: false,
331
331
  maxWidth: undefined,
332
+ prependLabel: undefined,
332
333
  filterDropdownLabel: DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT,
333
- disableCollapse: undefined,
334
+ forceCollapseState: undefined,
334
335
  };
335
336
  function toggleButtonsFilter(data, values, options = DefaultToggleButtonsFilterOptions) {
336
337
  if (!data || !values) {
337
338
  return data;
338
339
  }
339
340
  const customComparatorBtns = [];
340
- for (const btn of options.buttons) {
341
+ for (const btn of options.buttons || []) {
341
342
  if (btn.comparator) {
342
343
  customComparatorBtns.push(btn);
343
344
  }
@@ -390,8 +391,9 @@ class DataFilterToggleButtonsComponent {
390
391
  exact = this._optDefault('exact');
391
392
  caseSensitive = this._optDefault('caseSensitive');
392
393
  maxWidth = this._optDefault('maxWidth');
394
+ prependLabel = this._optDefault('prependLabel');
393
395
  filterDropdownLabel = this._optDefault('filterDropdownLabel');
394
- disableCollapse = this._optDefault('disableCollapse');
396
+ forceCollapseState = this._optDefault('forceCollapseState');
395
397
  get _collapsedClass() {
396
398
  return this.isCollapsed();
397
399
  }
@@ -401,6 +403,10 @@ class DataFilterToggleButtonsComponent {
401
403
  isCollapsed = signal(false, ...(ngDevMode ? [{ debugName: "isCollapsed" }] : []));
402
404
  _measureDiv;
403
405
  _resizeObserver;
406
+ /**
407
+ * Emits when the `buttons` input changes.
408
+ */
409
+ _buttonsChanged = new Subject();
404
410
  set value(value) {
405
411
  const _value = !isNullOrUndefined(value) ? coerceArray(value) : undefined;
406
412
  if (this._control.value !== _value) {
@@ -421,10 +427,13 @@ class DataFilterToggleButtonsComponent {
421
427
  hasProperty(this._filterOptions, 'initialValue')) {
422
428
  this.value = this._optDefault('initialValue');
423
429
  }
424
- this.activeFilterLabel = this.filterStateChanges.pipe(startWith(undefined), map(() => {
430
+ this.activeFilterLabel = merge(this.filterStateChanges, this._buttonsChanged).pipe(startWith(undefined), map(() => {
425
431
  const state = this.filterState();
426
- const options = state.state.options;
427
- const selectedOptions = options.buttons
432
+ // Depending on the timing of when this is called, the options may not be fully initialized yet.
433
+ // Cast as partial to avoid TypeError on uninitialized values.
434
+ const options = state.state
435
+ .options;
436
+ const selectedOptions = (options.buttons || [])
428
437
  .filter((o) => coerceArray(state.state.value).includes(o.value))
429
438
  .map((o) => o.name);
430
439
  return selectedOptions.length > 0
@@ -434,19 +443,42 @@ class DataFilterToggleButtonsComponent {
434
443
  }
435
444
  ngAfterViewInit() {
436
445
  this._resizeObserver = new ResizeObserver(() => this._updateCollapsed());
437
- if (notNullOrUndefined(this._elementRef.nativeElement.parentElement) &&
438
- this.disableCollapse !== true) {
439
- this._resizeObserver.observe(this._elementRef.nativeElement.parentElement);
440
- }
446
+ this._syncResizeObserver();
441
447
  }
442
448
  ngOnChanges(changes) {
443
449
  if (changes['buttons'] && !changes['buttons'].firstChange) {
444
450
  this._updateCollapsed();
451
+ this._buttonsChanged.next();
452
+ }
453
+ if (changes['forceCollapseState'] &&
454
+ !changes['forceCollapseState'].firstChange) {
455
+ this._syncResizeObserver();
456
+ }
457
+ }
458
+ /**
459
+ * Observes the parent element only while the collapsed state is width driven.
460
+ * When `forceCollapseState` is set there is nothing to observe, so the
461
+ * observer is disconnected and the forced state is applied directly.
462
+ */
463
+ _syncResizeObserver() {
464
+ if (isNullOrUndefined(this._resizeObserver)) {
465
+ return;
466
+ }
467
+ this._resizeObserver.disconnect();
468
+ const parentElement = this._elementRef.nativeElement.parentElement;
469
+ if (notNullOrUndefined(parentElement) &&
470
+ isNullOrUndefined(this.forceCollapseState)) {
471
+ this._resizeObserver.observe(parentElement);
472
+ }
473
+ else {
474
+ // The observer won't fire, so apply the collapsed state directly.
475
+ this._updateCollapsed();
445
476
  }
446
477
  }
447
478
  ngOnDestroy() {
448
479
  this._filterContainer.removeFilter(this);
449
480
  this._resizeObserver?.disconnect();
481
+ this._buttonsChanged.complete();
450
482
  }
451
483
  _optDefault(prop) {
452
484
  if (this._filterOptions &&
@@ -465,18 +497,27 @@ class DataFilterToggleButtonsComponent {
465
497
  exact: this.exact,
466
498
  caseSensitive: this.caseSensitive,
467
499
  maxWidth: this.maxWidth,
500
+ prependLabel: this.prependLabel,
468
501
  filterDropdownLabel: this.filterDropdownLabel,
469
- disableCollapse: this.disableCollapse,
502
+ forceCollapseState: this.forceCollapseState,
470
503
  };
471
504
  }
472
505
  filter(data) {
473
- return this._control.valueChanges.pipe(map((v) => toggleButtonsFilter(data, coerceArray(v), this.options)), startWith(toggleButtonsFilter(data, coerceArray(this._control.value), this.options)));
506
+ // `buttons` is merged in because `toggleButtonsFilter` resolves each value's
507
+ // custom `comparator` from `options.buttons`. A `buttons` list that arrives
508
+ // after the value is set would otherwise keep filtering with the stale
509
+ // (empty) list until the next value change.
510
+ return merge(this._control.valueChanges, this._buttonsChanged).pipe(map(() => toggleButtonsFilter(data, coerceArray(this._control.value), this.options)), startWith(toggleButtonsFilter(data, coerceArray(this._control.value), this.options)));
474
511
  }
475
512
  _updateCollapsed() {
476
- if (this.disableCollapse) {
477
- if (this.isCollapsed()) {
513
+ if (notNullOrUndefined(this.forceCollapseState)) {
514
+ if (this.isCollapsed() && this.forceCollapseState === 'expanded') {
478
515
  this.isCollapsed.set(false);
479
516
  }
517
+ else if (!this.isCollapsed() &&
518
+ this.forceCollapseState === 'collapsed') {
519
+ this.isCollapsed.set(true);
520
+ }
480
521
  return;
481
522
  }
482
523
  if (!this._measureDiv) {
@@ -506,11 +547,11 @@ class DataFilterToggleButtonsComponent {
506
547
  };
507
548
  }
508
549
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DataFilterToggleButtonsComponent, deps: [{ token: i0.ElementRef }, { token: THESEAM_DATA_FILTER_CONTAINER }, { token: THESEAM_DATA_FILTER_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Component });
509
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: DataFilterToggleButtonsComponent, isStandalone: false, selector: "seam-data-filter-toggle-buttons", inputs: { filterName: "filterName", properties: "properties", omitProperties: "omitProperties", multiple: "multiple", selectionToggleable: "selectionToggleable", buttons: "buttons", exact: "exact", caseSensitive: "caseSensitive", maxWidth: "maxWidth", filterDropdownLabel: "filterDropdownLabel", disableCollapse: "disableCollapse", value: "value" }, host: { properties: { "class.seam-data-filter-toggle-buttons-collapsed": "this._collapsedClass", "class.seam-data-filter-toggle-buttons-expanded": "this._expandedClass" } }, providers: [DATA_FILTER_TOGGLE_BUTTON], viewQueries: [{ propertyName: "_measureDiv", first: true, predicate: ["measureDiv"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"isCollapsed(); else buttonsTpl\">\n <button\n seamButton\n theme=\"primary\"\n size=\"sm\"\n class=\"dropdown-toggle\"\n title=\"View filter options\"\n [seamMenuToggle]=\"buttonsDropdownTpl\"\n >\n {{ activeFilterLabel | async }}\n </button>\n <seam-menu #buttonsDropdownTpl>\n <div\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n seamMenuItem\n [seamToggleGroupOption]=\"btn.value\"\n #opt=\"seamToggleGroupOption\"\n [class.seam-menu-item-active]=\"opt.selected\"\n (click)=\"opt.selected = !opt.selected\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n </seam-menu>\n</ng-container>\n\n<ng-template #buttonsTpl>\n <div\n class=\"btn-group\"\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n type=\"button\"\n class=\"btn btn-sm px-4\"\n [seamToggleGroupOption]=\"btn.value\"\n #opt=\"seamToggleGroupOption\"\n [class.btn-lightgray]=\"!opt.selected\"\n [class.btn-primary]=\"opt.selected\"\n (click)=\"opt.selected = !opt.selected\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Hidden measurement div: always in DOM, used to read natural btn-group width -->\n<div #measureDiv class=\"btn-group btn-group--measure\" aria-hidden=\"true\">\n <ng-container *ngFor=\"let btn of buttons\">\n <button type=\"button\" class=\"btn btn-sm px-4\" tabindex=\"-1\">\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n</div>\n", styles: [":host{position:relative}.btn-group--measure{visibility:hidden;position:absolute;pointer-events:none;white-space:nowrap;top:0;left:-9999px}.seam-menu-item.seam-menu-item-active,.seam-menu-item.seam-menu-item-active.cdk-mouse-focused:not(:hover){background:#357ebd;color:#fff}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3$1.ToggleGroupDirective, selector: "[seamToggleGroup]", inputs: ["value", "disabled", "multiple", "selectionToggleable"], outputs: ["change"], exportAs: ["seamToggleGroup"] }, { kind: "directive", type: i3$1.ToggleGroupOptionDirective, selector: "[seamToggleGroupOption]", inputs: ["seamToggleGroupOption", "selected"], outputs: ["selectionChange"], exportAs: ["seamToggleGroupOption"] }, { kind: "component", type: i4$1.MenuComponent, selector: "seam-menu", inputs: ["menuClass", "baseWidth", "animationType"], outputs: ["closed"], exportAs: ["seamMenu"] }, { kind: "directive", type: i4$1.MenuToggleDirective, selector: "[seamMenuToggle]", inputs: ["seamMenuToggle", "positions", "seamMenuTogglePositionsOffsetY"], outputs: ["menuToggle", "menuOpened", "menuClosed"], exportAs: ["seamMenuToggle"] }, { kind: "component", type: i4$1.MenuItemComponent, selector: "[seamMenuItem]", inputs: ["disabled", "role", "icon", "iconClass", "sublevelIcon", "subLevelIconClass", "badgeText", "badgeTheme"], exportAs: ["seamMenuItem"] }, { kind: "component", type: i5.TheSeamButtonComponent, selector: "button[seamButton]", inputs: ["disabled", "theme", "size", "type"], exportAs: ["seamButton"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
550
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: DataFilterToggleButtonsComponent, isStandalone: false, selector: "seam-data-filter-toggle-buttons", inputs: { filterName: "filterName", properties: "properties", omitProperties: "omitProperties", multiple: "multiple", selectionToggleable: "selectionToggleable", buttons: "buttons", exact: "exact", caseSensitive: "caseSensitive", maxWidth: "maxWidth", prependLabel: "prependLabel", filterDropdownLabel: "filterDropdownLabel", forceCollapseState: "forceCollapseState", value: "value" }, host: { properties: { "class.seam-data-filter-toggle-buttons-collapsed": "this._collapsedClass", "class.seam-data-filter-toggle-buttons-expanded": "this._expandedClass" } }, providers: [DATA_FILTER_TOGGLE_BUTTON], viewQueries: [{ propertyName: "_measureDiv", first: true, predicate: ["measureDiv"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"isCollapsed(); else buttonsTpl\">\n <div class=\"d-flex toggle-buttons-filter__collapsed\">\n <div\n *ngIf=\"prependLabel\"\n class=\"d-flex align-items-center toggle-buttons-filter__collapsed-prepend-label\"\n >\n {{ prependLabel }}\n </div>\n <button\n seamButton\n theme=\"lightgray\"\n size=\"sm\"\n class=\"dropdown-toggle toggle-buttons-filter__collapsed-button\"\n title=\"View filter options\"\n [seamMenuToggle]=\"buttonsDropdownTpl\"\n >\n {{ activeFilterLabel | async }}\n </button>\n <seam-menu #buttonsDropdownTpl>\n <div\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n #tg=\"seamToggleGroup\"\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n seamMenuItem\n [seamToggleGroupOption]=\"btn.value\"\n [class.seam-menu-item-active]=\"tg.isSelected(btn.value)\"\n (click)=\"tg.toggleOptionSelect(btn.value)\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n </seam-menu>\n </div>\n</ng-container>\n\n<ng-template #buttonsTpl>\n <div\n class=\"btn-group toggle-buttons-filter__expanded\"\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n #tg=\"seamToggleGroup\"\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n type=\"button\"\n class=\"btn btn-sm px-4\"\n [seamToggleGroupOption]=\"btn.value\"\n [class.btn-lightgray]=\"!tg.isSelected(btn.value)\"\n [class.btn-primary]=\"tg.isSelected(btn.value)\"\n (click)=\"tg.toggleOptionSelect(btn.value)\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Hidden measurement div: always in DOM, used to read natural btn-group width -->\n<div #measureDiv class=\"btn-group btn-group--measure\" aria-hidden=\"true\">\n <ng-container *ngFor=\"let btn of buttons\">\n <button type=\"button\" class=\"btn btn-sm px-4\" tabindex=\"-1\">\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n</div>\n", styles: [":host{position:relative}.btn-group--measure{visibility:hidden;position:absolute;pointer-events:none;white-space:nowrap;top:0;left:-9999px}.seam-menu-item.seam-menu-item-active,.seam-menu-item.seam-menu-item-active.cdk-mouse-focused:not(:hover){background:#357ebd;color:#fff}.toggle-buttons-filter__collapsed{font-size:.875rem}.toggle-buttons-filter__collapsed-prepend-label{border-radius:.2rem 0 0 .2rem;padding:.25rem .75rem;background:#357ebd;color:#fff}.toggle-buttons-filter__collapsed-button{position:relative;min-width:100px;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;padding-right:1.5rem}.toggle-buttons-filter__collapsed-button:after{position:absolute;top:calc(50% - 3px);right:calc(.75rem - 3px)}.toggle-buttons-filter__collapsed-prepend-label~.toggle-buttons-filter__collapsed-button{border-radius:0 .2rem .2rem 0}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3$1.ToggleGroupDirective, selector: "[seamToggleGroup]", inputs: ["value", "disabled", "multiple", "selectionToggleable"], outputs: ["change"], exportAs: ["seamToggleGroup"] }, { kind: "directive", type: i3$1.ToggleGroupOptionDirective, selector: "[seamToggleGroupOption]", inputs: ["seamToggleGroupOption"], exportAs: ["seamToggleGroupOption"] }, { kind: "component", type: i4$1.MenuComponent, selector: "seam-menu", inputs: ["menuClass", "baseWidth", "animationType"], outputs: ["closed"], exportAs: ["seamMenu"] }, { kind: "directive", type: i4$1.MenuToggleDirective, selector: "[seamMenuToggle]", inputs: ["seamMenuToggle", "positions", "seamMenuTogglePositionsOffsetY"], outputs: ["menuToggle", "menuOpened", "menuClosed"], exportAs: ["seamMenuToggle"] }, { kind: "component", type: i4$1.MenuItemComponent, selector: "[seamMenuItem]", inputs: ["disabled", "role", "icon", "iconClass", "sublevelIcon", "subLevelIconClass", "badgeText", "badgeTheme"], exportAs: ["seamMenuItem"] }, { kind: "component", type: i5.TheSeamButtonComponent, selector: "button[seamButton]", inputs: ["disabled", "theme", "size", "type"], exportAs: ["seamButton"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
510
551
  }
511
552
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DataFilterToggleButtonsComponent, decorators: [{
512
553
  type: Component,
513
- args: [{ selector: 'seam-data-filter-toggle-buttons', providers: [DATA_FILTER_TOGGLE_BUTTON], standalone: false, template: "<ng-container *ngIf=\"isCollapsed(); else buttonsTpl\">\n <button\n seamButton\n theme=\"primary\"\n size=\"sm\"\n class=\"dropdown-toggle\"\n title=\"View filter options\"\n [seamMenuToggle]=\"buttonsDropdownTpl\"\n >\n {{ activeFilterLabel | async }}\n </button>\n <seam-menu #buttonsDropdownTpl>\n <div\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n seamMenuItem\n [seamToggleGroupOption]=\"btn.value\"\n #opt=\"seamToggleGroupOption\"\n [class.seam-menu-item-active]=\"opt.selected\"\n (click)=\"opt.selected = !opt.selected\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n </seam-menu>\n</ng-container>\n\n<ng-template #buttonsTpl>\n <div\n class=\"btn-group\"\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n type=\"button\"\n class=\"btn btn-sm px-4\"\n [seamToggleGroupOption]=\"btn.value\"\n #opt=\"seamToggleGroupOption\"\n [class.btn-lightgray]=\"!opt.selected\"\n [class.btn-primary]=\"opt.selected\"\n (click)=\"opt.selected = !opt.selected\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Hidden measurement div: always in DOM, used to read natural btn-group width -->\n<div #measureDiv class=\"btn-group btn-group--measure\" aria-hidden=\"true\">\n <ng-container *ngFor=\"let btn of buttons\">\n <button type=\"button\" class=\"btn btn-sm px-4\" tabindex=\"-1\">\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n</div>\n", styles: [":host{position:relative}.btn-group--measure{visibility:hidden;position:absolute;pointer-events:none;white-space:nowrap;top:0;left:-9999px}.seam-menu-item.seam-menu-item-active,.seam-menu-item.seam-menu-item-active.cdk-mouse-focused:not(:hover){background:#357ebd;color:#fff}\n"] }]
554
+ args: [{ selector: 'seam-data-filter-toggle-buttons', providers: [DATA_FILTER_TOGGLE_BUTTON], standalone: false, template: "<ng-container *ngIf=\"isCollapsed(); else buttonsTpl\">\n <div class=\"d-flex toggle-buttons-filter__collapsed\">\n <div\n *ngIf=\"prependLabel\"\n class=\"d-flex align-items-center toggle-buttons-filter__collapsed-prepend-label\"\n >\n {{ prependLabel }}\n </div>\n <button\n seamButton\n theme=\"lightgray\"\n size=\"sm\"\n class=\"dropdown-toggle toggle-buttons-filter__collapsed-button\"\n title=\"View filter options\"\n [seamMenuToggle]=\"buttonsDropdownTpl\"\n >\n {{ activeFilterLabel | async }}\n </button>\n <seam-menu #buttonsDropdownTpl>\n <div\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n #tg=\"seamToggleGroup\"\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n seamMenuItem\n [seamToggleGroupOption]=\"btn.value\"\n [class.seam-menu-item-active]=\"tg.isSelected(btn.value)\"\n (click)=\"tg.toggleOptionSelect(btn.value)\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n </seam-menu>\n </div>\n</ng-container>\n\n<ng-template #buttonsTpl>\n <div\n class=\"btn-group toggle-buttons-filter__expanded\"\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n #tg=\"seamToggleGroup\"\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n type=\"button\"\n class=\"btn btn-sm px-4\"\n [seamToggleGroupOption]=\"btn.value\"\n [class.btn-lightgray]=\"!tg.isSelected(btn.value)\"\n [class.btn-primary]=\"tg.isSelected(btn.value)\"\n (click)=\"tg.toggleOptionSelect(btn.value)\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Hidden measurement div: always in DOM, used to read natural btn-group width -->\n<div #measureDiv class=\"btn-group btn-group--measure\" aria-hidden=\"true\">\n <ng-container *ngFor=\"let btn of buttons\">\n <button type=\"button\" class=\"btn btn-sm px-4\" tabindex=\"-1\">\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n</div>\n", styles: [":host{position:relative}.btn-group--measure{visibility:hidden;position:absolute;pointer-events:none;white-space:nowrap;top:0;left:-9999px}.seam-menu-item.seam-menu-item-active,.seam-menu-item.seam-menu-item-active.cdk-mouse-focused:not(:hover){background:#357ebd;color:#fff}.toggle-buttons-filter__collapsed{font-size:.875rem}.toggle-buttons-filter__collapsed-prepend-label{border-radius:.2rem 0 0 .2rem;padding:.25rem .75rem;background:#357ebd;color:#fff}.toggle-buttons-filter__collapsed-button{position:relative;min-width:100px;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;padding-right:1.5rem}.toggle-buttons-filter__collapsed-button:after{position:absolute;top:calc(50% - 3px);right:calc(.75rem - 3px)}.toggle-buttons-filter__collapsed-prepend-label~.toggle-buttons-filter__collapsed-button{border-radius:0 .2rem .2rem 0}\n"] }]
514
555
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: undefined, decorators: [{
515
556
  type: Inject,
516
557
  args: [THESEAM_DATA_FILTER_CONTAINER]
@@ -537,9 +578,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
537
578
  type: Input
538
579
  }], maxWidth: [{
539
580
  type: Input
581
+ }], prependLabel: [{
582
+ type: Input
540
583
  }], filterDropdownLabel: [{
541
584
  type: Input
542
- }], disableCollapse: [{
585
+ }], forceCollapseState: [{
543
586
  type: Input
544
587
  }], _collapsedClass: [{
545
588
  type: HostBinding,
@@ -1 +1 @@
1
- {"version":3,"file":"theseam-ui-common-data-filters.mjs","sources":["../../../projects/ui-common/data-filters/data-filter.ts","../../../projects/ui-common/data-filters/data-filter-def.ts","../../../projects/ui-common/data-filters/data-filter-container.ts","../../../projects/ui-common/data-filters/filters/data-filter-text/data-filter-text.component.ts","../../../projects/ui-common/data-filters/filters/data-filter-text/data-filter-text.component.html","../../../projects/ui-common/data-filters/filters/data-filter-search/data-filter-search.component.ts","../../../projects/ui-common/data-filters/filters/data-filter-search/data-filter-search.component.html","../../../projects/ui-common/data-filters/filters/data-filter-toggle-buttons/data-filter-toggle-buttons.component.ts","../../../projects/ui-common/data-filters/filters/data-filter-toggle-buttons/data-filter-toggle-buttons.component.html","../../../projects/ui-common/data-filters/data-filters.module.ts","../../../projects/ui-common/data-filters/theseam-ui-common-data-filters.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core'\nimport { combineLatest, Observable, of } from 'rxjs'\nimport { map, startWith, switchMap } from 'rxjs/operators'\n\nexport type DataFilterFunction = <T>(data: T[]) => Observable<T[]>\n\n/**\n * State of the filter that would allow an external operation to apply the\n * filtering.\n *\n * This is primarily for server-side filtering.\n */\nexport interface DataFilterState {\n /**\n * DataFilter's name.\n */\n name: string\n\n /**\n * Anything necessary for an external implementation to apply this filter.\n */\n state: { [key: string]: any }\n}\n\n// TODO: Consider adding something, such as a priority or order, to allow the\n// order the filter functions are called in to be declared/influenced\n// externally. This would allow the filters that will most likely filter out\n// many records quickly to be run before the heavy processing filters.\nexport interface DataFilter {\n /**\n * Name used when referencing filter by string.\n */\n name: string\n\n /**\n * Optional override for the filter name used in `filterState()`.\n *\n * When multiple instances of the same filter type exist on a page, each\n * instance shares the same `name`. Set `filterName` to give an instance a\n * distinct key so that filter-state mappers can differentiate them.\n *\n * If unset, `filterState()` falls back to `name`.\n */\n filterName?: string\n\n /**\n * Unique value to prevent a filter being used more than once if it ends up\n * being registered more than once.\n */\n uid: string\n\n /**\n *\n */\n filterStateChanges: Observable<DataFilterState>\n\n /**\n * Filters the data based on the conditions of the filter.\n */\n filter<T>(data: T[]): Observable<T[]>\n\n /**\n *\n */\n filterState(): DataFilterState\n}\n\nexport const THESEAM_DATA_FILTER = new InjectionToken<DataFilter>(\n 'TheSeamDataFilter',\n)\nexport const THESEAM_DATA_FILTER_OPTIONS = new InjectionToken<object>(\n 'TheSeamDataFilterOptions',\n)\n\nexport function filterOperator<T>(filterFn: DataFilterFunction) {\n return (source$: Observable<T[]>) => source$.pipe(switchMap(filterFn))\n}\n\nexport function composeDataFilters(filters: DataFilter[]) {\n const filterFunctions = filters.map((f) => filterOperator(f.filter.bind(f)))\n return (source$: Observable<any>) => {\n let src$ = source$\n for (const f of filterFunctions) {\n src$ = src$.pipe(f)\n }\n return src$\n }\n}\n\nexport function composeDataFilterStates(\n filters: DataFilter[],\n): Observable<DataFilterState[]> {\n if (filters.length === 0) {\n return of([])\n }\n\n return combineLatest(\n filters.map((f) =>\n f.filterStateChanges.pipe(\n startWith(undefined),\n map(() => f.filterState()),\n ),\n ),\n )\n}\n\n/** @deprecated Use `DataFilter` instead. */\nexport type IDataFilter = DataFilter\n\n/** @deprecated Use `IDataFilterFunction` instead. */\nexport type IDataFilterFunction = DataFilterFunction\n","import { InjectionToken } from '@angular/core'\n\nimport { IDataFilter } from './data-filter'\n\nexport interface IDataFilterDef<T = any> {\n name: string\n\n /**\n * Component that controls the filter.\n */\n component: IDataFilter\n}\n\nexport const THESEAM_DATA_FILTER_DEF = new InjectionToken<IDataFilterDef[]>(\n 'TheSeamDataFilter',\n)\n","import { InjectionToken } from '@angular/core'\nimport { IDataFilter } from './data-filter'\n\nexport interface DataFilterContainer {\n filters(): IDataFilter[]\n\n addFilter(dataFilter: IDataFilter): void\n\n removeFilter(dataFilter: IDataFilter): void\n}\n\nexport const THESEAM_DATA_FILTER_CONTAINER =\n new InjectionToken<DataFilterContainer>('DataFilterContainer')\n","import { BooleanInput } from '@angular/cdk/coercion'\nimport {\n Component,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n TemplateRef,\n} from '@angular/core'\nimport { UntypedFormControl } from '@angular/forms'\nimport { Observable, of } from 'rxjs'\nimport { map, shareReplay, startWith, switchMap } from 'rxjs/operators'\n\nimport { InputBoolean } from '@theseam/ui-common/core'\nimport { isNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport {\n DataFilterState,\n IDataFilter,\n THESEAM_DATA_FILTER,\n THESEAM_DATA_FILTER_OPTIONS,\n} from '../../data-filter'\nimport { THESEAM_DATA_FILTER_CONTAINER } from '../../data-filter-container'\nimport type { DataFilterContainer } from '../../data-filter-container'\nimport { ITextFilterOptions } from './text-filter-options'\n\nexport const DATA_FILTER_TEXT: any = {\n provide: THESEAM_DATA_FILTER,\n useExisting: forwardRef(() => DataFilterTextComponent),\n multi: true,\n}\n\nexport const DefaultTextFilterOptions: ITextFilterOptions = {\n properties: undefined,\n omitProperties: undefined,\n exact: false,\n caseSensitive: false,\n}\n\nexport function textDataFilter(\n data: any[],\n text: string,\n options = DefaultTextFilterOptions,\n) {\n if (!data || !text) {\n return data\n }\n\n if (data.length <= 0) {\n return data\n }\n\n let props = options ? options.properties : undefined\n if (!props) {\n props = []\n let keys = Object.keys(data[0])\n if (options && options.omitProperties) {\n keys = keys.filter(\n (key) => !(options.omitProperties || []).find((p) => p === key),\n )\n }\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(data[0], key)) {\n props.push(key)\n }\n }\n }\n\n const filtered: any[] = []\n\n for (const item of data) {\n for (const p of props) {\n let value1 = `${item[p]}`\n let value2 = text\n\n if (!options.caseSensitive) {\n value1 = value1.toLowerCase()\n value2 = value2.toLowerCase()\n }\n\n if (item[p] && value1.indexOf(value2) !== (options.exact ? 0 : -1)) {\n filtered.push(item)\n break\n }\n }\n }\n\n return filtered\n}\n\nlet _uid = 0\n\n@Component({\n selector: 'seam-data-filter-text',\n templateUrl: './data-filter-text.component.html',\n styleUrls: ['./data-filter-text.component.scss'],\n providers: [DATA_FILTER_TEXT],\n standalone: false,\n})\nexport class DataFilterTextComponent implements OnInit, OnDestroy, IDataFilter {\n static ngAcceptInputType_exact: BooleanInput\n static ngAcceptInputType_caseSensitive: BooleanInput\n\n public readonly name = 'text'\n public readonly uid = `text__${_uid++}`\n\n @Input() filterName: string | undefined\n\n _control = new UntypedFormControl()\n\n @Input() properties: string[] | undefined | null =\n this._optDefault('properties')\n @Input() omitProperties: string[] | undefined | null =\n this._optDefault('omitProperties')\n @Input() @InputBoolean() exact: boolean = this._optDefault('exact')\n @Input() @InputBoolean() caseSensitive: boolean =\n this._optDefault('caseSensitive')\n\n @Input() placeholder: string | undefined | null\n @Input() iconTpl: TemplateRef<HTMLElement> | undefined | null\n\n @Input()\n set value(value: string | string[]) {\n const _value = !isNullOrUndefined(value) ? `${value}` : ''\n if (this._control.value !== _value) {\n this._control.setValue(_value)\n }\n }\n\n public readonly filterStateChanges: Observable<DataFilterState>\n\n constructor(\n @Inject(THESEAM_DATA_FILTER_CONTAINER)\n private _filterContainer: DataFilterContainer,\n @Optional()\n @Inject(THESEAM_DATA_FILTER_OPTIONS)\n private _filterOptions: ITextFilterOptions | null,\n ) {\n this.filterStateChanges = this._control.valueChanges.pipe(\n switchMap(() => of(this.filterState())),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }\n\n ngOnInit() {\n this._filterContainer.addFilter(this)\n }\n\n ngOnDestroy() {\n this._filterContainer.removeFilter(this)\n }\n\n private _optDefault<K extends keyof ITextFilterOptions>(prop: K) {\n if (\n this._filterOptions &&\n Object.prototype.hasOwnProperty.call(this._filterOptions, prop)\n ) {\n return this._filterOptions[prop]\n }\n return DefaultTextFilterOptions[prop]\n }\n\n get options(): ITextFilterOptions {\n return {\n properties: this.properties ?? undefined,\n omitProperties: this.omitProperties ?? undefined,\n exact: this.exact,\n caseSensitive: this.caseSensitive,\n }\n }\n\n public filter<T>(data: T[]): Observable<T[]> {\n return this._control.valueChanges.pipe(\n map((v) => textDataFilter(data, v, this.options)),\n startWith(textDataFilter(data, this._control.value, this.options)),\n )\n }\n\n public filterState(): DataFilterState {\n return {\n // id:\n name: this.filterName ?? this.name,\n state: {\n value: this._control.value,\n options: this.options,\n },\n }\n }\n}\n","<div\n class=\"position-relative\"\n [class.data-filter-text-has-icon]=\"iconTpl\"\n (click)=\"inp.focus()\"\n>\n <label [attr.for]=\"inp.id\" class=\"sr-only\">Text filter</label>\n <input\n seamInput\n #inp=\"seamInput\"\n seamInputSize=\"sm\"\n [formControl]=\"_control\"\n [placeholder]=\"placeholder\"\n />\n <ng-container *ngIf=\"iconTpl\">\n <ng-container *ngTemplateOutlet=\"iconTpl\"></ng-container>\n </ng-container>\n</div>\n","import { BooleanInput } from '@angular/cdk/coercion'\nimport {\n ChangeDetectionStrategy,\n Component,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n TemplateRef,\n} from '@angular/core'\nimport { UntypedFormControl } from '@angular/forms'\nimport { Observable, of } from 'rxjs'\nimport { map, shareReplay, startWith, switchMap } from 'rxjs/operators'\n\nimport { faSearch } from '@fortawesome/free-solid-svg-icons'\n\nimport { InputBoolean } from '@theseam/ui-common/core'\nimport type { SeamIcon } from '@theseam/ui-common/icon'\nimport { isNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport {\n DataFilterState,\n IDataFilter,\n THESEAM_DATA_FILTER,\n THESEAM_DATA_FILTER_OPTIONS,\n} from '../../data-filter'\nimport { THESEAM_DATA_FILTER_CONTAINER } from '../../data-filter-container'\nimport type { DataFilterContainer } from '../../data-filter-container'\nimport { textDataFilter } from '../data-filter-text/data-filter-text.component'\n\nimport { ISearchFilterOptions } from './search-filter-options'\n\nexport const DATA_FILTER_SEARCH: any = {\n provide: THESEAM_DATA_FILTER,\n useExisting: forwardRef(() => DataFilterSearchComponent),\n multi: true,\n}\n\nexport const DefaultSearchFilterOptions: ISearchFilterOptions = {\n properties: undefined,\n omitProperties: undefined,\n exact: false,\n caseSensitive: false,\n}\n\nexport function searchDataFilter(\n data: any[],\n values: string,\n options = DefaultSearchFilterOptions,\n) {\n return textDataFilter(data, values, options)\n}\n\nlet _uid = 0\n\n@Component({\n selector: 'seam-data-filter-search',\n templateUrl: './data-filter-search.component.html',\n styleUrls: ['./data-filter-search.component.scss'],\n providers: [DATA_FILTER_SEARCH],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class DataFilterSearchComponent\n implements OnInit, OnDestroy, IDataFilter\n{\n static ngAcceptInputType_exact: BooleanInput\n static ngAcceptInputType_caseSensitive: BooleanInput\n\n public readonly name = 'search'\n public readonly uid = `search__${_uid++}`\n\n @Input() filterName: string | undefined\n\n _control = new UntypedFormControl()\n\n @Input() properties: string[] | undefined | null =\n this._optDefault('properties')\n @Input() omitProperties: string[] | undefined | null =\n this._optDefault('omitProperties')\n @Input() @InputBoolean() exact: boolean = this._optDefault('exact')\n @Input() @InputBoolean() caseSensitive: boolean =\n this._optDefault('caseSensitive')\n\n @Input() placeholder: string | undefined | null = 'Search...'\n @Input() icon: SeamIcon | undefined | null = faSearch\n @Input() iconTpl?: TemplateRef<HTMLElement>\n\n @Input()\n set value(value: string | string[]) {\n const _value = !isNullOrUndefined(value) ? `${value}` : ''\n if (this._control.value !== _value) {\n this._control.setValue(_value)\n }\n }\n\n public readonly filterStateChanges: Observable<DataFilterState>\n\n constructor(\n @Inject(THESEAM_DATA_FILTER_CONTAINER)\n private _filterContainer: DataFilterContainer,\n @Optional()\n @Inject(THESEAM_DATA_FILTER_OPTIONS)\n private _filterOptions: ISearchFilterOptions | null,\n ) {\n this.filterStateChanges = this._control.valueChanges.pipe(\n switchMap(() => of(this.filterState())),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }\n\n ngOnInit() {\n this._filterContainer.addFilter(this)\n }\n\n ngOnDestroy() {\n this._filterContainer.removeFilter(this)\n }\n\n private _optDefault<K extends keyof ISearchFilterOptions>(prop: K) {\n if (\n this._filterOptions &&\n Object.prototype.hasOwnProperty.call(this._filterOptions, prop)\n ) {\n return this._filterOptions[prop]\n }\n return DefaultSearchFilterOptions[prop]\n }\n\n get options(): ISearchFilterOptions {\n return {\n properties: this.properties ?? undefined,\n omitProperties: this.omitProperties ?? undefined,\n exact: this.exact,\n caseSensitive: this.caseSensitive,\n }\n }\n\n public filter<T>(data: T[]): Observable<T[]> {\n return this._control.valueChanges.pipe(\n map((v) => searchDataFilter(data, v, this.options)),\n startWith(searchDataFilter(data, this._control.value, this.options)),\n )\n }\n\n public filterState(): DataFilterState {\n return {\n // id:\n name: this.filterName ?? this.name,\n state: {\n value: this._control.value,\n options: this.options,\n },\n }\n }\n}\n","<div\n class=\"position-relative\"\n [class.data-filter-search-has-icon]=\"iconTpl || icon\"\n (click)=\"inp.focus()\"\n>\n <label [attr.for]=\"inp.id\" class=\"sr-only\">Search filter</label>\n <input\n seamInput\n #inp=\"seamInput\"\n seamInputSize=\"sm\"\n [formControl]=\"_control\"\n [placeholder]=\"placeholder\"\n />\n <ng-container *ngIf=\"iconTpl; else searchIconTpl\">\n <div class=\"data-filter-search--icon-wrapper\">\n <ng-container *ngTemplateOutlet=\"iconTpl\"></ng-container>\n </div>\n </ng-container>\n <ng-template #searchIconTpl>\n <ng-container *ngIf=\"icon\">\n <div class=\"data-filter-search--icon-wrapper\">\n <seam-icon [icon]=\"icon\" class=\"text-muted\"></seam-icon>\n </div>\n </ng-container>\n </ng-template>\n</div>\n","import { coerceArray } from '@angular/cdk/coercion'\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n forwardRef,\n HostBinding,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n signal,\n SimpleChanges,\n ViewChild,\n} from '@angular/core'\nimport { UntypedFormControl } from '@angular/forms'\nimport { Observable, of } from 'rxjs'\nimport { map, shareReplay, startWith, switchMap } from 'rxjs/operators'\n\nimport {\n hasProperty,\n isNullOrUndefined,\n notNullOrUndefined,\n} from '@theseam/ui-common/utils'\n\nimport {\n DataFilterState,\n IDataFilter,\n THESEAM_DATA_FILTER,\n THESEAM_DATA_FILTER_OPTIONS,\n} from '../../data-filter'\nimport { THESEAM_DATA_FILTER_CONTAINER } from '../../data-filter-container'\nimport type { DataFilterContainer } from '../../data-filter-container'\nimport { textDataFilter } from '../data-filter-text/data-filter-text.component'\nimport { ITextFilterOptions } from '../data-filter-text/text-filter-options'\n\nexport const DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT = 'Select Filter'\n\nexport const DATA_FILTER_TOGGLE_BUTTON: any = {\n provide: THESEAM_DATA_FILTER,\n useExisting: forwardRef(() => DataFilterToggleButtonsComponent),\n multi: true,\n}\n\nexport interface IToggleButton {\n name: string\n value: string\n comparator?: (value: any, row: any, index: number) => -1 | 0 | 1\n}\n\nexport interface IToggleButtonsFilterOptions extends ITextFilterOptions {\n selectionToggleable: boolean\n multiple: boolean\n buttons: IToggleButton[]\n initialValue?: any\n /** The maximum width a button row can grow to before collapsing. If not set, the button row will grow until it overflows, then collapse. */\n maxWidth?: number\n /** The text shown when the button row is in the collapsed state and no filter is selected. */\n filterDropdownLabel?: string\n /** When true, will prevent the button row from collapsing into a dropdown on smaller screen sizes. */\n disableCollapse?: boolean\n}\n\nexport const DefaultToggleButtonsFilterOptions: IToggleButtonsFilterOptions = {\n properties: undefined,\n omitProperties: undefined,\n multiple: false,\n selectionToggleable: false,\n buttons: [],\n exact: false,\n caseSensitive: false,\n maxWidth: undefined,\n filterDropdownLabel: DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT,\n disableCollapse: undefined,\n}\n\nexport function toggleButtonsFilter(\n data: any[],\n values: string[],\n options = DefaultToggleButtonsFilterOptions,\n) {\n if (!data || !values) {\n return data\n }\n\n const customComparatorBtns: IToggleButton[] = []\n for (const btn of options.buttons) {\n if (btn.comparator) {\n customComparatorBtns.push(btn)\n }\n }\n\n let _data = data\n for (const val of values) {\n if (val === '') {\n continue\n }\n\n let cmp\n for (const btn of customComparatorBtns) {\n if (btn.value === val) {\n cmp = btn.comparator\n }\n }\n if (cmp) {\n const filtered: any[] = []\n for (let i = 0; i < _data.length; i++) {\n if (cmp(val, _data[i], i) !== -1) {\n filtered.push(_data[i])\n }\n }\n _data = filtered\n } else {\n _data = textDataFilter(_data, val, {\n properties: options.properties,\n omitProperties: options.omitProperties,\n exact: options.exact,\n caseSensitive: options.caseSensitive,\n })\n }\n }\n return _data\n}\n\nlet _uid = 0\n\n@Component({\n selector: 'seam-data-filter-toggle-buttons',\n templateUrl: './data-filter-toggle-buttons.component.html',\n styleUrls: ['./data-filter-toggle-buttons.component.scss'],\n providers: [DATA_FILTER_TOGGLE_BUTTON],\n standalone: false,\n})\nexport class DataFilterToggleButtonsComponent\n implements OnInit, OnChanges, OnDestroy, AfterViewInit, IDataFilter\n{\n public readonly name = 'toggle-buttons'\n public readonly uid = `toggle-buttons__${_uid++}`\n\n @Input() filterName: string | undefined\n\n _control = new UntypedFormControl()\n\n @Input() properties = this._optDefault('properties')\n @Input() omitProperties = this._optDefault('omitProperties')\n @Input() multiple = this._optDefault('multiple')\n @Input() selectionToggleable = this._optDefault('selectionToggleable')\n @Input() buttons = this._optDefault('buttons')\n @Input() exact = this._optDefault('exact')\n @Input() caseSensitive = this._optDefault('caseSensitive')\n @Input() maxWidth = this._optDefault('maxWidth')\n @Input() filterDropdownLabel = this._optDefault('filterDropdownLabel')\n @Input() disableCollapse = this._optDefault('disableCollapse')\n\n @HostBinding('class.seam-data-filter-toggle-buttons-collapsed')\n get _collapsedClass() {\n return this.isCollapsed()\n }\n\n @HostBinding('class.seam-data-filter-toggle-buttons-expanded')\n get _expandedClass() {\n return !this.isCollapsed()\n }\n\n public readonly isCollapsed = signal(false)\n\n @ViewChild('measureDiv') private _measureDiv!: ElementRef<HTMLElement>\n\n private _resizeObserver: ResizeObserver | undefined\n\n @Input()\n set value(value: string | string[]) {\n const _value = !isNullOrUndefined(value) ? coerceArray(value) : undefined\n if (this._control.value !== _value) {\n this._control.setValue(_value)\n }\n }\n\n public readonly filterStateChanges: Observable<DataFilterState>\n public activeFilterLabel!: Observable<string>\n\n constructor(\n private _elementRef: ElementRef<HTMLElement>,\n @Inject(THESEAM_DATA_FILTER_CONTAINER)\n private _filterContainer: DataFilterContainer,\n @Optional()\n @Inject(THESEAM_DATA_FILTER_OPTIONS)\n private _filterOptions: IToggleButtonsFilterOptions | null,\n ) {\n this.filterStateChanges = this._control.valueChanges.pipe(\n switchMap(() => of(this.filterState())),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }\n\n ngOnInit() {\n this._filterContainer.addFilter(this)\n if (\n this._filterOptions &&\n hasProperty(this._filterOptions, 'initialValue')\n ) {\n this.value = this._optDefault('initialValue')\n }\n\n this.activeFilterLabel = this.filterStateChanges.pipe(\n startWith(undefined),\n map(() => {\n const state = this.filterState()\n const options = state.state.options as IToggleButtonsFilterOptions\n const selectedOptions = options.buttons\n .filter((o) => coerceArray(state.state.value).includes(o.value))\n .map((o) => o.name)\n\n return selectedOptions.length > 0\n ? selectedOptions.join(', ')\n : this.filterDropdownLabel || DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT\n }),\n )\n }\n\n ngAfterViewInit(): void {\n this._resizeObserver = new ResizeObserver(() => this._updateCollapsed())\n\n if (\n notNullOrUndefined(this._elementRef.nativeElement.parentElement) &&\n this.disableCollapse !== true\n ) {\n this._resizeObserver.observe(this._elementRef.nativeElement.parentElement)\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['buttons'] && !changes['buttons'].firstChange) {\n this._updateCollapsed()\n }\n }\n\n ngOnDestroy(): void {\n this._filterContainer.removeFilter(this)\n this._resizeObserver?.disconnect()\n }\n\n private _optDefault<K extends keyof IToggleButtonsFilterOptions>(prop: K) {\n if (\n this._filterOptions &&\n Object.prototype.hasOwnProperty.call(this._filterOptions, prop)\n ) {\n return this._filterOptions[prop]\n }\n return DefaultToggleButtonsFilterOptions[prop]\n }\n\n get options(): IToggleButtonsFilterOptions {\n return {\n properties: this.properties,\n omitProperties: this.omitProperties,\n multiple: this.multiple,\n selectionToggleable: this.selectionToggleable,\n buttons: this.buttons,\n exact: this.exact,\n caseSensitive: this.caseSensitive,\n maxWidth: this.maxWidth,\n filterDropdownLabel: this.filterDropdownLabel,\n disableCollapse: this.disableCollapse,\n }\n }\n\n public filter<T>(data: T[]): Observable<T[]> {\n return this._control.valueChanges.pipe(\n map((v) => toggleButtonsFilter(data, coerceArray(v), this.options)),\n startWith(\n toggleButtonsFilter(\n data,\n coerceArray(this._control.value),\n this.options,\n ),\n ),\n )\n }\n\n private _updateCollapsed(): void {\n if (this.disableCollapse) {\n if (this.isCollapsed()) {\n this.isCollapsed.set(false)\n }\n\n return\n }\n if (!this._measureDiv) {\n return\n }\n const measureWidth = this._measureDiv.nativeElement.scrollWidth\n\n // Because of the flex layout, this element won't necessarily grow to its full\n // potential width when in collapsed mode, meaning it stays collapsed even\n // though there's room to expand. If this becomes a problem, we may need to use a\n // different strategy to determine when it's safe to show the full filter bar.\n const clientWidth =\n this._elementRef.nativeElement.parentElement?.clientWidth\n\n // Not enough information to determine collapsed state, so don't update it\n if (isNullOrUndefined(clientWidth)) {\n return\n }\n\n const threshold =\n this.maxWidth != null ? Math.min(clientWidth, this.maxWidth) : clientWidth\n this.isCollapsed.set(measureWidth > threshold)\n }\n\n public filterState(): DataFilterState {\n return {\n // id:\n name: this.filterName ?? this.name,\n state: {\n value: this._control.value,\n options: this.options,\n },\n }\n }\n}\n","<ng-container *ngIf=\"isCollapsed(); else buttonsTpl\">\n <button\n seamButton\n theme=\"primary\"\n size=\"sm\"\n class=\"dropdown-toggle\"\n title=\"View filter options\"\n [seamMenuToggle]=\"buttonsDropdownTpl\"\n >\n {{ activeFilterLabel | async }}\n </button>\n <seam-menu #buttonsDropdownTpl>\n <div\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n seamMenuItem\n [seamToggleGroupOption]=\"btn.value\"\n #opt=\"seamToggleGroupOption\"\n [class.seam-menu-item-active]=\"opt.selected\"\n (click)=\"opt.selected = !opt.selected\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n </seam-menu>\n</ng-container>\n\n<ng-template #buttonsTpl>\n <div\n class=\"btn-group\"\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n type=\"button\"\n class=\"btn btn-sm px-4\"\n [seamToggleGroupOption]=\"btn.value\"\n #opt=\"seamToggleGroupOption\"\n [class.btn-lightgray]=\"!opt.selected\"\n [class.btn-primary]=\"opt.selected\"\n (click)=\"opt.selected = !opt.selected\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Hidden measurement div: always in DOM, used to read natural btn-group width -->\n<div #measureDiv class=\"btn-group btn-group--measure\" aria-hidden=\"true\">\n <ng-container *ngFor=\"let btn of buttons\">\n <button type=\"button\" class=\"btn btn-sm px-4\" tabindex=\"-1\">\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n</div>\n","import { CommonModule } from '@angular/common'\nimport { NgModule } from '@angular/core'\nimport { ReactiveFormsModule } from '@angular/forms'\n\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome'\n\nimport { TheSeamFormFieldModule } from '@theseam/ui-common/form-field'\nimport { TheSeamIconModule } from '@theseam/ui-common/icon'\nimport { TheSeamToggleGroupModule } from '@theseam/ui-common/toggle-group'\nimport { TheSeamMenuModule } from '@theseam/ui-common/menu'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\n\nimport { THESEAM_DATA_FILTER_DEF } from './data-filter-def'\nimport { DataFilterSearchComponent } from './filters/data-filter-search/data-filter-search.component'\nimport { DataFilterTextComponent } from './filters/data-filter-text/data-filter-text.component'\nimport { DataFilterToggleButtonsComponent } from './filters/data-filter-toggle-buttons/data-filter-toggle-buttons.component'\n\nconst filterComponents = [\n DataFilterSearchComponent,\n DataFilterTextComponent,\n DataFilterToggleButtonsComponent,\n]\n\nconst filterDefProviders = [\n {\n provide: THESEAM_DATA_FILTER_DEF,\n useValue: { name: 'search', component: DataFilterSearchComponent },\n multi: true,\n },\n {\n provide: THESEAM_DATA_FILTER_DEF,\n useValue: { name: 'text', component: DataFilterTextComponent },\n multi: true,\n },\n {\n provide: THESEAM_DATA_FILTER_DEF,\n useValue: {\n name: 'toggle-buttons',\n component: DataFilterToggleButtonsComponent,\n },\n multi: true,\n },\n]\n\n@NgModule({\n declarations: [...filterComponents],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n TheSeamFormFieldModule,\n FontAwesomeModule,\n TheSeamToggleGroupModule,\n TheSeamIconModule,\n TheSeamMenuModule,\n TheSeamButtonsModule,\n ],\n providers: [...filterDefProviders],\n exports: [...filterComponents],\n})\nexport class TheSeamDataFiltersModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["_uid","i3","i4"],"mappings":"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"}
1
+ {"version":3,"file":"theseam-ui-common-data-filters.mjs","sources":["../../../projects/ui-common/data-filters/data-filter.ts","../../../projects/ui-common/data-filters/data-filter-def.ts","../../../projects/ui-common/data-filters/data-filter-container.ts","../../../projects/ui-common/data-filters/filters/data-filter-text/data-filter-text.component.ts","../../../projects/ui-common/data-filters/filters/data-filter-text/data-filter-text.component.html","../../../projects/ui-common/data-filters/filters/data-filter-search/data-filter-search.component.ts","../../../projects/ui-common/data-filters/filters/data-filter-search/data-filter-search.component.html","../../../projects/ui-common/data-filters/filters/data-filter-toggle-buttons/data-filter-toggle-buttons.component.ts","../../../projects/ui-common/data-filters/filters/data-filter-toggle-buttons/data-filter-toggle-buttons.component.html","../../../projects/ui-common/data-filters/data-filters.module.ts","../../../projects/ui-common/data-filters/theseam-ui-common-data-filters.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core'\nimport { combineLatest, Observable, of } from 'rxjs'\nimport { map, startWith, switchMap } from 'rxjs/operators'\n\nexport type DataFilterFunction = <T>(data: T[]) => Observable<T[]>\n\n/**\n * State of the filter that would allow an external operation to apply the\n * filtering.\n *\n * This is primarily for server-side filtering.\n */\nexport interface DataFilterState {\n /**\n * DataFilter's name.\n */\n name: string\n\n /**\n * Anything necessary for an external implementation to apply this filter.\n */\n state: { [key: string]: any }\n}\n\n// TODO: Consider adding something, such as a priority or order, to allow the\n// order the filter functions are called in to be declared/influenced\n// externally. This would allow the filters that will most likely filter out\n// many records quickly to be run before the heavy processing filters.\nexport interface DataFilter {\n /**\n * Name used when referencing filter by string.\n */\n name: string\n\n /**\n * Optional override for the filter name used in `filterState()`.\n *\n * When multiple instances of the same filter type exist on a page, each\n * instance shares the same `name`. Set `filterName` to give an instance a\n * distinct key so that filter-state mappers can differentiate them.\n *\n * If unset, `filterState()` falls back to `name`.\n */\n filterName?: string\n\n /**\n * Unique value to prevent a filter being used more than once if it ends up\n * being registered more than once.\n */\n uid: string\n\n /**\n *\n */\n filterStateChanges: Observable<DataFilterState>\n\n /**\n * Filters the data based on the conditions of the filter.\n */\n filter<T>(data: T[]): Observable<T[]>\n\n /**\n *\n */\n filterState(): DataFilterState\n}\n\nexport const THESEAM_DATA_FILTER = new InjectionToken<DataFilter>(\n 'TheSeamDataFilter',\n)\nexport const THESEAM_DATA_FILTER_OPTIONS = new InjectionToken<object>(\n 'TheSeamDataFilterOptions',\n)\n\nexport function filterOperator<T>(filterFn: DataFilterFunction) {\n return (source$: Observable<T[]>) => source$.pipe(switchMap(filterFn))\n}\n\nexport function composeDataFilters(filters: DataFilter[]) {\n const filterFunctions = filters.map((f) => filterOperator(f.filter.bind(f)))\n return (source$: Observable<any>) => {\n let src$ = source$\n for (const f of filterFunctions) {\n src$ = src$.pipe(f)\n }\n return src$\n }\n}\n\nexport function composeDataFilterStates(\n filters: DataFilter[],\n): Observable<DataFilterState[]> {\n if (filters.length === 0) {\n return of([])\n }\n\n return combineLatest(\n filters.map((f) =>\n f.filterStateChanges.pipe(\n startWith(undefined),\n map(() => f.filterState()),\n ),\n ),\n )\n}\n\n/** @deprecated Use `DataFilter` instead. */\nexport type IDataFilter = DataFilter\n\n/** @deprecated Use `IDataFilterFunction` instead. */\nexport type IDataFilterFunction = DataFilterFunction\n","import { InjectionToken } from '@angular/core'\n\nimport { IDataFilter } from './data-filter'\n\nexport interface IDataFilterDef<T = any> {\n name: string\n\n /**\n * Component that controls the filter.\n */\n component: IDataFilter\n}\n\nexport const THESEAM_DATA_FILTER_DEF = new InjectionToken<IDataFilterDef[]>(\n 'TheSeamDataFilter',\n)\n","import { InjectionToken } from '@angular/core'\nimport { IDataFilter } from './data-filter'\n\nexport interface DataFilterContainer {\n filters(): IDataFilter[]\n\n addFilter(dataFilter: IDataFilter): void\n\n removeFilter(dataFilter: IDataFilter): void\n}\n\nexport const THESEAM_DATA_FILTER_CONTAINER =\n new InjectionToken<DataFilterContainer>('DataFilterContainer')\n","import { BooleanInput } from '@angular/cdk/coercion'\nimport {\n Component,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n TemplateRef,\n} from '@angular/core'\nimport { UntypedFormControl } from '@angular/forms'\nimport { Observable, of } from 'rxjs'\nimport { map, shareReplay, startWith, switchMap } from 'rxjs/operators'\n\nimport { InputBoolean } from '@theseam/ui-common/core'\nimport { isNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport {\n DataFilterState,\n IDataFilter,\n THESEAM_DATA_FILTER,\n THESEAM_DATA_FILTER_OPTIONS,\n} from '../../data-filter'\nimport { THESEAM_DATA_FILTER_CONTAINER } from '../../data-filter-container'\nimport type { DataFilterContainer } from '../../data-filter-container'\nimport { ITextFilterOptions } from './text-filter-options'\n\nexport const DATA_FILTER_TEXT: any = {\n provide: THESEAM_DATA_FILTER,\n useExisting: forwardRef(() => DataFilterTextComponent),\n multi: true,\n}\n\nexport const DefaultTextFilterOptions: ITextFilterOptions = {\n properties: undefined,\n omitProperties: undefined,\n exact: false,\n caseSensitive: false,\n}\n\nexport function textDataFilter(\n data: any[],\n text: string,\n options = DefaultTextFilterOptions,\n) {\n if (!data || !text) {\n return data\n }\n\n if (data.length <= 0) {\n return data\n }\n\n let props = options ? options.properties : undefined\n if (!props) {\n props = []\n let keys = Object.keys(data[0])\n if (options && options.omitProperties) {\n keys = keys.filter(\n (key) => !(options.omitProperties || []).find((p) => p === key),\n )\n }\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(data[0], key)) {\n props.push(key)\n }\n }\n }\n\n const filtered: any[] = []\n\n for (const item of data) {\n for (const p of props) {\n let value1 = `${item[p]}`\n let value2 = text\n\n if (!options.caseSensitive) {\n value1 = value1.toLowerCase()\n value2 = value2.toLowerCase()\n }\n\n if (item[p] && value1.indexOf(value2) !== (options.exact ? 0 : -1)) {\n filtered.push(item)\n break\n }\n }\n }\n\n return filtered\n}\n\nlet _uid = 0\n\n@Component({\n selector: 'seam-data-filter-text',\n templateUrl: './data-filter-text.component.html',\n styleUrls: ['./data-filter-text.component.scss'],\n providers: [DATA_FILTER_TEXT],\n standalone: false,\n})\nexport class DataFilterTextComponent implements OnInit, OnDestroy, IDataFilter {\n static ngAcceptInputType_exact: BooleanInput\n static ngAcceptInputType_caseSensitive: BooleanInput\n\n public readonly name = 'text'\n public readonly uid = `text__${_uid++}`\n\n @Input() filterName: string | undefined\n\n _control = new UntypedFormControl()\n\n @Input() properties: string[] | undefined | null =\n this._optDefault('properties')\n @Input() omitProperties: string[] | undefined | null =\n this._optDefault('omitProperties')\n @Input() @InputBoolean() exact: boolean = this._optDefault('exact')\n @Input() @InputBoolean() caseSensitive: boolean =\n this._optDefault('caseSensitive')\n\n @Input() placeholder: string | undefined | null\n @Input() iconTpl: TemplateRef<HTMLElement> | undefined | null\n\n @Input()\n set value(value: string | string[]) {\n const _value = !isNullOrUndefined(value) ? `${value}` : ''\n if (this._control.value !== _value) {\n this._control.setValue(_value)\n }\n }\n\n public readonly filterStateChanges: Observable<DataFilterState>\n\n constructor(\n @Inject(THESEAM_DATA_FILTER_CONTAINER)\n private _filterContainer: DataFilterContainer,\n @Optional()\n @Inject(THESEAM_DATA_FILTER_OPTIONS)\n private _filterOptions: ITextFilterOptions | null,\n ) {\n this.filterStateChanges = this._control.valueChanges.pipe(\n switchMap(() => of(this.filterState())),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }\n\n ngOnInit() {\n this._filterContainer.addFilter(this)\n }\n\n ngOnDestroy() {\n this._filterContainer.removeFilter(this)\n }\n\n private _optDefault<K extends keyof ITextFilterOptions>(prop: K) {\n if (\n this._filterOptions &&\n Object.prototype.hasOwnProperty.call(this._filterOptions, prop)\n ) {\n return this._filterOptions[prop]\n }\n return DefaultTextFilterOptions[prop]\n }\n\n get options(): ITextFilterOptions {\n return {\n properties: this.properties ?? undefined,\n omitProperties: this.omitProperties ?? undefined,\n exact: this.exact,\n caseSensitive: this.caseSensitive,\n }\n }\n\n public filter<T>(data: T[]): Observable<T[]> {\n return this._control.valueChanges.pipe(\n map((v) => textDataFilter(data, v, this.options)),\n startWith(textDataFilter(data, this._control.value, this.options)),\n )\n }\n\n public filterState(): DataFilterState {\n return {\n // id:\n name: this.filterName ?? this.name,\n state: {\n value: this._control.value,\n options: this.options,\n },\n }\n }\n}\n","<div\n class=\"position-relative\"\n [class.data-filter-text-has-icon]=\"iconTpl\"\n (click)=\"inp.focus()\"\n>\n <label [attr.for]=\"inp.id\" class=\"sr-only\">Text filter</label>\n <input\n seamInput\n #inp=\"seamInput\"\n seamInputSize=\"sm\"\n [formControl]=\"_control\"\n [placeholder]=\"placeholder\"\n />\n <ng-container *ngIf=\"iconTpl\">\n <ng-container *ngTemplateOutlet=\"iconTpl\"></ng-container>\n </ng-container>\n</div>\n","import { BooleanInput } from '@angular/cdk/coercion'\nimport {\n ChangeDetectionStrategy,\n Component,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n TemplateRef,\n} from '@angular/core'\nimport { UntypedFormControl } from '@angular/forms'\nimport { Observable, of } from 'rxjs'\nimport { map, shareReplay, startWith, switchMap } from 'rxjs/operators'\n\nimport { faSearch } from '@fortawesome/free-solid-svg-icons'\n\nimport { InputBoolean } from '@theseam/ui-common/core'\nimport type { SeamIcon } from '@theseam/ui-common/icon'\nimport { isNullOrUndefined } from '@theseam/ui-common/utils'\n\nimport {\n DataFilterState,\n IDataFilter,\n THESEAM_DATA_FILTER,\n THESEAM_DATA_FILTER_OPTIONS,\n} from '../../data-filter'\nimport { THESEAM_DATA_FILTER_CONTAINER } from '../../data-filter-container'\nimport type { DataFilterContainer } from '../../data-filter-container'\nimport { textDataFilter } from '../data-filter-text/data-filter-text.component'\n\nimport { ISearchFilterOptions } from './search-filter-options'\n\nexport const DATA_FILTER_SEARCH: any = {\n provide: THESEAM_DATA_FILTER,\n useExisting: forwardRef(() => DataFilterSearchComponent),\n multi: true,\n}\n\nexport const DefaultSearchFilterOptions: ISearchFilterOptions = {\n properties: undefined,\n omitProperties: undefined,\n exact: false,\n caseSensitive: false,\n}\n\nexport function searchDataFilter(\n data: any[],\n values: string,\n options = DefaultSearchFilterOptions,\n) {\n return textDataFilter(data, values, options)\n}\n\nlet _uid = 0\n\n@Component({\n selector: 'seam-data-filter-search',\n templateUrl: './data-filter-search.component.html',\n styleUrls: ['./data-filter-search.component.scss'],\n providers: [DATA_FILTER_SEARCH],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class DataFilterSearchComponent\n implements OnInit, OnDestroy, IDataFilter\n{\n static ngAcceptInputType_exact: BooleanInput\n static ngAcceptInputType_caseSensitive: BooleanInput\n\n public readonly name = 'search'\n public readonly uid = `search__${_uid++}`\n\n @Input() filterName: string | undefined\n\n _control = new UntypedFormControl()\n\n @Input() properties: string[] | undefined | null =\n this._optDefault('properties')\n @Input() omitProperties: string[] | undefined | null =\n this._optDefault('omitProperties')\n @Input() @InputBoolean() exact: boolean = this._optDefault('exact')\n @Input() @InputBoolean() caseSensitive: boolean =\n this._optDefault('caseSensitive')\n\n @Input() placeholder: string | undefined | null = 'Search...'\n @Input() icon: SeamIcon | undefined | null = faSearch\n @Input() iconTpl?: TemplateRef<HTMLElement>\n\n @Input()\n set value(value: string | string[]) {\n const _value = !isNullOrUndefined(value) ? `${value}` : ''\n if (this._control.value !== _value) {\n this._control.setValue(_value)\n }\n }\n\n public readonly filterStateChanges: Observable<DataFilterState>\n\n constructor(\n @Inject(THESEAM_DATA_FILTER_CONTAINER)\n private _filterContainer: DataFilterContainer,\n @Optional()\n @Inject(THESEAM_DATA_FILTER_OPTIONS)\n private _filterOptions: ISearchFilterOptions | null,\n ) {\n this.filterStateChanges = this._control.valueChanges.pipe(\n switchMap(() => of(this.filterState())),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }\n\n ngOnInit() {\n this._filterContainer.addFilter(this)\n }\n\n ngOnDestroy() {\n this._filterContainer.removeFilter(this)\n }\n\n private _optDefault<K extends keyof ISearchFilterOptions>(prop: K) {\n if (\n this._filterOptions &&\n Object.prototype.hasOwnProperty.call(this._filterOptions, prop)\n ) {\n return this._filterOptions[prop]\n }\n return DefaultSearchFilterOptions[prop]\n }\n\n get options(): ISearchFilterOptions {\n return {\n properties: this.properties ?? undefined,\n omitProperties: this.omitProperties ?? undefined,\n exact: this.exact,\n caseSensitive: this.caseSensitive,\n }\n }\n\n public filter<T>(data: T[]): Observable<T[]> {\n return this._control.valueChanges.pipe(\n map((v) => searchDataFilter(data, v, this.options)),\n startWith(searchDataFilter(data, this._control.value, this.options)),\n )\n }\n\n public filterState(): DataFilterState {\n return {\n // id:\n name: this.filterName ?? this.name,\n state: {\n value: this._control.value,\n options: this.options,\n },\n }\n }\n}\n","<div\n class=\"position-relative\"\n [class.data-filter-search-has-icon]=\"iconTpl || icon\"\n (click)=\"inp.focus()\"\n>\n <label [attr.for]=\"inp.id\" class=\"sr-only\">Search filter</label>\n <input\n seamInput\n #inp=\"seamInput\"\n seamInputSize=\"sm\"\n [formControl]=\"_control\"\n [placeholder]=\"placeholder\"\n />\n <ng-container *ngIf=\"iconTpl; else searchIconTpl\">\n <div class=\"data-filter-search--icon-wrapper\">\n <ng-container *ngTemplateOutlet=\"iconTpl\"></ng-container>\n </div>\n </ng-container>\n <ng-template #searchIconTpl>\n <ng-container *ngIf=\"icon\">\n <div class=\"data-filter-search--icon-wrapper\">\n <seam-icon [icon]=\"icon\" class=\"text-muted\"></seam-icon>\n </div>\n </ng-container>\n </ng-template>\n</div>\n","import { coerceArray } from '@angular/cdk/coercion'\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n forwardRef,\n HostBinding,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n signal,\n SimpleChanges,\n ViewChild,\n} from '@angular/core'\nimport { UntypedFormControl } from '@angular/forms'\nimport { merge, Observable, of, Subject } from 'rxjs'\nimport { map, shareReplay, startWith, switchMap } from 'rxjs/operators'\n\nimport {\n hasProperty,\n isNullOrUndefined,\n notNullOrUndefined,\n} from '@theseam/ui-common/utils'\n\nimport {\n DataFilterState,\n IDataFilter,\n THESEAM_DATA_FILTER,\n THESEAM_DATA_FILTER_OPTIONS,\n} from '../../data-filter'\nimport { THESEAM_DATA_FILTER_CONTAINER } from '../../data-filter-container'\nimport type { DataFilterContainer } from '../../data-filter-container'\nimport { textDataFilter } from '../data-filter-text/data-filter-text.component'\nimport { ITextFilterOptions } from '../data-filter-text/text-filter-options'\n\nexport const DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT = 'Select Filter'\n\nexport const DATA_FILTER_TOGGLE_BUTTON: any = {\n provide: THESEAM_DATA_FILTER,\n useExisting: forwardRef(() => DataFilterToggleButtonsComponent),\n multi: true,\n}\n\nexport interface IToggleButton {\n name: string\n value: string\n comparator?: (value: any, row: any, index: number) => -1 | 0 | 1\n}\n\nexport interface IToggleButtonsFilterOptions extends ITextFilterOptions {\n selectionToggleable: boolean\n multiple: boolean\n buttons: IToggleButton[]\n initialValue?: any\n /**\n * The maximum width a button row can grow to before collapsing.\n * If not set, the button row will grow until it overflows, then collapse.\n * To force a button row to always be collapsed or expanded, use the `forceCollapseState` option instead.\n */\n maxWidth?: number\n /**\n * The text shown before the button row when the button row is in the collapsed state.\n * If not set, the button row will not show any text before the buttons when collapsed.\n */\n prependLabel?: string\n /**\n * The text shown when the button row is in the collapsed state and no filter is selected.\n */\n filterDropdownLabel?: string\n /**\n * When set, the button row will always be collapsed or expanded, regardless of the available width.\n */\n forceCollapseState?: 'collapsed' | 'expanded'\n}\n\nexport const DefaultToggleButtonsFilterOptions: IToggleButtonsFilterOptions = {\n properties: undefined,\n omitProperties: undefined,\n multiple: false,\n selectionToggleable: false,\n buttons: [],\n exact: false,\n caseSensitive: false,\n maxWidth: undefined,\n prependLabel: undefined,\n filterDropdownLabel: DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT,\n forceCollapseState: undefined,\n}\n\nexport function toggleButtonsFilter(\n data: any[],\n values: string[],\n options = DefaultToggleButtonsFilterOptions,\n) {\n if (!data || !values) {\n return data\n }\n\n const customComparatorBtns: IToggleButton[] = []\n for (const btn of options.buttons || []) {\n if (btn.comparator) {\n customComparatorBtns.push(btn)\n }\n }\n\n let _data = data\n for (const val of values) {\n if (val === '') {\n continue\n }\n\n let cmp\n for (const btn of customComparatorBtns) {\n if (btn.value === val) {\n cmp = btn.comparator\n }\n }\n if (cmp) {\n const filtered: any[] = []\n for (let i = 0; i < _data.length; i++) {\n if (cmp(val, _data[i], i) !== -1) {\n filtered.push(_data[i])\n }\n }\n _data = filtered\n } else {\n _data = textDataFilter(_data, val, {\n properties: options.properties,\n omitProperties: options.omitProperties,\n exact: options.exact,\n caseSensitive: options.caseSensitive,\n })\n }\n }\n return _data\n}\n\nlet _uid = 0\n\n@Component({\n selector: 'seam-data-filter-toggle-buttons',\n templateUrl: './data-filter-toggle-buttons.component.html',\n styleUrls: ['./data-filter-toggle-buttons.component.scss'],\n providers: [DATA_FILTER_TOGGLE_BUTTON],\n standalone: false,\n})\nexport class DataFilterToggleButtonsComponent\n implements OnInit, OnChanges, OnDestroy, AfterViewInit, IDataFilter\n{\n public readonly name = 'toggle-buttons'\n public readonly uid = `toggle-buttons__${_uid++}`\n\n @Input() filterName: string | undefined\n\n _control = new UntypedFormControl()\n\n @Input() properties = this._optDefault('properties')\n @Input() omitProperties = this._optDefault('omitProperties')\n @Input() multiple = this._optDefault('multiple')\n @Input() selectionToggleable = this._optDefault('selectionToggleable')\n @Input() buttons = this._optDefault('buttons')\n @Input() exact = this._optDefault('exact')\n @Input() caseSensitive = this._optDefault('caseSensitive')\n @Input() maxWidth = this._optDefault('maxWidth')\n @Input() prependLabel = this._optDefault('prependLabel')\n @Input() filterDropdownLabel = this._optDefault('filterDropdownLabel')\n @Input() forceCollapseState = this._optDefault('forceCollapseState')\n\n @HostBinding('class.seam-data-filter-toggle-buttons-collapsed')\n get _collapsedClass() {\n return this.isCollapsed()\n }\n\n @HostBinding('class.seam-data-filter-toggle-buttons-expanded')\n get _expandedClass() {\n return !this.isCollapsed()\n }\n\n public readonly isCollapsed = signal(false)\n\n @ViewChild('measureDiv') private _measureDiv!: ElementRef<HTMLElement>\n\n private _resizeObserver: ResizeObserver | undefined\n\n /**\n * Emits when the `buttons` input changes.\n */\n private readonly _buttonsChanged = new Subject<void>()\n\n @Input()\n set value(value: string | string[]) {\n const _value = !isNullOrUndefined(value) ? coerceArray(value) : undefined\n if (this._control.value !== _value) {\n this._control.setValue(_value)\n }\n }\n\n public readonly filterStateChanges: Observable<DataFilterState>\n public activeFilterLabel!: Observable<string>\n\n constructor(\n private _elementRef: ElementRef<HTMLElement>,\n @Inject(THESEAM_DATA_FILTER_CONTAINER)\n private _filterContainer: DataFilterContainer,\n @Optional()\n @Inject(THESEAM_DATA_FILTER_OPTIONS)\n private _filterOptions: IToggleButtonsFilterOptions | null,\n ) {\n this.filterStateChanges = this._control.valueChanges.pipe(\n switchMap(() => of(this.filterState())),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n }\n\n ngOnInit() {\n this._filterContainer.addFilter(this)\n if (\n this._filterOptions &&\n hasProperty(this._filterOptions, 'initialValue')\n ) {\n this.value = this._optDefault('initialValue')\n }\n\n this.activeFilterLabel = merge(\n this.filterStateChanges,\n this._buttonsChanged,\n ).pipe(\n startWith(undefined),\n map(() => {\n const state = this.filterState()\n // Depending on the timing of when this is called, the options may not be fully initialized yet.\n // Cast as partial to avoid TypeError on uninitialized values.\n const options = state.state\n .options as Partial<IToggleButtonsFilterOptions>\n const selectedOptions = (options.buttons || [])\n .filter((o) => coerceArray(state.state.value).includes(o.value))\n .map((o) => o.name)\n\n return selectedOptions.length > 0\n ? selectedOptions.join(', ')\n : this.filterDropdownLabel || DATA_FILTER_TOGGLE_BUTTON_DROPDOWN_TEXT\n }),\n )\n }\n\n ngAfterViewInit(): void {\n this._resizeObserver = new ResizeObserver(() => this._updateCollapsed())\n this._syncResizeObserver()\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['buttons'] && !changes['buttons'].firstChange) {\n this._updateCollapsed()\n this._buttonsChanged.next()\n }\n\n if (\n changes['forceCollapseState'] &&\n !changes['forceCollapseState'].firstChange\n ) {\n this._syncResizeObserver()\n }\n }\n\n /**\n * Observes the parent element only while the collapsed state is width driven.\n * When `forceCollapseState` is set there is nothing to observe, so the\n * observer is disconnected and the forced state is applied directly.\n */\n private _syncResizeObserver(): void {\n if (isNullOrUndefined(this._resizeObserver)) {\n return\n }\n\n this._resizeObserver.disconnect()\n\n const parentElement = this._elementRef.nativeElement.parentElement\n if (\n notNullOrUndefined(parentElement) &&\n isNullOrUndefined(this.forceCollapseState)\n ) {\n this._resizeObserver.observe(parentElement)\n } else {\n // The observer won't fire, so apply the collapsed state directly.\n this._updateCollapsed()\n }\n }\n\n ngOnDestroy(): void {\n this._filterContainer.removeFilter(this)\n this._resizeObserver?.disconnect()\n this._buttonsChanged.complete()\n }\n\n private _optDefault<K extends keyof IToggleButtonsFilterOptions>(prop: K) {\n if (\n this._filterOptions &&\n Object.prototype.hasOwnProperty.call(this._filterOptions, prop)\n ) {\n return this._filterOptions[prop]\n }\n return DefaultToggleButtonsFilterOptions[prop]\n }\n\n get options(): IToggleButtonsFilterOptions {\n return {\n properties: this.properties,\n omitProperties: this.omitProperties,\n multiple: this.multiple,\n selectionToggleable: this.selectionToggleable,\n buttons: this.buttons,\n exact: this.exact,\n caseSensitive: this.caseSensitive,\n maxWidth: this.maxWidth,\n prependLabel: this.prependLabel,\n filterDropdownLabel: this.filterDropdownLabel,\n forceCollapseState: this.forceCollapseState,\n }\n }\n\n public filter<T>(data: T[]): Observable<T[]> {\n // `buttons` is merged in because `toggleButtonsFilter` resolves each value's\n // custom `comparator` from `options.buttons`. A `buttons` list that arrives\n // after the value is set would otherwise keep filtering with the stale\n // (empty) list until the next value change.\n return merge(this._control.valueChanges, this._buttonsChanged).pipe(\n map(() =>\n toggleButtonsFilter(\n data,\n coerceArray(this._control.value),\n this.options,\n ),\n ),\n startWith(\n toggleButtonsFilter(\n data,\n coerceArray(this._control.value),\n this.options,\n ),\n ),\n )\n }\n\n private _updateCollapsed(): void {\n if (notNullOrUndefined(this.forceCollapseState)) {\n if (this.isCollapsed() && this.forceCollapseState === 'expanded') {\n this.isCollapsed.set(false)\n } else if (\n !this.isCollapsed() &&\n this.forceCollapseState === 'collapsed'\n ) {\n this.isCollapsed.set(true)\n }\n\n return\n }\n\n if (!this._measureDiv) {\n return\n }\n const measureWidth = this._measureDiv.nativeElement.scrollWidth\n\n // Because of the flex layout, this element won't necessarily grow to its full\n // potential width when in collapsed mode, meaning it stays collapsed even\n // though there's room to expand. If this becomes a problem, we may need to use a\n // different strategy to determine when it's safe to show the full filter bar.\n const clientWidth =\n this._elementRef.nativeElement.parentElement?.clientWidth\n\n // Not enough information to determine collapsed state, so don't update it\n if (isNullOrUndefined(clientWidth)) {\n return\n }\n\n const threshold =\n this.maxWidth != null ? Math.min(clientWidth, this.maxWidth) : clientWidth\n this.isCollapsed.set(measureWidth > threshold)\n }\n\n public filterState(): DataFilterState {\n return {\n // id:\n name: this.filterName ?? this.name,\n state: {\n value: this._control.value,\n options: this.options,\n },\n }\n }\n}\n","<ng-container *ngIf=\"isCollapsed(); else buttonsTpl\">\n <div class=\"d-flex toggle-buttons-filter__collapsed\">\n <div\n *ngIf=\"prependLabel\"\n class=\"d-flex align-items-center toggle-buttons-filter__collapsed-prepend-label\"\n >\n {{ prependLabel }}\n </div>\n <button\n seamButton\n theme=\"lightgray\"\n size=\"sm\"\n class=\"dropdown-toggle toggle-buttons-filter__collapsed-button\"\n title=\"View filter options\"\n [seamMenuToggle]=\"buttonsDropdownTpl\"\n >\n {{ activeFilterLabel | async }}\n </button>\n <seam-menu #buttonsDropdownTpl>\n <div\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n #tg=\"seamToggleGroup\"\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n seamMenuItem\n [seamToggleGroupOption]=\"btn.value\"\n [class.seam-menu-item-active]=\"tg.isSelected(btn.value)\"\n (click)=\"tg.toggleOptionSelect(btn.value)\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n </seam-menu>\n </div>\n</ng-container>\n\n<ng-template #buttonsTpl>\n <div\n class=\"btn-group toggle-buttons-filter__expanded\"\n role=\"group\"\n aria-label=\"Toggle Filters\"\n *ngIf=\"options as opts\"\n [formControl]=\"_control\"\n seamToggleGroup\n #tg=\"seamToggleGroup\"\n [multiple]=\"opts.multiple\"\n [selectionToggleable]=\"opts.selectionToggleable\"\n >\n <ng-container *ngFor=\"let btn of buttons\">\n <button\n type=\"button\"\n class=\"btn btn-sm px-4\"\n [seamToggleGroupOption]=\"btn.value\"\n [class.btn-lightgray]=\"!tg.isSelected(btn.value)\"\n [class.btn-primary]=\"tg.isSelected(btn.value)\"\n (click)=\"tg.toggleOptionSelect(btn.value)\"\n title=\"Apply filter\"\n >\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Hidden measurement div: always in DOM, used to read natural btn-group width -->\n<div #measureDiv class=\"btn-group btn-group--measure\" aria-hidden=\"true\">\n <ng-container *ngFor=\"let btn of buttons\">\n <button type=\"button\" class=\"btn btn-sm px-4\" tabindex=\"-1\">\n {{ btn.name || btn.value }}\n </button>\n </ng-container>\n</div>\n","import { CommonModule } from '@angular/common'\nimport { NgModule } from '@angular/core'\nimport { ReactiveFormsModule } from '@angular/forms'\n\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome'\n\nimport { TheSeamFormFieldModule } from '@theseam/ui-common/form-field'\nimport { TheSeamIconModule } from '@theseam/ui-common/icon'\nimport { TheSeamToggleGroupModule } from '@theseam/ui-common/toggle-group'\nimport { TheSeamMenuModule } from '@theseam/ui-common/menu'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\n\nimport { THESEAM_DATA_FILTER_DEF } from './data-filter-def'\nimport { DataFilterSearchComponent } from './filters/data-filter-search/data-filter-search.component'\nimport { DataFilterTextComponent } from './filters/data-filter-text/data-filter-text.component'\nimport { DataFilterToggleButtonsComponent } from './filters/data-filter-toggle-buttons/data-filter-toggle-buttons.component'\n\nconst filterComponents = [\n DataFilterSearchComponent,\n DataFilterTextComponent,\n DataFilterToggleButtonsComponent,\n]\n\nconst filterDefProviders = [\n {\n provide: THESEAM_DATA_FILTER_DEF,\n useValue: { name: 'search', component: DataFilterSearchComponent },\n multi: true,\n },\n {\n provide: THESEAM_DATA_FILTER_DEF,\n useValue: { name: 'text', component: DataFilterTextComponent },\n multi: true,\n },\n {\n provide: THESEAM_DATA_FILTER_DEF,\n useValue: {\n name: 'toggle-buttons',\n component: DataFilterToggleButtonsComponent,\n },\n multi: true,\n },\n]\n\n@NgModule({\n declarations: [...filterComponents],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n TheSeamFormFieldModule,\n FontAwesomeModule,\n TheSeamToggleGroupModule,\n TheSeamIconModule,\n TheSeamMenuModule,\n TheSeamButtonsModule,\n ],\n providers: [...filterDefProviders],\n exports: [...filterComponents],\n})\nexport class TheSeamDataFiltersModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["_uid","i3","i4"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;MAmEa,mBAAmB,GAAG,IAAI,cAAc,CACnD,mBAAmB;MAER,2BAA2B,GAAG,IAAI,cAAc,CAC3D,0BAA0B;AAGtB,SAAU,cAAc,CAAI,QAA4B,EAAA;AAC5D,IAAA,OAAO,CAAC,OAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACxE;AAEM,SAAU,kBAAkB,CAAC,OAAqB,EAAA;IACtD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,OAAwB,KAAI;QAClC,IAAI,IAAI,GAAG,OAAO;AAClB,QAAA,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE;AAC/B,YAAA,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACrB;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AACH;AAEM,SAAU,uBAAuB,CACrC,OAAqB,EAAA;AAErB,IAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,QAAA,OAAO,EAAE,CAAC,EAAE,CAAC;IACf;AAEA,IAAA,OAAO,aAAa,CAClB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KACZ,CAAC,CAAC,kBAAkB,CAAC,IAAI,CACvB,SAAS,CAAC,SAAS,CAAC,EACpB,GAAG,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAC3B,CACF,CACF;AACH;;MC3Fa,uBAAuB,GAAG,IAAI,cAAc,CACvD,mBAAmB;;MCHR,6BAA6B,GACxC,IAAI,cAAc,CAAsB,qBAAqB;;ACgBxD,MAAM,gBAAgB,GAAQ;AACnC,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,WAAW,EAAE,UAAU,CAAC,MAAM,uBAAuB,CAAC;AACtD,IAAA,KAAK,EAAE,IAAI;;AAGN,MAAM,wBAAwB,GAAuB;AAC1D,IAAA,UAAU,EAAE,SAAS;AACrB,IAAA,cAAc,EAAE,SAAS;AACzB,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,aAAa,EAAE,KAAK;;AAGhB,SAAU,cAAc,CAC5B,IAAW,EACX,IAAY,EACZ,OAAO,GAAG,wBAAwB,EAAA;AAElC,IAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;AAClB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;AACpB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS;IACpD,IAAI,CAAC,KAAK,EAAE;QACV,KAAK,GAAG,EAAE;QACV,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/B,QAAA,IAAI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE;AACrC,YAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAChB,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAChE;QACH;AACA,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AACtD,gBAAA,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;YACjB;QACF;IACF;IAEA,MAAM,QAAQ,GAAU,EAAE;AAE1B,IAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;AACvB,QAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;YACrB,IAAI,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,CAAC,CAAC,EAAE;YACzB,IAAI,MAAM,GAAG,IAAI;AAEjB,YAAA,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;AAC1B,gBAAA,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE;AAC7B,gBAAA,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE;YAC/B;YAEA,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;AAClE,gBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;gBACnB;YACF;QACF;IACF;AAEA,IAAA,OAAO,QAAQ;AACjB;AAEA,IAAIA,MAAI,GAAG,CAAC;MASC,uBAAuB,CAAA;AAkCxB,IAAA,gBAAA;AAGA,IAAA,cAAA;IApCV,OAAO,uBAAuB;IAC9B,OAAO,+BAA+B;IAEtB,IAAI,GAAG,MAAM;AACb,IAAA,GAAG,GAAG,CAAA,MAAA,EAASA,MAAI,EAAE,EAAE;AAE9B,IAAA,UAAU;AAEnB,IAAA,QAAQ,GAAG,IAAI,kBAAkB,EAAE;AAE1B,IAAA,UAAU,GACjB,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;AACvB,IAAA,cAAc,GACrB,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;AACX,IAAA,KAAK,GAAY,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AAC1C,IAAA,aAAa,GACpC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC;AAE1B,IAAA,WAAW;AACX,IAAA,OAAO;IAEhB,IACI,KAAK,CAAC,KAAwB,EAAA;AAChC,QAAA,MAAM,MAAM,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAA,CAAE,GAAG,EAAE;QAC1D,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,MAAM,EAAE;AAClC,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAChC;IACF;AAEgB,IAAA,kBAAkB;IAElC,WAAA,CAEU,gBAAqC,EAGrC,cAAyC,EAAA;QAHzC,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAGhB,IAAA,CAAA,cAAc,GAAd,cAAc;AAEtB,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CACvD,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EACvC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C;IACH;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC;IACvC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC;IAC1C;AAEQ,IAAA,WAAW,CAAqC,IAAO,EAAA;QAC7D,IACE,IAAI,CAAC,cAAc;AACnB,YAAA,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EAC/D;AACA,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAClC;AACA,QAAA,OAAO,wBAAwB,CAAC,IAAI,CAAC;IACvC;AAEA,IAAA,IAAI,OAAO,GAAA;QACT,OAAO;AACL,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS;AACxC,YAAA,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;YAChD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC;IACH;AAEO,IAAA,MAAM,CAAI,IAAS,EAAA;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CACpC,GAAG,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EACjD,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CACnE;IACH;IAEO,WAAW,GAAA;QAChB,OAAO;;AAEL,YAAA,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI;AAClC,YAAA,KAAK,EAAE;AACL,gBAAA,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;gBAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;AACtB,aAAA;SACF;IACH;wGAxFW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAiCxB,6BAA6B,EAAA,EAAA,EAAA,KAAA,EAG7B,2BAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AApC1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAHvB,CAAC,gBAAgB,CAAC,0BClG/B,gdAiBA,EAAA,MAAA,EAAA,CAAA,wPAAA,CAAA,EAAA,YAAA,EAAA,CAAA,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,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,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,yKAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,MAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;ADmG2B,UAAA,CAAA;AAAf,IAAA,YAAY;AAA6C,CAAA,EAAA,uBAAA,CAAA,SAAA,EAAA,OAAA,EAAA,KAAA,CAAA,CAAA;AAC1C,UAAA,CAAA;AAAf,IAAA,YAAY;AACa,CAAA,EAAA,uBAAA,CAAA,SAAA,EAAA,eAAA,EAAA,KAAA,CAAA,CAAA;4FAjBxB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,SAAA,EAGtB,CAAC,gBAAgB,CAAC,cACjB,KAAK,EAAA,QAAA,EAAA,gdAAA,EAAA,MAAA,EAAA,CAAA,wPAAA,CAAA,EAAA;;0BAmCd,MAAM;2BAAC,6BAA6B;;0BAEpC;;0BACA,MAAM;2BAAC,2BAA2B;;sBA7BpC;;sBAIA;;sBAEA;;sBAEA;;sBACA;;sBAGA;;sBACA;;sBAEA;;;AEzFI,MAAM,kBAAkB,GAAQ;AACrC,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,WAAW,EAAE,UAAU,CAAC,MAAM,yBAAyB,CAAC;AACxD,IAAA,KAAK,EAAE,IAAI;;AAGN,MAAM,0BAA0B,GAAyB;AAC9D,IAAA,UAAU,EAAE,SAAS;AACrB,IAAA,cAAc,EAAE,SAAS;AACzB,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,aAAa,EAAE,KAAK;;AAGhB,SAAU,gBAAgB,CAC9B,IAAW,EACX,MAAc,EACd,OAAO,GAAG,0BAA0B,EAAA;IAEpC,OAAO,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC;AAC9C;AAEA,IAAIA,MAAI,GAAG,CAAC;MAUC,yBAAyB,CAAA;AAqC1B,IAAA,gBAAA;AAGA,IAAA,cAAA;IArCV,OAAO,uBAAuB;IAC9B,OAAO,+BAA+B;IAEtB,IAAI,GAAG,QAAQ;AACf,IAAA,GAAG,GAAG,CAAA,QAAA,EAAWA,MAAI,EAAE,EAAE;AAEhC,IAAA,UAAU;AAEnB,IAAA,QAAQ,GAAG,IAAI,kBAAkB,EAAE;AAE1B,IAAA,UAAU,GACjB,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;AACvB,IAAA,cAAc,GACrB,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;AACX,IAAA,KAAK,GAAY,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AAC1C,IAAA,aAAa,GACpC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC;IAE1B,WAAW,GAA8B,WAAW;IACpD,IAAI,GAAgC,QAAQ;AAC5C,IAAA,OAAO;IAEhB,IACI,KAAK,CAAC,KAAwB,EAAA;AAChC,QAAA,MAAM,MAAM,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAA,CAAE,GAAG,EAAE;QAC1D,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,MAAM,EAAE;AAClC,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAChC;IACF;AAEgB,IAAA,kBAAkB;IAElC,WAAA,CAEU,gBAAqC,EAGrC,cAA2C,EAAA;QAH3C,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAGhB,IAAA,CAAA,cAAc,GAAd,cAAc;AAEtB,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CACvD,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EACvC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C;IACH;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC;IACvC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC;IAC1C;AAEQ,IAAA,WAAW,CAAuC,IAAO,EAAA;QAC/D,IACE,IAAI,CAAC,cAAc;AACnB,YAAA,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EAC/D;AACA,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAClC;AACA,QAAA,OAAO,0BAA0B,CAAC,IAAI,CAAC;IACzC;AAEA,IAAA,IAAI,OAAO,GAAA;QACT,OAAO;AACL,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS;AACxC,YAAA,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;YAChD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC;IACH;AAEO,IAAA,MAAM,CAAI,IAAS,EAAA;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CACpC,GAAG,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EACnD,SAAS,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CACrE;IACH;IAEO,WAAW,GAAA;QAChB,OAAO;;AAEL,YAAA,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI;AAClC,YAAA,KAAK,EAAE;AACL,gBAAA,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;gBAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;AACtB,aAAA;SACF;IACH;wGA3FW,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAoC1B,6BAA6B,EAAA,EAAA,EAAA,KAAA,EAG7B,2BAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAvC1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAJzB,CAAC,kBAAkB,CAAC,0BC7DjC,0yBA0BA,EAAA,MAAA,EAAA,CAAA,8VAAA,CAAA,EAAA,YAAA,EAAA,CAAA,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,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,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,yKAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,MAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,MAAA,EAAA,MAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;ADwD2B,UAAA,CAAA;AAAf,IAAA,YAAY;AAA6C,CAAA,EAAA,yBAAA,CAAA,SAAA,EAAA,OAAA,EAAA,KAAA,CAAA,CAAA;AAC1C,UAAA,CAAA;AAAf,IAAA,YAAY;AACa,CAAA,EAAA,yBAAA,CAAA,SAAA,EAAA,eAAA,EAAA,KAAA,CAAA,CAAA;4FAnBxB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBARrC,SAAS;+BACE,yBAAyB,EAAA,SAAA,EAGxB,CAAC,kBAAkB,CAAC,mBACd,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,KAAK,EAAA,QAAA,EAAA,0yBAAA,EAAA,MAAA,EAAA,CAAA,8VAAA,CAAA,EAAA;;0BAsCd,MAAM;2BAAC,6BAA6B;;0BAEpC;;0BACA,MAAM;2BAAC,2BAA2B;;sBA9BpC;;sBAIA;;sBAEA;;sBAEA;;sBACA;;sBAGA;;sBACA;;sBACA;;sBAEA;;;AEpDI,MAAM,uCAAuC,GAAG;AAEhD,MAAM,yBAAyB,GAAQ;AAC5C,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,WAAW,EAAE,UAAU,CAAC,MAAM,gCAAgC,CAAC;AAC/D,IAAA,KAAK,EAAE,IAAI;;AAmCN,MAAM,iCAAiC,GAAgC;AAC5E,IAAA,UAAU,EAAE,SAAS;AACrB,IAAA,cAAc,EAAE,SAAS;AACzB,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,mBAAmB,EAAE,KAAK;AAC1B,IAAA,OAAO,EAAE,EAAE;AACX,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,aAAa,EAAE,KAAK;AACpB,IAAA,QAAQ,EAAE,SAAS;AACnB,IAAA,YAAY,EAAE,SAAS;AACvB,IAAA,mBAAmB,EAAE,uCAAuC;AAC5D,IAAA,kBAAkB,EAAE,SAAS;;AAGzB,SAAU,mBAAmB,CACjC,IAAW,EACX,MAAgB,EAChB,OAAO,GAAG,iCAAiC,EAAA;AAE3C,IAAA,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;AACpB,QAAA,OAAO,IAAI;IACb;IAEA,MAAM,oBAAoB,GAAoB,EAAE;IAChD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE;AACvC,QAAA,IAAI,GAAG,CAAC,UAAU,EAAE;AAClB,YAAA,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC;QAChC;IACF;IAEA,IAAI,KAAK,GAAG,IAAI;AAChB,IAAA,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;AACxB,QAAA,IAAI,GAAG,KAAK,EAAE,EAAE;YACd;QACF;AAEA,QAAA,IAAI,GAAG;AACP,QAAA,KAAK,MAAM,GAAG,IAAI,oBAAoB,EAAE;AACtC,YAAA,IAAI,GAAG,CAAC,KAAK,KAAK,GAAG,EAAE;AACrB,gBAAA,GAAG,GAAG,GAAG,CAAC,UAAU;YACtB;QACF;QACA,IAAI,GAAG,EAAE;YACP,MAAM,QAAQ,GAAU,EAAE;AAC1B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,gBAAA,IAAI,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;oBAChC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACzB;YACF;YACA,KAAK,GAAG,QAAQ;QAClB;aAAO;AACL,YAAA,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,aAAa,EAAE,OAAO,CAAC,aAAa;AACrC,aAAA,CAAC;QACJ;IACF;AACA,IAAA,OAAO,KAAK;AACd;AAEA,IAAI,IAAI,GAAG,CAAC;MASC,gCAAgC,CAAA;AAuDjC,IAAA,WAAA;AAEA,IAAA,gBAAA;AAGA,IAAA,cAAA;IAzDM,IAAI,GAAG,gBAAgB;AACvB,IAAA,GAAG,GAAG,CAAA,gBAAA,EAAmB,IAAI,EAAE,EAAE;AAExC,IAAA,UAAU;AAEnB,IAAA,QAAQ,GAAG,IAAI,kBAAkB,EAAE;AAE1B,IAAA,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;AAC3C,IAAA,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;AACnD,IAAA,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;AACvC,IAAA,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC;AAC7D,IAAA,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;AACrC,IAAA,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AACjC,IAAA,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC;AACjD,IAAA,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;AACvC,IAAA,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;AAC/C,IAAA,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC;AAC7D,IAAA,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC;AAEpE,IAAA,IACI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE;IAC3B;AAEA,IAAA,IACI,cAAc,GAAA;AAChB,QAAA,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE;IAC5B;AAEgB,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,uDAAC;AAEV,IAAA,WAAW;AAEpC,IAAA,eAAe;AAEvB;;AAEG;AACc,IAAA,eAAe,GAAG,IAAI,OAAO,EAAQ;IAEtD,IACI,KAAK,CAAC,KAAwB,EAAA;AAChC,QAAA,MAAM,MAAM,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,SAAS;QACzE,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,MAAM,EAAE;AAClC,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAChC;IACF;AAEgB,IAAA,kBAAkB;AAC3B,IAAA,iBAAiB;AAExB,IAAA,WAAA,CACU,WAAoC,EAEpC,gBAAqC,EAGrC,cAAkD,EAAA;QALlD,IAAA,CAAA,WAAW,GAAX,WAAW;QAEX,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAGhB,IAAA,CAAA,cAAc,GAAd,cAAc;AAEtB,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CACvD,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EACvC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C;IACH;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC;QACrC,IACE,IAAI,CAAC,cAAc;YACnB,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,EAChD;YACA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;QAC/C;QAEA,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAC5B,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,eAAe,CACrB,CAAC,IAAI,CACJ,SAAS,CAAC,SAAS,CAAC,EACpB,GAAG,CAAC,MAAK;AACP,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;;;AAGhC,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC;AACnB,iBAAA,OAA+C;YAClD,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE;iBAC3C,MAAM,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;iBAC9D,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AAErB,YAAA,OAAO,eAAe,CAAC,MAAM,GAAG;AAC9B,kBAAE,eAAe,CAAC,IAAI,CAAC,IAAI;AAC3B,kBAAE,IAAI,CAAC,mBAAmB,IAAI,uCAAuC;QACzE,CAAC,CAAC,CACH;IACH;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxE,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;YACzD,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;QAC7B;QAEA,IACE,OAAO,CAAC,oBAAoB,CAAC;AAC7B,YAAA,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,WAAW,EAC1C;YACA,IAAI,CAAC,mBAAmB,EAAE;QAC5B;IACF;AAEA;;;;AAIG;IACK,mBAAmB,GAAA;AACzB,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;YAC3C;QACF;AAEA,QAAA,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;QAEjC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa;QAClE,IACE,kBAAkB,CAAC,aAAa,CAAC;AACjC,YAAA,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAC1C;AACA,YAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7C;aAAO;;YAEL,IAAI,CAAC,gBAAgB,EAAE;QACzB;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE;AAClC,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;IACjC;AAEQ,IAAA,WAAW,CAA8C,IAAO,EAAA;QACtE,IACE,IAAI,CAAC,cAAc;AACnB,YAAA,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EAC/D;AACA,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAClC;AACA,QAAA,OAAO,iCAAiC,CAAC,IAAI,CAAC;IAChD;AAEA,IAAA,IAAI,OAAO,GAAA;QACT,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC5C;IACH;AAEO,IAAA,MAAM,CAAI,IAAS,EAAA;;;;;AAKxB,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CACjE,GAAG,CAAC,MACF,mBAAmB,CACjB,IAAI,EACJ,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAChC,IAAI,CAAC,OAAO,CACb,CACF,EACD,SAAS,CACP,mBAAmB,CACjB,IAAI,EACJ,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAChC,IAAI,CAAC,OAAO,CACb,CACF,CACF;IACH;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE;YAC/C,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,kBAAkB,KAAK,UAAU,EAAE;AAChE,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;YAC7B;AAAO,iBAAA,IACL,CAAC,IAAI,CAAC,WAAW,EAAE;AACnB,gBAAA,IAAI,CAAC,kBAAkB,KAAK,WAAW,EACvC;AACA,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YAC5B;YAEA;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB;QACF;QACA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,WAAW;;;;;QAM/D,MAAM,WAAW,GACf,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,EAAE,WAAW;;AAG3D,QAAA,IAAI,iBAAiB,CAAC,WAAW,CAAC,EAAE;YAClC;QACF;QAEA,MAAM,SAAS,GACb,IAAI,CAAC,QAAQ,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,WAAW;QAC5E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC;IAChD;IAEO,WAAW,GAAA;QAChB,OAAO;;AAEL,YAAA,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI;AAClC,YAAA,KAAK,EAAE;AACL,gBAAA,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;gBAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;AACtB,aAAA;SACF;IACH;wGAlPW,gCAAgC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAwDjC,6BAA6B,EAAA,EAAA,EAAA,KAAA,EAG7B,2BAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AA3D1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gCAAgC,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iDAAA,EAAA,sBAAA,EAAA,gDAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,SAAA,EAHhC,CAAC,yBAAyB,CAAC,0JClJxC,2jFAiFA,EAAA,MAAA,EAAA,CAAA,22BAAA,CAAA,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,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,WAAA,EAAA,gCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,MAAA,EAAA,WAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA;;4FDoEa,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAP5C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iCAAiC,EAAA,SAAA,EAGhC,CAAC,yBAAyB,CAAC,cAC1B,KAAK,EAAA,QAAA,EAAA,2jFAAA,EAAA,MAAA,EAAA,CAAA,22BAAA,CAAA,EAAA;;0BA0Dd,MAAM;2BAAC,6BAA6B;;0BAEpC;;0BACA,MAAM;2BAAC,2BAA2B;;sBArDpC;;sBAIA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA,WAAW;uBAAC,iDAAiD;;sBAK7D,WAAW;uBAAC,gDAAgD;;sBAO5D,SAAS;uBAAC,YAAY;;sBAStB;;;AE/KH,MAAM,gBAAgB,GAAG;IACvB,yBAAyB;IACzB,uBAAuB;IACvB,gCAAgC;CACjC;AAED,MAAM,kBAAkB,GAAG;AACzB,IAAA;AACE,QAAA,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,yBAAyB,EAAE;AAClE,QAAA,KAAK,EAAE,IAAI;AACZ,KAAA;AACD,IAAA;AACE,QAAA,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,uBAAuB,EAAE;AAC9D,QAAA,KAAK,EAAE,IAAI;AACZ,KAAA;AACD,IAAA;AACE,QAAA,OAAO,EAAE,uBAAuB;AAChC,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,SAAS,EAAE,gCAAgC;AAC5C,SAAA;AACD,QAAA,KAAK,EAAE,IAAI;AACZ,KAAA;CACF;MAiBY,wBAAwB,CAAA;wGAAxB,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,iBAzCnC,yBAAyB;YACzB,uBAAuB;AACvB,YAAA,gCAAgC,aA2B9B,YAAY;YACZ,mBAAmB;YACnB,sBAAsB;YACtB,iBAAiB;YACjB,wBAAwB;YACxB,iBAAiB;YACjB,iBAAiB;AACjB,YAAA,oBAAoB,aApCtB,yBAAyB;YACzB,uBAAuB;YACvB,gCAAgC,CAAA,EAAA,CAAA;AAuCrB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,aAHxB,CAAC,GAAG,kBAAkB,CAAC,YAThC,YAAY;YACZ,mBAAmB;YACnB,sBAAsB;YACtB,iBAAiB;YACjB,wBAAwB;YACxB,iBAAiB;YACjB,iBAAiB;YACjB,oBAAoB,CAAA,EAAA,CAAA;;4FAKX,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAfpC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,CAAC,GAAG,gBAAgB,CAAC;AACnC,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,sBAAsB;wBACtB,iBAAiB;wBACjB,wBAAwB;wBACxB,iBAAiB;wBACjB,iBAAiB;wBACjB,oBAAoB;AACrB,qBAAA;AACD,oBAAA,SAAS,EAAE,CAAC,GAAG,kBAAkB,CAAC;AAClC,oBAAA,OAAO,EAAE,CAAC,GAAG,gBAAgB,CAAC;AAC/B,iBAAA;;;AC1DD;;AAEG;;;;"}