@libs-ui/components-scroll-overlay 0.2.356-24 → 0.2.356-26
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.
|
@@ -1,82 +1,106 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
1
|
import { DestroyRef, Directive, ElementRef, Renderer2, computed, effect, inject, input, output, signal, untracked } from '@angular/core';
|
|
3
2
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
3
|
import { checkMouseOverInContainer, getDragEventByElement } from '@libs-ui/utils';
|
|
5
4
|
import { Subscription, fromEvent, interval, switchMap, takeUntil, tap } from 'rxjs';
|
|
6
5
|
import * as i0 from "@angular/core";
|
|
6
|
+
const STYLE_TAG_ID = 'libs-ui-scroll-overlay-style-tag';
|
|
7
|
+
const SCROLL_BOTTOM_TOLERANCE = 3;
|
|
8
|
+
const MIN_THUMB_SIZE = 20;
|
|
9
|
+
const MOUSE_UP_RESET_DELAY = 250;
|
|
10
|
+
const DEFAULT_SCROLLBAR_HOVER_COLOR = '#CDD0D640';
|
|
11
|
+
const DEFAULT_SCROLL_THUMB_COLOR = '#CDD0D6';
|
|
12
|
+
const DEFAULT_SCROLL_THUMB_HOVER_COLOR = '#9CA2AD';
|
|
13
|
+
/**
|
|
14
|
+
* CSS chia sẻ cho mọi instance. Màu/padding lấy qua CSS variables để mỗi
|
|
15
|
+
* directive instance có thể custom độc lập mà không phải re-write style tag.
|
|
16
|
+
*/
|
|
17
|
+
const STYLE_CONTENT = `
|
|
18
|
+
.libs-ui-scroll-overlay-container .scrollbar-track {
|
|
19
|
+
background-color: var(--libs-ui-sb-track-color, transparent);
|
|
20
|
+
}
|
|
21
|
+
.libs-ui-scroll-overlay-container .scrollbar-track:hover {
|
|
22
|
+
background-color: var(--libs-ui-sb-track-hover-color, ${DEFAULT_SCROLLBAR_HOVER_COLOR});
|
|
23
|
+
}
|
|
24
|
+
.libs-ui-scroll-overlay-container .scrollbar-track-X {
|
|
25
|
+
width: 100%;
|
|
26
|
+
position: absolute;
|
|
27
|
+
bottom: 0;
|
|
28
|
+
left: 0;
|
|
29
|
+
visibility: hidden;
|
|
30
|
+
cursor: pointer;
|
|
31
|
+
opacity: 0;
|
|
32
|
+
z-index: 1;
|
|
33
|
+
transition: opacity 0.3s ease, visibility 0.3s ease;
|
|
34
|
+
}
|
|
35
|
+
.libs-ui-scroll-overlay-container .scrollbar-track-Y {
|
|
36
|
+
height: 100%;
|
|
37
|
+
position: absolute;
|
|
38
|
+
top: 0;
|
|
39
|
+
right: 0;
|
|
40
|
+
visibility: hidden;
|
|
41
|
+
cursor: pointer;
|
|
42
|
+
opacity: 0;
|
|
43
|
+
z-index: 1;
|
|
44
|
+
transition: opacity 0.3s ease, visibility 0.3s ease;
|
|
45
|
+
}
|
|
46
|
+
.libs-ui-scroll-overlay-container .scrollbar-thumb {
|
|
47
|
+
background-color: var(--libs-ui-sb-thumb-color, ${DEFAULT_SCROLL_THUMB_COLOR});
|
|
48
|
+
}
|
|
49
|
+
.libs-ui-scroll-overlay-container .scrollbar-thumb:hover {
|
|
50
|
+
background-color: var(--libs-ui-sb-thumb-hover-color, ${DEFAULT_SCROLL_THUMB_HOVER_COLOR});
|
|
51
|
+
}
|
|
52
|
+
.libs-ui-scroll-overlay-container .scrollbar-thumb-X {
|
|
53
|
+
height: calc(100% - var(--libs-ui-sb-padding-double, 4px));
|
|
54
|
+
bottom: var(--libs-ui-sb-padding, 2px);
|
|
55
|
+
border-radius: 4px;
|
|
56
|
+
cursor: grabbing;
|
|
57
|
+
transition: background-color 0.3s;
|
|
58
|
+
position: absolute;
|
|
59
|
+
}
|
|
60
|
+
.libs-ui-scroll-overlay-container .scrollbar-thumb-Y {
|
|
61
|
+
width: calc(100% - var(--libs-ui-sb-padding-double, 4px));
|
|
62
|
+
right: var(--libs-ui-sb-padding, 2px);
|
|
63
|
+
border-radius: 4px;
|
|
64
|
+
cursor: grabbing;
|
|
65
|
+
transition: background-color 0.3s;
|
|
66
|
+
position: absolute;
|
|
67
|
+
}
|
|
68
|
+
.libs-ui-scroll-overlay-container .libs-ui-scroll-overlay-element::-webkit-scrollbar {
|
|
69
|
+
width: 0 !important;
|
|
70
|
+
height: 0 !important;
|
|
71
|
+
}
|
|
72
|
+
`;
|
|
73
|
+
const ensureStyleTag = () => {
|
|
74
|
+
if (document.getElementById(STYLE_TAG_ID)) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const styleEl = document.createElement('style');
|
|
78
|
+
styleEl.id = STYLE_TAG_ID;
|
|
79
|
+
styleEl.textContent = STYLE_CONTENT;
|
|
80
|
+
document.head.append(styleEl);
|
|
81
|
+
};
|
|
7
82
|
export class LibsUiComponentsScrollOverlayDirective {
|
|
8
83
|
// #region PROPERTY
|
|
9
|
-
styles = computed(() => `
|
|
10
|
-
.scrollbar-track{
|
|
11
|
-
background-color:${this.scrollbarColor()};
|
|
12
|
-
}
|
|
13
|
-
.scrollbar-track:hover{
|
|
14
|
-
background-color:${this.scrollbarHoverColor()};
|
|
15
|
-
}
|
|
16
|
-
.scrollbar-track-X {
|
|
17
|
-
width:100%;
|
|
18
|
-
position: absolute;
|
|
19
|
-
bottom: 0;
|
|
20
|
-
left: 0;
|
|
21
|
-
visibility: hidden;
|
|
22
|
-
cursor: pointer;
|
|
23
|
-
opacity: 0;
|
|
24
|
-
z-index: 1;
|
|
25
|
-
transition: opacity 0.3s ease, visibility 0.3s ease;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
.scrollbar-track-Y {
|
|
29
|
-
height:100%;
|
|
30
|
-
position: absolute;
|
|
31
|
-
top: 0;
|
|
32
|
-
right: 0;
|
|
33
|
-
visibility: hidden;
|
|
34
|
-
cursor: pointer;
|
|
35
|
-
opacity: 0;
|
|
36
|
-
z-index: 1;
|
|
37
|
-
transition: opacity 0.3s ease, visibility 0.3s ease;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.scrollbar-thumb{
|
|
41
|
-
background-color:${this.scrollThumbColor()};
|
|
42
|
-
}
|
|
43
|
-
.scrollbar-thumb:hover{
|
|
44
|
-
background-color:${this.scrollThumbHoverColor()};
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.scrollbar-thumb-X {
|
|
48
|
-
height: calc(100% - ${this.scrollbarPadding() * 2}px);
|
|
49
|
-
bottom: ${this.scrollbarPadding()}px;
|
|
50
|
-
border-radius: 4px;
|
|
51
|
-
cursor: grabbing;
|
|
52
|
-
transition: background-color 0.3s;
|
|
53
|
-
position: absolute;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
.scrollbar-thumb-Y {
|
|
57
|
-
width: calc(100% - ${this.scrollbarPadding() * 2}px);
|
|
58
|
-
right: ${this.scrollbarPadding()}px;
|
|
59
|
-
border-radius: 4px;
|
|
60
|
-
cursor: grabbing;
|
|
61
|
-
transition: background-color 0.3s;
|
|
62
|
-
position: absolute;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
.lib-ui-scroll-overlay-container .lib-ui-scroll-overlay-element::-webkit-scrollbar {
|
|
66
|
-
width: 0 !important;
|
|
67
|
-
height: 0 !important;
|
|
68
|
-
}
|
|
69
|
-
`, {});
|
|
70
84
|
isScrollThumb = signal(false);
|
|
71
85
|
keepDisplayThumb = signal(false);
|
|
72
86
|
subsX = new Subscription();
|
|
73
87
|
subsY = new Subscription();
|
|
74
|
-
|
|
75
|
-
|
|
88
|
+
/** Timer reset isScrollThumb sau drag end — phải clear khi destroy để tránh set signal trên instance đã teardown. */
|
|
89
|
+
mouseUpTimer;
|
|
90
|
+
/** rAF throttle cho scroll handler — gom multiple scroll events về 1 lần update DOM mỗi frame. */
|
|
91
|
+
scrollRafX;
|
|
92
|
+
scrollRafY;
|
|
93
|
+
/** Cache dimensions — skip DOM write nếu kích thước không đổi giữa 2 lần poll. */
|
|
94
|
+
lastContentWidth = 0;
|
|
95
|
+
lastContentHeight = 0;
|
|
96
|
+
lastContainerWidth = 0;
|
|
97
|
+
lastContainerHeight = 0;
|
|
98
|
+
scrollbarWidth = computed(() => this.options()?.scrollbarWidth ?? 10);
|
|
99
|
+
scrollbarPadding = computed(() => this.options()?.scrollbarPadding ?? 2);
|
|
76
100
|
scrollbarColor = computed(() => this.options()?.scrollbarColor ?? '');
|
|
77
|
-
scrollbarHoverColor = computed(() => this.options()?.
|
|
78
|
-
scrollThumbColor = computed(() => this.options()?.scrollThumbColor ??
|
|
79
|
-
scrollThumbHoverColor = computed(() => this.options()?.scrollThumbHoverColor ??
|
|
101
|
+
scrollbarHoverColor = computed(() => this.options()?.scrollbarHoverColor ?? DEFAULT_SCROLLBAR_HOVER_COLOR);
|
|
102
|
+
scrollThumbColor = computed(() => this.options()?.scrollThumbColor ?? DEFAULT_SCROLL_THUMB_COLOR);
|
|
103
|
+
scrollThumbHoverColor = computed(() => this.options()?.scrollThumbHoverColor ?? DEFAULT_SCROLL_THUMB_HOVER_COLOR);
|
|
80
104
|
divContainer = document.createElement('div');
|
|
81
105
|
trackX = document.createElement('div');
|
|
82
106
|
thumbX = document.createElement('div');
|
|
@@ -101,58 +125,88 @@ export class LibsUiComponentsScrollOverlayDirective {
|
|
|
101
125
|
render2 = inject(Renderer2);
|
|
102
126
|
destroyRef = inject(DestroyRef);
|
|
103
127
|
constructor() {
|
|
128
|
+
// Setup scrollbars khi options/classContainer đổi.
|
|
104
129
|
effect(() => {
|
|
105
130
|
if (this.ignoreInit()) {
|
|
106
131
|
return;
|
|
107
132
|
}
|
|
108
133
|
const options = this.options();
|
|
109
|
-
|
|
110
|
-
this.classContainer()
|
|
111
|
-
?.split(' ')
|
|
112
|
-
.forEach((className) => {
|
|
113
|
-
if (!className) {
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
this.divContainer.classList.add(className);
|
|
117
|
-
});
|
|
134
|
+
const classContainer = this.classContainer();
|
|
118
135
|
untracked(() => {
|
|
136
|
+
this.syncContainerExtraClasses(classContainer);
|
|
119
137
|
this.Element.classList.toggle('overflow-hidden', options?.scrollX === 'hidden' && options?.scrollY === 'hidden');
|
|
120
138
|
if (options?.scrollX !== 'hidden') {
|
|
121
139
|
this.subsX.unsubscribe();
|
|
140
|
+
this.subsX = new Subscription();
|
|
122
141
|
this.trackX.className = '';
|
|
123
142
|
this.thumbX.className = '';
|
|
124
143
|
this.trackX.style.height = `${this.scrollbarWidth()}px`;
|
|
125
144
|
this.createScrollbar('X', this.trackX, this.thumbX);
|
|
126
|
-
this.bindEventsScrollBar('X', this.trackX);
|
|
127
|
-
this.handlerDragAndDropThumb('X');
|
|
128
|
-
this.handlerClickTrack('X');
|
|
145
|
+
this.bindEventsScrollBar('X', this.trackX, this.subsX);
|
|
146
|
+
this.handlerDragAndDropThumb('X', this.subsX);
|
|
147
|
+
this.handlerClickTrack('X', this.subsX);
|
|
129
148
|
}
|
|
130
149
|
if (options?.scrollY !== 'hidden') {
|
|
150
|
+
this.subsY.unsubscribe();
|
|
151
|
+
this.subsY = new Subscription();
|
|
131
152
|
this.trackY.className = '';
|
|
132
153
|
this.thumbY.className = '';
|
|
133
154
|
this.trackY.style.width = `${this.scrollbarWidth()}px`;
|
|
134
|
-
this.subsY.unsubscribe();
|
|
135
155
|
this.createScrollbar('Y', this.trackY, this.thumbY);
|
|
136
|
-
this.bindEventsScrollBar('Y', this.trackY);
|
|
137
|
-
this.handlerDragAndDropThumb('Y');
|
|
138
|
-
this.handlerClickTrack('Y');
|
|
156
|
+
this.bindEventsScrollBar('Y', this.trackY, this.subsY);
|
|
157
|
+
this.handlerDragAndDropThumb('Y', this.subsY);
|
|
158
|
+
this.handlerClickTrack('Y', this.subsY);
|
|
139
159
|
}
|
|
140
160
|
});
|
|
141
161
|
});
|
|
162
|
+
// Sync CSS variables per-instance — không đụng style tag chia sẻ giữa các instance.
|
|
163
|
+
effect(() => {
|
|
164
|
+
const sbColor = this.scrollbarColor();
|
|
165
|
+
const sbHover = this.scrollbarHoverColor();
|
|
166
|
+
const thColor = this.scrollThumbColor();
|
|
167
|
+
const thHover = this.scrollThumbHoverColor();
|
|
168
|
+
const padding = this.scrollbarPadding();
|
|
169
|
+
untracked(() => {
|
|
170
|
+
const divStyle = this.divContainer.style;
|
|
171
|
+
divStyle.setProperty('--libs-ui-sb-track-color', sbColor);
|
|
172
|
+
divStyle.setProperty('--libs-ui-sb-track-hover-color', sbHover);
|
|
173
|
+
divStyle.setProperty('--libs-ui-sb-thumb-color', thColor);
|
|
174
|
+
divStyle.setProperty('--libs-ui-sb-thumb-hover-color', thHover);
|
|
175
|
+
divStyle.setProperty('--libs-ui-sb-padding', `${padding}px`);
|
|
176
|
+
divStyle.setProperty('--libs-ui-sb-padding-double', `${padding * 2}px`);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
// Window resize → re-measure thumb size cho cả 2 trục.
|
|
180
|
+
fromEvent(window, 'resize')
|
|
181
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
182
|
+
.subscribe(() => {
|
|
183
|
+
this.updateScrollbarSize('X');
|
|
184
|
+
this.updateScrollbarSize('Y');
|
|
185
|
+
});
|
|
186
|
+
this.destroyRef.onDestroy(() => {
|
|
187
|
+
clearTimeout(this.mouseUpTimer);
|
|
188
|
+
if (this.scrollRafX)
|
|
189
|
+
cancelAnimationFrame(this.scrollRafX);
|
|
190
|
+
if (this.scrollRafY)
|
|
191
|
+
cancelAnimationFrame(this.scrollRafY);
|
|
192
|
+
this.divContainer.remove();
|
|
193
|
+
this.subsX.unsubscribe();
|
|
194
|
+
this.subsY.unsubscribe();
|
|
195
|
+
});
|
|
142
196
|
}
|
|
143
197
|
// #region FUNCTIONS
|
|
144
198
|
get Element() {
|
|
145
199
|
return this.elementScroll() || this.element.nativeElement;
|
|
146
200
|
}
|
|
201
|
+
/** Thêm các class consumer truyền qua [classContainer] mà không xóa class hệ thống đã set. */
|
|
202
|
+
syncContainerExtraClasses(classStr) {
|
|
203
|
+
classStr
|
|
204
|
+
.split(' ')
|
|
205
|
+
.filter(Boolean)
|
|
206
|
+
.forEach((className) => this.divContainer.classList.add(className));
|
|
207
|
+
}
|
|
147
208
|
createScrollbar(scrollDirection, trackEl, thumbEl) {
|
|
148
|
-
|
|
149
|
-
const styleElCustomScrollOverlay = document.getElementById(idStyleTag);
|
|
150
|
-
if (!styleElCustomScrollOverlay) {
|
|
151
|
-
const styleEl = document.createElement('style');
|
|
152
|
-
styleEl.setAttribute('id', idStyleTag);
|
|
153
|
-
styleEl.innerHTML = this.styles();
|
|
154
|
-
document.head.append(styleEl);
|
|
155
|
-
}
|
|
209
|
+
ensureStyleTag();
|
|
156
210
|
const stylesProperty = {
|
|
157
211
|
'box-sizing': 'border-box',
|
|
158
212
|
'scrollbar-width': 'none',
|
|
@@ -161,12 +215,10 @@ export class LibsUiComponentsScrollOverlayDirective {
|
|
|
161
215
|
'overflow-x': `${this.options()?.scrollX || 'scroll'}`,
|
|
162
216
|
'overflow-y': `${this.options()?.scrollY || 'scroll'}`,
|
|
163
217
|
};
|
|
164
|
-
Object.keys(stylesProperty).forEach((key) =>
|
|
165
|
-
|
|
166
|
-
});
|
|
167
|
-
trackEl.classList.add(`scrollbar-track`);
|
|
218
|
+
Object.keys(stylesProperty).forEach((key) => this.render2.setStyle(this.Element, key, stylesProperty[key], 1));
|
|
219
|
+
trackEl.classList.add('scrollbar-track');
|
|
168
220
|
trackEl.classList.add(`scrollbar-track-${scrollDirection}`);
|
|
169
|
-
thumbEl.classList.add(
|
|
221
|
+
thumbEl.classList.add('scrollbar-thumb');
|
|
170
222
|
thumbEl.classList.add(`scrollbar-thumb-${scrollDirection}`);
|
|
171
223
|
trackEl.appendChild(thumbEl);
|
|
172
224
|
if (this.Element.className) {
|
|
@@ -183,12 +235,12 @@ export class LibsUiComponentsScrollOverlayDirective {
|
|
|
183
235
|
if (!this.Element.className.includes('min-w-')) {
|
|
184
236
|
this.divContainer.classList.add('min-w-0');
|
|
185
237
|
}
|
|
186
|
-
if (!this.Element.className.includes('
|
|
187
|
-
this.Element.classList.add('
|
|
238
|
+
if (!this.Element.className.includes('libs-ui-scroll-overlay-element')) {
|
|
239
|
+
this.Element.classList.add('libs-ui-scroll-overlay-element');
|
|
188
240
|
}
|
|
189
241
|
}
|
|
190
|
-
if (!this.divContainer.classList.contains('
|
|
191
|
-
this.divContainer.classList.add('
|
|
242
|
+
if (!this.divContainer.classList.contains('libs-ui-scroll-overlay-container')) {
|
|
243
|
+
this.divContainer.classList.add('libs-ui-scroll-overlay-container');
|
|
192
244
|
}
|
|
193
245
|
this.divContainer.appendChild(trackEl);
|
|
194
246
|
if (!this.divContainer.style.position) {
|
|
@@ -198,11 +250,11 @@ export class LibsUiComponentsScrollOverlayDirective {
|
|
|
198
250
|
this.divContainer.append(this.Element);
|
|
199
251
|
this.updateScrollbarSize(scrollDirection);
|
|
200
252
|
}
|
|
201
|
-
bindEventsScrollBar(scrollDirection, trackEl) {
|
|
253
|
+
bindEventsScrollBar(scrollDirection, trackEl, subs) {
|
|
202
254
|
let scrollLeft = this.Element.scrollLeft;
|
|
203
255
|
let scrollTop = this.Element.scrollTop;
|
|
204
|
-
|
|
205
|
-
.pipe(tap((event) => {
|
|
256
|
+
subs.add(fromEvent(this.Element, 'scroll')
|
|
257
|
+
.pipe(tap((event) => this.scheduleScrollHandle(scrollDirection, () => {
|
|
206
258
|
const target = this.Element;
|
|
207
259
|
this.outScroll.emit(event);
|
|
208
260
|
if (scrollDirection === 'X') {
|
|
@@ -223,26 +275,26 @@ export class LibsUiComponentsScrollOverlayDirective {
|
|
|
223
275
|
scrollTop = target.scrollTop;
|
|
224
276
|
this.outScrollY.emit(event);
|
|
225
277
|
if (target.scrollTop === 0) {
|
|
226
|
-
|
|
278
|
+
this.outScrollTop.emit(event);
|
|
279
|
+
return;
|
|
227
280
|
}
|
|
228
|
-
if (target.scrollHeight <= target.scrollTop + target.offsetHeight +
|
|
229
|
-
|
|
281
|
+
if (target.scrollHeight <= target.scrollTop + target.offsetHeight + SCROLL_BOTTOM_TOLERANCE) {
|
|
282
|
+
this.outScrollBottom.emit(event);
|
|
230
283
|
}
|
|
231
|
-
}), takeUntilDestroyed(this.destroyRef))
|
|
232
|
-
.subscribe();
|
|
233
|
-
subs.add(fromEvent(document, 'resize')
|
|
234
|
-
.pipe(tap(this.updateScrollbarSize.bind(this, scrollDirection)), takeUntilDestroyed(this.destroyRef))
|
|
284
|
+
})), takeUntilDestroyed(this.destroyRef))
|
|
235
285
|
.subscribe());
|
|
236
286
|
const mouseLeave = fromEvent(this.divContainer, 'mouseleave');
|
|
237
|
-
const
|
|
238
|
-
subs.add(
|
|
287
|
+
const mouseEnter = fromEvent(this.divContainer, 'mouseenter');
|
|
288
|
+
subs.add(mouseEnter
|
|
239
289
|
.pipe(tap(() => {
|
|
240
290
|
if ((scrollDirection === 'X' && !this.options()?.scrollXOpacity0) || (scrollDirection === 'Y' && !this.options()?.scrollYOpacity0)) {
|
|
241
291
|
trackEl.style.visibility = 'visible';
|
|
242
292
|
trackEl.style.opacity = '1';
|
|
243
293
|
}
|
|
244
294
|
this.updateScrollbarSize(scrollDirection);
|
|
245
|
-
}), switchMap(() => interval(1000).pipe(takeUntil(mouseLeave))), tap(
|
|
295
|
+
}), switchMap(() => interval(1000).pipe(takeUntil(mouseLeave))), tap(() => {
|
|
296
|
+
this.updateScrollbarSize(scrollDirection);
|
|
297
|
+
}), takeUntilDestroyed(this.destroyRef))
|
|
246
298
|
.subscribe());
|
|
247
299
|
subs.add(mouseLeave
|
|
248
300
|
.pipe(tap(() => {
|
|
@@ -253,20 +305,31 @@ export class LibsUiComponentsScrollOverlayDirective {
|
|
|
253
305
|
trackEl.style.opacity = '0';
|
|
254
306
|
}), takeUntilDestroyed(this.destroyRef))
|
|
255
307
|
.subscribe());
|
|
308
|
+
}
|
|
309
|
+
/** Throttle scroll handler theo frame — gom nhiều scroll event vào 1 lần update DOM. */
|
|
310
|
+
scheduleScrollHandle(scrollDirection, handle) {
|
|
256
311
|
if (scrollDirection === 'X') {
|
|
257
|
-
this.
|
|
312
|
+
if (this.scrollRafX)
|
|
313
|
+
return;
|
|
314
|
+
this.scrollRafX = requestAnimationFrame(() => {
|
|
315
|
+
this.scrollRafX = undefined;
|
|
316
|
+
handle();
|
|
317
|
+
});
|
|
258
318
|
return;
|
|
259
319
|
}
|
|
260
|
-
if (
|
|
261
|
-
this.subsY = subs;
|
|
320
|
+
if (this.scrollRafY)
|
|
262
321
|
return;
|
|
263
|
-
|
|
322
|
+
this.scrollRafY = requestAnimationFrame(() => {
|
|
323
|
+
this.scrollRafY = undefined;
|
|
324
|
+
handle();
|
|
325
|
+
});
|
|
264
326
|
}
|
|
265
|
-
handlerClickTrack(scrollDirection) {
|
|
327
|
+
handlerClickTrack(scrollDirection, subs) {
|
|
266
328
|
const elementTrack = scrollDirection === 'X' ? this.trackX : this.trackY;
|
|
267
329
|
const elementThumb = scrollDirection === 'X' ? this.thumbX : this.thumbY;
|
|
268
|
-
|
|
269
|
-
|
|
330
|
+
subs.add(fromEvent(elementTrack, 'click')
|
|
331
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
332
|
+
.subscribe((e) => {
|
|
270
333
|
if (this.isScrollThumb()) {
|
|
271
334
|
return;
|
|
272
335
|
}
|
|
@@ -281,10 +344,9 @@ export class LibsUiComponentsScrollOverlayDirective {
|
|
|
281
344
|
this.updateScrollPositionByUserAction(scrollDirection, e, 'smooth', -1 * elementThumb.getBoundingClientRect().height);
|
|
282
345
|
}));
|
|
283
346
|
}
|
|
284
|
-
handlerDragAndDropThumb(scrollDirection) {
|
|
347
|
+
handlerDragAndDropThumb(scrollDirection, subs) {
|
|
285
348
|
const elementTrack = scrollDirection === 'X' ? this.trackX : this.trackY;
|
|
286
349
|
const elementThumb = scrollDirection === 'X' ? this.thumbX : this.thumbY;
|
|
287
|
-
const subs = scrollDirection === 'X' ? this.subsX : this.subsY;
|
|
288
350
|
let lengthThumbToPointClick = 0;
|
|
289
351
|
subs.add(getDragEventByElement({
|
|
290
352
|
elementMouseDown: elementThumb,
|
|
@@ -304,9 +366,10 @@ export class LibsUiComponentsScrollOverlayDirective {
|
|
|
304
366
|
elementTrack.style.visibility = 'hidden';
|
|
305
367
|
elementTrack.style.opacity = '0';
|
|
306
368
|
}
|
|
307
|
-
|
|
369
|
+
clearTimeout(this.mouseUpTimer);
|
|
370
|
+
this.mouseUpTimer = setTimeout(() => {
|
|
308
371
|
this.isScrollThumb.set(false);
|
|
309
|
-
},
|
|
372
|
+
}, MOUSE_UP_RESET_DELAY);
|
|
310
373
|
},
|
|
311
374
|
destroyRef: this.destroyRef,
|
|
312
375
|
}).subscribe((mouseEvent) => {
|
|
@@ -333,45 +396,48 @@ export class LibsUiComponentsScrollOverlayDirective {
|
|
|
333
396
|
if (scrollDirection === 'X') {
|
|
334
397
|
const containerWidth = this.Element.offsetWidth;
|
|
335
398
|
const contentWidth = (this.elementCheckScrollX() || this.Element).scrollWidth;
|
|
399
|
+
if (containerWidth === this.lastContainerWidth && contentWidth === this.lastContentWidth)
|
|
400
|
+
return;
|
|
401
|
+
this.lastContainerWidth = containerWidth;
|
|
402
|
+
this.lastContentWidth = contentWidth;
|
|
336
403
|
const thumbWidth = (containerWidth / contentWidth) * containerWidth;
|
|
337
|
-
this.thumbX.style.width = `${Math.max(
|
|
338
|
-
this.trackX.style.display = 'none';
|
|
339
|
-
if (contentWidth > containerWidth) {
|
|
340
|
-
this.trackX.style.display = 'block';
|
|
341
|
-
}
|
|
404
|
+
this.thumbX.style.width = `${Math.max(MIN_THUMB_SIZE, thumbWidth)}px`;
|
|
405
|
+
this.trackX.style.display = contentWidth > containerWidth ? 'block' : 'none';
|
|
342
406
|
this.updateScrollbarPosition(scrollDirection);
|
|
343
407
|
return;
|
|
344
408
|
}
|
|
345
409
|
const containerHeight = this.Element.offsetHeight;
|
|
346
410
|
const contentHeight = (this.elementCheckScrollY() || this.Element).scrollHeight;
|
|
411
|
+
if (containerHeight === this.lastContainerHeight && contentHeight === this.lastContentHeight)
|
|
412
|
+
return;
|
|
413
|
+
this.lastContainerHeight = containerHeight;
|
|
414
|
+
this.lastContentHeight = contentHeight;
|
|
347
415
|
const thumbHeight = (containerHeight / contentHeight) * containerHeight;
|
|
348
|
-
this.thumbY.style.height = `${Math.max(
|
|
349
|
-
this.trackY.style.display = 'none';
|
|
350
|
-
if (contentHeight > containerHeight) {
|
|
351
|
-
this.trackY.style.display = 'block';
|
|
352
|
-
}
|
|
416
|
+
this.thumbY.style.height = `${Math.max(MIN_THUMB_SIZE, thumbHeight)}px`;
|
|
417
|
+
this.trackY.style.display = contentHeight > containerHeight ? 'block' : 'none';
|
|
353
418
|
this.updateScrollbarPosition('Y');
|
|
354
419
|
}
|
|
355
420
|
updateScrollbarPosition(scrollDirection) {
|
|
356
421
|
if (scrollDirection === 'X') {
|
|
357
422
|
const containerWidth = this.Element.offsetWidth;
|
|
358
423
|
const contentWidth = (this.elementCheckScrollX() || this.Element).scrollWidth;
|
|
359
|
-
const
|
|
360
|
-
|
|
424
|
+
const denominatorScroll = contentWidth - containerWidth;
|
|
425
|
+
if (denominatorScroll <= 0)
|
|
426
|
+
return;
|
|
427
|
+
const denominatorThumb = containerWidth - this.thumbX.offsetWidth;
|
|
428
|
+
const thumbPosition = (this.Element.scrollLeft / denominatorScroll) * denominatorThumb;
|
|
361
429
|
this.thumbX.style.left = `${thumbPosition}px`;
|
|
362
430
|
return;
|
|
363
431
|
}
|
|
364
432
|
const containerHeight = this.Element.offsetHeight;
|
|
365
433
|
const contentHeight = (this.elementCheckScrollY() || this.Element).scrollHeight;
|
|
366
|
-
const
|
|
367
|
-
|
|
434
|
+
const denominatorScroll = contentHeight - containerHeight;
|
|
435
|
+
if (denominatorScroll <= 0)
|
|
436
|
+
return;
|
|
437
|
+
const denominatorThumb = containerHeight - this.thumbY.offsetHeight;
|
|
438
|
+
const thumbPosition = (this.Element.scrollTop / denominatorScroll) * denominatorThumb;
|
|
368
439
|
this.thumbY.style.top = `${thumbPosition}px`;
|
|
369
440
|
}
|
|
370
|
-
ngOnDestroy() {
|
|
371
|
-
this.divContainer.remove();
|
|
372
|
-
this.subsX.unsubscribe();
|
|
373
|
-
this.subsY.unsubscribe();
|
|
374
|
-
}
|
|
375
441
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsScrollOverlayDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
376
442
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: LibsUiComponentsScrollOverlayDirective, isStandalone: true, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: { debugMode: { classPropertyName: "debugMode", publicName: "debugMode", isSignal: true, isRequired: false, transformFunction: null }, ignoreInit: { classPropertyName: "ignoreInit", publicName: "ignoreInit", isSignal: true, isRequired: false, transformFunction: null }, classContainer: { classPropertyName: "classContainer", publicName: "classContainer", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, elementCheckScrollX: { classPropertyName: "elementCheckScrollX", publicName: "elementCheckScrollX", isSignal: true, isRequired: false, transformFunction: null }, elementCheckScrollY: { classPropertyName: "elementCheckScrollY", publicName: "elementCheckScrollY", isSignal: true, isRequired: false, transformFunction: null }, elementScroll: { classPropertyName: "elementScroll", publicName: "elementScroll", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outScroll: "outScroll", outScrollX: "outScrollX", outScrollY: "outScrollY", outScrollTop: "outScrollTop", outScrollBottom: "outScrollBottom" }, ngImport: i0 });
|
|
377
443
|
}
|
|
@@ -383,4 +449,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
383
449
|
standalone: true,
|
|
384
450
|
}]
|
|
385
451
|
}], ctorParameters: () => [] });
|
|
386
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLW92ZXJsYXkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3Njcm9sbC1vdmVybGF5L3NyYy9zY3JvbGwtb3ZlcmxheS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBYSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BKLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFPcEYsTUFBTSxPQUFPLHNDQUFzQztJQUNqRCxtQkFBbUI7SUFDRixNQUFNLEdBQUcsUUFBUSxDQUNoQyxHQUFHLEVBQUUsQ0FBQzs7NEJBRWtCLElBQUksQ0FBQyxjQUFjLEVBQUU7OzsyQkFHdEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MkJBMkIxQixJQUFJLENBQUMsZ0JBQWdCLEVBQUU7OzsyQkFHdkIsSUFBSSxDQUFDLHFCQUFxQixFQUFFOzs7OzhCQUl6QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDO2tCQUN2QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Ozs7Ozs7OzZCQVFaLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUM7aUJBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTs7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RCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0IsQ0FBQzt3R0EzYlUsc0NBQXNDOzRGQUF0QyxzQ0FBc0M7OzRGQUF0QyxzQ0FBc0M7a0JBTGxELFNBQVM7bUJBQUM7b0JBQ1QsOERBQThEO29CQUM5RCxRQUFRLEVBQUUsMENBQTBDO29CQUNwRCxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBEZXN0cm95UmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgUmVuZGVyZXIyLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBjaGVja01vdXNlT3ZlckluQ29udGFpbmVyLCBnZXREcmFnRXZlbnRCeUVsZW1lbnQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGZyb21FdmVudCwgaW50ZXJ2YWwsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElTY3JvbGxPdmVybGF5T3B0aW9ucywgVFlQRV9TQ1JPTExfRElSRUNUSU9OIH0gZnJvbSAnLi9zY3JvbGwuaW50ZXJmYWNlJztcbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZV0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSByZWFkb25seSBzdHlsZXMgPSBjb21wdXRlZChcbiAgICAoKSA9PiBgXG4gICAgICAuc2Nyb2xsYmFyLXRyYWNre1xuICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjoke3RoaXMuc2Nyb2xsYmFyQ29sb3IoKX07XG4gICAgICB9XG4gICAgICAuc2Nyb2xsYmFyLXRyYWNrOmhvdmVye1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiR7dGhpcy5zY3JvbGxiYXJIb3ZlckNvbG9yKCl9O1xuICAgICAgfVxuICAgICAgLnNjcm9sbGJhci10cmFjay1YIHtcbiAgICAgICAgd2lkdGg6MTAwJTtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBib3R0b206IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB6LWluZGV4OiAxO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgZWFzZSwgdmlzaWJpbGl0eSAwLjNzIGVhc2U7XG4gICAgICB9XG5cbiAgICAgIC5zY3JvbGxiYXItdHJhY2stWSB7XG4gICAgICAgIGhlaWdodDoxMDAlO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB6LWluZGV4OiAxO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgZWFzZSwgdmlzaWJpbGl0eSAwLjNzIGVhc2U7XG4gICAgICB9XG5cbiAgICAgIC5zY3JvbGxiYXItdGh1bWJ7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6JHt0aGlzLnNjcm9sbFRodW1iQ29sb3IoKX07XG4gICAgICB9XG4gICAgICAuc2Nyb2xsYmFyLXRodW1iOmhvdmVye1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiR7dGhpcy5zY3JvbGxUaHVtYkhvdmVyQ29sb3IoKX07XG4gICAgICB9XG5cbiAgICAgIC5zY3JvbGxiYXItdGh1bWItWCB7XG4gICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gJHt0aGlzLnNjcm9sbGJhclBhZGRpbmcoKSAqIDJ9cHgpO1xuICAgICAgICBib3R0b206ICR7dGhpcy5zY3JvbGxiYXJQYWRkaW5nKCl9cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgY3Vyc29yOiBncmFiYmluZztcbiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB9XG5cbiAgICAgIC5zY3JvbGxiYXItdGh1bWItWSB7XG4gICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAke3RoaXMuc2Nyb2xsYmFyUGFkZGluZygpICogMn1weCk7XG4gICAgICAgIHJpZ2h0OiAke3RoaXMuc2Nyb2xsYmFyUGFkZGluZygpfXB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGN1cnNvcjogZ3JhYmJpbmc7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zcztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgfVxuXG4gICAgICAubGliLXVpLXNjcm9sbC1vdmVybGF5LWNvbnRhaW5lciAubGliLXVpLXNjcm9sbC1vdmVybGF5LWVsZW1lbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgICAgICAgd2lkdGg6IDAgIWltcG9ydGFudDtcbiAgICAgICAgaGVpZ2h0OiAwICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gIGAsXG4gICAge31cbiAgKTtcbiAgcHJpdmF0ZSBpc1Njcm9sbFRodW1iID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBrZWVwRGlzcGxheVRodW1iID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBzdWJzWCA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBzdWJzWSA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBzY3JvbGxiYXJXaWR0aCA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3B0aW9ucygpPy5zY3JvbGxiYXJXaWR0aCA/PyAxMCk7IC8vIENoaeG7gXUgcuG7mW5nIHRoYW5oIGN14buZblxuICBwcml2YXRlIHNjcm9sbGJhclBhZGRpbmcgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsYmFyUGFkZGluZyA/PyAyKTsgLy8gQ2hp4buBdSBy4buZbmcgdGhhbmggY3Xhu5luXG4gIHByaXZhdGUgc2Nyb2xsYmFyQ29sb3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsYmFyQ29sb3IgPz8gJycpO1xuICBwcml2YXRlIHNjcm9sbGJhckhvdmVyQ29sb3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsYmFyQ29sb3IgPz8gJyNDREQwRDY0MCcpO1xuICBwcml2YXRlIHNjcm9sbFRodW1iQ29sb3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsVGh1bWJDb2xvciA/PyAnI0NERDBENicpO1xuICBwcml2YXRlIHNjcm9sbFRodW1iSG92ZXJDb2xvciA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3B0aW9ucygpPy5zY3JvbGxUaHVtYkhvdmVyQ29sb3IgPz8gJyM5Q0EyQUQnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXZDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFja1g6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGh1bWJYOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYWNrWTogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0aHVtYlk6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSBkZWJ1Z01vZGUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGlnbm9yZUluaXQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGNsYXNzQ29udGFpbmVyID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgb3B0aW9ucyA9IGlucHV0PElTY3JvbGxPdmVybGF5T3B0aW9ucyB8IHVuZGVmaW5lZD4oT2JqZWN0LmFzc2lnbih7fSkpO1xuICByZWFkb25seSBlbGVtZW50Q2hlY2tTY3JvbGxYID0gaW5wdXQ8SFRNTEVsZW1lbnQ+KCk7XG4gIHJlYWRvbmx5IGVsZW1lbnRDaGVja1Njcm9sbFkgPSBpbnB1dDxIVE1MRWxlbWVudD4oKTtcbiAgcmVhZG9ubHkgZWxlbWVudFNjcm9sbCA9IGlucHV0PEhUTUxFbGVtZW50PigpO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIHJlYWRvbmx5IG91dFNjcm9sbCA9IG91dHB1dDxFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U2Nyb2xsWCA9IG91dHB1dDxFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U2Nyb2xsWSA9IG91dHB1dDxFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U2Nyb2xsVG9wID0gb3V0cHV0PEV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxCb3R0b20gPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgLy8gI3JlZ2lvbiBJTkpFQ1RcbiAgcHJpdmF0ZSBlbGVtZW50ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlbmRlcjIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgcHJpdmF0ZSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pZ25vcmVJbml0KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgdGhpcy5kaXZDb250YWluZXIuY2xhc3NOYW1lID0gJyc7XG4gICAgICB0aGlzLmNsYXNzQ29udGFpbmVyKClcbiAgICAgICAgPy5zcGxpdCgnICcpXG4gICAgICAgIC5mb3JFYWNoKChjbGFzc05hbWUpID0+IHtcbiAgICAgICAgICBpZiAoIWNsYXNzTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRpdkNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLkVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnb3ZlcmZsb3ctaGlkZGVuJywgb3B0aW9ucz8uc2Nyb2xsWCA9PT0gJ2hpZGRlbicgJiYgb3B0aW9ucz8uc2Nyb2xsWSA9PT0gJ2hpZGRlbicpO1xuICAgICAgICBpZiAob3B0aW9ucz8uc2Nyb2xsWCAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICB0aGlzLnN1YnNYLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy50cmFja1guY2xhc3NOYW1lID0gJyc7XG4gICAgICAgICAgdGhpcy50aHVtYlguY2xhc3NOYW1lID0gJyc7XG4gICAgICAgICAgdGhpcy50cmFja1guc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5zY3JvbGxiYXJXaWR0aCgpfXB4YDtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVNjcm9sbGJhcignWCcsIHRoaXMudHJhY2tYLCB0aGlzLnRodW1iWCk7XG4gICAgICAgICAgdGhpcy5iaW5kRXZlbnRzU2Nyb2xsQmFyKCdYJywgdGhpcy50cmFja1gpO1xuXG4gICAgICAgICAgdGhpcy5oYW5kbGVyRHJhZ0FuZERyb3BUaHVtYignWCcpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlckNsaWNrVHJhY2soJ1gnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zY3JvbGxZICE9PSAnaGlkZGVuJykge1xuICAgICAgICAgIHRoaXMudHJhY2tZLmNsYXNzTmFtZSA9ICcnO1xuICAgICAgICAgIHRoaXMudGh1bWJZLmNsYXNzTmFtZSA9ICcnO1xuICAgICAgICAgIHRoaXMudHJhY2tZLnN0eWxlLndpZHRoID0gYCR7dGhpcy5zY3JvbGxiYXJXaWR0aCgpfXB4YDtcbiAgICAgICAgICB0aGlzLnN1YnNZLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy5jcmVhdGVTY3JvbGxiYXIoJ1knLCB0aGlzLnRyYWNrWSwgdGhpcy50aHVtYlkpO1xuICAgICAgICAgIHRoaXMuYmluZEV2ZW50c1Njcm9sbEJhcignWScsIHRoaXMudHJhY2tZKTtcblxuICAgICAgICAgIHRoaXMuaGFuZGxlckRyYWdBbmREcm9wVGh1bWIoJ1knKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZXJDbGlja1RyYWNrKCdZJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBGVU5DVElPTlNcbiAgcHJpdmF0ZSBnZXQgRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFNjcm9sbCgpIHx8IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTY3JvbGxiYXIoc2Nyb2xsRGlyZWN0aW9uOiBUWVBFX1NDUk9MTF9ESVJFQ1RJT04sIHRyYWNrRWw6IEhUTUxFbGVtZW50LCB0aHVtYkVsOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGlkU3R5bGVUYWcgPSAnI2lkLXN0eWxlLXRhZy1jdXN0b20tc2Nyb2xsLW92ZXJsYXknO1xuICAgIGNvbnN0IHN0eWxlRWxDdXN0b21TY3JvbGxPdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRTdHlsZVRhZyk7XG5cbiAgICBpZiAoIXN0eWxlRWxDdXN0b21TY3JvbGxPdmVybGF5KSB7XG4gICAgICBjb25zdCBzdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlRWwuc2V0QXR0cmlidXRlKCdpZCcsIGlkU3R5bGVUYWcpO1xuICAgICAgc3R5bGVFbC5pbm5lckhUTUwgPSB0aGlzLnN0eWxlcygpO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoc3R5bGVFbCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVzUHJvcGVydHkgPSB7XG4gICAgICAnYm94LXNpemluZyc6ICdib3JkZXItYm94JyxcbiAgICAgICdzY3JvbGxiYXItd2lkdGgnOiAnbm9uZScsXG4gICAgICAnc2Nyb2xsYmFyLWNvbG9yJzogdGhpcy5vcHRpb25zKCk/Lmlnbm9yZVRyYW5zcGFyZW50U2Nyb2xsQmFyQ29sb3JEZWZhdWx0ID8gJ2F1dG8nIDogJ3RyYW5zcGFyZW50IHRyYW5zcGFyZW50JyxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICdvdmVyZmxvdy14JzogYCR7dGhpcy5vcHRpb25zKCk/LnNjcm9sbFggfHwgJ3Njcm9sbCd9YCxcbiAgICAgICdvdmVyZmxvdy15JzogYCR7dGhpcy5vcHRpb25zKCk/LnNjcm9sbFkgfHwgJ3Njcm9sbCd9YCxcbiAgICB9IGFzIGFueTtcblxuICAgIE9iamVjdC5rZXlzKHN0eWxlc1Byb3BlcnR5KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHRoaXMucmVuZGVyMi5zZXRTdHlsZSh0aGlzLkVsZW1lbnQsIGtleSwgc3R5bGVzUHJvcGVydHlba2V5XSwgMSk7XG4gICAgfSk7XG5cbiAgICB0cmFja0VsLmNsYXNzTGlzdC5hZGQoYHNjcm9sbGJhci10cmFja2ApO1xuICAgIHRyYWNrRWwuY2xhc3NMaXN0LmFkZChgc2Nyb2xsYmFyLXRyYWNrLSR7c2Nyb2xsRGlyZWN0aW9ufWApO1xuXG4gICAgdGh1bWJFbC5jbGFzc0xpc3QuYWRkKGBzY3JvbGxiYXItdGh1bWJgKTtcbiAgICB0aHVtYkVsLmNsYXNzTGlzdC5hZGQoYHNjcm9sbGJhci10aHVtYi0ke3Njcm9sbERpcmVjdGlvbn1gKTtcbiAgICB0cmFja0VsLmFwcGVuZENoaWxkKHRodW1iRWwpO1xuICAgIGlmICh0aGlzLkVsZW1lbnQuY2xhc3NOYW1lKSB7XG4gICAgICB0aGlzLkVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykuZm9yRWFjaCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNsYXNzTmFtZSAmJlxuICAgICAgICAgIChbJ3ctZnVsbCcsICd3LXNjcmVlbicsICdoLWZ1bGwnLCAnaC1zY3JlZW4nLCAnc2hyaW5rLTAnXS5pbmNsdWRlcyhjbGFzc05hbWUpIHx8IGNsYXNzTmFtZS5pbmNsdWRlcygnbWluLWgtJykgfHwgY2xhc3NOYW1lLmluY2x1ZGVzKCdtaW4tdy0nKSB8fCAvXighPykoaHx3KS1cXFtbMC05XStweFxcXSQvLnRlc3QoY2xhc3NOYW1lKSkgJiZcbiAgICAgICAgICAhdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghdGhpcy5FbGVtZW50LmNsYXNzTmFtZS5pbmNsdWRlcygnbWluLWgtJykpIHtcbiAgICAgICAgdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWluLWgtMCcpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLkVsZW1lbnQuY2xhc3NOYW1lLmluY2x1ZGVzKCdtaW4tdy0nKSkge1xuICAgICAgICB0aGlzLmRpdkNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtaW4tdy0wJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuRWxlbWVudC5jbGFzc05hbWUuaW5jbHVkZXMoJ2xpYi11aS1zY3JvbGwtb3ZlcmxheS1lbGVtZW50JykpIHtcbiAgICAgICAgdGhpcy5FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xpYi11aS1zY3JvbGwtb3ZlcmxheS1lbGVtZW50Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWItdWktc2Nyb2xsLW92ZXJsYXktY29udGFpbmVyJykpIHtcbiAgICAgIHRoaXMuZGl2Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2xpYi11aS1zY3JvbGwtb3ZlcmxheS1jb250YWluZXInKTtcbiAgICB9XG4gICAgdGhpcy5kaXZDb250YWluZXIuYXBwZW5kQ2hpbGQodHJhY2tFbCk7XG5cbiAgICBpZiAoIXRoaXMuZGl2Q29udGFpbmVyLnN0eWxlLnBvc2l0aW9uKSB7XG4gICAgICB0aGlzLkVsZW1lbnQucGFyZW50RWxlbWVudD8uaW5zZXJ0QmVmb3JlKHRoaXMuZGl2Q29udGFpbmVyLCB0aGlzLkVsZW1lbnQpO1xuICAgICAgdGhpcy5kaXZDb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIH1cbiAgICB0aGlzLmRpdkNvbnRhaW5lci5hcHBlbmQodGhpcy5FbGVtZW50KTtcbiAgICB0aGlzLnVwZGF0ZVNjcm9sbGJhclNpemUoc2Nyb2xsRGlyZWN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgYmluZEV2ZW50c1Njcm9sbEJhcihzY3JvbGxEaXJlY3Rpb246IFRZUEVfU0NST0xMX0RJUkVDVElPTiwgdHJhY2tFbDogSFRNTEVsZW1lbnQpIHtcbiAgICBsZXQgc2Nyb2xsTGVmdCA9IHRoaXMuRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIGxldCBzY3JvbGxUb3AgPSB0aGlzLkVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHN1YnM6IFN1YnNjcmlwdGlvbiA9IGZyb21FdmVudDxFdmVudD4odGhpcy5FbGVtZW50LCAnc2Nyb2xsJylcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5FbGVtZW50O1xuXG4gICAgICAgICAgdGhpcy5vdXRTY3JvbGwuZW1pdChldmVudCk7XG4gICAgICAgICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LnNjcm9sbExlZnQgJiYgdGFyZ2V0LnNjcm9sbExlZnQgKyB0YXJnZXQub2Zmc2V0V2lkdGggPj0gdGFyZ2V0LnNjcm9sbFdpZHRoKSB7XG4gICAgICAgICAgICAgIHRhcmdldC5zY3JvbGxMZWZ0ID0gdGFyZ2V0LnNjcm9sbFdpZHRoIC0gdGFyZ2V0Lm9mZnNldFdpZHRoIC0gKHRhcmdldC5vZmZzZXRXaWR0aCAtIHRhcmdldC5jbGllbnRXaWR0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuc2Nyb2xsTGVmdCAhPT0gc2Nyb2xsTGVmdCkge1xuICAgICAgICAgICAgICB0aGlzLm91dFNjcm9sbFguZW1pdChldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY3JvbGxMZWZ0ID0gdGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbGJhclBvc2l0aW9uKHNjcm9sbERpcmVjdGlvbik7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGFyZ2V0LnNjcm9sbFRvcCA9PT0gc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsYmFyUG9zaXRpb24oc2Nyb2xsRGlyZWN0aW9uKTtcbiAgICAgICAgICBzY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsVG9wO1xuICAgICAgICAgIHRoaXMub3V0U2Nyb2xsWS5lbWl0KGV2ZW50KTtcblxuICAgICAgICAgIGlmICh0YXJnZXQuc2Nyb2xsVG9wID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vdXRTY3JvbGxUb3AuZW1pdChldmVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRhcmdldC5zY3JvbGxIZWlnaHQgPD0gdGFyZ2V0LnNjcm9sbFRvcCArIHRhcmdldC5vZmZzZXRIZWlnaHQgKyAzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vdXRTY3JvbGxCb3R0b20uZW1pdChldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHN1YnMuYWRkKFxuICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAncmVzaXplJylcbiAgICAgICAgLnBpcGUodGFwKHRoaXMudXBkYXRlU2Nyb2xsYmFyU2l6ZS5iaW5kKHRoaXMsIHNjcm9sbERpcmVjdGlvbikpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcblxuICAgIGNvbnN0IG1vdXNlTGVhdmUgPSBmcm9tRXZlbnQodGhpcy5kaXZDb250YWluZXIsICdtb3VzZWxlYXZlJyk7XG4gICAgY29uc3QgbW91c2VlbnRlciA9IGZyb21FdmVudCh0aGlzLmRpdkNvbnRhaW5lciwgJ21vdXNlZW50ZXInKTtcblxuICAgIHN1YnMuYWRkKFxuICAgICAgbW91c2VlbnRlclxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKChzY3JvbGxEaXJlY3Rpb24gPT09ICdYJyAmJiAhdGhpcy5vcHRpb25zKCk/LnNjcm9sbFhPcGFjaXR5MCkgfHwgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1knICYmICF0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsWU9wYWNpdHkwKSkge1xuICAgICAgICAgICAgICB0cmFja0VsLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgICAgICAgIHRyYWNrRWwuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsYmFyU2l6ZShzY3JvbGxEaXJlY3Rpb24pO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiBpbnRlcnZhbCgxMDAwKS5waXBlKHRha2VVbnRpbChtb3VzZUxlYXZlKSkpLFxuICAgICAgICAgIHRhcCh0aGlzLnVwZGF0ZVNjcm9sbGJhclNpemUuYmluZCh0aGlzLCBzY3JvbGxEaXJlY3Rpb24pKSxcbiAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG5cbiAgICBzdWJzLmFkZChcbiAgICAgIG1vdXNlTGVhdmVcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmtlZXBEaXNwbGF5VGh1bWIoKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFja0VsLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIHRyYWNrRWwuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG5cbiAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcpIHtcbiAgICAgIHRoaXMuc3Vic1ggPSBzdWJzO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1knKSB7XG4gICAgICB0aGlzLnN1YnNZID0gc3VicztcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tUcmFjayhzY3JvbGxEaXJlY3Rpb246IFRZUEVfU0NST0xMX0RJUkVDVElPTikge1xuICAgIGNvbnN0IGVsZW1lbnRUcmFjayA9IHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnID8gdGhpcy50cmFja1ggOiB0aGlzLnRyYWNrWTtcbiAgICBjb25zdCBlbGVtZW50VGh1bWIgPSBzY3JvbGxEaXJlY3Rpb24gPT09ICdYJyA/IHRoaXMudGh1bWJYIDogdGhpcy50aHVtYlk7XG4gICAgY29uc3Qgc3VicyA9IHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnID8gdGhpcy5zdWJzWCA6IHRoaXMuc3Vic1k7XG5cbiAgICBzdWJzLmFkZChcbiAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50PihlbGVtZW50VHJhY2ssICdjbGljaycpLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc1Njcm9sbFRodW1iKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChzY3JvbGxEaXJlY3Rpb24gPT09ICdYJyAmJiBlLmNsaWVudFggPCBlbGVtZW50VGh1bWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCkgfHwgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1knICYmIGUuY2xpZW50WSA8IGVsZW1lbnRUaHVtYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxQb3NpdGlvbkJ5VXNlckFjdGlvbihzY3JvbGxEaXJlY3Rpb24sIGUsICdzbW9vdGgnLCAwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbFBvc2l0aW9uQnlVc2VyQWN0aW9uKHNjcm9sbERpcmVjdGlvbiwgZSwgJ3Ntb290aCcsIC0xICogZWxlbWVudFRodW1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxQb3NpdGlvbkJ5VXNlckFjdGlvbihzY3JvbGxEaXJlY3Rpb24sIGUsICdzbW9vdGgnLCAtMSAqIGVsZW1lbnRUaHVtYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJEcmFnQW5kRHJvcFRodW1iKHNjcm9sbERpcmVjdGlvbjogVFlQRV9TQ1JPTExfRElSRUNUSU9OKSB7XG4gICAgY29uc3QgZWxlbWVudFRyYWNrID0gc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcgPyB0aGlzLnRyYWNrWCA6IHRoaXMudHJhY2tZO1xuICAgIGNvbnN0IGVsZW1lbnRUaHVtYiA9IHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnID8gdGhpcy50aHVtYlggOiB0aGlzLnRodW1iWTtcbiAgICBjb25zdCBzdWJzID0gc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcgPyB0aGlzLnN1YnNYIDogdGhpcy5zdWJzWTtcbiAgICBsZXQgbGVuZ3RoVGh1bWJUb1BvaW50Q2xpY2sgPSAwO1xuXG4gICAgc3Vicy5hZGQoXG4gICAgICBnZXREcmFnRXZlbnRCeUVsZW1lbnQoe1xuICAgICAgICBlbGVtZW50TW91c2VEb3duOiBlbGVtZW50VGh1bWIsXG4gICAgICAgIGZ1bmN0aW9uTW91c2VEb3duOiAobW91c2VFdmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNTY3JvbGxUaHVtYi5zZXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5rZWVwRGlzcGxheVRodW1iLnNldCh0cnVlKTtcbiAgICAgICAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcpIHtcbiAgICAgICAgICAgIGxlbmd0aFRodW1iVG9Qb2ludENsaWNrID0gZWxlbWVudFRodW1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBtb3VzZUV2ZW50LmNsaWVudFg7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbmd0aFRodW1iVG9Qb2ludENsaWNrID0gZWxlbWVudFRodW1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIG1vdXNlRXZlbnQuY2xpZW50WTtcbiAgICAgICAgfSxcbiAgICAgICAgZnVuY3Rpb25Nb3VzZVVwOiAobW91c2VFdmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMua2VlcERpc3BsYXlUaHVtYi5zZXQoZmFsc2UpO1xuICAgICAgICAgIGxlbmd0aFRodW1iVG9Qb2ludENsaWNrID0gMDtcbiAgICAgICAgICBpZiAoIWNoZWNrTW91c2VPdmVySW5Db250YWluZXIobW91c2VFdmVudCwgdGhpcy5FbGVtZW50KSkge1xuICAgICAgICAgICAgZWxlbWVudFRyYWNrLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIGVsZW1lbnRUcmFjay5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxUaHVtYi5zZXQoZmFsc2UpO1xuICAgICAgICAgIH0sIDI1MCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc3Ryb3lSZWY6IHRoaXMuZGVzdHJveVJlZixcbiAgICAgIH0pLnN1YnNjcmliZSgobW91c2VFdmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbFBvc2l0aW9uQnlVc2VyQWN0aW9uKHNjcm9sbERpcmVjdGlvbiwgbW91c2VFdmVudCwgJ2F1dG8nLCBsZW5ndGhUaHVtYlRvUG9pbnRDbGljayk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNjcm9sbFBvc2l0aW9uQnlVc2VyQWN0aW9uKHNjcm9sbERpcmVjdGlvbjogVFlQRV9TQ1JPTExfRElSRUNUSU9OLCBlOiBNb3VzZUV2ZW50LCBiZWhhdmlvcjogJ2F1dG8nIHwgJ3Ntb290aCcsIGxlbmd0aFRodW1iVG9Qb2ludENsaWNrID0gMCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnKSB7XG4gICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMuRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9ICh0aGlzLmVsZW1lbnRDaGVja1Njcm9sbFgoKSB8fCB0aGlzLkVsZW1lbnQpLnNjcm9sbFdpZHRoO1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IGUuY2xpZW50WCAtIHRoaXMuRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgbGVuZ3RoVGh1bWJUb1BvaW50Q2xpY2s7XG4gICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gKHRodW1iUG9zaXRpb24gLyAoY29udGFpbmVyV2lkdGggLSB0aGlzLnRodW1iWC5vZmZzZXRXaWR0aCkpICogKGNvbnRlbnRXaWR0aCAtIGNvbnRhaW5lcldpZHRoKTtcblxuICAgICAgdGhpcy5FbGVtZW50LnNjcm9sbCh7IGxlZnQ6IHNjcm9sbExlZnQsIGJlaGF2aW9yIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSB0aGlzLkVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIGNvbnN0IGNvbnRlbnRIZWlnaHQgPSAodGhpcy5lbGVtZW50Q2hlY2tTY3JvbGxZKCkgfHwgdGhpcy5FbGVtZW50KS5zY3JvbGxIZWlnaHQ7XG4gICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IGUuY2xpZW50WSAtIHRoaXMuRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBsZW5ndGhUaHVtYlRvUG9pbnRDbGljaztcbiAgICBjb25zdCBzY3JvbGxUb3AgPSAodGh1bWJQb3NpdGlvbiAvIChjb250YWluZXJIZWlnaHQgLSB0aGlzLnRodW1iWS5vZmZzZXRIZWlnaHQpKSAqIChjb250ZW50SGVpZ2h0IC0gY29udGFpbmVySGVpZ2h0KTtcblxuICAgIHRoaXMuRWxlbWVudC5zY3JvbGwoeyB0b3A6IHNjcm9sbFRvcCwgYmVoYXZpb3IgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNjcm9sbGJhclNpemUoc2Nyb2xsRGlyZWN0aW9uOiBUWVBFX1NDUk9MTF9ESVJFQ1RJT04pIHtcbiAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5FbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgY29uc3QgY29udGVudFdpZHRoID0gKHRoaXMuZWxlbWVudENoZWNrU2Nyb2xsWCgpIHx8IHRoaXMuRWxlbWVudCkuc2Nyb2xsV2lkdGg7XG4gICAgICBjb25zdCB0aHVtYldpZHRoID0gKGNvbnRhaW5lcldpZHRoIC8gY29udGVudFdpZHRoKSAqIGNvbnRhaW5lcldpZHRoO1xuXG4gICAgICB0aGlzLnRodW1iWC5zdHlsZS53aWR0aCA9IGAke01hdGgubWF4KDIwLCB0aHVtYldpZHRoKX1weGA7XG4gICAgICB0aGlzLnRyYWNrWC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgaWYgKGNvbnRlbnRXaWR0aCA+IGNvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgIHRoaXMudHJhY2tYLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVTY3JvbGxiYXJQb3NpdGlvbihzY3JvbGxEaXJlY3Rpb24pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gdGhpcy5FbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gKHRoaXMuZWxlbWVudENoZWNrU2Nyb2xsWSgpIHx8IHRoaXMuRWxlbWVudCkuc2Nyb2xsSGVpZ2h0O1xuICAgIGNvbnN0IHRodW1iSGVpZ2h0ID0gKGNvbnRhaW5lckhlaWdodCAvIGNvbnRlbnRIZWlnaHQpICogY29udGFpbmVySGVpZ2h0O1xuXG4gICAgdGhpcy50aHVtYlkuc3R5bGUuaGVpZ2h0ID0gYCR7TWF0aC5tYXgoMjAsIHRodW1iSGVpZ2h0KX1weGA7XG4gICAgdGhpcy50cmFja1kuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAoY29udGVudEhlaWdodCA+IGNvbnRhaW5lckhlaWdodCkge1xuICAgICAgdGhpcy50cmFja1kuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTY3JvbGxiYXJQb3NpdGlvbignWScpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTY3JvbGxiYXJQb3NpdGlvbihzY3JvbGxEaXJlY3Rpb246IFRZUEVfU0NST0xMX0RJUkVDVElPTikge1xuICAgIGlmIChzY3JvbGxEaXJlY3Rpb24gPT09ICdYJykge1xuICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSB0aGlzLkVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICBjb25zdCBjb250ZW50V2lkdGggPSAodGhpcy5lbGVtZW50Q2hlY2tTY3JvbGxYKCkgfHwgdGhpcy5FbGVtZW50KS5zY3JvbGxXaWR0aDtcbiAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSB0aGlzLkVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSAoc2Nyb2xsTGVmdCAvIChjb250ZW50V2lkdGggLSBjb250YWluZXJXaWR0aCkpICogKGNvbnRhaW5lcldpZHRoIC0gdGhpcy50aHVtYlgub2Zmc2V0V2lkdGgpO1xuXG4gICAgICB0aGlzLnRodW1iWC5zdHlsZS5sZWZ0ID0gYCR7dGh1bWJQb3NpdGlvbn1weGA7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gdGhpcy5FbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gKHRoaXMuZWxlbWVudENoZWNrU2Nyb2xsWSgpIHx8IHRoaXMuRWxlbWVudCkuc2Nyb2xsSGVpZ2h0O1xuICAgIGNvbnN0IHNjcm9sbFRvcCA9IHRoaXMuRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IChzY3JvbGxUb3AgLyAoY29udGVudEhlaWdodCAtIGNvbnRhaW5lckhlaWdodCkpICogKGNvbnRhaW5lckhlaWdodCAtIHRoaXMudGh1bWJZLm9mZnNldEhlaWdodCk7XG5cbiAgICB0aGlzLnRodW1iWS5zdHlsZS50b3AgPSBgJHt0aHVtYlBvc2l0aW9ufXB4YDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGl2Q29udGFpbmVyLnJlbW92ZSgpO1xuICAgIHRoaXMuc3Vic1gudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnN1YnNZLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==
|
|
452
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLW92ZXJsYXkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3Njcm9sbC1vdmVybGF5L3NyYy9zY3JvbGwtb3ZlcmxheS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekksT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUdwRixNQUFNLFlBQVksR0FBRyxrQ0FBa0MsQ0FBQztBQUN4RCxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUNsQyxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFDakMsTUFBTSw2QkFBNkIsR0FBRyxXQUFXLENBQUM7QUFDbEQsTUFBTSwwQkFBMEIsR0FBRyxTQUFTLENBQUM7QUFDN0MsTUFBTSxnQ0FBZ0MsR0FBRyxTQUFTLENBQUM7QUFFbkQ7OztHQUdHO0FBQ0gsTUFBTSxhQUFhLEdBQUc7Ozs7OzREQUtzQyw2QkFBNkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0RBeUJuQywwQkFBMEI7Ozs0REFHcEIsZ0NBQWdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBc0IzRixDQUFDO0FBRUYsTUFBTSxjQUFj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QUMsWUFBWSxDQUFDO1FBQ2hGLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxHQUFHLGVBQWUsQ0FBQztRQUMxRCxJQUFJLGlCQUFpQixJQUFJLENBQUM7WUFBRSxPQUFPO1FBQ25DLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ3BFLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztRQUN0RixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxhQUFhLElBQUksQ0FBQztJQUMvQyxDQUFDO3dHQXJaVSxzQ0FBc0M7NEZBQXRDLHNDQUFzQzs7NEZBQXRDLHNDQUFzQztrQkFMbEQsU0FBUzttQkFBQztvQkFDVCw4REFBOEQ7b0JBQzlELFFBQVEsRUFBRSwwQ0FBMEM7b0JBQ3BELFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc3Ryb3lSZWYsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBjaGVja01vdXNlT3ZlckluQ29udGFpbmVyLCBnZXREcmFnRXZlbnRCeUVsZW1lbnQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGZyb21FdmVudCwgaW50ZXJ2YWwsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElTY3JvbGxPdmVybGF5T3B0aW9ucywgVFlQRV9TQ1JPTExfRElSRUNUSU9OIH0gZnJvbSAnLi9zY3JvbGwuaW50ZXJmYWNlJztcblxuY29uc3QgU1RZTEVfVEFHX0lEID0gJ2xpYnMtdWktc2Nyb2xsLW92ZXJsYXktc3R5bGUtdGFnJztcbmNvbnN0IFNDUk9MTF9CT1RUT01fVE9MRVJBTkNFID0gMztcbmNvbnN0IE1JTl9USFVNQl9TSVpFID0gMjA7XG5jb25zdCBNT1VTRV9VUF9SRVNFVF9ERUxBWSA9IDI1MDtcbmNvbnN0IERFRkFVTFRfU0NST0xMQkFSX0hPVkVSX0NPTE9SID0gJyNDREQwRDY0MCc7XG5jb25zdCBERUZBVUxUX1NDUk9MTF9USFVNQl9DT0xPUiA9ICcjQ0REMEQ2JztcbmNvbnN0IERFRkFVTFRfU0NST0xMX1RIVU1CX0hPVkVSX0NPTE9SID0gJyM5Q0EyQUQnO1xuXG4vKipcbiAqIENTUyBjaGlhIHPhursgY2hvIG3hu41pIGluc3RhbmNlLiBNw6B1L3BhZGRpbmcgbOG6pXkgcXVhIENTUyB2YXJpYWJsZXMgxJHhu4MgbeG7l2lcbiAqIGRpcmVjdGl2ZSBpbnN0YW5jZSBjw7MgdGjhu4MgY3VzdG9tIMSR4buZYyBs4bqtcCBtw6Aga2jDtG5nIHBo4bqjaSByZS13cml0ZSBzdHlsZSB0YWcuXG4gKi9cbmNvbnN0IFNUWUxFX0NPTlRFTlQgPSBgXG4gIC5saWJzLXVpLXNjcm9sbC1vdmVybGF5LWNvbnRhaW5lciAuc2Nyb2xsYmFyLXRyYWNrIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1saWJzLXVpLXNiLXRyYWNrLWNvbG9yLCB0cmFuc3BhcmVudCk7XG4gIH1cbiAgLmxpYnMtdWktc2Nyb2xsLW92ZXJsYXktY29udGFpbmVyIC5zY3JvbGxiYXItdHJhY2s6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpYnMtdWktc2ItdHJhY2staG92ZXItY29sb3IsICR7REVGQVVMVF9TQ1JPTExCQVJfSE9WRVJfQ09MT1J9KTtcbiAgfVxuICAubGlicy11aS1zY3JvbGwtb3ZlcmxheS1jb250YWluZXIgLnNjcm9sbGJhci10cmFjay1YIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHotaW5kZXg6IDE7XG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGVhc2UsIHZpc2liaWxpdHkgMC4zcyBlYXNlO1xuICB9XG4gIC5saWJzLXVpLXNjcm9sbC1vdmVybGF5LWNvbnRhaW5lciAuc2Nyb2xsYmFyLXRyYWNrLVkge1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgb3BhY2l0eTogMDtcbiAgICB6LWluZGV4OiAxO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlLCB2aXNpYmlsaXR5IDAuM3MgZWFzZTtcbiAgfVxuICAubGlicy11aS1zY3JvbGwtb3ZlcmxheS1jb250YWluZXIgLnNjcm9sbGJhci10aHVtYiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlicy11aS1zYi10aHVtYi1jb2xvciwgJHtERUZBVUxUX1NDUk9MTF9USFVNQl9DT0xPUn0pO1xuICB9XG4gIC5saWJzLXVpLXNjcm9sbC1vdmVybGF5LWNvbnRhaW5lciAuc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1saWJzLXVpLXNiLXRodW1iLWhvdmVyLWNvbG9yLCAke0RFRkFVTFRfU0NST0xMX1RIVU1CX0hPVkVSX0NPTE9SfSk7XG4gIH1cbiAgLmxpYnMtdWktc2Nyb2xsLW92ZXJsYXktY29udGFpbmVyIC5zY3JvbGxiYXItdGh1bWItWCB7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSB2YXIoLS1saWJzLXVpLXNiLXBhZGRpbmctZG91YmxlLCA0cHgpKTtcbiAgICBib3R0b206IHZhcigtLWxpYnMtdWktc2ItcGFkZGluZywgMnB4KTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgY3Vyc29yOiBncmFiYmluZztcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3M7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICB9XG4gIC5saWJzLXVpLXNjcm9sbC1vdmVybGF5LWNvbnRhaW5lciAuc2Nyb2xsYmFyLXRodW1iLVkge1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLSB2YXIoLS1saWJzLXVpLXNiLXBhZGRpbmctZG91YmxlLCA0cHgpKTtcbiAgICByaWdodDogdmFyKC0tbGlicy11aS1zYi1wYWRkaW5nLCAycHgpO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBjdXJzb3I6IGdyYWJiaW5nO1xuICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zcztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIH1cbiAgLmxpYnMtdWktc2Nyb2xsLW92ZXJsYXktY29udGFpbmVyIC5saWJzLXVpLXNjcm9sbC1vdmVybGF5LWVsZW1lbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgICB3aWR0aDogMCAhaW1wb3J0YW50O1xuICAgIGhlaWdodDogMCAhaW1wb3J0YW50O1xuICB9XG5gO1xuXG5jb25zdCBlbnN1cmVTdHlsZVRhZyA9ICgpID0+IHtcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFNUWUxFX1RBR19JRCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc3R5bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gIHN0eWxlRWwuaWQgPSBTVFlMRV9UQUdfSUQ7XG4gIHN0eWxlRWwudGV4dENvbnRlbnQgPSBTVFlMRV9DT05URU5UO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZChzdHlsZUVsKTtcbn07XG5cbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZV0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSBpc1Njcm9sbFRodW1iID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBrZWVwRGlzcGxheVRodW1iID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBzdWJzWCA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBzdWJzWSA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgLyoqIFRpbWVyIHJlc2V0IGlzU2Nyb2xsVGh1bWIgc2F1IGRyYWcgZW5kIOKAlCBwaOG6o2kgY2xlYXIga2hpIGRlc3Ryb3kgxJHhu4MgdHLDoW5oIHNldCBzaWduYWwgdHLDqm4gaW5zdGFuY2UgxJHDoyB0ZWFyZG93bi4gKi9cbiAgcHJpdmF0ZSBtb3VzZVVwVGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgLyoqIHJBRiB0aHJvdHRsZSBjaG8gc2Nyb2xsIGhhbmRsZXIg4oCUIGdvbSBtdWx0aXBsZSBzY3JvbGwgZXZlbnRzIHbhu4EgMSBs4bqnbiB1cGRhdGUgRE9NIG3hu5dpIGZyYW1lLiAqL1xuICBwcml2YXRlIHNjcm9sbFJhZlg/OiBudW1iZXI7XG4gIHByaXZhdGUgc2Nyb2xsUmFmWT86IG51bWJlcjtcbiAgLyoqIENhY2hlIGRpbWVuc2lvbnMg4oCUIHNraXAgRE9NIHdyaXRlIG7hur91IGvDrWNoIHRoxrDhu5tjIGtow7RuZyDEkeG7lWkgZ2nhu69hIDIgbOG6p24gcG9sbC4gKi9cbiAgcHJpdmF0ZSBsYXN0Q29udGVudFdpZHRoID0gMDtcbiAgcHJpdmF0ZSBsYXN0Q29udGVudEhlaWdodCA9IDA7XG4gIHByaXZhdGUgbGFzdENvbnRhaW5lcldpZHRoID0gMDtcbiAgcHJpdmF0ZSBsYXN0Q29udGFpbmVySGVpZ2h0ID0gMDtcblxuICBwcml2YXRlIHNjcm9sbGJhcldpZHRoID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCk/LnNjcm9sbGJhcldpZHRoID8/IDEwKTtcbiAgcHJpdmF0ZSBzY3JvbGxiYXJQYWRkaW5nID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCk/LnNjcm9sbGJhclBhZGRpbmcgPz8gMik7XG4gIHByaXZhdGUgc2Nyb2xsYmFyQ29sb3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsYmFyQ29sb3IgPz8gJycpO1xuICBwcml2YXRlIHNjcm9sbGJhckhvdmVyQ29sb3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsYmFySG92ZXJDb2xvciA/PyBERUZBVUxUX1NDUk9MTEJBUl9IT1ZFUl9DT0xPUik7XG4gIHByaXZhdGUgc2Nyb2xsVGh1bWJDb2xvciA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3B0aW9ucygpPy5zY3JvbGxUaHVtYkNvbG9yID8/IERFRkFVTFRfU0NST0xMX1RIVU1CX0NPTE9SKTtcbiAgcHJpdmF0ZSBzY3JvbGxUaHVtYkhvdmVyQ29sb3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKT8uc2Nyb2xsVGh1bWJIb3ZlckNvbG9yID8/IERFRkFVTFRfU0NST0xMX1RIVU1CX0hPVkVSX0NPTE9SKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRpdkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYWNrWDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0aHVtYlg6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhY2tZOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRodW1iWTogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IGRlYnVnTW9kZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgaWdub3JlSW5pdCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgY2xhc3NDb250YWluZXIgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/ICcnIH0pO1xuICByZWFkb25seSBvcHRpb25zID0gaW5wdXQ8SVNjcm9sbE92ZXJsYXlPcHRpb25zIHwgdW5kZWZpbmVkPihPYmplY3QuYXNzaWduKHt9KSk7XG4gIHJlYWRvbmx5IGVsZW1lbnRDaGVja1Njcm9sbFggPSBpbnB1dDxIVE1MRWxlbWVudD4oKTtcbiAgcmVhZG9ubHkgZWxlbWVudENoZWNrU2Nyb2xsWSA9IGlucHV0PEhUTUxFbGVtZW50PigpO1xuICByZWFkb25seSBlbGVtZW50U2Nyb2xsID0gaW5wdXQ8SFRNTEVsZW1lbnQ+KCk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgcmVhZG9ubHkgb3V0U2Nyb2xsID0gb3V0cHV0PEV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxYID0gb3V0cHV0PEV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxZID0gb3V0cHV0PEV2ZW50PigpO1xuICByZWFkb25seSBvdXRTY3JvbGxUb3AgPSBvdXRwdXQ8RXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dFNjcm9sbEJvdHRvbSA9IG91dHB1dDxFdmVudD4oKTtcblxuICAvLyAjcmVnaW9uIElOSkVDVFxuICBwcml2YXRlIGVsZW1lbnQgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVuZGVyMiA9IGluamVjdChSZW5kZXJlcjIpO1xuICBwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gU2V0dXAgc2Nyb2xsYmFycyBraGkgb3B0aW9ucy9jbGFzc0NvbnRhaW5lciDEkeG7lWkuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlnbm9yZUluaXQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zKCk7XG4gICAgICBjb25zdCBjbGFzc0NvbnRhaW5lciA9IHRoaXMuY2xhc3NDb250YWluZXIoKTtcblxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5zeW5jQ29udGFpbmVyRXh0cmFDbGFzc2VzKGNsYXNzQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5FbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ292ZXJmbG93LWhpZGRlbicsIG9wdGlvbnM/LnNjcm9sbFggPT09ICdoaWRkZW4nICYmIG9wdGlvbnM/LnNjcm9sbFkgPT09ICdoaWRkZW4nKTtcblxuICAgICAgICBpZiAob3B0aW9ucz8uc2Nyb2xsWCAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICB0aGlzLnN1YnNYLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy5zdWJzWCA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICB0aGlzLnRyYWNrWC5jbGFzc05hbWUgPSAnJztcbiAgICAgICAgICB0aGlzLnRodW1iWC5jbGFzc05hbWUgPSAnJztcbiAgICAgICAgICB0aGlzLnRyYWNrWC5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLnNjcm9sbGJhcldpZHRoKCl9cHhgO1xuICAgICAgICAgIHRoaXMuY3JlYXRlU2Nyb2xsYmFyKCdYJywgdGhpcy50cmFja1gsIHRoaXMudGh1bWJYKTtcbiAgICAgICAgICB0aGlzLmJpbmRFdmVudHNTY3JvbGxCYXIoJ1gnLCB0aGlzLnRyYWNrWCwgdGhpcy5zdWJzWCk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVyRHJhZ0FuZERyb3BUaHVtYignWCcsIHRoaXMuc3Vic1gpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlckNsaWNrVHJhY2soJ1gnLCB0aGlzLnN1YnNYKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zY3JvbGxZICE9PSAnaGlkZGVuJykge1xuICAgICAgICAgIHRoaXMuc3Vic1kudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB0aGlzLnN1YnNZID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgICAgICAgIHRoaXMudHJhY2tZLmNsYXNzTmFtZSA9ICcnO1xuICAgICAgICAgIHRoaXMudGh1bWJZLmNsYXNzTmFtZSA9ICcnO1xuICAgICAgICAgIHRoaXMudHJhY2tZLnN0eWxlLndpZHRoID0gYCR7dGhpcy5zY3JvbGxiYXJXaWR0aCgpfXB4YDtcbiAgICAgICAgICB0aGlzLmNyZWF0ZVNjcm9sbGJhcignWScsIHRoaXMudHJhY2tZLCB0aGlzLnRodW1iWSk7XG4gICAgICAgICAgdGhpcy5iaW5kRXZlbnRzU2Nyb2xsQmFyKCdZJywgdGhpcy50cmFja1ksIHRoaXMuc3Vic1kpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlckRyYWdBbmREcm9wVGh1bWIoJ1knLCB0aGlzLnN1YnNZKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZXJDbGlja1RyYWNrKCdZJywgdGhpcy5zdWJzWSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gU3luYyBDU1MgdmFyaWFibGVzIHBlci1pbnN0YW5jZSDigJQga2jDtG5nIMSR4bulbmcgc3R5bGUgdGFnIGNoaWEgc+G6uyBnaeG7r2EgY8OhYyBpbnN0YW5jZS5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qgc2JDb2xvciA9IHRoaXMuc2Nyb2xsYmFyQ29sb3IoKTtcbiAgICAgIGNvbnN0IHNiSG92ZXIgPSB0aGlzLnNjcm9sbGJhckhvdmVyQ29sb3IoKTtcbiAgICAgIGNvbnN0IHRoQ29sb3IgPSB0aGlzLnNjcm9sbFRodW1iQ29sb3IoKTtcbiAgICAgIGNvbnN0IHRoSG92ZXIgPSB0aGlzLnNjcm9sbFRodW1iSG92ZXJDb2xvcigpO1xuICAgICAgY29uc3QgcGFkZGluZyA9IHRoaXMuc2Nyb2xsYmFyUGFkZGluZygpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGl2U3R5bGUgPSB0aGlzLmRpdkNvbnRhaW5lci5zdHlsZTtcbiAgICAgICAgZGl2U3R5bGUuc2V0UHJvcGVydHkoJy0tbGlicy11aS1zYi10cmFjay1jb2xvcicsIHNiQ29sb3IpO1xuICAgICAgICBkaXZTdHlsZS5zZXRQcm9wZXJ0eSgnLS1saWJzLXVpLXNiLXRyYWNrLWhvdmVyLWNvbG9yJywgc2JIb3Zlcik7XG4gICAgICAgIGRpdlN0eWxlLnNldFByb3BlcnR5KCctLWxpYnMtdWktc2ItdGh1bWItY29sb3InLCB0aENvbG9yKTtcbiAgICAgICAgZGl2U3R5bGUuc2V0UHJvcGVydHkoJy0tbGlicy11aS1zYi10aHVtYi1ob3Zlci1jb2xvcicsIHRoSG92ZXIpO1xuICAgICAgICBkaXZTdHlsZS5zZXRQcm9wZXJ0eSgnLS1saWJzLXVpLXNiLXBhZGRpbmcnLCBgJHtwYWRkaW5nfXB4YCk7XG4gICAgICAgIGRpdlN0eWxlLnNldFByb3BlcnR5KCctLWxpYnMtdWktc2ItcGFkZGluZy1kb3VibGUnLCBgJHtwYWRkaW5nICogMn1weGApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBXaW5kb3cgcmVzaXplIOKGkiByZS1tZWFzdXJlIHRodW1iIHNpemUgY2hvIGPhuqMgMiB0cuG7pWMuXG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbGJhclNpemUoJ1gnKTtcbiAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxiYXJTaXplKCdZJyk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubW91c2VVcFRpbWVyKTtcbiAgICAgIGlmICh0aGlzLnNjcm9sbFJhZlgpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuc2Nyb2xsUmFmWCk7XG4gICAgICBpZiAodGhpcy5zY3JvbGxSYWZZKSBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjcm9sbFJhZlkpO1xuICAgICAgdGhpcy5kaXZDb250YWluZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLnN1YnNYLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnN1YnNZLnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAjcmVnaW9uIEZVTkNUSU9OU1xuICBwcml2YXRlIGdldCBFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50U2Nyb2xsKCkgfHwgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICAvKiogVGjDqm0gY8OhYyBjbGFzcyBjb25zdW1lciB0cnV54buBbiBxdWEgW2NsYXNzQ29udGFpbmVyXSBtw6Aga2jDtG5nIHjDs2EgY2xhc3MgaOG7hyB0aOG7kW5nIMSRw6Mgc2V0LiAqL1xuICBwcml2YXRlIHN5bmNDb250YWluZXJFeHRyYUNsYXNzZXMoY2xhc3NTdHI6IHN0cmluZykge1xuICAgIGNsYXNzU3RyXG4gICAgICAuc3BsaXQoJyAnKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmZvckVhY2goKGNsYXNzTmFtZSkgPT4gdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2Nyb2xsYmFyKHNjcm9sbERpcmVjdGlvbjogVFlQRV9TQ1JPTExfRElSRUNUSU9OLCB0cmFja0VsOiBIVE1MRWxlbWVudCwgdGh1bWJFbDogSFRNTEVsZW1lbnQpIHtcbiAgICBlbnN1cmVTdHlsZVRhZygpO1xuXG4gICAgY29uc3Qgc3R5bGVzUHJvcGVydHkgPSB7XG4gICAgICAnYm94LXNpemluZyc6ICdib3JkZXItYm94JyxcbiAgICAgICdzY3JvbGxiYXItd2lkdGgnOiAnbm9uZScsXG4gICAgICAnc2Nyb2xsYmFyLWNvbG9yJzogdGhpcy5vcHRpb25zKCk/Lmlnbm9yZVRyYW5zcGFyZW50U2Nyb2xsQmFyQ29sb3JEZWZhdWx0ID8gJ2F1dG8nIDogJ3RyYW5zcGFyZW50IHRyYW5zcGFyZW50JyxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICdvdmVyZmxvdy14JzogYCR7dGhpcy5vcHRpb25zKCk/LnNjcm9sbFggfHwgJ3Njcm9sbCd9YCxcbiAgICAgICdvdmVyZmxvdy15JzogYCR7dGhpcy5vcHRpb25zKCk/LnNjcm9sbFkgfHwgJ3Njcm9sbCd9YCxcbiAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgT2JqZWN0LmtleXMoc3R5bGVzUHJvcGVydHkpLmZvckVhY2goKGtleSkgPT4gdGhpcy5yZW5kZXIyLnNldFN0eWxlKHRoaXMuRWxlbWVudCwga2V5LCBzdHlsZXNQcm9wZXJ0eVtrZXldLCAxKSk7XG5cbiAgICB0cmFja0VsLmNsYXNzTGlzdC5hZGQoJ3Njcm9sbGJhci10cmFjaycpO1xuICAgIHRyYWNrRWwuY2xhc3NMaXN0LmFkZChgc2Nyb2xsYmFyLXRyYWNrLSR7c2Nyb2xsRGlyZWN0aW9ufWApO1xuICAgIHRodW1iRWwuY2xhc3NMaXN0LmFkZCgnc2Nyb2xsYmFyLXRodW1iJyk7XG4gICAgdGh1bWJFbC5jbGFzc0xpc3QuYWRkKGBzY3JvbGxiYXItdGh1bWItJHtzY3JvbGxEaXJlY3Rpb259YCk7XG4gICAgdHJhY2tFbC5hcHBlbmRDaGlsZCh0aHVtYkVsKTtcblxuICAgIGlmICh0aGlzLkVsZW1lbnQuY2xhc3NOYW1lKSB7XG4gICAgICB0aGlzLkVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykuZm9yRWFjaCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNsYXNzTmFtZSAmJlxuICAgICAgICAgIChbJ3ctZnVsbCcsICd3LXNjcmVlbicsICdoLWZ1bGwnLCAnaC1zY3JlZW4nLCAnc2hyaW5rLTAnXS5pbmNsdWRlcyhjbGFzc05hbWUpIHx8IGNsYXNzTmFtZS5pbmNsdWRlcygnbWluLWgtJykgfHwgY2xhc3NOYW1lLmluY2x1ZGVzKCdtaW4tdy0nKSB8fCAvXighPykoaHx3KS1cXFtbMC05XStweFxcXSQvLnRlc3QoY2xhc3NOYW1lKSkgJiZcbiAgICAgICAgICAhdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghdGhpcy5FbGVtZW50LmNsYXNzTmFtZS5pbmNsdWRlcygnbWluLWgtJykpIHtcbiAgICAgICAgdGhpcy5kaXZDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWluLWgtMCcpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLkVsZW1lbnQuY2xhc3NOYW1lLmluY2x1ZGVzKCdtaW4tdy0nKSkge1xuICAgICAgICB0aGlzLmRpdkNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtaW4tdy0wJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuRWxlbWVudC5jbGFzc05hbWUuaW5jbHVkZXMoJ2xpYnMtdWktc2Nyb2xsLW92ZXJsYXktZWxlbWVudCcpKSB7XG4gICAgICAgIHRoaXMuRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLXNjcm9sbC1vdmVybGF5LWVsZW1lbnQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLmRpdkNvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ2xpYnMtdWktc2Nyb2xsLW92ZXJsYXktY29udGFpbmVyJykpIHtcbiAgICAgIHRoaXMuZGl2Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktc2Nyb2xsLW92ZXJsYXktY29udGFpbmVyJyk7XG4gICAgfVxuICAgIHRoaXMuZGl2Q29udGFpbmVyLmFwcGVuZENoaWxkKHRyYWNrRWwpO1xuXG4gICAgaWYgKCF0aGlzLmRpdkNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbikge1xuICAgICAgdGhpcy5FbGVtZW50LnBhcmVudEVsZW1lbnQ/Lmluc2VydEJlZm9yZSh0aGlzLmRpdkNvbnRhaW5lciwgdGhpcy5FbGVtZW50KTtcbiAgICAgIHRoaXMuZGl2Q29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gICAgdGhpcy5kaXZDb250YWluZXIuYXBwZW5kKHRoaXMuRWxlbWVudCk7XG4gICAgdGhpcy51cGRhdGVTY3JvbGxiYXJTaXplKHNjcm9sbERpcmVjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGJpbmRFdmVudHNTY3JvbGxCYXIoc2Nyb2xsRGlyZWN0aW9uOiBUWVBFX1NDUk9MTF9ESVJFQ1RJT04sIHRyYWNrRWw6IEhUTUxFbGVtZW50LCBzdWJzOiBTdWJzY3JpcHRpb24pIHtcbiAgICBsZXQgc2Nyb2xsTGVmdCA9IHRoaXMuRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIGxldCBzY3JvbGxUb3AgPSB0aGlzLkVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIHN1YnMuYWRkKFxuICAgICAgZnJvbUV2ZW50PEV2ZW50Pih0aGlzLkVsZW1lbnQsICdzY3JvbGwnKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVNjcm9sbEhhbmRsZShzY3JvbGxEaXJlY3Rpb24sICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5FbGVtZW50O1xuICAgICAgICAgICAgICB0aGlzLm91dFNjcm9sbC5lbWl0KGV2ZW50KTtcbiAgICAgICAgICAgICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5zY3JvbGxMZWZ0ICYmIHRhcmdldC5zY3JvbGxMZWZ0ICsgdGFyZ2V0Lm9mZnNldFdpZHRoID49IHRhcmdldC5zY3JvbGxXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNjcm9sbExlZnQgPSB0YXJnZXQuc2Nyb2xsV2lkdGggLSB0YXJnZXQub2Zmc2V0V2lkdGggLSAodGFyZ2V0Lm9mZnNldFdpZHRoIC0gdGFyZ2V0LmNsaWVudFdpZHRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5zY3JvbGxMZWZ0ICE9PSBzY3JvbGxMZWZ0KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm91dFNjcm9sbFguZW1pdChldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNjcm9sbExlZnQgPSB0YXJnZXQuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbGJhclBvc2l0aW9uKHNjcm9sbERpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0YXJnZXQuc2Nyb2xsVG9wID09PSBzY3JvbGxUb3ApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxiYXJQb3NpdGlvbihzY3JvbGxEaXJlY3Rpb24pO1xuICAgICAgICAgICAgICBzY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICB0aGlzLm91dFNjcm9sbFkuZW1pdChldmVudCk7XG4gICAgICAgICAgICAgIGlmICh0YXJnZXQuc2Nyb2xsVG9wID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdXRTY3JvbGxUb3AuZW1pdChldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0YXJnZXQuc2Nyb2xsSGVpZ2h0IDw9IHRhcmdldC5zY3JvbGxUb3AgKyB0YXJnZXQub2Zmc2V0SGVpZ2h0ICsgU0NST0xMX0JPVFRPTV9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm91dFNjcm9sbEJvdHRvbS5lbWl0KGV2ZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcblxuICAgIGNvbnN0IG1vdXNlTGVhdmUgPSBmcm9tRXZlbnQodGhpcy5kaXZDb250YWluZXIsICdtb3VzZWxlYXZlJyk7XG4gICAgY29uc3QgbW91c2VFbnRlciA9IGZyb21FdmVudCh0aGlzLmRpdkNvbnRhaW5lciwgJ21vdXNlZW50ZXInKTtcbiAgICBzdWJzLmFkZChcbiAgICAgIG1vdXNlRW50ZXJcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIGlmICgoc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcgJiYgIXRoaXMub3B0aW9ucygpPy5zY3JvbGxYT3BhY2l0eTApIHx8IChzY3JvbGxEaXJlY3Rpb24gPT09ICdZJyAmJiAhdGhpcy5vcHRpb25zKCk/LnNjcm9sbFlPcGFjaXR5MCkpIHtcbiAgICAgICAgICAgICAgdHJhY2tFbC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICAgICAgICB0cmFja0VsLnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbGJhclNpemUoc2Nyb2xsRGlyZWN0aW9uKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gaW50ZXJ2YWwoMTAwMCkucGlwZSh0YWtlVW50aWwobW91c2VMZWF2ZSkpKSxcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxiYXJTaXplKHNjcm9sbERpcmVjdGlvbik7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKClcbiAgICApO1xuXG4gICAgc3Vicy5hZGQoXG4gICAgICBtb3VzZUxlYXZlXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5rZWVwRGlzcGxheVRodW1iKCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2tFbC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICB0cmFja0VsLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKClcbiAgICApO1xuICB9XG5cbiAgLyoqIFRocm90dGxlIHNjcm9sbCBoYW5kbGVyIHRoZW8gZnJhbWUg4oCUIGdvbSBuaGnhu4F1IHNjcm9sbCBldmVudCB2w6BvIDEgbOG6p24gdXBkYXRlIERPTS4gKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZVNjcm9sbEhhbmRsZShzY3JvbGxEaXJlY3Rpb246IFRZUEVfU0NST0xMX0RJUkVDVElPTiwgaGFuZGxlOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxSYWZYKSByZXR1cm47XG4gICAgICB0aGlzLnNjcm9sbFJhZlggPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNjcm9sbFJhZlggPSB1bmRlZmluZWQ7XG4gICAgICAgIGhhbmRsZSgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNjcm9sbFJhZlkpIHJldHVybjtcbiAgICB0aGlzLnNjcm9sbFJhZlkgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5zY3JvbGxSYWZZID0gdW5kZWZpbmVkO1xuICAgICAgaGFuZGxlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrVHJhY2soc2Nyb2xsRGlyZWN0aW9uOiBUWVBFX1NDUk9MTF9ESVJFQ1RJT04sIHN1YnM6IFN1YnNjcmlwdGlvbikge1xuICAgIGNvbnN0IGVsZW1lbnRUcmFjayA9IHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnID8gdGhpcy50cmFja1ggOiB0aGlzLnRyYWNrWTtcbiAgICBjb25zdCBlbGVtZW50VGh1bWIgPSBzY3JvbGxEaXJlY3Rpb24gPT09ICdYJyA/IHRoaXMudGh1bWJYIDogdGhpcy50aHVtYlk7XG5cbiAgICBzdWJzLmFkZChcbiAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50PihlbGVtZW50VHJhY2ssICdjbGljaycpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNTY3JvbGxUaHVtYigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgoc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcgJiYgZS5jbGllbnRYIDwgZWxlbWVudFRodW1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQpIHx8IChzY3JvbGxEaXJlY3Rpb24gPT09ICdZJyAmJiBlLmNsaWVudFkgPCBlbGVtZW50VGh1bWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxQb3NpdGlvbkJ5VXNlckFjdGlvbihzY3JvbGxEaXJlY3Rpb24sIGUsICdzbW9vdGgnLCAwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbFBvc2l0aW9uQnlVc2VyQWN0aW9uKHNjcm9sbERpcmVjdGlvbiwgZSwgJ3Ntb290aCcsIC0xICogZWxlbWVudFRodW1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxQb3NpdGlvbkJ5VXNlckFjdGlvbihzY3JvbGxEaXJlY3Rpb24sIGUsICdzbW9vdGgnLCAtMSAqIGVsZW1lbnRUaHVtYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckRyYWdBbmREcm9wVGh1bWIoc2Nyb2xsRGlyZWN0aW9uOiBUWVBFX1NDUk9MTF9ESVJFQ1RJT04sIHN1YnM6IFN1YnNjcmlwdGlvbikge1xuICAgIGNvbnN0IGVsZW1lbnRUcmFjayA9IHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnID8gdGhpcy50cmFja1ggOiB0aGlzLnRyYWNrWTtcbiAgICBjb25zdCBlbGVtZW50VGh1bWIgPSBzY3JvbGxEaXJlY3Rpb24gPT09ICdYJyA/IHRoaXMudGh1bWJYIDogdGhpcy50aHVtYlk7XG4gICAgbGV0IGxlbmd0aFRodW1iVG9Qb2ludENsaWNrID0gMDtcblxuICAgIHN1YnMuYWRkKFxuICAgICAgZ2V0RHJhZ0V2ZW50QnlFbGVtZW50KHtcbiAgICAgICAgZWxlbWVudE1vdXNlRG93bjogZWxlbWVudFRodW1iLFxuICAgICAgICBmdW5jdGlvbk1vdXNlRG93bjogKG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLmlzU2Nyb2xsVGh1bWIuc2V0KHRydWUpO1xuICAgICAgICAgIHRoaXMua2VlcERpc3BsYXlUaHVtYi5zZXQodHJ1ZSk7XG4gICAgICAgICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PT0gJ1gnKSB7XG4gICAgICAgICAgICBsZW5ndGhUaHVtYlRvUG9pbnRDbGljayA9IGVsZW1lbnRUaHVtYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gbW91c2VFdmVudC5jbGllbnRYO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW5ndGhUaHVtYlRvUG9pbnRDbGljayA9IGVsZW1lbnRUaHVtYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSBtb3VzZUV2ZW50LmNsaWVudFk7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uTW91c2VVcDogKG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLmtlZXBEaXNwbGF5VGh1bWIuc2V0KGZhbHNlKTtcbiAgICAgICAgICBsZW5ndGhUaHVtYlRvUG9pbnRDbGljayA9IDA7XG4gICAgICAgICAgaWYgKCFjaGVja01vdXNlT3ZlckluQ29udGFpbmVyKG1vdXNlRXZlbnQsIHRoaXMuRWxlbWVudCkpIHtcbiAgICAgICAgICAgIGVsZW1lbnRUcmFjay5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICBlbGVtZW50VHJhY2suc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubW91c2VVcFRpbWVyKTtcbiAgICAgICAgICB0aGlzLm1vdXNlVXBUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc1Njcm9sbFRodW1iLnNldChmYWxzZSk7XG4gICAgICAgICAgfSwgTU9VU0VfVVBfUkVTRVRfREVMQVkpO1xuICAgICAgICB9LFxuICAgICAgICBkZXN0cm95UmVmOiB0aGlzLmRlc3Ryb3lSZWYsXG4gICAgICB9KS5zdWJzY3JpYmUoKG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxQb3NpdGlvbkJ5VXNlckFjdGlvbihzY3JvbGxEaXJlY3Rpb24sIG1vdXNlRXZlbnQsICdhdXRvJywgbGVuZ3RoVGh1bWJUb1BvaW50Q2xpY2spO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTY3JvbGxQb3NpdGlvbkJ5VXNlckFjdGlvbihzY3JvbGxEaXJlY3Rpb246IFRZUEVfU0NST0xMX0RJUkVDVElPTiwgZTogTW91c2VFdmVudCwgYmVoYXZpb3I6ICdhdXRvJyB8ICdzbW9vdGgnLCBsZW5ndGhUaHVtYlRvUG9pbnRDbGljayA9IDApIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChzY3JvbGxEaXJlY3Rpb24gPT09ICdYJykge1xuICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSB0aGlzLkVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICBjb25zdCBjb250ZW50V2lkdGggPSAodGhpcy5lbGVtZW50Q2hlY2tTY3JvbGxYKCkgfHwgdGhpcy5FbGVtZW50KS5zY3JvbGxXaWR0aDtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSBlLmNsaWVudFggLSB0aGlzLkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIGxlbmd0aFRodW1iVG9Qb2ludENsaWNrO1xuICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9ICh0aHVtYlBvc2l0aW9uIC8gKGNvbnRhaW5lcldpZHRoIC0gdGhpcy50aHVtYlgub2Zmc2V0V2lkdGgpKSAqIChjb250ZW50V2lkdGggLSBjb250YWluZXJXaWR0aCk7XG4gICAgICB0aGlzLkVsZW1lbnQuc2Nyb2xsKHsgbGVmdDogc2Nyb2xsTGVmdCwgYmVoYXZpb3IgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IHRoaXMuRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3QgY29udGVudEhlaWdodCA9ICh0aGlzLmVsZW1lbnRDaGVja1Njcm9sbFkoKSB8fCB0aGlzLkVsZW1lbnQpLnNjcm9sbEhlaWdodDtcbiAgICBjb25zdCB0aHVtYlBvc2l0aW9uID0gZS5jbGllbnRZIC0gdGhpcy5FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIGxlbmd0aFRodW1iVG9Qb2ludENsaWNrO1xuICAgIGNvbnN0IHNjcm9sbFRvcCA9ICh0aHVtYlBvc2l0aW9uIC8gKGNvbnRhaW5lckhlaWdodCAtIHRoaXMudGh1bWJZLm9mZnNldEhlaWdodCkpICogKGNvbnRlbnRIZWlnaHQgLSBjb250YWluZXJIZWlnaHQpO1xuICAgIHRoaXMuRWxlbWVudC5zY3JvbGwoeyB0b3A6IHNjcm9sbFRvcCwgYmVoYXZpb3IgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNjcm9sbGJhclNpemUoc2Nyb2xsRGlyZWN0aW9uOiBUWVBFX1NDUk9MTF9ESVJFQ1RJT04pIHtcbiAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAnWCcpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5FbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgY29uc3QgY29udGVudFdpZHRoID0gKHRoaXMuZWxlbWVudENoZWNrU2Nyb2xsWCgpIHx8IHRoaXMuRWxlbWVudCkuc2Nyb2xsV2lkdGg7XG4gICAgICBpZiAoY29udGFpbmVyV2lkdGggPT09IHRoaXMubGFzdENvbnRhaW5lcldpZHRoICYmIGNvbnRlbnRXaWR0aCA9PT0gdGhpcy5sYXN0Q29udGVudFdpZHRoKSByZXR1cm47XG4gICAgICB0aGlzLmxhc3RDb250YWluZXJXaWR0aCA9IGNvbnRhaW5lcldpZHRoO1xuICAgICAgdGhpcy5sYXN0Q29udGVudFdpZHRoID0gY29udGVudFdpZHRoO1xuICAgICAgY29uc3QgdGh1bWJXaWR0aCA9IChjb250YWluZXJXaWR0aCAvIGNvbnRlbnRXaWR0aCkgKiBjb250YWluZXJXaWR0aDtcbiAgICAgIHRoaXMudGh1bWJYLnN0eWxlLndpZHRoID0gYCR7TWF0aC5tYXgoTUlOX1RIVU1CX1NJWkUsIHRodW1iV2lkdGgpfXB4YDtcbiAgICAgIHRoaXMudHJhY2tYLnN0eWxlLmRpc3BsYXkgPSBjb250ZW50V2lkdGggPiBjb250YWluZXJXaWR0aCA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICB0aGlzLnVwZGF0ZVNjcm9sbGJhclBvc2l0aW9uKHNjcm9sbERpcmVjdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IHRoaXMuRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3QgY29udGVudEhlaWdodCA9ICh0aGlzLmVsZW1lbnRDaGVja1Njcm9sbFkoKSB8fCB0aGlzLkVsZW1lbnQpLnNjcm9sbEhlaWdodDtcbiAgICBpZiAoY29udGFpbmVySGVpZ2h0ID09PSB0aGlzLmxhc3RDb250YWluZXJIZWlnaHQgJiYgY29udGVudEhlaWdodCA9PT0gdGhpcy5sYXN0Q29udGVudEhlaWdodCkgcmV0dXJuO1xuICAgIHRoaXMubGFzdENvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckhlaWdodDtcbiAgICB0aGlzLmxhc3RDb250ZW50SGVpZ2h0ID0gY29udGVudEhlaWdodDtcbiAgICBjb25zdCB0aHVtYkhlaWdodCA9IChjb250YWluZXJIZWlnaHQgLyBjb250ZW50SGVpZ2h0KSAqIGNvbnRhaW5lckhlaWdodDtcbiAgICB0aGlzLnRodW1iWS5zdHlsZS5oZWlnaHQgPSBgJHtNYXRoLm1heChNSU5fVEhVTUJfU0laRSwgdGh1bWJIZWlnaHQpfXB4YDtcbiAgICB0aGlzLnRyYWNrWS5zdHlsZS5kaXNwbGF5ID0gY29udGVudEhlaWdodCA+IGNvbnRhaW5lckhlaWdodCA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgdGhpcy51cGRhdGVTY3JvbGxiYXJQb3NpdGlvbignWScpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTY3JvbGxiYXJQb3NpdGlvbihzY3JvbGxEaXJlY3Rpb246IFRZUEVfU0NST0xMX0RJUkVDVElPTikge1xuICAgIGlmIChzY3JvbGxEaXJlY3Rpb24gPT09ICdYJykge1xuICAgICAgY29uc3QgY29udGFpbmVyV2lkdGggPSB0aGlzLkVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICBjb25zdCBjb250ZW50V2lkdGggPSAodGhpcy5lbGVtZW50Q2hlY2tTY3JvbGxYKCkgfHwgdGhpcy5FbGVtZW50KS5zY3JvbGxXaWR0aDtcbiAgICAgIGNvbnN0IGRlbm9taW5hdG9yU2Nyb2xsID0gY29udGVudFdpZHRoIC0gY29udGFpbmVyV2lkdGg7XG4gICAgICBpZiAoZGVub21pbmF0b3JTY3JvbGwgPD0gMCkgcmV0dXJuO1xuICAgICAgY29uc3QgZGVub21pbmF0b3JUaHVtYiA9IGNvbnRhaW5lcldpZHRoIC0gdGhpcy50aHVtYlgub2Zmc2V0V2lkdGg7XG4gICAgICBjb25zdCB0aHVtYlBvc2l0aW9uID0gKHRoaXMuRWxlbWVudC5zY3JvbGxMZWZ0IC8gZGVub21pbmF0b3JTY3JvbGwpICogZGVub21pbmF0b3JUaHVtYjtcbiAgICAgIHRoaXMudGh1bWJYLnN0eWxlLmxlZnQgPSBgJHt0aHVtYlBvc2l0aW9ufXB4YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gdGhpcy5FbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gKHRoaXMuZWxlbWVudENoZWNrU2Nyb2xsWSgpIHx8IHRoaXMuRWxlbWVudCkuc2Nyb2xsSGVpZ2h0O1xuICAgIGNvbnN0IGRlbm9taW5hdG9yU2Nyb2xsID0gY29udGVudEhlaWdodCAtIGNvbnRhaW5lckhlaWdodDtcbiAgICBpZiAoZGVub21pbmF0b3JTY3JvbGwgPD0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGRlbm9taW5hdG9yVGh1bWIgPSBjb250YWluZXJIZWlnaHQgLSB0aGlzLnRodW1iWS5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9ICh0aGlzLkVsZW1lbnQuc2Nyb2xsVG9wIC8gZGVub21pbmF0b3JTY3JvbGwpICogZGVub21pbmF0b3JUaHVtYjtcbiAgICB0aGlzLnRodW1iWS5zdHlsZS50b3AgPSBgJHt0aHVtYlBvc2l0aW9ufXB4YDtcbiAgfVxufVxuIl19
|