@sbb-esta/lyne-elements-dev 4.9.0-dev.1775022513 → 4.9.0-dev.1775028444
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/core/styles/core.scss +9 -0
- package/core.css +22 -0
- package/custom-elements.json +561 -561
- package/development/step-label.component-D3wrRPQ7.js +265 -0
- package/development/step.component-ewujsOVD.js +212 -0
- package/development/stepper/step/step.component.js +1 -1
- package/development/stepper/step-label/step-label.component.d.ts.map +1 -1
- package/development/stepper/step-label/step-label.component.js +1 -1
- package/development/stepper/step-label.js +1 -1
- package/development/stepper/step.js +1 -1
- package/development/stepper/stepper/stepper.component.d.ts.map +1 -1
- package/development/stepper/stepper/stepper.component.js +1 -1
- package/development/stepper/stepper.js +1 -1
- package/development/stepper.component-BJC_4cep.js +497 -0
- package/development/stepper.js +3 -3
- package/development/stepper.pure.js +3 -3
- package/off-brand-theme.css +22 -0
- package/package.json +2 -2
- package/safety-theme.css +22 -0
- package/standard-theme.css +22 -0
- package/step-label.component-Cu_Hck4P.js +80 -0
- package/{step.component-CbfVfpi6.js → step.component-DY61vAFB.js} +1 -1
- package/stepper/step/step.component.js +1 -1
- package/stepper/step-label/step-label.component.js +1 -1
- package/stepper/step-label.js +1 -1
- package/stepper/step.js +1 -1
- package/stepper/stepper/stepper.component.js +1 -1
- package/stepper/stepper.js +1 -1
- package/{stepper.component-CrMknCZm.js → stepper.component-83cngpic.js} +6 -8
- package/stepper.js +3 -3
- package/stepper.pure.js +3 -3
- package/development/step-label.component-C_obpSzp.js +0 -298
- package/development/step.component-DsXAckYS.js +0 -220
- package/development/stepper.component-yAkgcauE.js +0 -508
- package/step-label.component-BYaPBTcl.js +0 -82
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
import { css, html } from "lit";
|
|
2
|
-
import { SbbElement } from "./core/base-elements.js";
|
|
3
|
-
import { appendAriaElements, removeAriaElements } from "./core/mixins.js";
|
|
4
|
-
import { boxSizingStyles } from "./core/styles.js";
|
|
5
|
-
import { SbbPropertyWatcherController } from "./core/controllers.js";
|
|
6
|
-
import { ResizeController } from "@lit-labs/observers/resize-controller.js";
|
|
7
|
-
//#region src/elements/stepper/step/step.scss?lit&inline
|
|
8
|
-
var step_default = css`:host {
|
|
9
|
-
--sbb-step-position: initial;
|
|
10
|
-
--sbb-step-inset-block-start: unset;
|
|
11
|
-
--sbb-step-opacity: 0;
|
|
12
|
-
--sbb-step-display: none;
|
|
13
|
-
--sbb-step-height: 0;
|
|
14
|
-
--sbb-step-animation-duration: var(
|
|
15
|
-
--sbb-disable-animation-duration,
|
|
16
|
-
var(--sbb-animation-duration-2x)
|
|
17
|
-
);
|
|
18
|
-
--sbb-step-animation-delay: 0;
|
|
19
|
-
display: contents;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
:host(:is(:state(selected),[state--selected])) {
|
|
23
|
-
--sbb-step-opacity: 1;
|
|
24
|
-
--sbb-step-display: block;
|
|
25
|
-
--sbb-step-height: fit-content;
|
|
26
|
-
--sbb-step-animation-duration: var(
|
|
27
|
-
--sbb-disable-animation-duration,
|
|
28
|
-
var(--sbb-animation-duration-4x)
|
|
29
|
-
);
|
|
30
|
-
--sbb-step-animation-delay: var(--sbb-step-animation-duration);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
:host(:is(:state(orientation-horizontal),[state--orientation-horizontal])) {
|
|
34
|
-
--sbb-step-position: absolute;
|
|
35
|
-
--sbb-step-inset-block-start: 0;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
:host(:is(:state(orientation-vertical),[state--orientation-vertical])) .sbb-step--wrapper {
|
|
39
|
-
margin-inline-start: var(--sbb-spacing-fixed-4x);
|
|
40
|
-
opacity: 0;
|
|
41
|
-
height: 0;
|
|
42
|
-
transition: display var(--sbb-step-animation-duration) var(--sbb-animation-easing), height var(--sbb-stepper-animation-duration) var(--sbb-animation-easing), opacity var(--sbb-step-animation-duration) var(--sbb-animation-easing);
|
|
43
|
-
transition-behavior: allow-discrete;
|
|
44
|
-
}
|
|
45
|
-
:host(:is(:state(selected),[state--selected]):is(:state(orientation-vertical),[state--orientation-vertical])) .sbb-step--wrapper {
|
|
46
|
-
opacity: 1;
|
|
47
|
-
height: var(--sbb-stepper-content-height);
|
|
48
|
-
transition: display var(--sbb-step-animation-duration) var(--sbb-animation-easing), height var(--sbb-stepper-animation-duration) var(--sbb-animation-easing), opacity var(--sbb-step-animation-duration) var(--sbb-stepper-animation-duration) var(--sbb-animation-easing);
|
|
49
|
-
transition-behavior: allow-discrete;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
.sbb-step {
|
|
53
|
-
--sbb-text-font-size: var(--sbb-text-font-size-m);
|
|
54
|
-
font-family: var(--sbb-typo-font-family);
|
|
55
|
-
font-weight: normal;
|
|
56
|
-
line-height: var(--sbb-typo-line-height-text);
|
|
57
|
-
letter-spacing: var(--sbb-typo-letter-spacing-text);
|
|
58
|
-
font-size: var(--sbb-text-font-size);
|
|
59
|
-
position: var(--sbb-step-position);
|
|
60
|
-
width: 100%;
|
|
61
|
-
inset-block-start: var(--sbb-step-inset-block-start);
|
|
62
|
-
opacity: var(--sbb-step-opacity);
|
|
63
|
-
display: var(--sbb-step-display);
|
|
64
|
-
height: var(--sbb-step-height);
|
|
65
|
-
transition-property: display, opacity;
|
|
66
|
-
transition-duration: var(--sbb-step-animation-duration);
|
|
67
|
-
transition-delay: var(--sbb-step-animation-delay);
|
|
68
|
-
transition-timing-function: var(--sbb-animation-easing);
|
|
69
|
-
transition-behavior: allow-discrete;
|
|
70
|
-
}
|
|
71
|
-
@starting-style {
|
|
72
|
-
.sbb-step {
|
|
73
|
-
--sbb-step-opacity: 0;
|
|
74
|
-
}
|
|
75
|
-
}`;
|
|
76
|
-
//#endregion
|
|
77
|
-
//#region src/elements/stepper/step/step.component.ts
|
|
78
|
-
var nextId = 0;
|
|
79
|
-
/**
|
|
80
|
-
* Combined with a `sbb-stepper`, it displays a step's content.
|
|
81
|
-
*
|
|
82
|
-
* @slot - Use the unnamed slot to provide content.
|
|
83
|
-
*/
|
|
84
|
-
var SbbStepElement = class extends SbbElement {
|
|
85
|
-
static {
|
|
86
|
-
this.elementName = "sbb-step";
|
|
87
|
-
}
|
|
88
|
-
static {
|
|
89
|
-
this.role = "tabpanel";
|
|
90
|
-
}
|
|
91
|
-
static {
|
|
92
|
-
this.styles = [boxSizingStyles, step_default];
|
|
93
|
-
}
|
|
94
|
-
static {
|
|
95
|
-
this.events = {
|
|
96
|
-
validate: "validate",
|
|
97
|
-
resizechange: "resizechange"
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
/** The label of the step. */
|
|
101
|
-
get label() {
|
|
102
|
-
return this._label;
|
|
103
|
-
}
|
|
104
|
-
get stepper() {
|
|
105
|
-
return this.closest("sbb-stepper");
|
|
106
|
-
}
|
|
107
|
-
constructor() {
|
|
108
|
-
super();
|
|
109
|
-
this._stepResizeObserver = new ResizeController(this, {
|
|
110
|
-
target: null,
|
|
111
|
-
skipInitial: true,
|
|
112
|
-
callback: () => setTimeout(() => this._onStepElementResize())
|
|
113
|
-
});
|
|
114
|
-
this._label = null;
|
|
115
|
-
this.addEventListener?.("click", (e) => this._handleClick(e));
|
|
116
|
-
this.addController(new SbbPropertyWatcherController(this, () => this.stepper, { orientation: (s) => {
|
|
117
|
-
if (this._previousOrientation) this.internals.states.delete(`orientation-${this._previousOrientation}`);
|
|
118
|
-
this._previousOrientation = s.orientation;
|
|
119
|
-
if (this._previousOrientation) this.internals.states.add(`orientation-${this._previousOrientation}`);
|
|
120
|
-
} }));
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Selects and configures the step.
|
|
124
|
-
* @internal
|
|
125
|
-
* TODO: @breaking-change: make protected
|
|
126
|
-
*/
|
|
127
|
-
select() {
|
|
128
|
-
if (!this.hasUpdated || !this.label) return;
|
|
129
|
-
this.internals.states.add("selected");
|
|
130
|
-
this.label.select();
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Deselects and configures the step.
|
|
134
|
-
* @internal
|
|
135
|
-
* TODO: @breaking-change: make protected
|
|
136
|
-
*/
|
|
137
|
-
deselect() {
|
|
138
|
-
if (!this.label) return;
|
|
139
|
-
this.internals.states.delete("selected");
|
|
140
|
-
this.label.deselect();
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Emits a validate event whenever step switch is triggered.
|
|
144
|
-
* @internal
|
|
145
|
-
* TODO: @breaking-change: make protected
|
|
146
|
-
*/
|
|
147
|
-
validate(eventData) {
|
|
148
|
-
/**
|
|
149
|
-
* @type {CustomEvent<SbbStepValidateEventDetails>}
|
|
150
|
-
* The validate event is dispatched when a step change is triggered. Can be canceled to abort the step change.
|
|
151
|
-
*/
|
|
152
|
-
return this.dispatchEvent(new CustomEvent("validate", {
|
|
153
|
-
bubbles: true,
|
|
154
|
-
composed: true,
|
|
155
|
-
cancelable: true,
|
|
156
|
-
detail: eventData
|
|
157
|
-
}));
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Configures the step.
|
|
161
|
-
* @internal
|
|
162
|
-
* TODO: @breaking-change: make protected
|
|
163
|
-
*/
|
|
164
|
-
configure(stepperLoaded) {
|
|
165
|
-
if (stepperLoaded) this._assignLabel();
|
|
166
|
-
}
|
|
167
|
-
/** Watches for clicked elements with `sbb-stepper-next` or `sbb-stepper-previous` attributes. */
|
|
168
|
-
_handleClick(event) {
|
|
169
|
-
const composedPathElements = event.composedPath().filter((el) => el instanceof window.HTMLElement);
|
|
170
|
-
if (composedPathElements.some((el) => this._isGoNextElement(el))) this.stepper?.next();
|
|
171
|
-
else if (composedPathElements.some((el) => this._isGoPreviousElement(el))) this.stepper?.previous();
|
|
172
|
-
}
|
|
173
|
-
_isGoNextElement(element) {
|
|
174
|
-
return element.hasAttribute("sbb-stepper-next") && !element.hasAttribute("disabled");
|
|
175
|
-
}
|
|
176
|
-
_isGoPreviousElement(element) {
|
|
177
|
-
return element.hasAttribute("sbb-stepper-previous") && !element.hasAttribute("disabled");
|
|
178
|
-
}
|
|
179
|
-
_onStepElementResize() {
|
|
180
|
-
if (!this.matches(":is(:state(selected),[state--selected])")) return;
|
|
181
|
-
/**
|
|
182
|
-
* @internal
|
|
183
|
-
* Emits when a resize happens, used to avoid setting the height of the stepper from the step component.
|
|
184
|
-
*/
|
|
185
|
-
this.dispatchEvent(new Event("resizechange", { bubbles: true }));
|
|
186
|
-
}
|
|
187
|
-
connectedCallback() {
|
|
188
|
-
super.connectedCallback();
|
|
189
|
-
this.id ||= `sbb-step-${nextId++}`;
|
|
190
|
-
this.slot ||= "step";
|
|
191
|
-
this._assignLabel();
|
|
192
|
-
}
|
|
193
|
-
firstUpdated(changedProperties) {
|
|
194
|
-
super.firstUpdated(changedProperties);
|
|
195
|
-
this.updateComplete.then(() => {
|
|
196
|
-
this._stepResizeObserver.observe(this.shadowRoot.querySelector(".sbb-step"));
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
_assignLabel() {
|
|
200
|
-
let previousSibling = this.previousElementSibling;
|
|
201
|
-
while (previousSibling && previousSibling.localName !== "sbb-step-label") previousSibling = previousSibling.previousElementSibling;
|
|
202
|
-
const value = previousSibling;
|
|
203
|
-
this.internals.ariaLabelledByElements = removeAriaElements(this.internals.ariaLabelledByElements, this._label);
|
|
204
|
-
this._label = value instanceof Element ? value : null;
|
|
205
|
-
this.internals.ariaLabelledByElements = appendAriaElements(this.internals.ariaLabelledByElements, this._label);
|
|
206
|
-
}
|
|
207
|
-
render() {
|
|
208
|
-
return html`
|
|
209
|
-
<div class="sbb-step--wrapper">
|
|
210
|
-
<div class="sbb-step">
|
|
211
|
-
<slot></slot>
|
|
212
|
-
</div>
|
|
213
|
-
</div>
|
|
214
|
-
`;
|
|
215
|
-
}
|
|
216
|
-
};
|
|
217
|
-
//#endregion
|
|
218
|
-
export { SbbStepElement as t };
|
|
219
|
-
|
|
220
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5jb21wb25lbnQtRHNYQWNrWVMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3N0ZXBwZXIvc3RlcC9zdGVwLnNjc3M/bGl0JmlubGluZSIsIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9zdGVwcGVyL3N0ZXAvc3RlcC5jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiQHVzZSAnLi4vLi4vY29yZS9zdHlsZXMnIGFzIHNiYjtcblxuOmhvc3Qge1xuICAtLXNiYi1zdGVwLXBvc2l0aW9uOiBpbml0aWFsO1xuICAtLXNiYi1zdGVwLWluc2V0LWJsb2NrLXN0YXJ0OiB1bnNldDtcbiAgLS1zYmItc3RlcC1vcGFjaXR5OiAwO1xuICAtLXNiYi1zdGVwLWRpc3BsYXk6IG5vbmU7XG4gIC0tc2JiLXN0ZXAtaGVpZ2h0OiAwO1xuICAtLXNiYi1zdGVwLWFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKFxuICAgIC0tc2JiLWRpc2FibGUtYW5pbWF0aW9uLWR1cmF0aW9uLFxuICAgIHZhcigtLXNiYi1hbmltYXRpb24tZHVyYXRpb24tMngpXG4gICk7XG4gIC0tc2JiLXN0ZXAtYW5pbWF0aW9uLWRlbGF5OiAwO1xuXG4gIGRpc3BsYXk6IGNvbnRlbnRzO1xufVxuXG46aG9zdCg6c3RhdGUoc2VsZWN0ZWQpKSB7XG4gIC0tc2JiLXN0ZXAtb3BhY2l0eTogMTtcbiAgLS1zYmItc3RlcC1kaXNwbGF5OiBibG9jaztcbiAgLS1zYmItc3RlcC1oZWlnaHQ6IGZpdC1jb250ZW50O1xuICAtLXNiYi1zdGVwLWFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKFxuICAgIC0tc2JiLWRpc2FibGUtYW5pbWF0aW9uLWR1cmF0aW9uLFxuICAgIHZhcigtLXNiYi1hbmltYXRpb24tZHVyYXRpb24tNHgpXG4gICk7XG4gIC0tc2JiLXN0ZXAtYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1zYmItc3RlcC1hbmltYXRpb24tZHVyYXRpb24pO1xufVxuXG46aG9zdCg6c3RhdGUob3JpZW50YXRpb24taG9yaXpvbnRhbCkpIHtcbiAgLS1zYmItc3RlcC1wb3NpdGlvbjogYWJzb2x1dGU7XG4gIC0tc2JiLXN0ZXAtaW5zZXQtYmxvY2stc3RhcnQ6IDA7XG59XG5cbi5zYmItc3RlcC0td3JhcHBlciB7XG4gIDpob3N0KDpzdGF0ZShvcmllbnRhdGlvbi12ZXJ0aWNhbCkpICYge1xuICAgIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IHZhcigtLXNiYi1zcGFjaW5nLWZpeGVkLTR4KTtcbiAgICBvcGFjaXR5OiAwO1xuICAgIGhlaWdodDogMDtcbiAgICB0cmFuc2l0aW9uOlxuICAgICAgZGlzcGxheSB2YXIoLS1zYmItc3RlcC1hbmltYXRpb24tZHVyYXRpb24pIHZhcigtLXNiYi1hbmltYXRpb24tZWFzaW5nKSxcbiAgICAgIGhlaWdodCB2YXIoLS1zYmItc3RlcHBlci1hbmltYXRpb24tZHVyYXRpb24pIHZhcigtLXNiYi1hbmltYXRpb24tZWFzaW5nKSxcbiAgICAgIG9wYWNpdHkgdmFyKC0tc2JiLXN0ZXAtYW5pbWF0aW9uLWR1cmF0aW9uKSB2YXIoLS1zYmItYW5pbWF0aW9uLWVhc2luZyk7XG5cbiAgICAvLyBFeHBlcmltZW50YWwgcHJvcGVydHksIGJ1dCBzdXBwb3J0ZWQgaW4gZXZlcnkgbWFqb3IgYnJvd3Nlci5cbiAgICB0cmFuc2l0aW9uLWJlaGF2aW9yOiBhbGxvdy1kaXNjcmV0ZTtcbiAgfVxuXG4gIDpob3N0KDpzdGF0ZShzZWxlY3RlZCk6c3RhdGUob3JpZW50YXRpb24tdmVydGljYWwpKSAmIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIGhlaWdodDogdmFyKC0tc2JiLXN0ZXBwZXItY29udGVudC1oZWlnaHQpO1xuICAgIHRyYW5zaXRpb246XG4gICAgICBkaXNwbGF5IHZhcigtLXNiYi1zdGVwLWFuaW1hdGlvbi1kdXJhdGlvbikgdmFyKC0tc2JiLWFuaW1hdGlvbi1lYXNpbmcpLFxuICAgICAgaGVpZ2h0IHZhcigtLXNiYi1zdGVwcGVyLWFuaW1hdGlvbi1kdXJhdGlvbikgdmFyKC0tc2JiLWFuaW1hdGlvbi1lYXNpbmcpLFxuICAgICAgb3BhY2l0eSB2YXIoLS1zYmItc3RlcC1hbmltYXRpb24tZHVyYXRpb24pIHZhcigtLXNiYi1zdGVwcGVyLWFuaW1hdGlvbi1kdXJhdGlvbilcbiAgICAgICAgdmFyKC0tc2JiLWFuaW1hdGlvbi1lYXNpbmcpO1xuXG4gICAgLy8gRXhwZXJpbWVudGFsIHByb3BlcnR5LCBidXQgc3VwcG9ydGVkIGluIGV2ZXJ5IG1ham9yIGJyb3dzZXIuXG4gICAgdHJhbnNpdGlvbi1iZWhhdmlvcjogYWxsb3ctZGlzY3JldGU7XG4gIH1cbn1cblxuLnNiYi1zdGVwIHtcbiAgQGluY2x1ZGUgc2JiLnRleHQtbS0tcmVndWxhcjtcblxuICBwb3NpdGlvbjogdmFyKC0tc2JiLXN0ZXAtcG9zaXRpb24pO1xuICB3aWR0aDogMTAwJTtcbiAgaW5zZXQtYmxvY2stc3RhcnQ6IHZhcigtLXNiYi1zdGVwLWluc2V0LWJsb2NrLXN0YXJ0KTtcbiAgb3BhY2l0eTogdmFyKC0tc2JiLXN0ZXAtb3BhY2l0eSk7XG4gIGRpc3BsYXk6IHZhcigtLXNiYi1zdGVwLWRpc3BsYXkpO1xuICBoZWlnaHQ6IHZhcigtLXNiYi1zdGVwLWhlaWdodCk7XG4gIHRyYW5zaXRpb246IHtcbiAgICBwcm9wZXJ0eTogZGlzcGxheSwgb3BhY2l0eTtcbiAgICBkdXJhdGlvbjogdmFyKC0tc2JiLXN0ZXAtYW5pbWF0aW9uLWR1cmF0aW9uKTtcbiAgICBkZWxheTogdmFyKC0tc2JiLXN0ZXAtYW5pbWF0aW9uLWRlbGF5KTtcbiAgICB0aW1pbmctZnVuY3Rpb246IHZhcigtLXNiYi1hbmltYXRpb24tZWFzaW5nKTtcbiAgfVxuXG4gIC8vIEV4cGVyaW1lbnRhbCBwcm9wZXJ0eSwgYnV0IHN1cHBvcnRlZCBpbiBldmVyeSBtYWpvciBicm93c2VyLlxuICB0cmFuc2l0aW9uLWJlaGF2aW9yOiBhbGxvdy1kaXNjcmV0ZTtcblxuICAvLyBFeHBlcmltZW50YWwgcHJvcGVydHksIGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gZXZlcnkgbWFqb3IgYnJvd3NlciBleGNlcHQgRmlyZWZveC5cbiAgQHN0YXJ0aW5nLXN0eWxlIHtcbiAgICAtLXNiYi1zdGVwLW9wYWNpdHk6IDA7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJlc2l6ZUNvbnRyb2xsZXIgfSBmcm9tICdAbGl0LWxhYnMvb2JzZXJ2ZXJzL3Jlc2l6ZS1jb250cm9sbGVyLmpzJztcbmltcG9ydCB7IHR5cGUgQ1NTUmVzdWx0R3JvdXAsIGh0bWwsIHR5cGUgUHJvcGVydHlWYWx1ZXMsIHR5cGUgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuXG5pbXBvcnQgeyBTYmJFbGVtZW50IH0gZnJvbSAnLi4vLi4vY29yZS9iYXNlLWVsZW1lbnRzLnRzJztcbmltcG9ydCB7IFNiYlByb3BlcnR5V2F0Y2hlckNvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9jb3JlL2NvbnRyb2xsZXJzLnRzJztcbmltcG9ydCB7IGFwcGVuZEFyaWFFbGVtZW50cywgcmVtb3ZlQXJpYUVsZW1lbnRzIH0gZnJvbSAnLi4vLi4vY29yZS9taXhpbnMudHMnO1xuaW1wb3J0IHsgYm94U2l6aW5nU3R5bGVzIH0gZnJvbSAnLi4vLi4vY29yZS9zdHlsZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBTYmJTdGVwTGFiZWxFbGVtZW50IH0gZnJvbSAnLi4vc3RlcC1sYWJlbC9zdGVwLWxhYmVsLmNvbXBvbmVudC50cyc7XG5pbXBvcnQgdHlwZSB7IFNiYlN0ZXBwZXJFbGVtZW50IH0gZnJvbSAnLi4vc3RlcHBlci9zdGVwcGVyLmNvbXBvbmVudC50cyc7XG5cbmltcG9ydCBzdHlsZSBmcm9tICcuL3N0ZXAuc2Nzcz9saXQmaW5saW5lJztcblxubGV0IG5leHRJZCA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2JiU3RlcFZhbGlkYXRlRXZlbnREZXRhaWxzIHtcbiAgY3VycmVudEluZGV4OiBudW1iZXIgfCBudWxsO1xuICBjdXJyZW50U3RlcDogU2JiU3RlcEVsZW1lbnQgfCBudWxsO1xuICBuZXh0SW5kZXg6IG51bWJlciB8IG51bGw7XG4gIG5leHRTdGVwOiBTYmJTdGVwRWxlbWVudCB8IG51bGw7XG59XG5cbi8qKlxuICogQ29tYmluZWQgd2l0aCBhIGBzYmItc3RlcHBlcmAsIGl0IGRpc3BsYXlzIGEgc3RlcCdzIGNvbnRlbnQuXG4gKlxuICogQHNsb3QgLSBVc2UgdGhlIHVubmFtZWQgc2xvdCB0byBwcm92aWRlIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTYmJTdGVwRWxlbWVudCBleHRlbmRzIFNiYkVsZW1lbnQge1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGVsZW1lbnROYW1lOiBzdHJpbmcgPSAnc2JiLXN0ZXAnO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IHJvbGUgPSAndGFicGFuZWwnO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBbYm94U2l6aW5nU3R5bGVzLCBzdHlsZV07XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIHZhbGlkYXRlOiAndmFsaWRhdGUnLFxuICAgIHJlc2l6ZWNoYW5nZTogJ3Jlc2l6ZWNoYW5nZScsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLy8gV2UgdXNlIGEgdGltZW91dCBhcyBhIHdvcmthcm91bmQgdG8gdGhlIFwiUmVzaXplT2JzZXJ2ZXIgbG9vcCBjb21wbGV0ZWQgd2l0aCB1bmRlbGl2ZXJlZCBub3RpZmljYXRpb25zXCIgZXJyb3IuXG4gIC8vIEZvciBtb3JlIGRldGFpbHM6XG4gIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvcmVzaXplLW9ic2VydmVyL2lzc3Vlcy8zOCNpc3N1ZWNvbW1lbnQtNDIyMTI2MDA2XG4gIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2p1Z2dsZS9yZXNpemUtb2JzZXJ2ZXIvaXNzdWVzLzEwMyNpc3N1ZWNvbW1lbnQtMTcxMTE0ODI4NVxuICBwcml2YXRlIF9zdGVwUmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplQ29udHJvbGxlcih0aGlzLCB7XG4gICAgdGFyZ2V0OiBudWxsLFxuICAgIHNraXBJbml0aWFsOiB0cnVlLFxuICAgIGNhbGxiYWNrOiAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX29uU3RlcEVsZW1lbnRSZXNpemUoKSksXG4gIH0pO1xuXG4gIC8qKiBUaGUgbGFiZWwgb2YgdGhlIHN0ZXAuICovXG4gIHB1YmxpYyBnZXQgbGFiZWwoKTogU2JiU3RlcExhYmVsRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9sYWJlbDtcbiAgfVxuICBwcml2YXRlIF9sYWJlbDogU2JiU3RlcExhYmVsRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBnZXQgc3RlcHBlcigpOiBTYmJTdGVwcGVyRWxlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNsb3Nlc3QoJ3NiYi1zdGVwcGVyJyk7XG4gIH1cblxuICBwcml2YXRlIF9wcmV2aW91c09yaWVudGF0aW9uPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdjbGljaycsIChlKSA9PiB0aGlzLl9oYW5kbGVDbGljayhlKSk7XG4gICAgdGhpcy5hZGRDb250cm9sbGVyKFxuICAgICAgbmV3IFNiYlByb3BlcnR5V2F0Y2hlckNvbnRyb2xsZXIodGhpcywgKCkgPT4gdGhpcy5zdGVwcGVyLCB7XG4gICAgICAgIG9yaWVudGF0aW9uOiAocykgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9wcmV2aW91c09yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKGBvcmllbnRhdGlvbi0ke3RoaXMuX3ByZXZpb3VzT3JpZW50YXRpb259YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3ByZXZpb3VzT3JpZW50YXRpb24gPSBzLm9yaWVudGF0aW9uO1xuICAgICAgICAgIGlmICh0aGlzLl9wcmV2aW91c09yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmludGVybmFscy5zdGF0ZXMuYWRkKGBvcmllbnRhdGlvbi0ke3RoaXMuX3ByZXZpb3VzT3JpZW50YXRpb259YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGFuZCBjb25maWd1cmVzIHRoZSBzdGVwLlxuICAgKiBAaW50ZXJuYWxcbiAgICogVE9ETzogQGJyZWFraW5nLWNoYW5nZTogbWFrZSBwcm90ZWN0ZWRcbiAgICovXG4gIHB1YmxpYyBzZWxlY3QoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWQgfHwgIXRoaXMubGFiZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnc2VsZWN0ZWQnKTtcbiAgICB0aGlzLmxhYmVsLnNlbGVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VsZWN0cyBhbmQgY29uZmlndXJlcyB0aGUgc3RlcC5cbiAgICogQGludGVybmFsXG4gICAqIFRPRE86IEBicmVha2luZy1jaGFuZ2U6IG1ha2UgcHJvdGVjdGVkXG4gICAqL1xuICBwdWJsaWMgZGVzZWxlY3QoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmxhYmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ3NlbGVjdGVkJyk7XG4gICAgdGhpcy5sYWJlbC5kZXNlbGVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgdmFsaWRhdGUgZXZlbnQgd2hlbmV2ZXIgc3RlcCBzd2l0Y2ggaXMgdHJpZ2dlcmVkLlxuICAgKiBAaW50ZXJuYWxcbiAgICogVE9ETzogQGJyZWFraW5nLWNoYW5nZTogbWFrZSBwcm90ZWN0ZWRcbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZShldmVudERhdGE6IFNiYlN0ZXBWYWxpZGF0ZUV2ZW50RGV0YWlscyk6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE86IEBicmVha2luZy1jaGFuZ2U6IENyZWF0ZSBhIHNwZWNpZmljIGV2ZW50IHR5cGUgZm9yIHRoaXMgZXZlbnQuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0N1c3RvbUV2ZW50PFNiYlN0ZXBWYWxpZGF0ZUV2ZW50RGV0YWlscz59XG4gICAgICogVGhlIHZhbGlkYXRlIGV2ZW50IGlzIGRpc3BhdGNoZWQgd2hlbiBhIHN0ZXAgY2hhbmdlIGlzIHRyaWdnZXJlZC4gQ2FuIGJlIGNhbmNlbGVkIHRvIGFib3J0IHRoZSBzdGVwIGNoYW5nZS5cbiAgICAgKi9cbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFNiYlN0ZXBWYWxpZGF0ZUV2ZW50RGV0YWlscz4oJ3ZhbGlkYXRlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiBldmVudERhdGEsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIHN0ZXAuXG4gICAqIEBpbnRlcm5hbFxuICAgKiBUT0RPOiBAYnJlYWtpbmctY2hhbmdlOiBtYWtlIHByb3RlY3RlZFxuICAgKi9cbiAgcHVibGljIGNvbmZpZ3VyZShzdGVwcGVyTG9hZGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHN0ZXBwZXJMb2FkZWQpIHtcbiAgICAgIHRoaXMuX2Fzc2lnbkxhYmVsKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdhdGNoZXMgZm9yIGNsaWNrZWQgZWxlbWVudHMgd2l0aCBgc2JiLXN0ZXBwZXItbmV4dGAgb3IgYHNiYi1zdGVwcGVyLXByZXZpb3VzYCBhdHRyaWJ1dGVzLiAqL1xuICBwcml2YXRlIF9oYW5kbGVDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wb3NlZFBhdGhFbGVtZW50cyA9IGV2ZW50XG4gICAgICAuY29tcG9zZWRQYXRoKClcbiAgICAgIC5maWx0ZXIoKGVsKSA9PiBlbCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MRWxlbWVudCk7XG4gICAgaWYgKGNvbXBvc2VkUGF0aEVsZW1lbnRzLnNvbWUoKGVsKSA9PiB0aGlzLl9pc0dvTmV4dEVsZW1lbnQoZWwgYXMgSFRNTEVsZW1lbnQpKSkge1xuICAgICAgdGhpcy5zdGVwcGVyPy5uZXh0KCk7XG4gICAgfSBlbHNlIGlmIChjb21wb3NlZFBhdGhFbGVtZW50cy5zb21lKChlbCkgPT4gdGhpcy5faXNHb1ByZXZpb3VzRWxlbWVudChlbCBhcyBIVE1MRWxlbWVudCkpKSB7XG4gICAgICB0aGlzLnN0ZXBwZXI/LnByZXZpb3VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNHb05leHRFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdzYmItc3RlcHBlci1uZXh0JykgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNHb1ByZXZpb3VzRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnc2JiLXN0ZXBwZXItcHJldmlvdXMnKSAmJiAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gIH1cblxuICBwcml2YXRlIF9vblN0ZXBFbGVtZW50UmVzaXplKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tYXRjaGVzKCc6c3RhdGUoc2VsZWN0ZWQpJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKiBFbWl0cyB3aGVuIGEgcmVzaXplIGhhcHBlbnMsIHVzZWQgdG8gYXZvaWQgc2V0dGluZyB0aGUgaGVpZ2h0IG9mIHRoZSBzdGVwcGVyIGZyb20gdGhlIHN0ZXAgY29tcG9uZW50LlxuICAgICAqL1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3Jlc2l6ZWNoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmlkIHx8PSBgc2JiLXN0ZXAtJHtuZXh0SWQrK31gO1xuICAgIHRoaXMuc2xvdCB8fD0gJ3N0ZXAnO1xuICAgIHRoaXMuX2Fzc2lnbkxhYmVsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX3N0ZXBSZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuc2hhZG93Um9vdCEucXVlcnlTZWxlY3RvcignLnNiYi1zdGVwJykgYXMgSFRNTEVsZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXNzaWduTGFiZWwoKTogdm9pZCB7XG4gICAgbGV0IHByZXZpb3VzU2libGluZyA9IHRoaXMucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICB3aGlsZSAocHJldmlvdXNTaWJsaW5nICYmIHByZXZpb3VzU2libGluZy5sb2NhbE5hbWUgIT09ICdzYmItc3RlcC1sYWJlbCcpIHtcbiAgICAgIHByZXZpb3VzU2libGluZyA9IHByZXZpb3VzU2libGluZy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHByZXZpb3VzU2libGluZyBhcyBTYmJTdGVwTGFiZWxFbGVtZW50IHwgbnVsbDtcblxuICAgIHRoaXMuaW50ZXJuYWxzLmFyaWFMYWJlbGxlZEJ5RWxlbWVudHMgPSByZW1vdmVBcmlhRWxlbWVudHMoXG4gICAgICB0aGlzLmludGVybmFscy5hcmlhTGFiZWxsZWRCeUVsZW1lbnRzLFxuICAgICAgdGhpcy5fbGFiZWwsXG4gICAgKTtcbiAgICB0aGlzLl9sYWJlbCA9IHZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCA/IHZhbHVlIDogbnVsbDtcbiAgICB0aGlzLmludGVybmFscy5hcmlhTGFiZWxsZWRCeUVsZW1lbnRzID0gYXBwZW5kQXJpYUVsZW1lbnRzKFxuICAgICAgdGhpcy5pbnRlcm5hbHMuYXJpYUxhYmVsbGVkQnlFbGVtZW50cyxcbiAgICAgIHRoaXMuX2xhYmVsLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc3RlcC0td3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXN0ZXBcIj5cbiAgICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXN0ZXAnOiBTYmJTdGVwRWxlbWVudDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBHbG9iYWxFdmVudEhhbmRsZXJzRXZlbnRNYXAge1xuICAgIHJlc2l6ZWNoYW5nZTogRXZlbnQ7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7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
|