@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.
- package/esm2022/lib/components/assistive-text/assistive-text.component.mjs +34 -0
- package/esm2022/lib/components/badge/badge.component.mjs +7 -4
- package/esm2022/lib/components/banner/banner.component.mjs +3 -3
- package/esm2022/lib/components/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +18 -3
- package/esm2022/lib/components/breadcrumbs/breadcrumbs.component.mjs +19 -3
- package/esm2022/lib/components/dropdown/dropdown-item/dropdown-item.component.mjs +23 -6
- package/esm2022/lib/components/dropdown/dropdown-menu/dropdown-menu-footer.directive.mjs +17 -0
- package/esm2022/lib/components/dropdown/dropdown-menu/dropdown-menu-header.directive.mjs +17 -0
- package/esm2022/lib/components/dropdown/dropdown-menu/dropdown-menu.component.mjs +35 -5
- package/esm2022/lib/components/dropdown/dropdown-trigger/dropdown-trigger.directive.mjs +23 -2
- package/esm2022/lib/components/dropdown/dropdown.directive.mjs +93 -14
- package/esm2022/lib/components/dropdown/dropdown.module.mjs +32 -5
- package/esm2022/lib/components/icon-button/icon-button.component.mjs +6 -6
- package/esm2022/lib/components/icon-button-toggle/icon-button-toggle.component.mjs +3 -3
- package/esm2022/lib/components/modal/modal.component.mjs +3 -3
- package/esm2022/lib/components/searchbar/searchbar.component.mjs +86 -0
- package/esm2022/lib/components/segmented-control/segmented-control.component.mjs +13 -3
- package/esm2022/lib/components/select/select.component.mjs +168 -0
- package/esm2022/lib/components/split-button/split-button.component.mjs +17 -3
- package/esm2022/lib/components/tab/tab-item/tab-item.component.mjs +112 -0
- package/esm2022/lib/components/tab/tab.component.mjs +242 -0
- package/esm2022/lib/components/text-input/base-text-input/base-text-input.component.mjs +109 -0
- package/esm2022/lib/components/text-input/text-input.component.mjs +8 -103
- package/esm2022/lib/components/textarea/textarea.component.mjs +6 -5
- package/esm2022/lib/components/toast/toast.component.mjs +44 -5
- package/esm2022/lib/services/dropdown.service.mjs +2 -3
- package/esm2022/public-api.mjs +4 -1
- package/fesm2022/design-system-rte-angular.mjs +1047 -156
- package/fesm2022/design-system-rte-angular.mjs.map +1 -1
- package/lib/components/assistive-text/assistive-text.component.d.ts +14 -0
- package/lib/components/badge/badge.directive.d.ts +1 -1
- package/lib/components/breadcrumbs/breadcrumb-item/breadcrumb-item.component.d.ts +3 -2
- package/lib/components/breadcrumbs/breadcrumbs.component.d.ts +10 -3
- package/lib/components/dropdown/dropdown-item/dropdown-item.component.d.ts +4 -1
- package/lib/components/dropdown/dropdown-menu/dropdown-menu-footer.directive.d.ts +7 -0
- package/lib/components/dropdown/dropdown-menu/dropdown-menu-header.directive.d.ts +7 -0
- package/lib/components/dropdown/dropdown-menu/dropdown-menu.component.d.ts +23 -1
- package/lib/components/dropdown/dropdown-trigger/dropdown-trigger.directive.d.ts +7 -1
- package/lib/components/dropdown/dropdown.directive.d.ts +17 -3
- package/lib/components/dropdown/dropdown.module.d.ts +3 -1
- package/lib/components/icon-button/icon-button.component.d.ts +5 -4
- package/lib/components/icon-button-toggle/icon-button-toggle.component.d.ts +2 -2
- package/lib/components/popover/popover.component.d.ts +1 -1
- package/lib/components/searchbar/searchbar.component.d.ts +31 -0
- package/lib/components/segmented-control/segmented-control.component.d.ts +1 -0
- package/lib/components/select/select.component.d.ts +56 -0
- package/lib/components/split-button/split-button.component.d.ts +10 -2
- package/lib/components/tab/tab-item/tab-item.component.d.ts +35 -0
- package/lib/components/tab/tab.component.d.ts +70 -0
- package/lib/components/tag/tag.component.d.ts +2 -2
- package/lib/components/text-input/base-text-input/base-text-input.component.d.ts +47 -0
- package/lib/components/text-input/text-input.component.d.ts +3 -39
- package/lib/components/toast/toast.component.d.ts +9 -1
- package/lib/components/tooltip/tooltip.component.d.ts +1 -1
- package/package.json +2 -2
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHMtcnRlLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvdGFiL3RhYi1pdGVtL3RhYi1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RzLXJ0ZS1saWIvc3JjL2xpYi9jb21wb25lbnRzL3RhYi90YWItaXRlbS90YWItaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFHTixTQUFTLEVBQ1QsTUFBTSxFQUVOLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7QUFVMUQsTUFBTSxPQUFPLGdCQUFnQjtJQVI3QjtRQVNXLGNBQVMsR0FBRyxLQUFLLENBQTRCLFlBQVksQ0FBQyxDQUFDO1FBQzNELFdBQU0sR0FBRyxLQUFLLEVBQWdCLENBQUM7UUFDL0IsbUJBQWMsR0FBRyxLQUFLLEVBQVcsQ0FBQztRQUNsQyxlQUFVLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ25DLFVBQUssR0FBRyxNQUFNLEVBQVUsQ0FBQztRQUN6QixrQkFBYSxHQUFHLEtBQUssRUFBYyxDQUFDO1FBQ3BDLGFBQVEsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDakMsYUFBUSxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUVqQyxlQUFVLEdBQUcsU0FBUyxDQUFnQyxTQUFTLENBQUMsQ0FBQztRQUVqRSx3QkFBbUIs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O2dCQUMzQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDN0IsT0FBTyxFQUFFLENBQUM7YUFDWCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDO1lBQzNCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzdCLE9BQU8sRUFBRSxDQUFDO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F0RlUsZ0JBQWdCO21HQUFoQixnQkFBZ0IsbXBDQzFCN0IsdzZDQTBDQSwwM0NEdEJZLFlBQVksd05BQUUsYUFBYSxpSEFBRSxjQUFjOzs0RkFNMUMsZ0JBQWdCO2tCQVI1QixTQUFTOytCQUNFLGNBQWMsV0FDZixDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLGNBQzFDLElBQUksbUJBR0MsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIEVsZW1lbnRSZWYsXG4gIEFmdGVyVmlld0luaXQsXG4gIHZpZXdDaGlsZCxcbiAgb3V0cHV0LFxuICBPbkRlc3Ryb3ksXG4gIGNvbXB1dGVkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVGFiSXRlbVByb3BzIH0gZnJvbSBcIkBkZXNpZ24tc3lzdGVtLXJ0ZS9jb3JlL2NvbXBvbmVudHMvdGFiL3RhYi5pbnRlcmZhY2VcIjtcblxuaW1wb3J0IHsgQmFkZ2VDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vYmFkZ2UvYmFkZ2UuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2ljb24vaWNvbi5jb21wb25lbnRcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcInJ0ZS10YWItaXRlbVwiLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJY29uQ29tcG9uZW50LCBCYWRnZUNvbXBvbmVudF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlVXJsOiBcIi4vdGFiLWl0ZW0uY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmw6IFwiLi90YWItaXRlbS5jb21wb25lbnQuc2Nzc1wiLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGFiSXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHJlYWRvbmx5IGRpcmVjdGlvbiA9IGlucHV0PFwiaG9yaXpvbnRhbFwiIHwgXCJ2ZXJ0aWNhbFwiPihcImhvcml6b250YWxcIik7XG4gIHJlYWRvbmx5IG9wdGlvbiA9IGlucHV0PFRhYkl0ZW1Qcm9wcz4oKTtcbiAgcmVhZG9ubHkgY29tcGFjdFNwYWNpbmcgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpc1NlbGVjdGVkID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBjbGljayA9IG91dHB1dDxzdHJpbmc+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=
|