@design-system-rte/angular 1.0.1 → 1.2.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 (56) hide show
  1. package/esm2022/lib/components/assistive-text/assistive-text.component.mjs +34 -0
  2. package/esm2022/lib/components/badge/badge.component.mjs +7 -4
  3. package/esm2022/lib/components/banner/banner.component.mjs +3 -3
  4. package/esm2022/lib/components/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +18 -3
  5. package/esm2022/lib/components/breadcrumbs/breadcrumbs.component.mjs +19 -3
  6. package/esm2022/lib/components/dropdown/dropdown-item/dropdown-item.component.mjs +23 -6
  7. package/esm2022/lib/components/dropdown/dropdown-menu/dropdown-menu-footer.directive.mjs +17 -0
  8. package/esm2022/lib/components/dropdown/dropdown-menu/dropdown-menu-header.directive.mjs +17 -0
  9. package/esm2022/lib/components/dropdown/dropdown-menu/dropdown-menu.component.mjs +35 -5
  10. package/esm2022/lib/components/dropdown/dropdown-trigger/dropdown-trigger.directive.mjs +23 -2
  11. package/esm2022/lib/components/dropdown/dropdown.directive.mjs +93 -14
  12. package/esm2022/lib/components/dropdown/dropdown.module.mjs +32 -5
  13. package/esm2022/lib/components/icon-button/icon-button.component.mjs +6 -6
  14. package/esm2022/lib/components/icon-button-toggle/icon-button-toggle.component.mjs +3 -3
  15. package/esm2022/lib/components/modal/modal.component.mjs +3 -3
  16. package/esm2022/lib/components/searchbar/searchbar.component.mjs +86 -0
  17. package/esm2022/lib/components/segmented-control/segmented-control.component.mjs +13 -3
  18. package/esm2022/lib/components/select/select.component.mjs +168 -0
  19. package/esm2022/lib/components/split-button/split-button.component.mjs +17 -3
  20. package/esm2022/lib/components/tab/tab-item/tab-item.component.mjs +112 -0
  21. package/esm2022/lib/components/tab/tab.component.mjs +242 -0
  22. package/esm2022/lib/components/text-input/base-text-input/base-text-input.component.mjs +109 -0
  23. package/esm2022/lib/components/text-input/text-input.component.mjs +8 -103
  24. package/esm2022/lib/components/textarea/textarea.component.mjs +6 -5
  25. package/esm2022/lib/components/toast/toast.component.mjs +44 -5
  26. package/esm2022/lib/services/dropdown.service.mjs +2 -3
  27. package/esm2022/public-api.mjs +4 -1
  28. package/fesm2022/design-system-rte-angular.mjs +1047 -156
  29. package/fesm2022/design-system-rte-angular.mjs.map +1 -1
  30. package/lib/components/assistive-text/assistive-text.component.d.ts +14 -0
  31. package/lib/components/badge/badge.directive.d.ts +1 -1
  32. package/lib/components/breadcrumbs/breadcrumb-item/breadcrumb-item.component.d.ts +3 -2
  33. package/lib/components/breadcrumbs/breadcrumbs.component.d.ts +10 -3
  34. package/lib/components/dropdown/dropdown-item/dropdown-item.component.d.ts +4 -1
  35. package/lib/components/dropdown/dropdown-menu/dropdown-menu-footer.directive.d.ts +7 -0
  36. package/lib/components/dropdown/dropdown-menu/dropdown-menu-header.directive.d.ts +7 -0
  37. package/lib/components/dropdown/dropdown-menu/dropdown-menu.component.d.ts +23 -1
  38. package/lib/components/dropdown/dropdown-trigger/dropdown-trigger.directive.d.ts +7 -1
  39. package/lib/components/dropdown/dropdown.directive.d.ts +17 -3
  40. package/lib/components/dropdown/dropdown.module.d.ts +3 -1
  41. package/lib/components/icon-button/icon-button.component.d.ts +5 -4
  42. package/lib/components/icon-button-toggle/icon-button-toggle.component.d.ts +2 -2
  43. package/lib/components/popover/popover.component.d.ts +1 -1
  44. package/lib/components/searchbar/searchbar.component.d.ts +31 -0
  45. package/lib/components/segmented-control/segmented-control.component.d.ts +1 -0
  46. package/lib/components/select/select.component.d.ts +56 -0
  47. package/lib/components/split-button/split-button.component.d.ts +10 -2
  48. package/lib/components/tab/tab-item/tab-item.component.d.ts +35 -0
  49. package/lib/components/tab/tab.component.d.ts +70 -0
  50. package/lib/components/tag/tag.component.d.ts +2 -2
  51. package/lib/components/text-input/base-text-input/base-text-input.component.d.ts +47 -0
  52. package/lib/components/text-input/text-input.component.d.ts +3 -39
  53. package/lib/components/toast/toast.component.d.ts +9 -1
  54. package/lib/components/tooltip/tooltip.component.d.ts +1 -1
  55. package/package.json +2 -2
  56. package/public-api.d.ts +3 -0
@@ -0,0 +1,112 @@
1
+ import { CommonModule } from "@angular/common";
2
+ import { ChangeDetectionStrategy, Component, input, signal, viewChild, output, computed, } from "@angular/core";
3
+ import { BadgeComponent } from "../../badge/badge.component";
4
+ import { IconComponent } from "../../icon/icon.component";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ export class TabItemComponent {
8
+ constructor() {
9
+ this.direction = input("horizontal");
10
+ this.option = input();
11
+ this.compactSpacing = input();
12
+ this.isSelected = input(false);
13
+ this.click = output();
14
+ this.handleKeydown = input();
15
+ this.inverted = input(false);
16
+ this.isHidden = input(false);
17
+ this.tabItemRef = viewChild("tabItem");
18
+ this.hoverIndicatorStyle = signal(null);
19
+ this.displayBadge = (option) => {
20
+ return !!(option.badgeContent || option.badgeType || option.badgeIcon || option.badgeCount);
21
+ };
22
+ this.hoverIndicatorWidth = computed(() => {
23
+ return `${this.hoverIndicatorStyle()?.width}px`;
24
+ });
25
+ this.hoverIndicatorHeight = computed(() => {
26
+ return `${this.hoverIndicatorStyle()?.height}px`;
27
+ });
28
+ this.hoverIndicatorLeft = computed(() => {
29
+ return `${this.hoverIndicatorStyle()?.left}px`;
30
+ });
31
+ this.hoverIndicatorTop = computed(() => {
32
+ return `${this.hoverIndicatorStyle()?.top}px`;
33
+ });
34
+ this.hoverIndicatorOpacity = computed(() => {
35
+ return this.hoverIndicatorStyle()?.opacity ?? 0;
36
+ });
37
+ this.computeHoverIndicatorStyle = () => {
38
+ if (this.direction() === "horizontal") {
39
+ this.hoverIndicatorStyle.set({
40
+ width: this.tabItemRef()?.nativeElement.offsetWidth,
41
+ height: 2,
42
+ left: this.tabItemRef()?.nativeElement.offsetLeft,
43
+ top: this.tabItemRef()
44
+ ? this.tabItemRef().nativeElement.offsetTop + this.tabItemRef().nativeElement.offsetHeight
45
+ : 0,
46
+ opacity: 0,
47
+ });
48
+ }
49
+ else {
50
+ this.hoverIndicatorStyle.set({
51
+ width: 2,
52
+ height: this.tabItemRef()?.nativeElement.offsetHeight,
53
+ left: this.tabItemRef()?.nativeElement.offsetLeft && this.tabItemRef().nativeElement.offsetLeft - 4,
54
+ top: this.tabItemRef().nativeElement.offsetTop,
55
+ opacity: 0,
56
+ });
57
+ }
58
+ };
59
+ }
60
+ ngAfterViewInit() {
61
+ this.computeHoverIndicatorStyle();
62
+ if (this.tabItemRef && this.tabItemRef()?.nativeElement) {
63
+ if (this.option()?.disabled)
64
+ return;
65
+ window.addEventListener("resize", this.computeHoverIndicatorStyle);
66
+ const parent = this.tabItemRef()?.nativeElement.parentElement?.parentElement;
67
+ if (parent) {
68
+ parent.addEventListener("scroll", this.computeHoverIndicatorStyle);
69
+ }
70
+ }
71
+ }
72
+ ngOnDestroy() {
73
+ const parent = this.tabItemRef()?.nativeElement.parentElement?.parentElement;
74
+ window.removeEventListener("resize", this.computeHoverIndicatorStyle);
75
+ if (parent) {
76
+ parent.removeEventListener("scroll", this.computeHoverIndicatorStyle);
77
+ }
78
+ }
79
+ onClickTabItem(event, id) {
80
+ this.hoverIndicatorStyle.set({
81
+ ...this.hoverIndicatorStyle(),
82
+ opacity: 0,
83
+ });
84
+ if (!this.option()?.disabled) {
85
+ this.click.emit(id);
86
+ }
87
+ else {
88
+ event.stopPropagation();
89
+ }
90
+ }
91
+ handleMouseHover() {
92
+ if (!this.isSelected()) {
93
+ this.hoverIndicatorStyle.set({
94
+ ...this.hoverIndicatorStyle(),
95
+ opacity: 1,
96
+ });
97
+ }
98
+ }
99
+ handleMouseOut() {
100
+ this.hoverIndicatorStyle.set({
101
+ ...this.hoverIndicatorStyle(),
102
+ opacity: 0,
103
+ });
104
+ }
105
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TabItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
106
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: TabItemComponent, isStandalone: true, selector: "rte-tab-item", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, option: { classPropertyName: "option", publicName: "option", isSignal: true, isRequired: false, transformFunction: null }, compactSpacing: { classPropertyName: "compactSpacing", publicName: "compactSpacing", isSignal: true, isRequired: false, transformFunction: null }, isSelected: { classPropertyName: "isSelected", publicName: "isSelected", isSignal: true, isRequired: false, transformFunction: null }, handleKeydown: { classPropertyName: "handleKeydown", publicName: "handleKeydown", isSignal: true, isRequired: false, transformFunction: null }, inverted: { classPropertyName: "inverted", publicName: "inverted", isSignal: true, isRequired: false, transformFunction: null }, isHidden: { classPropertyName: "isHidden", publicName: "isHidden", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { click: "click" }, viewQueries: [{ propertyName: "tabItemRef", first: true, predicate: ["tabItem"], descendants: true, isSignal: true }], ngImport: i0, template: "<button\n #tabItem\n class=\"rte-tabitem\"\n role=\"tab\"\n [id]=\"option()?.id\"\n [attr.aria-selected]=\"isSelected()\"\n [attr.aria-controls]=\"option()?.panelId\"\n [tabIndex]=\"isSelected() ? 0 : -1\"\n [attr.data-selected]=\"isSelected()\"\n [attr.data-inverted]=\"inverted()\"\n [attr.data-compact-spacing]=\"compactSpacing()\"\n [attr.data-disabled]=\"option()?.disabled\"\n [attr.data-hidden]=\"isHidden()\"\n (click)=\"onClickTabItem($event, option()?.id || '')\"\n (mouseover)=\"handleMouseHover()\"\n (mouseout)=\"handleMouseOut()\"\n (keydown)=\"handleKeydown()\"\n>\n <rte-icon *ngIf=\"option()?.icon\" [name]=\"option()?.icon || ''\" [appearance]=\"isSelected() ? 'filled' : 'outlined'\" />\n <span *ngIf=\"option()?.label\">{{ option()?.label }}</span>\n <rte-badge\n *ngIf=\"displayBadge(option()!)\"\n [simpleBadge]=\"true\"\n [badgeContent]=\"option()?.badgeContent || 'empty'\"\n [badgeType]=\"option()?.badgeType || 'neutral'\"\n [icon]=\"option()?.badgeIcon || ''\"\n [count]=\"option()?.badgeCount\"\n />\n</button>\n<span\n #hoverIndicator\n class=\"rte-tab-hover-indicator\"\n [attr.data-disabled]=\"option()?.disabled\"\n [id]=\"'tab-hover-indicator' + option()?.id\"\n [ngStyle]=\"{\n width: hoverIndicatorWidth(),\n height: hoverIndicatorHeight(),\n left: hoverIndicatorLeft(),\n top: hoverIndicatorTop(),\n opacity: hoverIndicatorOpacity(),\n }\"\n></span>\n", styles: [":host{pointer-events:none;display:flex}.rte-tabitem{font-feature-settings:\"liga\" off,\"clig\" off;font-style:normal;font-family:Arial;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0px;display:flex;padding:12px;justify-content:center;align-items:center;gap:12px;background:transparent;color:var(--content-secondary);cursor:pointer;border:none;text-align:left;flex-shrink:0;margin-left:2px;height:100%;pointer-events:auto}.rte-tabitem[data-inverted=true]{color:var(--content-primary-inverse)}.rte-tabitem[data-direction=vertical]{flex-shrink:1;margin-left:0}.rte-tabitem[data-hidden=true]{visibility:hidden}.rte-tabitem[data-selected=true]:not([data-disabled=true]),.rte-tabitem:hover:not([data-disabled=true]){font-feature-settings:\"liga\" off,\"clig\" off;font-style:normal;font-family:Arial;font-weight:700;font-size:14px;line-height:20px;letter-spacing:0px}.rte-tabitem[data-disabled=true]{color:var(--content-disabled);cursor:not-allowed}.rte-tabitem[data-compact-spacing=true]{padding:4px 12px}.rte-tabitem:focus-visible{z-index:1;outline:2px solid var(--border-brand-focused)}.rte-tab-hover-indicator{position:absolute;top:4px;height:2px;width:2px;background:var(--background-neutral-regular-hover);opacity:0;transition:left .2s ease,width .2s ease;z-index:10}.rte-tab-hover-indicator[data-disabled=true]{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: IconComponent, selector: "rte-icon", inputs: ["name", "size", "color", "classes", "appearance"] }, { kind: "component", type: BadgeComponent, selector: "rte-badge", inputs: ["badgeType", "badgeSize", "badgeContent", "count", "icon", "simpleBadge"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
107
+ }
108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TabItemComponent, decorators: [{
109
+ type: Component,
110
+ args: [{ selector: "rte-tab-item", imports: [CommonModule, IconComponent, BadgeComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n #tabItem\n class=\"rte-tabitem\"\n role=\"tab\"\n [id]=\"option()?.id\"\n [attr.aria-selected]=\"isSelected()\"\n [attr.aria-controls]=\"option()?.panelId\"\n [tabIndex]=\"isSelected() ? 0 : -1\"\n [attr.data-selected]=\"isSelected()\"\n [attr.data-inverted]=\"inverted()\"\n [attr.data-compact-spacing]=\"compactSpacing()\"\n [attr.data-disabled]=\"option()?.disabled\"\n [attr.data-hidden]=\"isHidden()\"\n (click)=\"onClickTabItem($event, option()?.id || '')\"\n (mouseover)=\"handleMouseHover()\"\n (mouseout)=\"handleMouseOut()\"\n (keydown)=\"handleKeydown()\"\n>\n <rte-icon *ngIf=\"option()?.icon\" [name]=\"option()?.icon || ''\" [appearance]=\"isSelected() ? 'filled' : 'outlined'\" />\n <span *ngIf=\"option()?.label\">{{ option()?.label }}</span>\n <rte-badge\n *ngIf=\"displayBadge(option()!)\"\n [simpleBadge]=\"true\"\n [badgeContent]=\"option()?.badgeContent || 'empty'\"\n [badgeType]=\"option()?.badgeType || 'neutral'\"\n [icon]=\"option()?.badgeIcon || ''\"\n [count]=\"option()?.badgeCount\"\n />\n</button>\n<span\n #hoverIndicator\n class=\"rte-tab-hover-indicator\"\n [attr.data-disabled]=\"option()?.disabled\"\n [id]=\"'tab-hover-indicator' + option()?.id\"\n [ngStyle]=\"{\n width: hoverIndicatorWidth(),\n height: hoverIndicatorHeight(),\n left: hoverIndicatorLeft(),\n top: hoverIndicatorTop(),\n opacity: hoverIndicatorOpacity(),\n }\"\n></span>\n", styles: [":host{pointer-events:none;display:flex}.rte-tabitem{font-feature-settings:\"liga\" off,\"clig\" off;font-style:normal;font-family:Arial;font-weight:400;font-size:14px;line-height:20px;letter-spacing:0px;display:flex;padding:12px;justify-content:center;align-items:center;gap:12px;background:transparent;color:var(--content-secondary);cursor:pointer;border:none;text-align:left;flex-shrink:0;margin-left:2px;height:100%;pointer-events:auto}.rte-tabitem[data-inverted=true]{color:var(--content-primary-inverse)}.rte-tabitem[data-direction=vertical]{flex-shrink:1;margin-left:0}.rte-tabitem[data-hidden=true]{visibility:hidden}.rte-tabitem[data-selected=true]:not([data-disabled=true]),.rte-tabitem:hover:not([data-disabled=true]){font-feature-settings:\"liga\" off,\"clig\" off;font-style:normal;font-family:Arial;font-weight:700;font-size:14px;line-height:20px;letter-spacing:0px}.rte-tabitem[data-disabled=true]{color:var(--content-disabled);cursor:not-allowed}.rte-tabitem[data-compact-spacing=true]{padding:4px 12px}.rte-tabitem:focus-visible{z-index:1;outline:2px solid var(--border-brand-focused)}.rte-tab-hover-indicator{position:absolute;top:4px;height:2px;width:2px;background:var(--background-neutral-regular-hover);opacity:0;transition:left .2s ease,width .2s ease;z-index:10}.rte-tab-hover-indicator[data-disabled=true]{display:none}\n"] }]
111
+ }] });
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHMtcnRlLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvdGFiL3RhYi1pdGVtL3RhYi1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RzLXJ0ZS1saWIvc3JjL2xpYi9jb21wb25lbnRzL3RhYi90YWItaXRlbS90YWItaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFHTixTQUFTLEVBQ1QsTUFBTSxFQUVOLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7QUFVMUQsTUFBTSxPQUFPLGdCQUFnQjtJQVI3QjtRQVNXLGNBQVMsR0FBRyxLQUFLLENBQTRCLFlBQVksQ0FBQyxDQUFDO1FBQzNELFdBQU0sR0FBRyxLQUFLLEVBQWdCLENBQUM7UUFDL0IsbUJBQWMsR0FBRyxLQUFLLEVBQVcsQ0FBQztRQUNsQyxlQUFVLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ25DLFVBQUssR0FBRyxNQUFNLEVBQVUsQ0FBQztRQUN6QixrQkFBYSxHQUFHLEtBQUssRUFBYyxDQUFDO1FBQ3BDLGFBQVEsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDakMsYUFBUSxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUVqQyxlQUFVLEdBQUcsU0FBUyxDQUFnQyxTQUFTLENBQUMsQ0FBQztRQUVqRSx3QkFBbUIsR0FBRyxNQUFNLENBTTNCLElBQUksQ0FBQyxDQUFDO1FBRVAsaUJBQVksR0FBRyxDQUFDLE1BQW9CLEVBQVcsRUFBRTtZQUN4RCxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5RixDQUFDLENBQUM7UUFFTyx3QkFBbUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQzNDLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUNNLHlCQUFvQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDNUMsT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBQ00sdUJBQWtCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUMxQyxPQUFPLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7UUFDTSxzQkFBaUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3pDLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztRQUNNLDBCQUFxQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDN0MsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO1FBa0RLLCtCQUEwQixHQUFHLEdBQUcsRUFBRTtZQUN4QyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQztvQkFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxhQUFhLENBQUMsV0FBVztvQkFDbkQsTUFBTSxFQUFFLENBQUM7b0JBQ1QsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxhQUFhLENBQUMsVUFBVTtvQkFDakQsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7d0JBQ3BCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFHLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFHLENBQUMsYUFBYSxDQUFDLFlBQVk7d0JBQzVGLENBQUMsQ0FBQyxDQUFDO29CQUNMLE9BQU8sRUFBRSxDQUFDO2lCQUNYLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDO29CQUMzQixLQUFLLEVBQUUsQ0FBQztvQkFDUixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLGFBQWEsQ0FBQyxZQUFZO29CQUNyRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLGFBQWEsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsQ0FBQztvQkFDcEcsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUcsQ0FBQyxhQUFhLENBQUMsU0FBUztvQkFDL0MsT0FBTyxFQUFFLENBQUM7aUJBQ1gsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQztLQUNIO0lBckVDLGVBQWU7UUFDYixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3hELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLFFBQVE7Z0JBQUUsT0FBTztZQUNwQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxhQUFhLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQztZQUM3RSxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDckUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxhQUFhLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQztRQUM3RSxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ3RFLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQWlCLEVBQUUsRUFBVTtRQUMxQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDO1lBQzNCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzdCLE9BQU8sRUFBRSxDQUFDO1NBQ1gsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDO2dCQUMzQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDN0IsT0FBTyxFQUFFLENBQUM7YUFDWCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDO1lBQzNCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzdCLE9BQU8sRUFBRSxDQUFDO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F0RlUsZ0JBQWdCO21HQUFoQixnQkFBZ0IsbXBDQzFCN0IsdzZDQTBDQSwwM0NEdEJZLFlBQVksd05BQUUsYUFBYSxpSEFBRSxjQUFjOzs0RkFNMUMsZ0JBQWdCO2tCQVI1QixTQUFTOytCQUNFLGNBQWMsV0FDZixDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLGNBQzFDLElBQUksbUJBR0MsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIEVsZW1lbnRSZWYsXG4gIEFmdGVyVmlld0luaXQsXG4gIHZpZXdDaGlsZCxcbiAgb3V0cHV0LFxuICBPbkRlc3Ryb3ksXG4gIGNvbXB1dGVkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVGFiSXRlbVByb3BzIH0gZnJvbSBcIkBkZXNpZ24tc3lzdGVtLXJ0ZS9jb3JlL2NvbXBvbmVudHMvdGFiL3RhYi5pbnRlcmZhY2VcIjtcblxuaW1wb3J0IHsgQmFkZ2VDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vYmFkZ2UvYmFkZ2UuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2ljb24vaWNvbi5jb21wb25lbnRcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcInJ0ZS10YWItaXRlbVwiLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJY29uQ29tcG9uZW50LCBCYWRnZUNvbXBvbmVudF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlVXJsOiBcIi4vdGFiLWl0ZW0uY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmw6IFwiLi90YWItaXRlbS5jb21wb25lbnQuc2Nzc1wiLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGFiSXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHJlYWRvbmx5IGRpcmVjdGlvbiA9IGlucHV0PFwiaG9yaXpvbnRhbFwiIHwgXCJ2ZXJ0aWNhbFwiPihcImhvcml6b250YWxcIik7XG4gIHJlYWRvbmx5IG9wdGlvbiA9IGlucHV0PFRhYkl0ZW1Qcm9wcz4oKTtcbiAgcmVhZG9ubHkgY29tcGFjdFNwYWNpbmcgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpc1NlbGVjdGVkID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBjbGljayA9IG91dHB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGhhbmRsZUtleWRvd24gPSBpbnB1dDwoKSA9PiB2b2lkPigpO1xuICByZWFkb25seSBpbnZlcnRlZCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgaXNIaWRkZW4gPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgcmVhZG9ubHkgdGFiSXRlbVJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50Pj4oXCJ0YWJJdGVtXCIpO1xuXG4gIHJlYWRvbmx5IGhvdmVySW5kaWNhdG9yU3R5bGUgPSBzaWduYWw8e1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIGxlZnQ/OiBudW1iZXI7XG4gICAgdG9wPzogbnVtYmVyO1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICBvcGFjaXR5PzogbnVtYmVyO1xuICB9IHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgZGlzcGxheUJhZGdlID0gKG9wdGlvbjogVGFiSXRlbVByb3BzKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuICEhKG9wdGlvbi5iYWRnZUNvbnRlbnQgfHwgb3B0aW9uLmJhZGdlVHlwZSB8fCBvcHRpb24uYmFkZ2VJY29uIHx8IG9wdGlvbi5iYWRnZUNvdW50KTtcbiAgfTtcblxuICByZWFkb25seSBob3ZlckluZGljYXRvcldpZHRoID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBgJHt0aGlzLmhvdmVySW5kaWNhdG9yU3R5bGUoKT8ud2lkdGh9cHhgO1xuICB9KTtcbiAgcmVhZG9ubHkgaG92ZXJJbmRpY2F0b3JIZWlnaHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIGAke3RoaXMuaG92ZXJJbmRpY2F0b3JTdHlsZSgpPy5oZWlnaHR9cHhgO1xuICB9KTtcbiAgcmVhZG9ubHkgaG92ZXJJbmRpY2F0b3JMZWZ0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBgJHt0aGlzLmhvdmVySW5kaWNhdG9yU3R5bGUoKT8ubGVmdH1weGA7XG4gIH0pO1xuICByZWFkb25seSBob3ZlckluZGljYXRvclRvcCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gYCR7dGhpcy5ob3ZlckluZGljYXRvclN0eWxlKCk/LnRvcH1weGA7XG4gIH0pO1xuICByZWFkb25seSBob3ZlckluZGljYXRvck9wYWNpdHkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuaG92ZXJJbmRpY2F0b3JTdHlsZSgpPy5vcGFjaXR5ID8/IDA7XG4gIH0pO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmNvbXB1dGVIb3ZlckluZGljYXRvclN0eWxlKCk7XG4gICAgaWYgKHRoaXMudGFiSXRlbVJlZiAmJiB0aGlzLnRhYkl0ZW1SZWYoKT8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9uKCk/LmRpc2FibGVkKSByZXR1cm47XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLmNvbXB1dGVIb3ZlckluZGljYXRvclN0eWxlKTtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMudGFiSXRlbVJlZigpPy5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ/LnBhcmVudEVsZW1lbnQ7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMuY29tcHV0ZUhvdmVySW5kaWNhdG9yU3R5bGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMudGFiSXRlbVJlZigpPy5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ/LnBhcmVudEVsZW1lbnQ7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5jb21wdXRlSG92ZXJJbmRpY2F0b3JTdHlsZSk7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5jb21wdXRlSG92ZXJJbmRpY2F0b3JTdHlsZSk7XG4gICAgfVxuICB9XG5cbiAgb25DbGlja1RhYkl0ZW0oZXZlbnQ6IE1vdXNlRXZlbnQsIGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmhvdmVySW5kaWNhdG9yU3R5bGUuc2V0KHtcbiAgICAgIC4uLnRoaXMuaG92ZXJJbmRpY2F0b3JTdHlsZSgpLFxuICAgICAgb3BhY2l0eTogMCxcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMub3B0aW9uKCk/LmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmNsaWNrLmVtaXQoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVNb3VzZUhvdmVyKCkge1xuICAgIGlmICghdGhpcy5pc1NlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMuaG92ZXJJbmRpY2F0b3JTdHlsZS5zZXQoe1xuICAgICAgICAuLi50aGlzLmhvdmVySW5kaWNhdG9yU3R5bGUoKSxcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vdXNlT3V0KCkge1xuICAgIHRoaXMuaG92ZXJJbmRpY2F0b3JTdHlsZS5zZXQoe1xuICAgICAgLi4udGhpcy5ob3ZlckluZGljYXRvclN0eWxlKCksXG4gICAgICBvcGFjaXR5OiAwLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlSG92ZXJJbmRpY2F0b3JTdHlsZSA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5kaXJlY3Rpb24oKSA9PT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICAgIHRoaXMuaG92ZXJJbmRpY2F0b3JTdHlsZS5zZXQoe1xuICAgICAgICB3aWR0aDogdGhpcy50YWJJdGVtUmVmKCk/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsXG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgbGVmdDogdGhpcy50YWJJdGVtUmVmKCk/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICAgICAgdG9wOiB0aGlzLnRhYkl0ZW1SZWYoKVxuICAgICAgICAgID8gdGhpcy50YWJJdGVtUmVmKCkhLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wICsgdGhpcy50YWJJdGVtUmVmKCkhLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0XG4gICAgICAgICAgOiAwLFxuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaG92ZXJJbmRpY2F0b3JTdHlsZS5zZXQoe1xuICAgICAgICB3aWR0aDogMixcbiAgICAgICAgaGVpZ2h0OiB0aGlzLnRhYkl0ZW1SZWYoKT8ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQsXG4gICAgICAgIGxlZnQ6IHRoaXMudGFiSXRlbVJlZigpPy5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQgJiYgdGhpcy50YWJJdGVtUmVmKCkhLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCAtIDQsXG4gICAgICAgIHRvcDogdGhpcy50YWJJdGVtUmVmKCkhLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wLFxuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuIiwiPGJ1dHRvblxuICAjdGFiSXRlbVxuICBjbGFzcz1cInJ0ZS10YWJpdGVtXCJcbiAgcm9sZT1cInRhYlwiXG4gIFtpZF09XCJvcHRpb24oKT8uaWRcIlxuICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQoKVwiXG4gIFthdHRyLmFyaWEtY29udHJvbHNdPVwib3B0aW9uKCk/LnBhbmVsSWRcIlxuICBbdGFiSW5kZXhdPVwiaXNTZWxlY3RlZCgpID8gMCA6IC0xXCJcbiAgW2F0dHIuZGF0YS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKClcIlxuICBbYXR0ci5kYXRhLWludmVydGVkXT1cImludmVydGVkKClcIlxuICBbYXR0ci5kYXRhLWNvbXBhY3Qtc3BhY2luZ109XCJjb21wYWN0U3BhY2luZygpXCJcbiAgW2F0dHIuZGF0YS1kaXNhYmxlZF09XCJvcHRpb24oKT8uZGlzYWJsZWRcIlxuICBbYXR0ci5kYXRhLWhpZGRlbl09XCJpc0hpZGRlbigpXCJcbiAgKGNsaWNrKT1cIm9uQ2xpY2tUYWJJdGVtKCRldmVudCwgb3B0aW9uKCk/LmlkIHx8ICcnKVwiXG4gIChtb3VzZW92ZXIpPVwiaGFuZGxlTW91c2VIb3ZlcigpXCJcbiAgKG1vdXNlb3V0KT1cImhhbmRsZU1vdXNlT3V0KClcIlxuICAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duKClcIlxuPlxuICA8cnRlLWljb24gKm5nSWY9XCJvcHRpb24oKT8uaWNvblwiIFtuYW1lXT1cIm9wdGlvbigpPy5pY29uIHx8ICcnXCIgW2FwcGVhcmFuY2VdPVwiaXNTZWxlY3RlZCgpID8gJ2ZpbGxlZCcgOiAnb3V0bGluZWQnXCIgLz5cbiAgPHNwYW4gKm5nSWY9XCJvcHRpb24oKT8ubGFiZWxcIj57eyBvcHRpb24oKT8ubGFiZWwgfX08L3NwYW4+XG4gIDxydGUtYmFkZ2VcbiAgICAqbmdJZj1cImRpc3BsYXlCYWRnZShvcHRpb24oKSEpXCJcbiAgICBbc2ltcGxlQmFkZ2VdPVwidHJ1ZVwiXG4gICAgW2JhZGdlQ29udGVudF09XCJvcHRpb24oKT8uYmFkZ2VDb250ZW50IHx8ICdlbXB0eSdcIlxuICAgIFtiYWRnZVR5cGVdPVwib3B0aW9uKCk/LmJhZGdlVHlwZSB8fCAnbmV1dHJhbCdcIlxuICAgIFtpY29uXT1cIm9wdGlvbigpPy5iYWRnZUljb24gfHwgJydcIlxuICAgIFtjb3VudF09XCJvcHRpb24oKT8uYmFkZ2VDb3VudFwiXG4gIC8+XG48L2J1dHRvbj5cbjxzcGFuXG4gICNob3ZlckluZGljYXRvclxuICBjbGFzcz1cInJ0ZS10YWItaG92ZXItaW5kaWNhdG9yXCJcbiAgW2F0dHIuZGF0YS1kaXNhYmxlZF09XCJvcHRpb24oKT8uZGlzYWJsZWRcIlxuICBbaWRdPVwiJ3RhYi1ob3Zlci1pbmRpY2F0b3InICsgb3B0aW9uKCk/LmlkXCJcbiAgW25nU3R5bGVdPVwie1xuICAgIHdpZHRoOiBob3ZlckluZGljYXRvcldpZHRoKCksXG4gICAgaGVpZ2h0OiBob3ZlckluZGljYXRvckhlaWdodCgpLFxuICAgIGxlZnQ6IGhvdmVySW5kaWNhdG9yTGVmdCgpLFxuICAgIHRvcDogaG92ZXJJbmRpY2F0b3JUb3AoKSxcbiAgICBvcGFjaXR5OiBob3ZlckluZGljYXRvck9wYWNpdHkoKSxcbiAgfVwiXG4+PC9zcGFuPlxuIl19
@@ -0,0 +1,242 @@
1
+ import { CommonModule } from "@angular/common";
2
+ import { ChangeDetectionStrategy, Component, input, computed, signal, viewChildren, output, viewChild, } from "@angular/core";
3
+ import { scrollToSelectedTab } from "@design-system-rte/core/components/tab/tab.utils";
4
+ import { ARROW_DOWN_KEY, ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, } from "@design-system-rte/core/constants/keyboard/keyboard.constants";
5
+ import { BadgeComponent } from "../badge/badge.component";
6
+ import { DropdownModule } from "../dropdown";
7
+ import { IconComponent } from "../icon/icon.component";
8
+ import { IconButtonComponent } from "../icon-button/icon-button.component";
9
+ import { TabItemComponent } from "./tab-item/tab-item.component";
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/common";
12
+ import * as i2 from "../dropdown/dropdown.directive";
13
+ import * as i3 from "../dropdown/dropdown-trigger/dropdown-trigger.directive";
14
+ import * as i4 from "../dropdown/dropdown-menu/dropdown-menu.component";
15
+ export class TabComponent {
16
+ constructor() {
17
+ this.alignment = input("start");
18
+ this.direction = input("horizontal");
19
+ this.options = input([]);
20
+ this.selectedTabId = input();
21
+ this.compactSpacing = input(false);
22
+ this.overflowType = input("scrollable");
23
+ this.inverted = input(false);
24
+ this.sliderLeft = signal(0);
25
+ this.sliderWidth = signal(0);
26
+ this.sliderTop = signal(0);
27
+ this.sliderHeight = signal(0);
28
+ this.tabItemRefs = viewChildren("tabItem");
29
+ this.containerRef = viewChild("tabList");
30
+ this.hoverIndicatorRefs = viewChildren("hoverIndicator");
31
+ this.selectedTabRef = computed(() => {
32
+ const idx = this.options().findIndex((opt) => opt.id === this.selectedTabId());
33
+ const tabItem = this.tabItemRefs()[idx];
34
+ return tabItem;
35
+ });
36
+ this.hoverIndicatorStyle = signal(null);
37
+ this.change = output();
38
+ this.isScrollable = signal(false);
39
+ this.isOverflowingLeft = signal(false);
40
+ this.isOverflowingRight = signal(false);
41
+ this.isOverflowingTop = signal(false);
42
+ this.isOverflowingBottom = signal(false);
43
+ this.canScrollBackward = computed(() => {
44
+ return this.isOverflowingLeft() || this.isOverflowingTop();
45
+ });
46
+ this.canScrollForward = computed(() => {
47
+ return this.isOverflowingRight() || this.isOverflowingBottom();
48
+ });
49
+ this.isHorizontal = computed(() => this.direction() === "horizontal" && (this.isOverflowingRight() || this.isOverflowingLeft()));
50
+ this.shouldDisplayDropdown = computed(() => this.overflowType() === "dropdown" && this.isHorizontal());
51
+ this.selectedTab = computed(() => {
52
+ return this.options().find((option) => option.id === this.selectedTabId());
53
+ });
54
+ this.dropdownFilteredOptions = computed(() => {
55
+ return this.options().filter((option) => option.id !== this.selectedTabId());
56
+ });
57
+ this.displayBadge = (option) => {
58
+ return (!!option.showBadge ||
59
+ (option.badgeCount !== undefined && option.badgeCount > 0 && option.badgeContent === "number") ||
60
+ (option.badgeContent === "icon" && !!option.badgeIcon));
61
+ };
62
+ this.tabItemSelectedIndicatorStyle = computed(() => ({
63
+ left: `${this.shouldDisplayDropdown() ? 0 : this.sliderLeft()}px`,
64
+ top: `${this.sliderTop()}px`,
65
+ width: `${this.sliderWidth() + (this.shouldDisplayDropdown() ? 32 : 0)}px`,
66
+ height: `${this.sliderHeight()}px`,
67
+ }));
68
+ this.onKeydownTabItem = (event) => {
69
+ const isVertical = this.direction() === "vertical";
70
+ const isDownKeyPressed = isVertical && event.key === ARROW_DOWN_KEY;
71
+ const isUpKeyPressed = isVertical && event.key === ARROW_UP_KEY;
72
+ const isRightKeyPressed = !isVertical && event.key === ARROW_RIGHT_KEY;
73
+ const isLeftKeyPressed = !isVertical && event.key === ARROW_LEFT_KEY;
74
+ const isArrowNext = isDownKeyPressed || isRightKeyPressed;
75
+ const isArrowPrev = isUpKeyPressed || isLeftKeyPressed;
76
+ if (isArrowNext || isArrowPrev) {
77
+ event.preventDefault();
78
+ this.focusItem(isArrowNext ? "next" : "previous");
79
+ }
80
+ };
81
+ this.onClickTabItem = (id) => {
82
+ if (id !== this.selectedTabId()) {
83
+ this.change.emit(id);
84
+ if (!this.shouldDisplayDropdown()) {
85
+ const newTab = this.getTabItem(id)?.tabItemRef()?.nativeElement;
86
+ if (newTab) {
87
+ const container = this.containerRef()?.nativeElement;
88
+ if (container) {
89
+ scrollToSelectedTab(newTab, container, this.direction());
90
+ }
91
+ }
92
+ }
93
+ }
94
+ };
95
+ this.getTabItem = (id) => {
96
+ return this.tabItemRefs().find((tab) => tab.option()?.id === id);
97
+ };
98
+ this.focusItem = (direction) => {
99
+ const currentIndex = this.tabItemRefs().findIndex((tab) => tab === this.selectedTabRef());
100
+ const maxIterations = this.tabItemRefs().length;
101
+ let newIndex = this.computeNextItemIndex(currentIndex, maxIterations, direction);
102
+ let counter = 0;
103
+ while (this.tabItemRefs()[newIndex].tabItemRef()?.nativeElement.getAttribute("data-disabled") === "true" &&
104
+ counter < maxIterations) {
105
+ newIndex = this.computeNextItemIndex(newIndex, maxIterations, direction);
106
+ counter++;
107
+ }
108
+ this.tabItemRefs()[newIndex].tabItemRef()?.nativeElement.focus();
109
+ this.tabItemRefs()[newIndex].tabItemRef()?.nativeElement.click();
110
+ };
111
+ this.computeScrollableSignals = () => {
112
+ this.computeIsScrollable();
113
+ this.computeIsOverflowingLeft();
114
+ this.computeIsOverflowingRight();
115
+ this.computeIsOverflowingTop();
116
+ this.computeIsOverflowingBottom();
117
+ };
118
+ }
119
+ isSelected(id) {
120
+ return this.selectedTabId() === id;
121
+ }
122
+ ngAfterViewInit() {
123
+ this.updateSelectedTabItemIndicator();
124
+ this.computeScrollableSignals();
125
+ window.addEventListener("resize", this.updateSelectedTabItemIndicator.bind(this));
126
+ window.addEventListener("resize", this.computeScrollableSignals.bind(this));
127
+ if (this.containerRef()) {
128
+ this.containerRef()?.nativeElement.addEventListener("scroll", this.computeScrollableSignals.bind(this));
129
+ }
130
+ this.hoverIndicatorRefs().forEach((hoverIndicator) => {
131
+ hoverIndicator.nativeElement.style.opacity = "0";
132
+ });
133
+ }
134
+ ngOnDestroy() {
135
+ window.removeEventListener("resize", this.updateSelectedTabItemIndicator.bind(this));
136
+ window.removeEventListener("resize", this.computeScrollableSignals.bind(this));
137
+ if (this.containerRef()) {
138
+ this.containerRef()?.nativeElement.removeEventListener("scroll", this.computeScrollableSignals.bind(this));
139
+ }
140
+ }
141
+ ngOnChanges(changes) {
142
+ if (changes["selectedTabId"]) {
143
+ this.updateSelectedTabItemIndicator();
144
+ }
145
+ }
146
+ scrollBackward() {
147
+ if (this.containerRef()?.nativeElement) {
148
+ const scrollObject = this.direction() === "horizontal" ? { left: -300 } : { top: -300 };
149
+ this.containerRef()?.nativeElement.scrollBy({ ...scrollObject, behavior: "smooth" });
150
+ }
151
+ }
152
+ scrollForward() {
153
+ if (this.containerRef() && this.containerRef()?.nativeElement) {
154
+ const scrollObject = this.direction() === "horizontal" ? { left: 300 } : { top: 300 };
155
+ this.containerRef()?.nativeElement.scrollBy({ ...scrollObject, behavior: "smooth" });
156
+ }
157
+ }
158
+ computeNextItemIndex(currentIndex, totalItems, direction) {
159
+ return direction === "next" ? (currentIndex + 1) % totalItems : (currentIndex - 1 + totalItems) % totalItems;
160
+ }
161
+ computeIndicatorStyle(tabItem) {
162
+ if (this.direction() === "horizontal") {
163
+ return {
164
+ width: tabItem.offsetWidth,
165
+ left: tabItem.offsetLeft,
166
+ top: tabItem.offsetTop + tabItem.offsetHeight,
167
+ };
168
+ }
169
+ else {
170
+ return {
171
+ left: 0,
172
+ top: tabItem.offsetTop,
173
+ height: tabItem.offsetHeight,
174
+ width: 2,
175
+ };
176
+ }
177
+ }
178
+ updateSelectedTabItemIndicator() {
179
+ const idx = this.options().findIndex((opt) => opt.id === this.selectedTabId());
180
+ const tabItem = this.tabItemRefs()[idx];
181
+ if (tabItem?.tabItemRef) {
182
+ if (tabItem.option()?.disabled) {
183
+ return;
184
+ }
185
+ const tabItemRef = tabItem.tabItemRef?.();
186
+ if (tabItemRef && tabItemRef.nativeElement) {
187
+ const tabItemElement = tabItemRef.nativeElement;
188
+ const indicatorStyle = this.computeIndicatorStyle(tabItemElement);
189
+ this.sliderHeight.set(indicatorStyle.height ?? 2);
190
+ this.sliderTop.set(indicatorStyle.top);
191
+ this.sliderWidth.set(indicatorStyle.width ?? 2);
192
+ this.sliderLeft.set(indicatorStyle.left);
193
+ }
194
+ }
195
+ }
196
+ computeIsScrollable() {
197
+ if (this.containerRef()?.nativeElement) {
198
+ const containerNativeElement = this.containerRef()?.nativeElement;
199
+ if (containerNativeElement) {
200
+ this.isScrollable.set(containerNativeElement.offsetWidth < containerNativeElement.scrollWidth ||
201
+ containerNativeElement.offsetHeight < containerNativeElement.scrollHeight);
202
+ }
203
+ }
204
+ return false;
205
+ }
206
+ computeIsOverflowingLeft() {
207
+ const containerNativeElement = this.containerRef()?.nativeElement;
208
+ if (containerNativeElement) {
209
+ const isOverFlowingLeft = containerNativeElement.scrollLeft > 0;
210
+ this.isOverflowingLeft.set(this.isScrollable() && isOverFlowingLeft);
211
+ }
212
+ }
213
+ computeIsOverflowingRight() {
214
+ const containerNativeElement = this.containerRef()?.nativeElement;
215
+ if (containerNativeElement) {
216
+ const isOverflowingRight = containerNativeElement.scrollWidth - containerNativeElement.clientWidth - containerNativeElement.scrollLeft > 0;
217
+ this.isOverflowingRight.set(this.isScrollable() && isOverflowingRight);
218
+ }
219
+ }
220
+ computeIsOverflowingTop() {
221
+ const containerNativeElement = this.containerRef()?.nativeElement;
222
+ if (containerNativeElement) {
223
+ const isOverFlowingTop = containerNativeElement.scrollTop > 0;
224
+ this.isOverflowingTop.set(this.isScrollable() && isOverFlowingTop);
225
+ }
226
+ }
227
+ computeIsOverflowingBottom() {
228
+ const containerNativeElement = this.containerRef()?.nativeElement;
229
+ if (containerNativeElement) {
230
+ const isOverflowingBottom = containerNativeElement.scrollHeight - containerNativeElement.clientHeight - containerNativeElement.scrollTop >
231
+ 0;
232
+ this.isOverflowingBottom.set(this.isScrollable() && isOverflowingBottom);
233
+ }
234
+ }
235
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TabComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
236
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: TabComponent, isStandalone: true, selector: "rte-tab", inputs: { alignment: { classPropertyName: "alignment", publicName: "alignment", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, selectedTabId: { classPropertyName: "selectedTabId", publicName: "selectedTabId", isSignal: true, isRequired: false, transformFunction: null }, compactSpacing: { classPropertyName: "compactSpacing", publicName: "compactSpacing", isSignal: true, isRequired: false, transformFunction: null }, overflowType: { classPropertyName: "overflowType", publicName: "overflowType", isSignal: true, isRequired: false, transformFunction: null }, inverted: { classPropertyName: "inverted", publicName: "inverted", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { change: "change" }, viewQueries: [{ propertyName: "tabItemRefs", predicate: ["tabItem"], descendants: true, isSignal: true }, { propertyName: "containerRef", first: true, predicate: ["tabList"], descendants: true, isSignal: true }, { propertyName: "hoverIndicatorRefs", predicate: ["hoverIndicator"], descendants: true, isSignal: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"rte-tab-container\" [attr.data-direction]=\"direction()\">\n <div class=\"rte-tab-border-vertical\" aria-hidden=\"true\" role=\"presentation\" [attr.data-direction]=\"direction()\"></div>\n <div\n [ngStyle]=\"{\n position: 'relative',\n display: 'flex',\n 'align-items': 'center',\n 'flex-direction': direction() === 'horizontal' ? 'row' : 'column',\n }\"\n >\n <rte-icon-button\n *ngIf=\"isScrollable() && !shouldDisplayDropdown()\"\n aria-label=\"Previous tabs\"\n variant=\"transparent\"\n [name]=\"direction() === 'horizontal' ? 'arrow-chevron-left' : 'arrow-chevron-up'\"\n [ngStyle]=\"{\n opacity: canScrollBackward() ? '1' : '0',\n 'pointer-events': canScrollBackward() ? 'auto' : 'none',\n }\"\n (clickEvent)=\"scrollBackward()\"\n />\n <div\n #tabList\n role=\"tablist\"\n aria-label=\"Sample Tabs\"\n class=\"rte-tab\"\n [attr.data-alignment]=\"shouldDisplayDropdown() ? 'start' : alignment()\"\n [attr.data-direction]=\"direction()\"\n [attr.data-overflow-type]=\"overflowType()\"\n >\n <span class=\"rte-tab-selected-indicator\" [ngStyle]=\"tabItemSelectedIndicatorStyle()\"></span>\n <div\n *ngIf=\"shouldDisplayDropdown() && options().length\"\n rteDropdown\n [rteDropdownOffset]=\"10\"\n (menuEvent)=\"onClickTabItem($event.id)\"\n >\n <button\n rteDropdownTrigger\n class=\"rte-tab-dropdown-button\"\n [attr.data-inverted]=\"inverted()\"\n [attr.data-overflow-type]=\"overflowType()\"\n >\n <rte-icon *ngIf=\"selectedTab()?.icon\" appearance=\"filled\" [name]=\"selectedTab()?.icon!\"></rte-icon>\n <span *ngIf=\"selectedTab()?.label\">{{ selectedTab()?.label }}</span>\n <rte-badge\n *ngIf=\"selectedTab()?.badgeCount && selectedTab()?.badgeContent === 'number'\"\n [badgeType]=\"selectedTab()?.badgeType!\"\n [badgeContent]=\"selectedTab()?.badgeContent!\"\n [count]=\"selectedTab()?.badgeCount\"\n [simpleBadge]=\"true\"\n ></rte-badge>\n <rte-icon name=\"arrow-chevron-down\" appearance=\"outlined\"></rte-icon>\n </button>\n <rte-dropdown-menu [items]=\"dropdownFilteredOptions()\" />\n </div>\n <ng-container *ngFor=\"let option of options(); let idx = index\">\n <rte-tab-item\n #tabItem\n [option]=\"option\"\n [direction]=\"direction()\"\n [compactSpacing]=\"compactSpacing()\"\n [isSelected]=\"isSelected(option.id)\"\n [inverted]=\"inverted()\"\n [attr.data-hidden]=\"shouldDisplayDropdown()\"\n [isHidden]=\"shouldDisplayDropdown()\"\n (keydown)=\"onKeydownTabItem($event)\"\n (click)=\"onClickTabItem(option.id)\"\n ></rte-tab-item>\n </ng-container>\n </div>\n <rte-icon-button\n *ngIf=\"isScrollable() && !shouldDisplayDropdown()\"\n aria-label=\"Next tabs\"\n variant=\"transparent\"\n [name]=\"direction() === 'horizontal' ? 'arrow-chevron-right' : 'arrow-chevron-down'\"\n [ngStyle]=\"{\n opacity: canScrollForward() ? '1' : '0',\n 'pointer-events': canScrollForward() ? 'auto' : 'none',\n }\"\n (clickEvent)=\"scrollForward()\"\n />\n </div>\n <div\n class=\"rte-tab-border-horizontal\"\n aria-hidden=\"true\"\n role=\"presentation\"\n [attr.data-direction]=\"direction()\"\n [attr.data-compact-spacing]=\"compactSpacing()\"\n [attr.data-scrollable]=\"isScrollable() && overflowType() === 'scrollable'\"\n ></div>\n</div>\n", styles: [".rte-tab-container{position:relative;display:flex;flex-direction:column}.rte-tab-container[data-direction=vertical]{flex-direction:row;height:100%}.rte-tab{position:relative;display:flex;height:100%;gap:24px;justify-content:flex-start;padding-bottom:2px;margin-bottom:-2px;margin-left:-2px;scrollbar-width:none;width:100%;padding-top:2px;padding-left:2px;align-items:center}.rte-tab[data-direction=horizontal]{overflow-x:scroll}.rte-tab[data-direction=horizontal][data-overflow-type=dropdown]{overflow:hidden;margin-left:0}.rte-tab[data-direction=vertical]{flex-direction:column;border-bottom:none;gap:4px;height:100%;padding-right:2px;margin-left:-2px;width:max-content;align-items:start;margin-bottom:0}.rte-tab[data-direction=vertical] .rte-tab-selected-indicator{width:2px;transition:top .2s ease,height .2s ease}.rte-tab[data-alignment=center]{justify-content:center}.rte-tab .rte-tab-selected-indicator{position:absolute;bottom:0;height:2px;background:var(--background-brand-selected-default);transition:left .2s ease,width .2s ease;pointer-events:none;z-index:1}.rte-tab .rte-tab-separator{width:24px;flex-shrink:0}.rte-tab-border-horizontal{background-color:var(--background-neutral-regular-default);position:relative;height:2px}.rte-tab-border-horizontal[data-compact-spacing=true][data-scrollable=true]{bottom:5px}.rte-tab-border-horizontal[data-direction=vertical]{display:none}.rte-tab-border-vertical{background-color:var(--background-neutral-regular-default);position:relative;width:2px}.rte-tab-border-vertical[data-direction=horizontal]{display:none}.rte-tab-dropdown-button{font-feature-settings:\"liga\" off,\"clig\" off;font-style:normal;font-family:Arial;font-weight:700;font-size:14px;line-height:20px;letter-spacing:0px;color:var(--content-secondary);width:max-content;display:flex;align-items:center;gap:12px;background-color:transparent;border:none;cursor:pointer;padding:0;margin:12px}.rte-tab-dropdown-button:focus-visible{outline:2px solid var(--border-brand-focused);outline-offset:12px;z-index:1}.rte-tab-dropdown-button[data-inverted=true]{color:var(--content-primary-inverse)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: TabItemComponent, selector: "rte-tab-item", inputs: ["direction", "option", "compactSpacing", "isSelected", "handleKeydown", "inverted", "isHidden"], outputs: ["click"] }, { kind: "component", type: IconButtonComponent, selector: "rte-icon-button", inputs: ["disabled", "name", "size", "variant", "type", "appearance", "compactSpacing", "ariaLabel", "ariaLabelledBy", "badgeCount", "badgeContent", "badgeType", "badgeIcon", "customStyle"], outputs: ["clickEvent"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "directive", type: i2.DropdownDirective, selector: "[rteDropdown]", inputs: ["rteDropdownId", "rteDropdownPosition", "rteDropdownAlignment", "rteDropdownIsOpen", "rteDropdownOffset", "rteDropdownAutofocus", "rteDropdownAutoOpen", "rteDropdownWidth"], outputs: ["menuEvent", "clickedOutside", "closedDropdown"] }, { kind: "directive", type: i3.DropdownTriggerDirective, selector: "[rteDropdownTrigger]", inputs: ["rteDropdownTriggerActivateWithArrowDown"], outputs: ["dropdownKeyDown", "dropdownTriggered", "dropdownTriggerFocus", "dropdownTriggerClearContent", "dropdownTriggerOpenDropdown", "dropdownTriggerCloseDropdown"] }, { kind: "component", type: i4.DropdownMenuComponent, selector: "rte-dropdown-menu", inputs: ["items", "menuId", "isOpen", "width", "headerTemplate", "footerTemplate"], outputs: ["itemEvent", "closingMenu"] }, { kind: "component", type: IconComponent, selector: "rte-icon", inputs: ["name", "size", "color", "classes", "appearance"] }, { kind: "component", type: BadgeComponent, selector: "rte-badge", inputs: ["badgeType", "badgeSize", "badgeContent", "count", "icon", "simpleBadge"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
237
+ }
238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TabComponent, decorators: [{
239
+ type: Component,
240
+ args: [{ selector: "rte-tab", imports: [CommonModule, TabItemComponent, IconButtonComponent, DropdownModule, IconComponent, BadgeComponent], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"rte-tab-container\" [attr.data-direction]=\"direction()\">\n <div class=\"rte-tab-border-vertical\" aria-hidden=\"true\" role=\"presentation\" [attr.data-direction]=\"direction()\"></div>\n <div\n [ngStyle]=\"{\n position: 'relative',\n display: 'flex',\n 'align-items': 'center',\n 'flex-direction': direction() === 'horizontal' ? 'row' : 'column',\n }\"\n >\n <rte-icon-button\n *ngIf=\"isScrollable() && !shouldDisplayDropdown()\"\n aria-label=\"Previous tabs\"\n variant=\"transparent\"\n [name]=\"direction() === 'horizontal' ? 'arrow-chevron-left' : 'arrow-chevron-up'\"\n [ngStyle]=\"{\n opacity: canScrollBackward() ? '1' : '0',\n 'pointer-events': canScrollBackward() ? 'auto' : 'none',\n }\"\n (clickEvent)=\"scrollBackward()\"\n />\n <div\n #tabList\n role=\"tablist\"\n aria-label=\"Sample Tabs\"\n class=\"rte-tab\"\n [attr.data-alignment]=\"shouldDisplayDropdown() ? 'start' : alignment()\"\n [attr.data-direction]=\"direction()\"\n [attr.data-overflow-type]=\"overflowType()\"\n >\n <span class=\"rte-tab-selected-indicator\" [ngStyle]=\"tabItemSelectedIndicatorStyle()\"></span>\n <div\n *ngIf=\"shouldDisplayDropdown() && options().length\"\n rteDropdown\n [rteDropdownOffset]=\"10\"\n (menuEvent)=\"onClickTabItem($event.id)\"\n >\n <button\n rteDropdownTrigger\n class=\"rte-tab-dropdown-button\"\n [attr.data-inverted]=\"inverted()\"\n [attr.data-overflow-type]=\"overflowType()\"\n >\n <rte-icon *ngIf=\"selectedTab()?.icon\" appearance=\"filled\" [name]=\"selectedTab()?.icon!\"></rte-icon>\n <span *ngIf=\"selectedTab()?.label\">{{ selectedTab()?.label }}</span>\n <rte-badge\n *ngIf=\"selectedTab()?.badgeCount && selectedTab()?.badgeContent === 'number'\"\n [badgeType]=\"selectedTab()?.badgeType!\"\n [badgeContent]=\"selectedTab()?.badgeContent!\"\n [count]=\"selectedTab()?.badgeCount\"\n [simpleBadge]=\"true\"\n ></rte-badge>\n <rte-icon name=\"arrow-chevron-down\" appearance=\"outlined\"></rte-icon>\n </button>\n <rte-dropdown-menu [items]=\"dropdownFilteredOptions()\" />\n </div>\n <ng-container *ngFor=\"let option of options(); let idx = index\">\n <rte-tab-item\n #tabItem\n [option]=\"option\"\n [direction]=\"direction()\"\n [compactSpacing]=\"compactSpacing()\"\n [isSelected]=\"isSelected(option.id)\"\n [inverted]=\"inverted()\"\n [attr.data-hidden]=\"shouldDisplayDropdown()\"\n [isHidden]=\"shouldDisplayDropdown()\"\n (keydown)=\"onKeydownTabItem($event)\"\n (click)=\"onClickTabItem(option.id)\"\n ></rte-tab-item>\n </ng-container>\n </div>\n <rte-icon-button\n *ngIf=\"isScrollable() && !shouldDisplayDropdown()\"\n aria-label=\"Next tabs\"\n variant=\"transparent\"\n [name]=\"direction() === 'horizontal' ? 'arrow-chevron-right' : 'arrow-chevron-down'\"\n [ngStyle]=\"{\n opacity: canScrollForward() ? '1' : '0',\n 'pointer-events': canScrollForward() ? 'auto' : 'none',\n }\"\n (clickEvent)=\"scrollForward()\"\n />\n </div>\n <div\n class=\"rte-tab-border-horizontal\"\n aria-hidden=\"true\"\n role=\"presentation\"\n [attr.data-direction]=\"direction()\"\n [attr.data-compact-spacing]=\"compactSpacing()\"\n [attr.data-scrollable]=\"isScrollable() && overflowType() === 'scrollable'\"\n ></div>\n</div>\n", styles: [".rte-tab-container{position:relative;display:flex;flex-direction:column}.rte-tab-container[data-direction=vertical]{flex-direction:row;height:100%}.rte-tab{position:relative;display:flex;height:100%;gap:24px;justify-content:flex-start;padding-bottom:2px;margin-bottom:-2px;margin-left:-2px;scrollbar-width:none;width:100%;padding-top:2px;padding-left:2px;align-items:center}.rte-tab[data-direction=horizontal]{overflow-x:scroll}.rte-tab[data-direction=horizontal][data-overflow-type=dropdown]{overflow:hidden;margin-left:0}.rte-tab[data-direction=vertical]{flex-direction:column;border-bottom:none;gap:4px;height:100%;padding-right:2px;margin-left:-2px;width:max-content;align-items:start;margin-bottom:0}.rte-tab[data-direction=vertical] .rte-tab-selected-indicator{width:2px;transition:top .2s ease,height .2s ease}.rte-tab[data-alignment=center]{justify-content:center}.rte-tab .rte-tab-selected-indicator{position:absolute;bottom:0;height:2px;background:var(--background-brand-selected-default);transition:left .2s ease,width .2s ease;pointer-events:none;z-index:1}.rte-tab .rte-tab-separator{width:24px;flex-shrink:0}.rte-tab-border-horizontal{background-color:var(--background-neutral-regular-default);position:relative;height:2px}.rte-tab-border-horizontal[data-compact-spacing=true][data-scrollable=true]{bottom:5px}.rte-tab-border-horizontal[data-direction=vertical]{display:none}.rte-tab-border-vertical{background-color:var(--background-neutral-regular-default);position:relative;width:2px}.rte-tab-border-vertical[data-direction=horizontal]{display:none}.rte-tab-dropdown-button{font-feature-settings:\"liga\" off,\"clig\" off;font-style:normal;font-family:Arial;font-weight:700;font-size:14px;line-height:20px;letter-spacing:0px;color:var(--content-secondary);width:max-content;display:flex;align-items:center;gap:12px;background-color:transparent;border:none;cursor:pointer;padding:0;margin:12px}.rte-tab-dropdown-button:focus-visible{outline:2px solid var(--border-brand-focused);outline-offset:12px;z-index:1}.rte-tab-dropdown-button[data-inverted=true]{color:var(--content-primary-inverse)}\n"] }]
241
+ }] });
242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RzLXJ0ZS1saWIvc3JjL2xpYi9jb21wb25lbnRzL3RhYi90YWIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHMtcnRlLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvdGFiL3RhYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sWUFBWSxFQUdaLE1BQU0sRUFHTixTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDdkYsT0FBTyxFQUNMLGNBQWMsRUFDZCxjQUFjLEVBQ2QsZUFBZSxFQUNmLFlBQVksR0FDYixNQUFNLCtEQUErRCxDQUFDO0FBRXZFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUUzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7O0FBVWpFLE1BQU0sT0FBTyxZQUFZO0lBUnpCO1FBU1csY0FBUyxHQUFHLEtBQUssQ0FBZSxPQUFPLENBQUMsQ0FBQztRQUN6QyxjQUFTLEdBQUcsS0FBSyxDQUFZLFlBQVksQ0FBQyxDQUFDO1FBQzNDLFlBQU8sR0FBRyxLQUFLLENBQXNCLEVBQUUsQ0FBQyxDQUFDO1FB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QkFBc0IsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLGdCQUFnQixDQUFDLENBQUM7UUFDckUsQ0FBQztJQUNILENBQUM7SUFDTywwQkFBMEI7UUFDaEMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsYUFBYSxDQUFDO1FBQ2xFLElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUMzQixNQUFNLG1CQUFtQixHQUN2QixzQkFBc0IsQ0FBQyxZQUFZLEdBQUcsc0JBQXNCLENBQUMsWUFBWSxHQUFHLHNCQUFzQixDQUFDLFNBQVM7Z0JBQzVHLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLG1CQUFtQixDQUFDLENBQUM7UUFDM0UsQ0FBQztJQUNILENBQUM7K0dBMVFVLFlBQVk7bUdBQVosWUFBWSx5M0NDMUN6Qix1bkhBNEZBLHNuRUR4RFksWUFBWSxxVkFBRSxnQkFBZ0IsdUxBQUUsbUJBQW1CLG1SQUFFLGNBQWMsMjJCQUFFLGFBQWEsaUhBQUUsY0FBYzs7NEZBTWpHLFlBQVk7a0JBUnhCLFNBQVM7K0JBQ0UsU0FBUyxXQUNWLENBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLGNBQ2pHLElBQUksbUJBR0MsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGlucHV0LFxuICBjb21wdXRlZCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIG91dHB1dCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT25DaGFuZ2VzLFxuICB2aWV3Q2hpbGQsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERpcmVjdGlvbiB9IGZyb20gXCJAZGVzaWduLXN5c3RlbS1ydGUvY29yZS9jb21wb25lbnRzL2NvbW1vbi9jb21tb24tdHlwZXNcIjtcbmltcG9ydCB7IFRhYkFsaWdubWVudCwgVGFiSXRlbVByb3BzLCBUYWJQcm9wcyB9IGZyb20gXCJAZGVzaWduLXN5c3RlbS1ydGUvY29yZS9jb21wb25lbnRzL3RhYi90YWIuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBzY3JvbGxUb1NlbGVjdGVkVGFiIH0gZnJvbSBcIkBkZXNpZ24tc3lzdGVtLXJ0ZS9jb3JlL2NvbXBvbmVudHMvdGFiL3RhYi51dGlsc1wiO1xuaW1wb3J0IHtcbiAgQVJST1dfRE9XTl9LRVksXG4gIEFSUk9XX0xFRlRfS0VZLFxuICBBUlJPV19SSUdIVF9LRVksXG4gIEFSUk9XX1VQX0tFWSxcbn0gZnJvbSBcIkBkZXNpZ24tc3lzdGVtLXJ0ZS9jb3JlL2NvbnN0YW50cy9rZXlib2FyZC9rZXlib2FyZC5jb25zdGFudHNcIjtcblxuaW1wb3J0IHsgQmFkZ2VDb21wb25lbnQgfSBmcm9tIFwiLi4vYmFkZ2UvYmFkZ2UuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gXCIuLi9kcm9wZG93blwiO1xuaW1wb3J0IHsgRHJvcGRvd25JdGVtQ29uZmlnIH0gZnJvbSBcIi4uL2Ryb3Bkb3duL2Ryb3Bkb3duLWl0ZW0vZHJvcGRvd24taXRlbS5jb21wb25lbnRcIjtcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tIFwiLi4vaWNvbi9pY29uLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSWNvbkJ1dHRvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9pY29uLWJ1dHRvbi9pY29uLWJ1dHRvbi5jb21wb25lbnRcIjtcblxuaW1wb3J0IHsgVGFiSXRlbUNvbXBvbmVudCB9IGZyb20gXCIuL3RhYi1pdGVtL3RhYi1pdGVtLmNvbXBvbmVudFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwicnRlLXRhYlwiLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBUYWJJdGVtQ29tcG9uZW50LCBJY29uQnV0dG9uQ29tcG9uZW50LCBEcm9wZG93bk1vZHVsZSwgSWNvbkNvbXBvbmVudCwgQmFkZ2VDb21wb25lbnRdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogXCIuL3RhYi5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybDogXCIuL3RhYi5jb21wb25lbnQuc2Nzc1wiLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGFiQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICByZWFkb25seSBhbGlnbm1lbnQgPSBpbnB1dDxUYWJBbGlnbm1lbnQ+KFwic3RhcnRcIik7XG4gIHJlYWRvbmx5IGRpcmVjdGlvbiA9IGlucHV0PERpcmVjdGlvbj4oXCJob3Jpem9udGFsXCIpO1xuICByZWFkb25seSBvcHRpb25zID0gaW5wdXQ8VGFiUHJvcHNbXCJvcHRpb25zXCJdPihbXSk7XG4gIHJlYWRvbmx5IHNlbGVjdGVkVGFiSWQgPSBpbnB1dDxUYWJQcm9wc1tcInNlbGVjdGVkVGFiSWRcIl0+KCk7XG4gIHJlYWRvbmx5IGNvbXBhY3RTcGFjaW5nID0gaW5wdXQ8VGFiUHJvcHNbXCJjb21wYWN0U3BhY2luZ1wiXT4oZmFsc2UpO1xuICByZWFkb25seSBvdmVyZmxvd1R5cGUgPSBpbnB1dDxUYWJQcm9wc1tcIm92ZXJmbG93VHlwZVwiXT4oXCJzY3JvbGxhYmxlXCIpO1xuICByZWFkb25seSBpbnZlcnRlZCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSBzbGlkZXJMZWZ0ID0gc2lnbmFsKDApO1xuICByZWFkb25seSBzbGlkZXJXaWR0aCA9IHNpZ25hbCgwKTtcbiAgcmVhZG9ubHkgc2xpZGVyVG9wID0gc2lnbmFsKDApO1xuICByZWFkb25seSBzbGlkZXJIZWlnaHQgPSBzaWduYWwoMCk7XG5cbiAgcmVhZG9ubHkgdGFiSXRlbVJlZnMgPSB2aWV3Q2hpbGRyZW48VGFiSXRlbUNvbXBvbmVudD4oXCJ0YWJJdGVtXCIpO1xuICByZWFkb25seSBjb250YWluZXJSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KFwidGFiTGlzdFwiKTtcbiAgcmVhZG9ubHkgaG92ZXJJbmRpY2F0b3JSZWZzID0gdmlld0NoaWxkcmVuPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PihcImhvdmVySW5kaWNhdG9yXCIpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkVGFiUmVmID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMub3B0aW9ucygpLmZpbmRJbmRleCgob3B0KSA9PiBvcHQuaWQgPT09IHRoaXMuc2VsZWN0ZWRUYWJJZCgpKTtcbiAgICBjb25zdCB0YWJJdGVtID0gdGhpcy50YWJJdGVtUmVmcygpW2lkeF07XG4gICAgcmV0dXJuIHRhYkl0ZW07XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhvdmVySW5kaWNhdG9yU3R5bGUgPSBzaWduYWw8e1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIGxlZnQ/OiBudW1iZXI7XG4gICAgdG9wPzogbnVtYmVyO1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICBvcGFjaXR5PzogbnVtYmVyO1xuICB9IHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgY2hhbmdlID0gb3V0cHV0PHN0cmluZz4oKTtcblxuICByZWFkb25seSBpc1Njcm9sbGFibGUgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzT3ZlcmZsb3dpbmdMZWZ0ID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc092ZXJmbG93aW5nUmlnaHQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzT3ZlcmZsb3dpbmdUb3AgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzT3ZlcmZsb3dpbmdCb3R0b20gPSBzaWduYWwoZmFsc2UpO1xuXG4gIHJlYWRvbmx5IGNhblNjcm9sbEJhY2t3YXJkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmlzT3ZlcmZsb3dpbmdMZWZ0KCkgfHwgdGhpcy5pc092ZXJmbG93aW5nVG9wKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGNhblNjcm9sbEZvcndhcmQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuaXNPdmVyZmxvd2luZ1JpZ2h0KCkgfHwgdGhpcy5pc092ZXJmbG93aW5nQm90dG9tKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGlzSG9yaXpvbnRhbCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuZGlyZWN0aW9uKCkgPT09IFwiaG9yaXpvbnRhbFwiICYmICh0aGlzLmlzT3ZlcmZsb3dpbmdSaWdodCgpIHx8IHRoaXMuaXNPdmVyZmxvd2luZ0xlZnQoKSksXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvdWxkRGlzcGxheURyb3Bkb3duID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vdmVyZmxvd1R5cGUoKSA9PT0gXCJkcm9wZG93blwiICYmIHRoaXMuaXNIb3Jpem9udGFsKCkpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkVGFiID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMoKS5maW5kKChvcHRpb24pID0+IG9wdGlvbi5pZCA9PT0gdGhpcy5zZWxlY3RlZFRhYklkKCkpO1xuICB9KTtcbiAgcmVhZG9ubHkgZHJvcGRvd25GaWx0ZXJlZE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uaWQgIT09IHRoaXMuc2VsZWN0ZWRUYWJJZCgpKSBhcyBEcm9wZG93bkl0ZW1Db25maWdbXTtcbiAgfSk7XG5cbiAgZGlzcGxheUJhZGdlID0gKG9wdGlvbjogVGFiSXRlbVByb3BzKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhb3B0aW9uLnNob3dCYWRnZSB8fFxuICAgICAgKG9wdGlvbi5iYWRnZUNvdW50ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9uLmJhZGdlQ291bnQgPiAwICYmIG9wdGlvbi5iYWRnZUNvbnRlbnQgPT09IFwibnVtYmVyXCIpIHx8XG4gICAgICAob3B0aW9uLmJhZGdlQ29udGVudCA9PT0gXCJpY29uXCIgJiYgISFvcHRpb24uYmFkZ2VJY29uKVxuICAgICk7XG4gIH07XG5cbiAgaXNTZWxlY3RlZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWJJZCgpID09PSBpZDtcbiAgfVxuXG4gIHJlYWRvbmx5IHRhYkl0ZW1TZWxlY3RlZEluZGljYXRvclN0eWxlID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICBsZWZ0OiBgJHt0aGlzLnNob3VsZERpc3BsYXlEcm9wZG93bigpID8gMCA6IHRoaXMuc2xpZGVyTGVmdCgpfXB4YCxcbiAgICB0b3A6IGAke3RoaXMuc2xpZGVyVG9wKCl9cHhgLFxuICAgIHdpZHRoOiBgJHt0aGlzLnNsaWRlcldpZHRoKCkgKyAodGhpcy5zaG91bGREaXNwbGF5RHJvcGRvd24oKSA/IDMyIDogMCl9cHhgLFxuICAgIGhlaWdodDogYCR7dGhpcy5zbGlkZXJIZWlnaHQoKX1weGAsXG4gIH0pKTtcblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZFRhYkl0ZW1JbmRpY2F0b3IoKTtcbiAgICB0aGlzLmNvbXB1dGVTY3JvbGxhYmxlU2lnbmFscygpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMudXBkYXRlU2VsZWN0ZWRUYWJJdGVtSW5kaWNhdG9yLmJpbmQodGhpcykpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMuY29tcHV0ZVNjcm9sbGFibGVTaWduYWxzLmJpbmQodGhpcykpO1xuICAgIGlmICh0aGlzLmNvbnRhaW5lclJlZigpKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lclJlZigpPy5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5jb21wdXRlU2Nyb2xsYWJsZVNpZ25hbHMuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIHRoaXMuaG92ZXJJbmRpY2F0b3JSZWZzKCkuZm9yRWFjaCgoaG92ZXJJbmRpY2F0b3IpID0+IHtcbiAgICAgIGhvdmVySW5kaWNhdG9yLm5hdGl2ZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IFwiMFwiO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy51cGRhdGVTZWxlY3RlZFRhYkl0ZW1JbmRpY2F0b3IuYmluZCh0aGlzKSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5jb21wdXRlU2Nyb2xsYWJsZVNpZ25hbHMuYmluZCh0aGlzKSk7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyUmVmKCkpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyUmVmKCk/Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLmNvbXB1dGVTY3JvbGxhYmxlU2lnbmFscy5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbXCJzZWxlY3RlZFRhYklkXCJdKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkVGFiSXRlbUluZGljYXRvcigpO1xuICAgIH1cbiAgfVxuXG4gIG9uS2V5ZG93blRhYkl0ZW0gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5kaXJlY3Rpb24oKSA9PT0gXCJ2ZXJ0aWNhbFwiO1xuXG4gICAgY29uc3QgaXNEb3duS2V5UHJlc3NlZCA9IGlzVmVydGljYWwgJiYgZXZlbnQua2V5ID09PSBBUlJPV19ET1dOX0tFWTtcbiAgICBjb25zdCBpc1VwS2V5UHJlc3NlZCA9IGlzVmVydGljYWwgJiYgZXZlbnQua2V5ID09PSBBUlJPV19VUF9LRVk7XG4gICAgY29uc3QgaXNSaWdodEtleVByZXNzZWQgPSAhaXNWZXJ0aWNhbCAmJiBldmVudC5rZXkgPT09IEFSUk9XX1JJR0hUX0tFWTtcbiAgICBjb25zdCBpc0xlZnRLZXlQcmVzc2VkID0gIWlzVmVydGljYWwgJiYgZXZlbnQua2V5ID09PSBBUlJPV19MRUZUX0tFWTtcblxuICAgIGNvbnN0IGlzQXJyb3dOZXh0ID0gaXNEb3duS2V5UHJlc3NlZCB8fCBpc1JpZ2h0S2V5UHJlc3NlZDtcbiAgICBjb25zdCBpc0Fycm93UHJldiA9IGlzVXBLZXlQcmVzc2VkIHx8IGlzTGVmdEtleVByZXNzZWQ7XG5cbiAgICBpZiAoaXNBcnJvd05leHQgfHwgaXNBcnJvd1ByZXYpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmZvY3VzSXRlbShpc0Fycm93TmV4dCA/IFwibmV4dFwiIDogXCJwcmV2aW91c1wiKTtcbiAgICB9XG4gIH07XG5cbiAgb25DbGlja1RhYkl0ZW0gPSAoaWQ6IHN0cmluZykgPT4ge1xuICAgIGlmIChpZCAhPT0gdGhpcy5zZWxlY3RlZFRhYklkKCkpIHtcbiAgICAgIHRoaXMuY2hhbmdlLmVtaXQoaWQpO1xuICAgICAgaWYgKCF0aGlzLnNob3VsZERpc3BsYXlEcm9wZG93bigpKSB7XG4gICAgICAgIGNvbnN0IG5ld1RhYiA9IHRoaXMuZ2V0VGFiSXRlbShpZCk/LnRhYkl0ZW1SZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKG5ld1RhYikge1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyUmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICAgICAgc2Nyb2xsVG9TZWxlY3RlZFRhYihuZXdUYWIsIGNvbnRhaW5lciwgdGhpcy5kaXJlY3Rpb24oKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHNjcm9sbEJhY2t3YXJkKCkge1xuICAgIGlmICh0aGlzLmNvbnRhaW5lclJlZigpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBjb25zdCBzY3JvbGxPYmplY3QgPSB0aGlzLmRpcmVjdGlvbigpID09PSBcImhvcml6b250YWxcIiA/IHsgbGVmdDogLTMwMCB9IDogeyB0b3A6IC0zMDAgfTtcbiAgICAgIHRoaXMuY29udGFpbmVyUmVmKCk/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsQnkoeyAuLi5zY3JvbGxPYmplY3QsIGJlaGF2aW9yOiBcInNtb290aFwiIH0pO1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbEZvcndhcmQoKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyUmVmKCkgJiYgdGhpcy5jb250YWluZXJSZWYoKT8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgY29uc3Qgc2Nyb2xsT2JqZWN0ID0gdGhpcy5kaXJlY3Rpb24oKSA9PT0gXCJob3Jpem9udGFsXCIgPyB7IGxlZnQ6IDMwMCB9IDogeyB0b3A6IDMwMCB9O1xuICAgICAgdGhpcy5jb250YWluZXJSZWYoKT8ubmF0aXZlRWxlbWVudC5zY3JvbGxCeSh7IC4uLnNjcm9sbE9iamVjdCwgYmVoYXZpb3I6IFwic21vb3RoXCIgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYWJJdGVtID0gKGlkOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gdGhpcy50YWJJdGVtUmVmcygpLmZpbmQoKHRhYikgPT4gdGFiLm9wdGlvbigpPy5pZCA9PT0gaWQpO1xuICB9O1xuXG4gIHByaXZhdGUgZm9jdXNJdGVtID0gKGRpcmVjdGlvbjogXCJuZXh0XCIgfCBcInByZXZpb3VzXCIpID0+IHtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLnRhYkl0ZW1SZWZzKCkuZmluZEluZGV4KCh0YWIpID0+IHRhYiA9PT0gdGhpcy5zZWxlY3RlZFRhYlJlZigpKTtcbiAgICBjb25zdCBtYXhJdGVyYXRpb25zID0gdGhpcy50YWJJdGVtUmVmcygpLmxlbmd0aDtcbiAgICBsZXQgbmV3SW5kZXggPSB0aGlzLmNvbXB1dGVOZXh0SXRlbUluZGV4KGN1cnJlbnRJbmRleCwgbWF4SXRlcmF0aW9ucywgZGlyZWN0aW9uKTtcbiAgICBsZXQgY291bnRlciA9IDA7XG4gICAgd2hpbGUgKFxuICAgICAgdGhpcy50YWJJdGVtUmVmcygpW25ld0luZGV4XS50YWJJdGVtUmVmKCk/Lm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1kaXNhYmxlZFwiKSA9PT0gXCJ0cnVlXCIgJiZcbiAgICAgIGNvdW50ZXIgPCBtYXhJdGVyYXRpb25zXG4gICAgKSB7XG4gICAgICBuZXdJbmRleCA9IHRoaXMuY29tcHV0ZU5leHRJdGVtSW5kZXgobmV3SW5kZXgsIG1heEl0ZXJhdGlvbnMsIGRpcmVjdGlvbik7XG4gICAgICBjb3VudGVyKys7XG4gICAgfVxuICAgIHRoaXMudGFiSXRlbVJlZnMoKVtuZXdJbmRleF0udGFiSXRlbVJlZigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy50YWJJdGVtUmVmcygpW25ld0luZGV4XS50YWJJdGVtUmVmKCk/Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgfTtcblxuICBwcml2YXRlIGNvbXB1dGVOZXh0SXRlbUluZGV4KGN1cnJlbnRJbmRleDogbnVtYmVyLCB0b3RhbEl0ZW1zOiBudW1iZXIsIGRpcmVjdGlvbjogXCJuZXh0XCIgfCBcInByZXZpb3VzXCIpIHtcbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSBcIm5leHRcIiA/IChjdXJyZW50SW5kZXggKyAxKSAlIHRvdGFsSXRlbXMgOiAoY3VycmVudEluZGV4IC0gMSArIHRvdGFsSXRlbXMpICUgdG90YWxJdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUluZGljYXRvclN0eWxlKHRhYkl0ZW06IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuZGlyZWN0aW9uKCkgPT09IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogdGFiSXRlbS5vZmZzZXRXaWR0aCxcbiAgICAgICAgbGVmdDogdGFiSXRlbS5vZmZzZXRMZWZ0LFxuICAgICAgICB0b3A6IHRhYkl0ZW0ub2Zmc2V0VG9wICsgdGFiSXRlbS5vZmZzZXRIZWlnaHQsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB0b3A6IHRhYkl0ZW0ub2Zmc2V0VG9wLFxuICAgICAgICBoZWlnaHQ6IHRhYkl0ZW0ub2Zmc2V0SGVpZ2h0LFxuICAgICAgICB3aWR0aDogMixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3RlZFRhYkl0ZW1JbmRpY2F0b3IoKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5vcHRpb25zKCkuZmluZEluZGV4KChvcHQpID0+IG9wdC5pZCA9PT0gdGhpcy5zZWxlY3RlZFRhYklkKCkpO1xuICAgIGNvbnN0IHRhYkl0ZW0gPSB0aGlzLnRhYkl0ZW1SZWZzKClbaWR4XTtcbiAgICBpZiAodGFiSXRlbT8udGFiSXRlbVJlZikge1xuICAgICAgaWYgKHRhYkl0ZW0ub3B0aW9uKCk/LmRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhYkl0ZW1SZWYgPSB0YWJJdGVtLnRhYkl0ZW1SZWY/LigpO1xuICAgICAgaWYgKHRhYkl0ZW1SZWYgJiYgdGFiSXRlbVJlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHRhYkl0ZW1FbGVtZW50ID0gdGFiSXRlbVJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBpbmRpY2F0b3JTdHlsZSA9IHRoaXMuY29tcHV0ZUluZGljYXRvclN0eWxlKHRhYkl0ZW1FbGVtZW50KTtcbiAgICAgICAgdGhpcy5zbGlkZXJIZWlnaHQuc2V0KGluZGljYXRvclN0eWxlLmhlaWdodCA/PyAyKTtcbiAgICAgICAgdGhpcy5zbGlkZXJUb3Auc2V0KGluZGljYXRvclN0eWxlLnRvcCk7XG4gICAgICAgIHRoaXMuc2xpZGVyV2lkdGguc2V0KGluZGljYXRvclN0eWxlLndpZHRoID8/IDIpO1xuICAgICAgICB0aGlzLnNsaWRlckxlZnQuc2V0KGluZGljYXRvclN0eWxlLmxlZnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZVNjcm9sbGFibGVTaWduYWxzID0gKCkgPT4ge1xuICAgIHRoaXMuY29tcHV0ZUlzU2Nyb2xsYWJsZSgpO1xuICAgIHRoaXMuY29tcHV0ZUlzT3ZlcmZsb3dpbmdMZWZ0KCk7XG4gICAgdGhpcy5jb21wdXRlSXNPdmVyZmxvd2luZ1JpZ2h0KCk7XG4gICAgdGhpcy5jb21wdXRlSXNPdmVyZmxvd2luZ1RvcCgpO1xuICAgIHRoaXMuY29tcHV0ZUlzT3ZlcmZsb3dpbmdCb3R0b20oKTtcbiAgfTtcblxuICBwcml2YXRlIGNvbXB1dGVJc1Njcm9sbGFibGUoKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyUmVmKCk/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lck5hdGl2ZUVsZW1lbnQgPSB0aGlzLmNvbnRhaW5lclJlZigpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKGNvbnRhaW5lck5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5pc1Njcm9sbGFibGUuc2V0KFxuICAgICAgICAgIGNvbnRhaW5lck5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggPCBjb250YWluZXJOYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoIHx8XG4gICAgICAgICAgICBjb250YWluZXJOYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA8IGNvbnRhaW5lck5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVJc092ZXJmbG93aW5nTGVmdCgpIHtcbiAgICBjb25zdCBjb250YWluZXJOYXRpdmVFbGVtZW50ID0gdGhpcy5jb250YWluZXJSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoY29udGFpbmVyTmF0aXZlRWxlbWVudCkge1xuICAgICAgY29uc3QgaXNPdmVyRmxvd2luZ0xlZnQgPSBjb250YWluZXJOYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPiAwO1xuICAgICAgdGhpcy5pc092ZXJmbG93aW5nTGVmdC5zZXQodGhpcy5pc1Njcm9sbGFibGUoKSAmJiBpc092ZXJGbG93aW5nTGVmdCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlSXNPdmVyZmxvd2luZ1JpZ2h0KCkge1xuICAgIGNvbnN0IGNvbnRhaW5lck5hdGl2ZUVsZW1lbnQgPSB0aGlzLmNvbnRhaW5lclJlZigpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChjb250YWluZXJOYXRpdmVFbGVtZW50KSB7XG4gICAgICBjb25zdCBpc092ZXJmbG93aW5nUmlnaHQgPVxuICAgICAgICBjb250YWluZXJOYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoIC0gY29udGFpbmVyTmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCAtIGNvbnRhaW5lck5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA+IDA7XG4gICAgICB0aGlzLmlzT3ZlcmZsb3dpbmdSaWdodC5zZXQodGhpcy5pc1Njcm9sbGFibGUoKSAmJiBpc092ZXJmbG93aW5nUmlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUlzT3ZlcmZsb3dpbmdUb3AoKSB7XG4gICAgY29uc3QgY29udGFpbmVyTmF0aXZlRWxlbWVudCA9IHRoaXMuY29udGFpbmVyUmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNvbnRhaW5lck5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGlzT3ZlckZsb3dpbmdUb3AgPSBjb250YWluZXJOYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA+IDA7XG4gICAgICB0aGlzLmlzT3ZlcmZsb3dpbmdUb3Auc2V0KHRoaXMuaXNTY3JvbGxhYmxlKCkgJiYgaXNPdmVyRmxvd2luZ1RvcCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY29tcHV0ZUlzT3ZlcmZsb3dpbmdCb3R0b20oKSB7XG4gICAgY29uc3QgY29udGFpbmVyTmF0aXZlRWxlbWVudCA9IHRoaXMuY29udGFpbmVyUmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNvbnRhaW5lck5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGlzT3ZlcmZsb3dpbmdCb3R0b20gPVxuICAgICAgICBjb250YWluZXJOYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCAtIGNvbnRhaW5lck5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0IC0gY29udGFpbmVyTmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPlxuICAgICAgICAwO1xuICAgICAgdGhpcy5pc092ZXJmbG93aW5nQm90dG9tLnNldCh0aGlzLmlzU2Nyb2xsYWJsZSgpICYmIGlzT3ZlcmZsb3dpbmdCb3R0b20pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInJ0ZS10YWItY29udGFpbmVyXCIgW2F0dHIuZGF0YS1kaXJlY3Rpb25dPVwiZGlyZWN0aW9uKClcIj5cbiAgPGRpdiBjbGFzcz1cInJ0ZS10YWItYm9yZGVyLXZlcnRpY2FsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgcm9sZT1cInByZXNlbnRhdGlvblwiIFthdHRyLmRhdGEtZGlyZWN0aW9uXT1cImRpcmVjdGlvbigpXCI+PC9kaXY+XG4gIDxkaXZcbiAgICBbbmdTdHlsZV09XCJ7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICdhbGlnbi1pdGVtcyc6ICdjZW50ZXInLFxuICAgICAgJ2ZsZXgtZGlyZWN0aW9uJzogZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyA/ICdyb3cnIDogJ2NvbHVtbicsXG4gICAgfVwiXG4gID5cbiAgICA8cnRlLWljb24tYnV0dG9uXG4gICAgICAqbmdJZj1cImlzU2Nyb2xsYWJsZSgpICYmICFzaG91bGREaXNwbGF5RHJvcGRvd24oKVwiXG4gICAgICBhcmlhLWxhYmVsPVwiUHJldmlvdXMgdGFic1wiXG4gICAgICB2YXJpYW50PVwidHJhbnNwYXJlbnRcIlxuICAgICAgW25hbWVdPVwiZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyA/ICdhcnJvdy1jaGV2cm9uLWxlZnQnIDogJ2Fycm93LWNoZXZyb24tdXAnXCJcbiAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgb3BhY2l0eTogY2FuU2Nyb2xsQmFja3dhcmQoKSA/ICcxJyA6ICcwJyxcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzJzogY2FuU2Nyb2xsQmFja3dhcmQoKSA/ICdhdXRvJyA6ICdub25lJyxcbiAgICAgIH1cIlxuICAgICAgKGNsaWNrRXZlbnQpPVwic2Nyb2xsQmFja3dhcmQoKVwiXG4gICAgLz5cbiAgICA8ZGl2XG4gICAgICAjdGFiTGlzdFxuICAgICAgcm9sZT1cInRhYmxpc3RcIlxuICAgICAgYXJpYS1sYWJlbD1cIlNhbXBsZSBUYWJzXCJcbiAgICAgIGNsYXNzPVwicnRlLXRhYlwiXG4gICAgICBbYXR0ci5kYXRhLWFsaWdubWVudF09XCJzaG91bGREaXNwbGF5RHJvcGRvd24oKSA/ICdzdGFydCcgOiBhbGlnbm1lbnQoKVwiXG4gICAgICBbYXR0ci5kYXRhLWRpcmVjdGlvbl09XCJkaXJlY3Rpb24oKVwiXG4gICAgICBbYXR0ci5kYXRhLW92ZXJmbG93LXR5cGVdPVwib3ZlcmZsb3dUeXBlKClcIlxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwicnRlLXRhYi1zZWxlY3RlZC1pbmRpY2F0b3JcIiBbbmdTdHlsZV09XCJ0YWJJdGVtU2VsZWN0ZWRJbmRpY2F0b3JTdHlsZSgpXCI+PC9zcGFuPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cInNob3VsZERpc3BsYXlEcm9wZG93bigpICYmIG9wdGlvbnMoKS5sZW5ndGhcIlxuICAgICAgICBydGVEcm9wZG93blxuICAgICAgICBbcnRlRHJvcGRvd25PZmZzZXRdPVwiMTBcIlxuICAgICAgICAobWVudUV2ZW50KT1cIm9uQ2xpY2tUYWJJdGVtKCRldmVudC5pZClcIlxuICAgICAgPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgcnRlRHJvcGRvd25UcmlnZ2VyXG4gICAgICAgICAgY2xhc3M9XCJydGUtdGFiLWRyb3Bkb3duLWJ1dHRvblwiXG4gICAgICAgICAgW2F0dHIuZGF0YS1pbnZlcnRlZF09XCJpbnZlcnRlZCgpXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLW92ZXJmbG93LXR5cGVdPVwib3ZlcmZsb3dUeXBlKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHJ0ZS1pY29uICpuZ0lmPVwic2VsZWN0ZWRUYWIoKT8uaWNvblwiIGFwcGVhcmFuY2U9XCJmaWxsZWRcIiBbbmFtZV09XCJzZWxlY3RlZFRhYigpPy5pY29uIVwiPjwvcnRlLWljb24+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RlZFRhYigpPy5sYWJlbFwiPnt7IHNlbGVjdGVkVGFiKCk/LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgIDxydGUtYmFkZ2VcbiAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRUYWIoKT8uYmFkZ2VDb3VudCAmJiBzZWxlY3RlZFRhYigpPy5iYWRnZUNvbnRlbnQgPT09ICdudW1iZXInXCJcbiAgICAgICAgICAgIFtiYWRnZVR5cGVdPVwic2VsZWN0ZWRUYWIoKT8uYmFkZ2VUeXBlIVwiXG4gICAgICAgICAgICBbYmFkZ2VDb250ZW50XT1cInNlbGVjdGVkVGFiKCk/LmJhZGdlQ29udGVudCFcIlxuICAgICAgICAgICAgW2NvdW50XT1cInNlbGVjdGVkVGFiKCk/LmJhZGdlQ291bnRcIlxuICAgICAgICAgICAgW3NpbXBsZUJhZGdlXT1cInRydWVcIlxuICAgICAgICAgID48L3J0ZS1iYWRnZT5cbiAgICAgICAgICA8cnRlLWljb24gbmFtZT1cImFycm93LWNoZXZyb24tZG93blwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lZFwiPjwvcnRlLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8cnRlLWRyb3Bkb3duLW1lbnUgW2l0ZW1zXT1cImRyb3Bkb3duRmlsdGVyZWRPcHRpb25zKClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9ucygpOyBsZXQgaWR4ID0gaW5kZXhcIj5cbiAgICAgICAgPHJ0ZS10YWItaXRlbVxuICAgICAgICAgICN0YWJJdGVtXG4gICAgICAgICAgW29wdGlvbl09XCJvcHRpb25cIlxuICAgICAgICAgIFtkaXJlY3Rpb25dPVwiZGlyZWN0aW9uKClcIlxuICAgICAgICAgIFtjb21wYWN0U3BhY2luZ109XCJjb21wYWN0U3BhY2luZygpXCJcbiAgICAgICAgICBbaXNTZWxlY3RlZF09XCJpc1NlbGVjdGVkKG9wdGlvbi5pZClcIlxuICAgICAgICAgIFtpbnZlcnRlZF09XCJpbnZlcnRlZCgpXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLWhpZGRlbl09XCJzaG91bGREaXNwbGF5RHJvcGRvd24oKVwiXG4gICAgICAgICAgW2lzSGlkZGVuXT1cInNob3VsZERpc3BsYXlEcm9wZG93bigpXCJcbiAgICAgICAgICAoa2V5ZG93bik9XCJvbktleWRvd25UYWJJdGVtKCRldmVudClcIlxuICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrVGFiSXRlbShvcHRpb24uaWQpXCJcbiAgICAgICAgPjwvcnRlLXRhYi1pdGVtPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPHJ0ZS1pY29uLWJ1dHRvblxuICAgICAgKm5nSWY9XCJpc1Njcm9sbGFibGUoKSAmJiAhc2hvdWxkRGlzcGxheURyb3Bkb3duKClcIlxuICAgICAgYXJpYS1sYWJlbD1cIk5leHQgdGFic1wiXG4gICAgICB2YXJpYW50PVwidHJhbnNwYXJlbnRcIlxuICAgICAgW25hbWVdPVwiZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyA/ICdhcnJvdy1jaGV2cm9uLXJpZ2h0JyA6ICdhcnJvdy1jaGV2cm9uLWRvd24nXCJcbiAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgb3BhY2l0eTogY2FuU2Nyb2xsRm9yd2FyZCgpID8gJzEnIDogJzAnLFxuICAgICAgICAncG9pbnRlci1ldmVudHMnOiBjYW5TY3JvbGxGb3J3YXJkKCkgPyAnYXV0bycgOiAnbm9uZScsXG4gICAgICB9XCJcbiAgICAgIChjbGlja0V2ZW50KT1cInNjcm9sbEZvcndhcmQoKVwiXG4gICAgLz5cbiAgPC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cInJ0ZS10YWItYm9yZGVyLWhvcml6b250YWxcIlxuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgW2F0dHIuZGF0YS1kaXJlY3Rpb25dPVwiZGlyZWN0aW9uKClcIlxuICAgIFthdHRyLmRhdGEtY29tcGFjdC1zcGFjaW5nXT1cImNvbXBhY3RTcGFjaW5nKClcIlxuICAgIFthdHRyLmRhdGEtc2Nyb2xsYWJsZV09XCJpc1Njcm9sbGFibGUoKSAmJiBvdmVyZmxvd1R5cGUoKSA9PT0gJ3Njcm9sbGFibGUnXCJcbiAgPjwvZGl2PlxuPC9kaXY+XG4iXX0=