@ts-core/angular 18.0.1 → 19.0.1
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/application/ApplicationBaseComponent.d.ts +1 -1
- package/fesm2022/ts-core-angular.mjs +310 -271
- package/fesm2022/ts-core-angular.mjs.map +1 -1
- package/login/LoginTokenStorage.d.ts +1 -1
- package/notification/INotificationContent.d.ts +1 -1
- package/package.json +13 -15
- package/public-api.d.ts +1 -0
- package/service/RouterBaseService.d.ts +0 -4
- package/service/ServiceWorkerService.d.ts +3 -1
- package/storage/JSONValueStorage.d.ts +5 -0
- package/theme/ThemeAssetDirective.d.ts +1 -1
- package/theme/ThemeToggleDirective.d.ts +1 -1
- package/window/IWindowContent.d.ts +1 -1
- package/esm2022/ApplicationInjector.mjs +0 -9
- package/esm2022/VIModule.mjs +0 -190
- package/esm2022/application/ApplicationBaseComponent.mjs +0 -96
- package/esm2022/application/ApplicationComponent.mjs +0 -64
- package/esm2022/application/MessageBaseComponent.mjs +0 -60
- package/esm2022/asset/AssetBackgroundDirective.mjs +0 -155
- package/esm2022/asset/AssetBackgroundPipe.mjs +0 -22
- package/esm2022/asset/AssetFilePipe.mjs +0 -22
- package/esm2022/asset/AssetIconPipe.mjs +0 -22
- package/esm2022/asset/AssetImagePipe.mjs +0 -22
- package/esm2022/asset/AssetModule.mjs +0 -25
- package/esm2022/asset/AssetSoundPipe.mjs +0 -22
- package/esm2022/asset/AssetVideoPipe.mjs +0 -22
- package/esm2022/bottomSheet/BottomSheetService.mjs +0 -4
- package/esm2022/cookie/CookieModule.mjs +0 -47
- package/esm2022/cookie/CookieOptions.mjs +0 -9
- package/esm2022/cookie/CookieService.mjs +0 -69
- package/esm2022/directive/AspectRatioResizeDirective.mjs +0 -135
- package/esm2022/directive/AutoScrollBottomDirective.mjs +0 -122
- package/esm2022/directive/ClickToCopyDirective.mjs +0 -53
- package/esm2022/directive/ClickToSelectDirective.mjs +0 -55
- package/esm2022/directive/FocusDirective.mjs +0 -60
- package/esm2022/directive/HTMLContentTitleDirective.mjs +0 -74
- package/esm2022/directive/HTMLTitleDirective.mjs +0 -73
- package/esm2022/directive/InfiniteScrollDirective.mjs +0 -72
- package/esm2022/directive/IsBrowserDirective.mjs +0 -24
- package/esm2022/directive/IsServerDirective.mjs +0 -24
- package/esm2022/directive/ResizeDirective.mjs +0 -84
- package/esm2022/directive/ScrollCheckDirective.mjs +0 -106
- package/esm2022/directive/ScrollDirective.mjs +0 -121
- package/esm2022/directive/SelectOnFocusDirective.mjs +0 -48
- package/esm2022/directive/StructureDirective.mjs +0 -80
- package/esm2022/language/LanguageDirective.mjs +0 -103
- package/esm2022/language/LanguageHasDirective.mjs +0 -87
- package/esm2022/language/LanguageModule.mjs +0 -61
- package/esm2022/language/LanguagePipe.mjs +0 -88
- package/esm2022/language/LanguagePipeHas.mjs +0 -64
- package/esm2022/language/LanguagePipeHasPure.mjs +0 -41
- package/esm2022/language/LanguagePipePure.mjs +0 -40
- package/esm2022/language/LanguageRequireResolver.mjs +0 -37
- package/esm2022/language/LanguageResolver.mjs +0 -21
- package/esm2022/list/IListItem.mjs +0 -2
- package/esm2022/list/ListItem.mjs +0 -148
- package/esm2022/list/ListItems.mjs +0 -107
- package/esm2022/list/select/ISelectListItem.mjs +0 -2
- package/esm2022/list/select/RouterSelectListItems.mjs +0 -60
- package/esm2022/list/select/SelectListItem.mjs +0 -67
- package/esm2022/list/select/SelectListItems.mjs +0 -130
- package/esm2022/login/LoginBaseService.mjs +0 -191
- package/esm2022/login/LoginGuard.mjs +0 -41
- package/esm2022/login/LoginIfCanGuard.mjs +0 -55
- package/esm2022/login/LoginNotGuard.mjs +0 -41
- package/esm2022/login/LoginRequireResolver.mjs +0 -40
- package/esm2022/login/LoginResolver.mjs +0 -24
- package/esm2022/login/LoginTokenStorage.mjs +0 -18
- package/esm2022/manager/FocusManager.mjs +0 -54
- package/esm2022/manager/ResizeManager.mjs +0 -90
- package/esm2022/menu/MenuItem.mjs +0 -20
- package/esm2022/menu/MenuItemBase.mjs +0 -56
- package/esm2022/menu/MenuItems.mjs +0 -111
- package/esm2022/menu/NavigationMenuItem.mjs +0 -20
- package/esm2022/module/LazyModuleLoader.mjs +0 -97
- package/esm2022/notification/INotification.mjs +0 -16
- package/esm2022/notification/INotificationConfig.mjs +0 -2
- package/esm2022/notification/INotificationContent.mjs +0 -141
- package/esm2022/notification/NotificationConfig.mjs +0 -27
- package/esm2022/notification/NotificationService.mjs +0 -4
- package/esm2022/notification/NotificationServiceEvent.mjs +0 -8
- package/esm2022/pipe/CamelCasePipe.mjs +0 -23
- package/esm2022/pipe/FinancePipe.mjs +0 -53
- package/esm2022/pipe/MomentDateAdaptivePipe.mjs +0 -51
- package/esm2022/pipe/MomentDateFromNowPipe.mjs +0 -22
- package/esm2022/pipe/MomentDatePipe.mjs +0 -71
- package/esm2022/pipe/MomentTimePipe.mjs +0 -35
- package/esm2022/pipe/NgModelErrorPipe.mjs +0 -43
- package/esm2022/pipe/PrettifyPipe.mjs +0 -38
- package/esm2022/pipe/SanitizePipe.mjs +0 -48
- package/esm2022/pipe/StartCasePipe.mjs +0 -23
- package/esm2022/pipe/TimePipe.mjs +0 -38
- package/esm2022/pipe/TruncatePipe.mjs +0 -23
- package/esm2022/public-api.mjs +0 -139
- package/esm2022/question/IQuestion.mjs +0 -14
- package/esm2022/question/QuestionManager.mjs +0 -107
- package/esm2022/service/PipeBaseService.mjs +0 -140
- package/esm2022/service/PlatformService.mjs +0 -44
- package/esm2022/service/RouterBaseService.mjs +0 -244
- package/esm2022/service/ServiceWorkerService.mjs +0 -107
- package/esm2022/service/route/CanDeactivateGuard.mjs +0 -11
- package/esm2022/service/route/IRouterDeactivatable.mjs +0 -2
- package/esm2022/storage/BooleanValueStorage.mjs +0 -15
- package/esm2022/storage/DateValueStorage.mjs +0 -46
- package/esm2022/storage/IValueStorage.mjs +0 -2
- package/esm2022/storage/LocalStorageService.mjs +0 -73
- package/esm2022/storage/ValueStorage.mjs +0 -84
- package/esm2022/theme/ThemeAssetBackgroundDirective.mjs +0 -51
- package/esm2022/theme/ThemeAssetDirective.mjs +0 -253
- package/esm2022/theme/ThemeAssetIconDirective.mjs +0 -48
- package/esm2022/theme/ThemeAssetImageDirective.mjs +0 -49
- package/esm2022/theme/ThemeModule.mjs +0 -81
- package/esm2022/theme/ThemeStyleDirective.mjs +0 -125
- package/esm2022/theme/ThemeStyleHoverDirective.mjs +0 -107
- package/esm2022/theme/ThemeToggleDirective.mjs +0 -63
- package/esm2022/transport/TransportLazy.mjs +0 -93
- package/esm2022/transport/TransportLazyModule.mjs +0 -30
- package/esm2022/transport/TransportLazyModuleLoadedEvent.mjs +0 -18
- package/esm2022/ts-core-angular.mjs +0 -5
- package/esm2022/user/IUser.mjs +0 -9
- package/esm2022/user/UserBaseService.mjs +0 -124
- package/esm2022/util/ViewUtil.mjs +0 -589
- package/esm2022/window/IWindow.mjs +0 -31
- package/esm2022/window/IWindowConfig.mjs +0 -7
- package/esm2022/window/IWindowContent.mjs +0 -143
- package/esm2022/window/WindowBase.mjs +0 -177
- package/esm2022/window/WindowClosedError.mjs +0 -19
- package/esm2022/window/WindowConfig.mjs +0 -218
- package/esm2022/window/WindowService.mjs +0 -4
- package/esm2022/window/WindowServiceEvent.mjs +0 -9
|
@@ -1,589 +0,0 @@
|
|
|
1
|
-
import { ViewContainerRef } from '@angular/core';
|
|
2
|
-
import { ExtendedError } from '@ts-core/common';
|
|
3
|
-
import * as _ from 'lodash';
|
|
4
|
-
export class ViewUtil {
|
|
5
|
-
// --------------------------------------------------------------------------
|
|
6
|
-
//
|
|
7
|
-
// Constants
|
|
8
|
-
//
|
|
9
|
-
// --------------------------------------------------------------------------
|
|
10
|
-
static _renderer = null;
|
|
11
|
-
static _document = null;
|
|
12
|
-
static get renderer() {
|
|
13
|
-
if (_.isNil(ViewUtil._renderer)) {
|
|
14
|
-
throw new ExtendedError(`ViewUtil is not initialized: renderer in nil`);
|
|
15
|
-
}
|
|
16
|
-
return ViewUtil._renderer;
|
|
17
|
-
}
|
|
18
|
-
static set renderer(value) {
|
|
19
|
-
if (value === ViewUtil._renderer) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
ViewUtil._renderer = value;
|
|
23
|
-
}
|
|
24
|
-
static get document() {
|
|
25
|
-
return !_.isNil(ViewUtil._document) ? ViewUtil._document : document;
|
|
26
|
-
}
|
|
27
|
-
static set document(value) {
|
|
28
|
-
ViewUtil._document = value;
|
|
29
|
-
}
|
|
30
|
-
static get window() {
|
|
31
|
-
return this.document.defaultView;
|
|
32
|
-
}
|
|
33
|
-
// --------------------------------------------------------------------------
|
|
34
|
-
//
|
|
35
|
-
// Private Methods
|
|
36
|
-
//
|
|
37
|
-
// --------------------------------------------------------------------------
|
|
38
|
-
static copyToClipboard() {
|
|
39
|
-
try {
|
|
40
|
-
ViewUtil.document.execCommand('copy');
|
|
41
|
-
}
|
|
42
|
-
catch (error) { }
|
|
43
|
-
}
|
|
44
|
-
// --------------------------------------------------------------------------
|
|
45
|
-
//
|
|
46
|
-
// Common Properties
|
|
47
|
-
//
|
|
48
|
-
// --------------------------------------------------------------------------
|
|
49
|
-
static parseElement(element) {
|
|
50
|
-
if (element instanceof HTMLElement) {
|
|
51
|
-
return element;
|
|
52
|
-
}
|
|
53
|
-
if (element instanceof ViewContainerRef) {
|
|
54
|
-
element = element.element;
|
|
55
|
-
}
|
|
56
|
-
return !_.isNil(element) ? element.nativeElement : null;
|
|
57
|
-
}
|
|
58
|
-
static createBase64(element) {
|
|
59
|
-
let value = null;
|
|
60
|
-
let canvas = ViewUtil.createElement('canvas');
|
|
61
|
-
ViewUtil.setProperty(canvas, 'width', element.offsetWidth);
|
|
62
|
-
ViewUtil.setProperty(canvas, 'height', element.offsetHeight);
|
|
63
|
-
try {
|
|
64
|
-
let context = canvas.getContext('2d');
|
|
65
|
-
context.drawImage(element, 0, 0, element.offsetWidth, element.offsetHeight);
|
|
66
|
-
value = canvas.toDataURL('image/jpeg', 1.0);
|
|
67
|
-
value = value.replace('data:image/jpeg;base64,', '');
|
|
68
|
-
}
|
|
69
|
-
catch (error) { }
|
|
70
|
-
return value;
|
|
71
|
-
}
|
|
72
|
-
static selectContent(container, isNeedCopyToClipboard = false) {
|
|
73
|
-
container = ViewUtil.parseElement(container);
|
|
74
|
-
if (container instanceof HTMLInputElement || container instanceof HTMLTextAreaElement) {
|
|
75
|
-
let isWasDisabled = container.disabled;
|
|
76
|
-
if (isWasDisabled) {
|
|
77
|
-
container.disabled = false;
|
|
78
|
-
}
|
|
79
|
-
container.select();
|
|
80
|
-
if (isNeedCopyToClipboard) {
|
|
81
|
-
ViewUtil.copyToClipboard();
|
|
82
|
-
}
|
|
83
|
-
if (isWasDisabled) {
|
|
84
|
-
container.disabled = true;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
let selection = ViewUtil.window.getSelection();
|
|
89
|
-
selection.removeAllRanges();
|
|
90
|
-
let range = ViewUtil.document.createRange();
|
|
91
|
-
if (!_.isNil(container)) {
|
|
92
|
-
range.selectNodeContents(container);
|
|
93
|
-
}
|
|
94
|
-
selection.addRange(range);
|
|
95
|
-
if (isNeedCopyToClipboard) {
|
|
96
|
-
ViewUtil.copyToClipboard();
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
static setBackground(container, image, repeat = 'repeat', error) {
|
|
101
|
-
if (_.isNil(image)) {
|
|
102
|
-
ViewUtil.removeStyle(container, 'backgroundImage');
|
|
103
|
-
ViewUtil.removeStyle(container, 'backgroundRepeat');
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
image = ViewUtil.getBackgroundUrl(image);
|
|
107
|
-
if (!_.isEmpty(error)) {
|
|
108
|
-
image += `, ${ViewUtil.getBackgroundUrl(error)}`;
|
|
109
|
-
}
|
|
110
|
-
ViewUtil.setStyle(container, 'backgroundImage', image);
|
|
111
|
-
ViewUtil.setStyle(container, 'backgroundRepeat', repeat);
|
|
112
|
-
}
|
|
113
|
-
static getBackgroundUrl(item) {
|
|
114
|
-
return !item.includes('url(') ? `url(${item})` : item;
|
|
115
|
-
}
|
|
116
|
-
// --------------------------------------------------------------------------
|
|
117
|
-
//
|
|
118
|
-
// Child Methods
|
|
119
|
-
//
|
|
120
|
-
// --------------------------------------------------------------------------
|
|
121
|
-
static createElement(name, className, innerHTML) {
|
|
122
|
-
let element = ViewUtil.renderer.createElement(name);
|
|
123
|
-
if (!_.isNil(name)) {
|
|
124
|
-
ViewUtil.setProperty(element, 'className', className);
|
|
125
|
-
}
|
|
126
|
-
if (!_.isNil(innerHTML)) {
|
|
127
|
-
ViewUtil.setProperty(element, 'innerHTML', innerHTML);
|
|
128
|
-
}
|
|
129
|
-
return element;
|
|
130
|
-
}
|
|
131
|
-
static appendChild(parent, child) {
|
|
132
|
-
if (!_.isNil(parent) && !_.isNil(child)) {
|
|
133
|
-
ViewUtil.renderer.appendChild(parent, child);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
static removeChild(parent, child) {
|
|
137
|
-
if (!_.isNil(parent) && !_.isNil(child)) {
|
|
138
|
-
ViewUtil.renderer.removeChild(parent, child);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
static toggleChild(container, child, value) {
|
|
142
|
-
let isContains = container.contains(child);
|
|
143
|
-
if (value && !isContains) {
|
|
144
|
-
ViewUtil.appendChild(container, child);
|
|
145
|
-
}
|
|
146
|
-
if (!value && isContains) {
|
|
147
|
-
ViewUtil.removeChild(container, child);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
// --------------------------------------------------------------------------
|
|
151
|
-
//
|
|
152
|
-
// Size Methods
|
|
153
|
-
//
|
|
154
|
-
// --------------------------------------------------------------------------
|
|
155
|
-
static getStageWidth() {
|
|
156
|
-
return ViewUtil.window.innerWidth || ViewUtil.document.body.clientWidth;
|
|
157
|
-
}
|
|
158
|
-
static getStageHeight() {
|
|
159
|
-
return ViewUtil.window.innerHeight || ViewUtil.document.body.clientHeight;
|
|
160
|
-
}
|
|
161
|
-
static getCanvasContext2d(container, options) {
|
|
162
|
-
let canvas = ViewUtil.parseElement(container);
|
|
163
|
-
try {
|
|
164
|
-
return canvas.getContext('2d', options);
|
|
165
|
-
}
|
|
166
|
-
catch (error) {
|
|
167
|
-
return null;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
static getBoundingRectangle(container) {
|
|
171
|
-
container = ViewUtil.parseElement(container);
|
|
172
|
-
if (_.isNil(container) || _.isNil(container.getBoundingClientRect)) {
|
|
173
|
-
return {
|
|
174
|
-
x: NaN,
|
|
175
|
-
y: NaN,
|
|
176
|
-
width: NaN,
|
|
177
|
-
height: NaN,
|
|
178
|
-
top: NaN,
|
|
179
|
-
right: NaN,
|
|
180
|
-
left: NaN,
|
|
181
|
-
bottom: NaN
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
return container.getBoundingClientRect();
|
|
185
|
-
}
|
|
186
|
-
static getWidth(container) {
|
|
187
|
-
container = ViewUtil.parseElement(container);
|
|
188
|
-
if (_.isNil(container)) {
|
|
189
|
-
return NaN;
|
|
190
|
-
}
|
|
191
|
-
let value = parseFloat(ViewUtil.getStyle(container, 'width'));
|
|
192
|
-
if (_.isNaN(value)) {
|
|
193
|
-
value = ViewUtil.getBoundingRectangle(container).width;
|
|
194
|
-
}
|
|
195
|
-
if (_.isNaN(value)) {
|
|
196
|
-
value = container.offsetWidth;
|
|
197
|
-
}
|
|
198
|
-
return value;
|
|
199
|
-
}
|
|
200
|
-
static setWidth(container, value, isNeedCheckLimits = false) {
|
|
201
|
-
if (_.isNil(container) || _.isNaN(value)) {
|
|
202
|
-
return false;
|
|
203
|
-
}
|
|
204
|
-
if (isNeedCheckLimits &&
|
|
205
|
-
(value < ViewUtil.getMinWidth(container) || value > ViewUtil.getMaxWidth(container) || value === ViewUtil.getWidth(container))) {
|
|
206
|
-
return false;
|
|
207
|
-
}
|
|
208
|
-
ViewUtil.setStyle(container, 'width', value + 'px');
|
|
209
|
-
return true;
|
|
210
|
-
}
|
|
211
|
-
static getMaxWidth(container) {
|
|
212
|
-
if (_.isNil(container)) {
|
|
213
|
-
return NaN;
|
|
214
|
-
}
|
|
215
|
-
let value = parseFloat(ViewUtil.getStyle(container, 'maxWidth'));
|
|
216
|
-
if (_.isNaN(value)) {
|
|
217
|
-
value = Number.POSITIVE_INFINITY;
|
|
218
|
-
}
|
|
219
|
-
return value;
|
|
220
|
-
}
|
|
221
|
-
static getMinWidth(container) {
|
|
222
|
-
if (_.isNil(container)) {
|
|
223
|
-
return NaN;
|
|
224
|
-
}
|
|
225
|
-
let value = parseFloat(ViewUtil.getStyle(container, 'minWidth'));
|
|
226
|
-
if (_.isNaN(value)) {
|
|
227
|
-
value = 0;
|
|
228
|
-
}
|
|
229
|
-
return value;
|
|
230
|
-
}
|
|
231
|
-
static getHeight(container) {
|
|
232
|
-
container = ViewUtil.parseElement(container);
|
|
233
|
-
if (_.isNil(container)) {
|
|
234
|
-
return NaN;
|
|
235
|
-
}
|
|
236
|
-
let value = parseFloat(ViewUtil.getStyle(container, 'height'));
|
|
237
|
-
if (_.isNaN(value)) {
|
|
238
|
-
value = ViewUtil.getBoundingRectangle(container).height;
|
|
239
|
-
}
|
|
240
|
-
if (_.isNaN(value)) {
|
|
241
|
-
value = container.offsetHeight;
|
|
242
|
-
}
|
|
243
|
-
return value;
|
|
244
|
-
}
|
|
245
|
-
static setHeight(container, value, isNeedCheckLimits = false) {
|
|
246
|
-
if (_.isNil(container) || _.isNaN(value)) {
|
|
247
|
-
return false;
|
|
248
|
-
}
|
|
249
|
-
if (isNeedCheckLimits &&
|
|
250
|
-
(value < ViewUtil.getMinHeight(container) || value > ViewUtil.getMaxHeight(container) || value === ViewUtil.getHeight(container))) {
|
|
251
|
-
return false;
|
|
252
|
-
}
|
|
253
|
-
ViewUtil.setStyle(container, 'height', value + 'px');
|
|
254
|
-
return true;
|
|
255
|
-
}
|
|
256
|
-
static getMaxHeight(container) {
|
|
257
|
-
if (_.isNil(container)) {
|
|
258
|
-
return NaN;
|
|
259
|
-
}
|
|
260
|
-
let value = parseFloat(ViewUtil.getStyle(container, 'maxHeight'));
|
|
261
|
-
if (_.isNaN(value)) {
|
|
262
|
-
value = Number.POSITIVE_INFINITY;
|
|
263
|
-
}
|
|
264
|
-
return value;
|
|
265
|
-
}
|
|
266
|
-
static getMinHeight(container) {
|
|
267
|
-
if (_.isNil(container)) {
|
|
268
|
-
return NaN;
|
|
269
|
-
}
|
|
270
|
-
let value = parseFloat(ViewUtil.getStyle(container, 'minHeight'));
|
|
271
|
-
if (isNaN(value)) {
|
|
272
|
-
value = 0;
|
|
273
|
-
}
|
|
274
|
-
return value;
|
|
275
|
-
}
|
|
276
|
-
static size(container, width, height, isNeedCheckLimits) {
|
|
277
|
-
ViewUtil.setWidth(container, width, isNeedCheckLimits);
|
|
278
|
-
ViewUtil.setHeight(container, height, isNeedCheckLimits);
|
|
279
|
-
}
|
|
280
|
-
static getX(container) {
|
|
281
|
-
if (_.isNil(container)) {
|
|
282
|
-
return NaN;
|
|
283
|
-
}
|
|
284
|
-
let value = parseFloat(ViewUtil.getStyle(container, 'left'));
|
|
285
|
-
return _.isNaN(value) ? 0 : value;
|
|
286
|
-
}
|
|
287
|
-
static setX(container, value) {
|
|
288
|
-
if (!_.isNil(container) && !_.isNaN(value)) {
|
|
289
|
-
ViewUtil.setStyle(container, 'left', value + 'px');
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
static getY(container) {
|
|
293
|
-
if (_.isNil(container)) {
|
|
294
|
-
return NaN;
|
|
295
|
-
}
|
|
296
|
-
let value = parseFloat(ViewUtil.getStyle(container, 'top'));
|
|
297
|
-
return _.isNaN(value) ? 0 : value;
|
|
298
|
-
}
|
|
299
|
-
static setY(container, value) {
|
|
300
|
-
if (!_.isNil(container) && !_.isNaN(value)) {
|
|
301
|
-
ViewUtil.setStyle(container, 'top', value + 'px');
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
static move(container, x, y) {
|
|
305
|
-
ViewUtil.setX(container, x);
|
|
306
|
-
ViewUtil.setY(container, y);
|
|
307
|
-
}
|
|
308
|
-
// --------------------------------------------------------------------------
|
|
309
|
-
//
|
|
310
|
-
// Focus Methods
|
|
311
|
-
//
|
|
312
|
-
// --------------------------------------------------------------------------
|
|
313
|
-
static focusInput(input) {
|
|
314
|
-
let caretIndex = 0;
|
|
315
|
-
if (!_.isNil(input.value)) {
|
|
316
|
-
caretIndex = Math.max(0, input.value.toString().length);
|
|
317
|
-
}
|
|
318
|
-
input.focus();
|
|
319
|
-
input.setSelectionRange(caretIndex, caretIndex);
|
|
320
|
-
}
|
|
321
|
-
// --------------------------------------------------------------------------
|
|
322
|
-
//
|
|
323
|
-
// Classes Methods
|
|
324
|
-
//
|
|
325
|
-
// --------------------------------------------------------------------------
|
|
326
|
-
static addClass(container, name) {
|
|
327
|
-
if (_.isEmpty(name)) {
|
|
328
|
-
return;
|
|
329
|
-
}
|
|
330
|
-
container = ViewUtil.parseElement(container);
|
|
331
|
-
if (!_.isNil(container)) {
|
|
332
|
-
ViewUtil.renderer.addClass(container, name);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
static addClasses(container, names) {
|
|
336
|
-
if (_.isEmpty(names)) {
|
|
337
|
-
return;
|
|
338
|
-
}
|
|
339
|
-
names.split(' ').forEach(name => ViewUtil.addClass(container, name));
|
|
340
|
-
}
|
|
341
|
-
static removeClass(container, name) {
|
|
342
|
-
if (_.isEmpty(name)) {
|
|
343
|
-
return;
|
|
344
|
-
}
|
|
345
|
-
container = ViewUtil.parseElement(container);
|
|
346
|
-
if (!_.isNil(container)) {
|
|
347
|
-
ViewUtil.renderer.removeClass(container, name);
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
static removeClasses(container, names) {
|
|
351
|
-
if (_.isEmpty(names)) {
|
|
352
|
-
return;
|
|
353
|
-
}
|
|
354
|
-
names.split(' ').forEach(name => ViewUtil.removeClass(container, name));
|
|
355
|
-
}
|
|
356
|
-
static hasClass(container, name) {
|
|
357
|
-
if (_.isNil(name)) {
|
|
358
|
-
return false;
|
|
359
|
-
}
|
|
360
|
-
container = ViewUtil.parseElement(container);
|
|
361
|
-
return !_.isNil(container) ? container.classList.contains(name) : false;
|
|
362
|
-
}
|
|
363
|
-
static toggleClass(container, name, value) {
|
|
364
|
-
if (value) {
|
|
365
|
-
ViewUtil.addClass(container, name);
|
|
366
|
-
}
|
|
367
|
-
else {
|
|
368
|
-
ViewUtil.removeClass(container, name);
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
static toggleClasses(container, name, value) {
|
|
372
|
-
if (value) {
|
|
373
|
-
ViewUtil.addClasses(container, name);
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
ViewUtil.removeClasses(container, name);
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
static getProperty(container, name) {
|
|
380
|
-
if (_.isNil(name)) {
|
|
381
|
-
return null;
|
|
382
|
-
}
|
|
383
|
-
container = ViewUtil.parseElement(container);
|
|
384
|
-
return !_.isNil(container) ? container[name] : null;
|
|
385
|
-
}
|
|
386
|
-
static setProperty(container, name, value) {
|
|
387
|
-
container = ViewUtil.parseElement(container);
|
|
388
|
-
if (_.isNil(name) || _.isNil(container)) {
|
|
389
|
-
return;
|
|
390
|
-
}
|
|
391
|
-
if (!_.isNil(value)) {
|
|
392
|
-
ViewUtil.renderer.setProperty(container, name, value);
|
|
393
|
-
}
|
|
394
|
-
else {
|
|
395
|
-
ViewUtil.removeProperty(container, name);
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
static removeProperty(container, name) {
|
|
399
|
-
ViewUtil.removeAttribute(container, name);
|
|
400
|
-
}
|
|
401
|
-
static getAttribute(container, name) {
|
|
402
|
-
if (_.isNil(name)) {
|
|
403
|
-
return null;
|
|
404
|
-
}
|
|
405
|
-
container = ViewUtil.parseElement(container);
|
|
406
|
-
return !_.isNil(container) ? container.getAttribute(name) : null;
|
|
407
|
-
}
|
|
408
|
-
static removeAttribute(container, name) {
|
|
409
|
-
container = ViewUtil.parseElement(container);
|
|
410
|
-
if (_.isNil(name) || _.isNil(container)) {
|
|
411
|
-
return;
|
|
412
|
-
}
|
|
413
|
-
ViewUtil.renderer.removeAttribute(container, name);
|
|
414
|
-
}
|
|
415
|
-
static setAttribute(container, name, value) {
|
|
416
|
-
container = ViewUtil.parseElement(container);
|
|
417
|
-
if (_.isNil(name) || _.isNil(container)) {
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
|
-
if (!_.isNil(value)) {
|
|
421
|
-
ViewUtil.renderer.setAttribute(container, name, value);
|
|
422
|
-
}
|
|
423
|
-
else {
|
|
424
|
-
ViewUtil.removeAttribute(container, name);
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
static getStyle(container, name) {
|
|
428
|
-
container = ViewUtil.parseElement(container);
|
|
429
|
-
if (_.isNil(name) || _.isNil(container)) {
|
|
430
|
-
return null;
|
|
431
|
-
}
|
|
432
|
-
return container.style[name];
|
|
433
|
-
}
|
|
434
|
-
static setStyle(container, name, value, flags) {
|
|
435
|
-
container = ViewUtil.parseElement(container);
|
|
436
|
-
if (_.isNil(name) || _.isNil(container)) {
|
|
437
|
-
return;
|
|
438
|
-
}
|
|
439
|
-
if (value !== ViewUtil.getStyle(container, name)) {
|
|
440
|
-
ViewUtil.renderer.setStyle(container, name, value, flags);
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
static removeStyle(container, name, flags) {
|
|
444
|
-
container = ViewUtil.parseElement(container);
|
|
445
|
-
if (_.isNil(name) || _.isNil(container)) {
|
|
446
|
-
return;
|
|
447
|
-
}
|
|
448
|
-
ViewUtil.renderer.removeStyle(container, name, flags);
|
|
449
|
-
}
|
|
450
|
-
// --------------------------------------------------------------------------
|
|
451
|
-
//
|
|
452
|
-
// Video Methods
|
|
453
|
-
//
|
|
454
|
-
// --------------------------------------------------------------------------
|
|
455
|
-
static createVideo(isMute = true, isInline = false) {
|
|
456
|
-
let video = ViewUtil.createElement('video');
|
|
457
|
-
ViewUtil.setProperty(video, 'autoplay', true);
|
|
458
|
-
if (isMute) {
|
|
459
|
-
ViewUtil.setVideoMuteParameters(video, isMute);
|
|
460
|
-
}
|
|
461
|
-
if (isInline) {
|
|
462
|
-
ViewUtil.setVideoInlineParameters(video);
|
|
463
|
-
}
|
|
464
|
-
return video;
|
|
465
|
-
}
|
|
466
|
-
static setVideoMuteParameters(video, isMute = true) {
|
|
467
|
-
if (!_.isNil(video)) {
|
|
468
|
-
video.muted = video.defaultMuted = isMute;
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
static setVideoInlineParameters(video) {
|
|
472
|
-
ViewUtil.setAttribute(video, 'webkit-playsinline', 1);
|
|
473
|
-
ViewUtil.setAttribute(video, 'playsinline', true);
|
|
474
|
-
}
|
|
475
|
-
static getVideoError(video) {
|
|
476
|
-
if (_.isNil(video) || _.isNil(video.error)) {
|
|
477
|
-
return null;
|
|
478
|
-
}
|
|
479
|
-
let error = video.error;
|
|
480
|
-
let value = 'Video error ' + video.src + ', ';
|
|
481
|
-
switch (error.code) {
|
|
482
|
-
case MediaError.MEDIA_ERR_ABORTED:
|
|
483
|
-
value += 'media aborted';
|
|
484
|
-
break;
|
|
485
|
-
case MediaError.MEDIA_ERR_DECODE:
|
|
486
|
-
value += 'error to decode';
|
|
487
|
-
break;
|
|
488
|
-
case MediaError.MEDIA_ERR_NETWORK:
|
|
489
|
-
value += 'network error';
|
|
490
|
-
break;
|
|
491
|
-
case MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED:
|
|
492
|
-
value += 'source not supported';
|
|
493
|
-
break;
|
|
494
|
-
}
|
|
495
|
-
return value;
|
|
496
|
-
}
|
|
497
|
-
static playVideo(video) {
|
|
498
|
-
if (_.isNil(video)) {
|
|
499
|
-
return null;
|
|
500
|
-
}
|
|
501
|
-
try {
|
|
502
|
-
return video.play();
|
|
503
|
-
}
|
|
504
|
-
catch (error) {
|
|
505
|
-
return Promise.reject(error);
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
static playAudio(audio) {
|
|
509
|
-
if (_.isNil(audio)) {
|
|
510
|
-
return null;
|
|
511
|
-
}
|
|
512
|
-
try {
|
|
513
|
-
return audio.play();
|
|
514
|
-
}
|
|
515
|
-
catch (error) {
|
|
516
|
-
return Promise.reject(error);
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
static pauseVideo(video) {
|
|
520
|
-
if (!_.isNil(video)) {
|
|
521
|
-
video.pause();
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
static isVideoPlaying(video) {
|
|
525
|
-
return !_.isNil(video) ? !video.paused && !video.ended : false;
|
|
526
|
-
}
|
|
527
|
-
static loadVideo(video) {
|
|
528
|
-
if (!_.isNil(video)) {
|
|
529
|
-
video.load();
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
static stopVideoIfNeed(video) {
|
|
533
|
-
if (!_.isNil(video) && (!_.isNil(video.src) || !_.isNil(video.srcObject))) {
|
|
534
|
-
ViewUtil.stopVideo(video);
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
static stopVideo(video) {
|
|
538
|
-
if (_.isNil(video)) {
|
|
539
|
-
return;
|
|
540
|
-
}
|
|
541
|
-
if (video.srcObject instanceof MediaStream) {
|
|
542
|
-
let tracks = video.srcObject.getTracks();
|
|
543
|
-
tracks.forEach(track => track.stop());
|
|
544
|
-
}
|
|
545
|
-
video.srcObject = null;
|
|
546
|
-
video.pause();
|
|
547
|
-
video.src = '';
|
|
548
|
-
video.load();
|
|
549
|
-
}
|
|
550
|
-
static disposeVideo(video) {
|
|
551
|
-
ViewUtil.stopVideo(video);
|
|
552
|
-
ViewUtil.removeChild(video.parentNode, video);
|
|
553
|
-
video.remove();
|
|
554
|
-
}
|
|
555
|
-
static disposeVideos(container) {
|
|
556
|
-
container = ViewUtil.parseElement(container);
|
|
557
|
-
for (let i = container.children.length - 1; i >= 0; i--) {
|
|
558
|
-
let item = container.children.item(i);
|
|
559
|
-
if (item instanceof HTMLVideoElement) {
|
|
560
|
-
ViewUtil.disposeVideo(item);
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
// --------------------------------------------------------------------------
|
|
565
|
-
//
|
|
566
|
-
// Object Methods
|
|
567
|
-
//
|
|
568
|
-
// --------------------------------------------------------------------------
|
|
569
|
-
static disposeObjects(container, isIEBrowser) {
|
|
570
|
-
container = ViewUtil.parseElement(container);
|
|
571
|
-
for (let i = container.children.length - 1; i >= 0; i--) {
|
|
572
|
-
let item = container.children.item(i);
|
|
573
|
-
if (item instanceof HTMLObjectElement) {
|
|
574
|
-
ViewUtil.disposeObject(item, isIEBrowser);
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
static disposeObject(object, isIEBrowser) {
|
|
579
|
-
if (isIEBrowser && object['readyState'] === 4) {
|
|
580
|
-
for (let i in object) {
|
|
581
|
-
if (_.isFunction(object[i])) {
|
|
582
|
-
object[i] = null;
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
ViewUtil.removeChild(object.parentNode, object);
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmlld1V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbC9WaWV3VXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQThDLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUU1QixNQUFNLE9BQU8sUUFBUTtJQUNqQiw2RUFBNkU7SUFDN0UsRUFBRTtJQUNGLFlBQVk7SUFDWixFQUFFO0lBQ0YsNkVBQTZFO0lBRXJFLE1BQU0sQ0FBQyxTQUFTLEdBQWMsSUFBSSxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxTQUFTLEdBQWEsSUFBSSxDQUFDO0lBRW5DLE1BQU0sS0FBSyxRQUFRO1FBQ3RCLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksYUFBYSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUM5QixDQUFDO0lBQ00sTUFBTSxLQUFLLFFBQVEsQ0FBQyxLQUFnQjtRQUN2QyxJQUFJLEtBQUssS0FBSyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDL0IsT0FBTztRQUNYLENBQUM7UUFDRCxRQUFRLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRU0sTUFBTSxLQUFLLFFBQVE7UUFDdEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDeEUsQ0FBQztJQUNNLE1BQU0sS0FBSyxRQUFRLENBQUMsS0FBZTtRQUN0QyxRQUFRLENBQUMsU0FB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QUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzFCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUNELFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBSZW5kZXJlclN0eWxlRmxhZ3MyLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFeHRlbmRlZEVycm9yIH0gZnJvbSAnQHRzLWNvcmUvY29tbW9uJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNsYXNzIFZpZXdVdGlsIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vXG4gICAgLy9cdENvbnN0YW50c1xuICAgIC8vXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIHByaXZhdGUgc3RhdGljIF9yZW5kZXJlcjogUmVuZGVyZXIyID0gbnVsbDtcbiAgICBwcml2YXRlIHN0YXRpYyBfZG9jdW1lbnQ6IERvY3VtZW50ID0gbnVsbDtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IHJlbmRlcmVyKCk6IFJlbmRlcmVyMiB7XG4gICAgICAgIGlmIChfLmlzTmlsKFZpZXdVdGlsLl9yZW5kZXJlcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFeHRlbmRlZEVycm9yKGBWaWV3VXRpbCBpcyBub3QgaW5pdGlhbGl6ZWQ6IHJlbmRlcmVyIGluIG5pbGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBWaWV3VXRpbC5fcmVuZGVyZXI7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2V0IHJlbmRlcmVyKHZhbHVlOiBSZW5kZXJlcjIpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBWaWV3VXRpbC5fcmVuZGVyZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBWaWV3VXRpbC5fcmVuZGVyZXIgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBkb2N1bWVudCgpOiBEb2N1bWVudCB7XG4gICAgICAgIHJldHVybiAhXy5pc05pbChWaWV3VXRpbC5fZG9jdW1lbnQpID8gVmlld1V0aWwuX2RvY3VtZW50IDogZG9jdW1lbnQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2V0IGRvY3VtZW50KHZhbHVlOiBEb2N1bWVudCkge1xuICAgICAgICBWaWV3VXRpbC5fZG9jdW1lbnQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCB3aW5kb3coKTogV2luZG93IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvL1xuICAgIC8vXHRQcml2YXRlIE1ldGhvZHNcbiAgICAvL1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb3B5VG9DbGlwYm9hcmQoKTogdm9pZCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBWaWV3VXRpbC5kb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vXG4gICAgLy9cdENvbW1vbiBQcm9wZXJ0aWVzXG4gICAgLy9cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZUVsZW1lbnQ8VCBleHRlbmRzIEhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ+KGVsZW1lbnQ6IElWaWV3RWxlbWVudDxUPik6IFQge1xuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudCBhcyBUO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVmlld0NvbnRhaW5lclJlZikge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIV8uaXNOaWwoZWxlbWVudCkgPyBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQgOiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlQmFzZTY0KGVsZW1lbnQ6IEhUTUxJbWFnZUVsZW1lbnQgfCBIVE1MQ2FudmFzRWxlbWVudCB8IEhUTUxWaWRlb0VsZW1lbnQpOiBzdHJpbmcge1xuICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICBsZXQgY2FudmFzID0gVmlld1V0aWwuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIFZpZXdVdGlsLnNldFByb3BlcnR5KGNhbnZhcywgJ3dpZHRoJywgZWxlbWVudC5vZmZzZXRXaWR0aCk7XG4gICAgICAgIFZpZXdVdGlsLnNldFByb3BlcnR5KGNhbnZhcywgJ2hlaWdodCcsIGVsZW1lbnQub2Zmc2V0SGVpZ2h0KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGVsZW1lbnQsIDAsIDAsIGVsZW1lbnQub2Zmc2V0V2lkdGgsIGVsZW1lbnQub2Zmc2V0SGVpZ2h0KTtcbiAgICAgICAgICAgIHZhbHVlID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIDEuMCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJywgJycpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VsZWN0Q29udGVudChjb250YWluZXI6IElWaWV3RWxlbWVudCwgaXNOZWVkQ29weVRvQ2xpcGJvYXJkOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgY29udGFpbmVyID0gVmlld1V0aWwucGFyc2VFbGVtZW50KGNvbnRhaW5lcik7XG4gICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IGNvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGxldCBpc1dhc0Rpc2FibGVkID0gY29udGFpbmVyLmRpc2FibGVkO1xuICAgICAgICAgICAgaWYgKGlzV2FzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRhaW5lci5zZWxlY3QoKTtcbiAgICAgICAgICAgIGlmIChpc05lZWRDb3B5VG9DbGlwYm9hcmQpIHtcbiAgICAgICAgICAgICAgICBWaWV3VXRpbC5jb3B5VG9DbGlwYm9hcmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1dhc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb24gPSBWaWV3VXRpbC53aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cbiAgICAgICAgICAgIGxldCByYW5nZSA9IFZpZXdVdGlsLmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICBpZiAoIV8uaXNOaWwoY29udGFpbmVyKSkge1xuICAgICAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhjb250YWluZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgICAgICAgICAgaWYgKGlzTmVlZENvcHlUb0NsaXBib2FyZCkge1xuICAgICAgICAgICAgICAgIFZpZXdVdGlsLmNvcHlUb0NsaXBib2FyZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXRCYWNrZ3JvdW5kKGNvbnRhaW5lcjogSVZpZXdFbGVtZW50LCBpbWFnZTogc3RyaW5nLCByZXBlYXQ6IHN0cmluZyA9ICdyZXBlYXQnLCBlcnJvcj86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoXy5pc05pbChpbWFnZSkpIHtcbiAgICAgICAgICAgIFZpZXdVdGlsLnJlbW92ZVN0eWxlKGNvbnRhaW5lciwgJ2JhY2tncm91bmRJbWFnZScpO1xuICAgICAgICAgICAgVmlld1V0aWwucmVtb3ZlU3R5bGUoY29udGFpbmVyLCAnYmFja2dyb3VuZFJlcGVhdCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaW1hZ2UgPSBWaWV3VXRpbC5nZXRCYWNrZ3JvdW5kVXJsKGltYWdlKTtcbiAgICAgICAgaWYgKCFfLmlzRW1wdHkoZXJyb3IpKSB7XG4gICAgICAgICAgICBpbWFnZSArPSBgLCAke1ZpZXdVdGlsLmdldEJhY2tncm91bmRVcmwoZXJyb3IpfWA7XG4gICAgICAgIH1cblxuICAgICAgICBWaWV3VXRpbC5zZXRTdHlsZShjb250YWluZXIsICdiYWNrZ3JvdW5kSW1hZ2UnLCBpbWFnZSk7XG4gICAgICAgIFZpZXdVdGlsLnNldFN0eWxlKGNvbnRhaW5lciwgJ2JhY2tncm91bmRSZXBlYXQnLCByZXBlYXQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QmFja2dyb3VuZFVybChpdGVtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gIWl0ZW0uaW5jbHVkZXMoJ3VybCgnKSA/IGB1cmwoJHtpdGVtfSlgIDogaXRlbTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vXG4gICAgLy9cdENoaWxkIE1ldGhvZHNcbiAgICAvL1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUVsZW1lbnQ8VCA9IGFueT4obmFtZTogc3RyaW5nLCBjbGFzc05hbWU/OiBzdHJpbmcsIGlubmVySFRNTD86IHN0cmluZyk6IFQge1xuICAgICAgICBsZXQgZWxlbWVudCA9IFZpZXdVdGlsLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQobmFtZSk7XG4gICAgICAgIGlmICghXy5pc05pbChuYW1lKSkge1xuICAgICAgICAgICAgVmlld1V0aWwuc2V0UHJvcGVydHkoZWxlbWVudCwgJ2NsYXNzTmFtZScsIGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfLmlzTmlsKGlubmVySFRNTCkpIHtcbiAgICAgICAgICAgIFZpZXdVdGlsLnNldFByb3BlcnR5KGVsZW1lbnQsICdpbm5lckhUTUwnLCBpbm5lckhUTUwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXBwZW5kQ2hpbGQocGFyZW50OiBhbnksIGNoaWxkOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFfLmlzTmlsKHBhcmVudCkgJiYgIV8uaXNOaWwoY2hpbGQpKSB7XG4gICAgICAgICAgICBWaWV3VXRpbC5yZW5kZXJlci5hcHBlbmRDaGlsZChwYXJlbnQsIGNoaWxkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlQ2hpbGQocGFyZW50OiBhbnksIGNoaWxkOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFfLmlzTmlsKHBhcmVudCkgJiYgIV8uaXNOaWwoY2hpbGQpKSB7XG4gICAgICAgICAgICBWaWV3VXRpbC5yZW5kZXJlci5yZW1vdmVDaGlsZChwYXJlbnQsIGNoaWxkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdG9nZ2xlQ2hpbGQoY29udGFpbmVyOiBOb2RlLCBjaGlsZDogTm9kZSwgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgbGV0IGlzQ29udGFpbnMgPSBjb250YWluZXIuY29udGFpbnMoY2hpbGQpO1xuICAgICAgICBpZiAodmFsdWUgJiYgIWlzQ29udGFpbnMpIHtcbiAgICAgICAgICAgIFZpZXdVdGlsLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdmFsdWUgJiYgaXNDb250YWlucykge1xuICAgICAgICAgICAgVmlld1V0aWwucmVtb3ZlQ2hpbGQoY29udGFpbmVyLCBjaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vXG4gICAgLy9cdFNpemUgTWV0aG9kc1xuICAgIC8vXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U3RhZ2VXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gVmlld1V0aWwud2luZG93LmlubmVyV2lkdGggfHwgVmlld1V0aWwuZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFN0YWdlSGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBWaWV3VXRpbC53aW5kb3cuaW5uZXJIZWlnaHQgfHwgVmlld1V0aWwuZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDYW52YXNDb250ZXh0MmQoY29udGFpbmVyOiBJVmlld0VsZW1lbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LCBvcHRpb25zPzogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEU2V0dGluZ3MpOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQge1xuICAgICAgICBsZXQgY2FudmFzID0gVmlld1V0aWwucGFyc2VFbGVtZW50KGNvbnRhaW5lcik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gY2FudmFzLmdldENvbnRleHQoJzJkJywgb3B0aW9ucyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Qm91bmRpbmdSZWN0YW5nbGUoY29udGFpbmVyOiBJVmlld0VsZW1lbnQpOiBET01SZWN0IHtcbiAgICAgICAgY29udGFpbmVyID0gVmlld1V0aWwucGFyc2VFbGVtZW50KGNvbnRhaW5lcik7XG4gICAgICAgIGlmIChfLmlzTmlsKGNvbnRhaW5lcikgfHwgXy5pc05pbChjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB4OiBOYU4sXG4gICAgICAgICAgICAgICAgeTogTmFOLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBOYU4sXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBOYU4sXG4gICAgICAgICAgICAgICAgdG9wOiBOYU4sXG4gICAgICAgICAgICAgICAgcmlnaHQ6IE5hTixcbiAgICAgICAgICAgICAgICBsZWZ0OiBOYU4sXG4gICAgICAgICAgICAgICAgYm90dG9tOiBOYU5cbiAgICAgICAgICAgIH0gYXMgRE9NUmVjdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0V2lkdGgoY29udGFpbmVyOiBJVmlld0VsZW1lbnQpOiBudW1iZXIge1xuICAgICAgICBjb250YWluZXIgPSBWaWV3VXRpbC5wYXJzZUVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgICAgaWYgKF8uaXNOaWwoY29udGFpbmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZUZsb2F0KFZpZXdVdGlsLmdldFN0eWxlKGNvbnRhaW5lciwgJ3dpZHRoJykpO1xuICAgICAgICBpZiAoXy5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gVmlld1V0aWwuZ2V0Qm91bmRpbmdSZWN0YW5nbGUoY29udGFpbmVyKS53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXy5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY29udGFpbmVyLm9mZnNldFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNldFdpZHRoKGNvbnRhaW5lcjogSVZpZXdFbGVtZW50LCB2YWx1ZTogbnVtYmVyLCBpc05lZWRDaGVja0xpbWl0czogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChfLmlzTmlsKGNvbnRhaW5lcikgfHwgXy5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzTmVlZENoZWNrTGltaXRzICYmXG4gICAgICAgICAgICAodmFsdWUgPCBWaWV3VXRpbC5nZXRNaW5XaWR0aChjb250YWluZXIpIHx8IHZhbHVlID4gVmlld1V0aWwuZ2V0TWF4V2lkdGgoY29udGFpbmVyKSB8fCB2YWx1ZSA9PT0gVmlld1V0aWwuZ2V0V2lkdGgoY29udGFpbmVyKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBWaWV3VXRpbC5zZXRTdHlsZShjb250YWluZXIsICd3aWR0aCcsIHZhbHVlICsgJ3B4Jyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TWF4V2lkdGgoY29udGFpbmVyOiBJVmlld0VsZW1lbnQpOiBudW1iZXIge1xuICAgICAgICBpZiAoXy5pc05pbChjb250YWluZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWx1ZSA9IHBhcnNlRmxvYXQoVmlld1V0aWwuZ2V0U3R5bGUoY29udGFpbmVyLCAnbWF4V2lkdGgnKSk7XG4gICAgICAgIGlmIChfLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TWluV2lkdGgoY29udGFpbmVyOiBJVmlld0VsZW1lbnQpOiBudW1iZXIge1xuICAgICAgICBpZiAoXy5pc05pbChjb250YWluZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWx1ZSA9IHBhcnNlRmxvYXQoVmlld1V0aWwuZ2V0U3R5bGUoY29udGFpbmVyLCAnbWluV2lkdGgnKSk7XG4gICAgICAgIGlmIChfLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEhlaWdodChjb250YWluZXI6IElWaWV3RWxlbWVudCk6IG51bWJlciB7XG4gICAgICAgIGNvbnRhaW5lciA9IFZpZXdVdGlsLnBhcnNlRWxlbWVudChjb250YWluZXIpO1xuICAgICAgICBpZiAoXy5pc05pbChjb250YWluZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlID0gcGFyc2VGbG9hdChWaWV3VXRpbC5nZXRTdHlsZShjb250YWluZXIsICdoZWlnaHQnKSk7XG4gICAgICAgIGlmIChfLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBWaWV3VXRpbC5nZXRCb3VuZGluZ1JlY3RhbmdsZShjb250YWluZXIpLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXy5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gY29udGFpbmVyLm9mZnNldEhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2V0SGVpZ2h0KGNvbnRhaW5lcjogSVZpZXdFbGVtZW50LCB2YWx1ZTogbnVtYmVyLCBpc05lZWRDaGVja0xpbWl0czogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChfLmlzTmlsKGNvbnRhaW5lcikgfHwgXy5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc05lZWRDaGVja0xpbWl0cyAmJlxuICAgICAgICAgICAgKHZhbHVlIDwgVmlld1V0aWwuZ2V0TWluSGVpZ2h0KGNvbnRhaW5lcikgfHwgdmFsdWUgPiBWaWV3VXRpbC5nZXRNYXhIZWlnaHQoY29udGFpbmVyKSB8fCB2YWx1ZSA9PT0gVmlld1V0aWwuZ2V0SGVpZ2h0KGNvbnRhaW5lcikpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIFZpZXdVdGlsLnNldFN0eWxlKGNvbnRhaW5lciwgJ2hlaWdodCcsIHZhbHVlICsgJ3B4Jyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldE1heEhlaWdodChjb250YWluZXI6IElWaWV3RWxlbWVudCk6IG51bWJlciB7XG4gICAgICAgIGlmIChfLmlzTmlsKGNvbnRhaW5lcikpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlID0gcGFyc2VGbG9hdChWaWV3VXRpbC5nZXRTdHlsZShjb250YWluZXIsICdtYXhIZWlnaHQnKSk7XG4gICAgICAgIGlmIChfLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldE1pbkhlaWdodChjb250YWluZXI6IElWaWV3RWxlbWVudCk6IG51bWJlciB7XG4gICAgICAgIGlmIChfLmlzTmlsKGNvbnRhaW5lcikpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlID0gcGFyc2VGbG9hdChWaWV3VXRpbC5nZXRTdHlsZShjb250YWluZXIsICdtaW5IZWlnaHQnKSk7XG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzaXplKGNvbnRhaW5lcjogSVZpZXdFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgaXNOZWVkQ2hlY2tMaW1pdHM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgVmlld1V0aWwuc2V0V2lkdGgoY29udGFpbmVyLCB3aWR0aCwgaXNOZWVkQ2hlY2tMaW1pdHMpO1xuICAgICAgICBWaWV3VXRpbC5zZXRIZWlnaHQoY29udGFpbmVyLCBoZWlnaHQsIGlzTmVlZENoZWNrTGltaXRzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFgoY29udGFpbmVyOiBJVmlld0VsZW1lbnQpOiBudW1iZXIge1xuICAgICAgICBpZiAoXy5pc05pbChjb250YWluZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWx1ZSA9IHBhcnNlRmxvYXQoVmlld1V0aWwuZ2V0U3R5bGUoY29udGFpbmVyLCAnbGVmdCcpKTtcbiAgICAgICAgcmV0dXJuIF8uaXNOYU4odmFsdWUpID8gMCA6IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2V0WChjb250YWluZXI6IElWaWV3RWxlbWVudCwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIV8uaXNOaWwoY29udGFpbmVyKSAmJiAhXy5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIFZpZXdVdGlsLnNldFN0eWxlKGNvbnRhaW5lciwgJ2xlZnQnLCB2YWx1ZSArICdweCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRZKGNvbnRhaW5lcjogSVZpZXdFbGVtZW50KTogbnVtYmVyIHtcbiAgICAgICAgaWYgKF8uaXNOaWwoY29udGFpbmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZUZsb2F0KFZpZXdVdGlsLmdldFN0eWxlKGNvbnRhaW5lciwgJ3RvcCcpKTtcbiAgICAgICAgcmV0dXJuIF8uaXNOYU4odmFsdWUpID8gMCA6IHZhbHVlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNldFkoY29udGFpbmVyOiBJVmlld0VsZW1lbnQsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFfLmlzTmlsKGNvbnRhaW5lcikgJiYgIV8uaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICBWaWV3VXRpbC5zZXRTdHlsZShjb250YWluZXIsICd0b3AnLCB2YWx1ZSArICdweCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgbW92ZShjb250YWluZXI6IElWaWV3RWxlbWVudCwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgVmlld1V0aWwuc2V0WChjb250YWluZXIsIHgpO1xuICAgICAgICBWaWV3VXRpbC5zZXRZKGNvbnRhaW5lciwgeSk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvL1xuICAgIC8vXHRGb2N1cyBNZXRob2RzXG4gICAgLy9cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgcHVibGljIHN0YXRpYyBmb2N1c0lucHV0KGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBsZXQgY2FyZXRJbmRleCA9IDA7XG4gICAgICAgIGlmICghXy5pc05pbChpbnB1dC52YWx1ZSkpIHtcbiAgICAgICAgICAgIGNhcmV0SW5kZXggPSBNYXRoLm1heCgwLCBpbnB1dC52YWx1ZS50b1N0cmluZygpLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXRJbmRleCwgY2FyZXRJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvL1xuICAgIC8vXHRDbGFzc2VzIE1ldGhvZHNcbiAgICAvL1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBwdWJsaWMgc3RhdGljIGFkZENsYXNzKGNvbnRhaW5lcjogSVZpZXdFbGVtZW50LCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKF8uaXNFbXB0eShuYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRhaW5lciA9IFZpZXdVdGlsLnBhcnNlRWxlbWVudChjb250YWluZXIpO1xuICAgICAgICBpZiAoIV8uaXNOaWwoY29udGFpbmVyKSkge1xuICAgICAgICAgICAgVmlld1V0aWwucmVuZGVyZXIuYWRkQ2xhc3MoY29udGFpbmVyLCBuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYWRkQ2xhc3Nlcyhjb250YWluZXI6IElWaWV3RWxlbWVudCwgbmFtZXM6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoXy5pc0VtcHR5KG5hbWVzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5hbWVzLnNwbGl0KCcgJykuZm9yRWFjaChuYW1lID0+IFZpZXdVdGlsLmFkZENsYXNzKGNvbnRhaW5lciwgbmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlQ2xhc3MoY29udGFpbmVyOiBJVmlld0VsZW1lbnQsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoXy5pc0VtcHR5KG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGFpbmVyID0gVmlld1V0aWwucGFyc2VFbGVtZW50KGNvbnRhaW5lcik7XG4gICAgICAgIGlmICghXy5pc05pbChjb250YWluZXIpKSB7XG4gICAgICAgICAgICBWaWV3VXRpbC5yZW5kZXJlci5yZW1vdmVDbGFzcyhjb250YWluZXIsIG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmVDbGFzc2VzKGNvbnRhaW5lcjogSVZpZXdFbGVtZW50LCBuYW1lczogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChfLmlzRW1wdHkobmFtZXMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbmFtZXMuc3BsaXQoJyAnKS5mb3JFYWNoKG5hbWUgPT4gVmlld1V0aWwucmVtb3ZlQ2xhc3MoY29udGFpbmVyLCBuYW1lKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNDbGFzcyhjb250YWluZXI6IElWaWV3RWxlbWVudCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChfLmlzTmlsKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29udGFpbmVyID0gVmlld1V0aWwucGFyc2VFbGVtZW50KGNvbnRhaW5lcik7XG4gICAgICAgIHJldHVybiAhXy5pc05pbChjb250YWluZXIpID8gY29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSA6IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdG9nZ2xlQ2xhc3MoY29udGFpbmVyOiBJVmlld0VsZW1lbnQsIG5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBWaWV3VXRpbC5hZGRDbGFzcyhjb250YWluZXIsIG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgVmlld1V0aWwucmVtb3ZlQ2xhc3MoY29udGFpbmVyLCBuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdG9nZ2xlQ2xhc3Nlcyhjb250YWluZXI6IElWaWV3RWxlbWVudCwgbmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIFZpZXdVdGlsLmFkZENsYXNzZXMoY29udGFpbmVyLCBuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFZpZXdVdGlsLnJlbW92ZUNsYXNzZXMoY29udGFpbmVyLCBuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UHJvcGVydHkoY29udGFpbmVyOiBJVmlld0VsZW1lbnQsIG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIGlmIChfLmlzTmlsKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb250YWluZXIgPSBWaWV3VXRpbC5wYXJzZUVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgICAgcmV0dXJuICFfLmlzTmlsKGNvbnRhaW5lcikgPyBjb250YWluZXJbbmFtZV0gOiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2V0UHJvcGVydHkoY29udGFpbmVyOiBJVmlld0VsZW1lbnQsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBjb250YWluZXIgPSBWaWV3VXRpbC5wYXJzZUVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgICAgaWYgKF8uaXNOaWwobmFtZSkgfHwgXy5pc05pbChjb250YWluZXIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfLmlzTmlsKHZhbHVlKSkge1xuICAgICAgICAgICAgVmlld1V0aWwucmVuZGVyZXIuc2V0UHJvcGVydHkoY29udGFpbmVyLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBWaWV3VXRpbC5yZW1vdmVQcm9wZXJ0eShjb250YWluZXIsIG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmVQcm9wZXJ0eShjb250YWluZXI6IElWaWV3RWxlbWVudCwgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIFZpZXdVdGlsLnJlbW92ZUF0dHJpYnV0ZShjb250YWluZXIsIG5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXR0cmlidXRlKGNvbnRhaW5lcjogSVZpZXdFbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICBpZiAoXy5pc05pbChuYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29udGFpbmVyID0gVmlld1V0aWwucGFyc2VFbGVtZW50KGNvbnRhaW5lcik7XG4gICAgICAgIHJldHVybiAhXy5pc05pbChjb250YWluZXIpID8gY29udGFpbmVyLmdldEF0dHJpYnV0ZShuYW1lKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmVBdHRyaWJ1dGUoY29udGFpbmVyOiBJVmlld0VsZW1lbnQsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb250YWluZXIgPSBWaWV3VXRpbC5wYXJzZUVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgICAgaWYgKF8uaXNOaWwobmFtZSkgfHwgXy5pc05pbChjb250YWluZXIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgVmlld1V0aWwucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGNvbnRhaW5lciwgbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXRBdHRyaWJ1dGUoY29udGFpbmVyOiBJVmlld0VsZW1lbnQsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBjb250YWluZXIgPSBWaWV3VXRpbC5wYXJzZUVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgICAgaWYgKF8uaXNOaWwobmFtZSkgfHwgXy5pc05pbChjb250YWluZXIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfLmlzTmlsKHZhbHVlKSkge1xuICAgICAgICAgICAgVmlld1V0aWwucmVuZGVyZXIuc2V0QXR0cmlidXRlKGNvbnRhaW5lciwgbmFtZSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgVmlld1V0aWwucmVtb3ZlQXR0cmlidXRlKGNvbnRhaW5lciwgbmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFN0eWxlKGNvbnRhaW5lcjogSVZpZXdFbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICBjb250YWluZXIgPSBWaWV3VXRpbC5wYXJzZUVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgICAgaWYgKF8uaXNOaWwobmFtZSkgfHwgXy5pc05pbChjb250YWluZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGFpbmVyLnN0eWxlW25hbWVdO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2V0U3R5bGUoY29udGFpbmVyOiBJVmlld0VsZW1lbnQsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgZmxhZ3M/OiBSZW5kZXJlclN0eWxlRmxhZ3MyKTogdm9pZCB7XG4gICAgICAgIGNvbnRhaW5lciA9IFZpZXdVdGlsLnBhcnNlRWxlbWVudChjb250YWluZXIpO1xuICAgICAgICBpZiAoXy5pc05pbChuYW1lKSB8fCBfLmlzTmlsKGNvbnRhaW5lcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgIT09IFZpZXdVdGlsLmdldFN0eWxlKGNvbnRhaW5lciwgbmFtZSkpIHtcbiAgICAgICAgICAgIFZpZXdVdGlsLnJlbmRlcmVyLnNldFN0eWxlKGNvbnRhaW5lciwgbmFtZSwgdmFsdWUsIGZsYWdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlU3R5bGUoY29udGFpbmVyOiBJVmlld0VsZW1lbnQsIG5hbWU6IHN0cmluZywgZmxhZ3M/OiBSZW5kZXJlclN0eWxlRmxhZ3MyKTogdm9pZCB7XG4gICAgICAgIGNvbnRhaW5lciA9IFZpZXdVdGlsLnBhcnNlRWxlbWVudChjb250YWluZXIpO1xuICAgICAgICBpZiAoXy5pc05pbChuYW1lKSB8fCBfLmlzTmlsKGNvbnRhaW5lcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBWaWV3VXRpbC5yZW5kZXJlci5yZW1vdmVTdHlsZShjb250YWluZXIsIG5hbWUsIGZsYWdzKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vXG4gICAgLy9cdFZpZGVvIE1ldGhvZHNcbiAgICAvL1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVZpZGVvKGlzTXV0ZTogYm9vbGVhbiA9IHRydWUsIGlzSW5saW5lOiBib29sZWFuID0gZmFsc2UpOiBIVE1MVmlkZW9FbGVtZW50IHtcbiAgICAgICAgbGV0IHZpZGVvID0gVmlld1V0aWwuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICAgICAgVmlld1V0aWwuc2V0UHJvcGVydHkodmlkZW8sICdhdXRvcGxheScsIHRydWUpO1xuICAgICAgICBpZiAoaXNNdXRlKSB7XG4gICAgICAgICAgICBWaWV3VXRpbC5zZXRWaWRlb011dGVQYXJhbWV0ZXJzKHZpZGVvLCBpc011dGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0lubGluZSkge1xuICAgICAgICAgICAgVmlld1V0aWwuc2V0VmlkZW9JbmxpbmVQYXJhbWV0ZXJzKHZpZGVvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlkZW87XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXRWaWRlb011dGVQYXJhbWV0ZXJzKHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50LCBpc011dGU6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGlmICghXy5pc05pbCh2aWRlbykpIHtcbiAgICAgICAgICAgIHZpZGVvLm11dGVkID0gdmlkZW8uZGVmYXVsdE11dGVkID0gaXNNdXRlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXRWaWRlb0lubGluZVBhcmFtZXRlcnModmlkZW86IEhUTUxWaWRlb0VsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgVmlld1V0aWwuc2V0QXR0cmlidXRlKHZpZGVvLCAnd2Via2l0LXBsYXlzaW5saW5lJywgMSk7XG4gICAgICAgIFZpZXdVdGlsLnNldEF0dHJpYnV0ZSh2aWRlbywgJ3BsYXlzaW5saW5lJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRWaWRlb0Vycm9yKHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKF8uaXNOaWwodmlkZW8pIHx8IF8uaXNOaWwodmlkZW8uZXJyb3IpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlcnJvcjogTWVkaWFFcnJvciA9IHZpZGVvLmVycm9yO1xuICAgICAgICBsZXQgdmFsdWUgPSAnVmlkZW8gZXJyb3IgJyArIHZpZGVvLnNyYyArICcsICc7XG4gICAgICAgIHN3aXRjaCAoZXJyb3IuY29kZSkge1xuICAgICAgICAgICAgY2FzZSBNZWRpYUVycm9yLk1FRElBX0VSUl9BQk9SVEVEOlxuICAgICAgICAgICAgICAgIHZhbHVlICs9ICdtZWRpYSBhYm9ydGVkJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTWVkaWFFcnJvci5NRURJQV9FUlJfREVDT0RFOlxuICAgICAgICAgICAgICAgIHZhbHVlICs9ICdlcnJvciB0byBkZWNvZGUnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBNZWRpYUVycm9yLk1FRElBX0VSUl9ORVRXT1JLOlxuICAgICAgICAgICAgICAgIHZhbHVlICs9ICduZXR3b3JrIGVycm9yJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTWVkaWFFcnJvci5NRURJQV9FUlJfU1JDX05PVF9TVVBQT1JURUQ6XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ3NvdXJjZSBub3Qgc3VwcG9ydGVkJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwbGF5VmlkZW8odmlkZW86IEhUTUxWaWRlb0VsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKF8uaXNOaWwodmlkZW8pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdmlkZW8ucGxheSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcGxheUF1ZGlvKGF1ZGlvOiBIVE1MQXVkaW9FbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChfLmlzTmlsKGF1ZGlvKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhdWRpby5wbGF5KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwYXVzZVZpZGVvKHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghXy5pc05pbCh2aWRlbykpIHtcbiAgICAgICAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzVmlkZW9QbGF5aW5nKHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhXy5pc05pbCh2aWRlbykgPyAhdmlkZW8ucGF1c2VkICYmICF2aWRlby5lbmRlZCA6IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbG9hZFZpZGVvKHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghXy5pc05pbCh2aWRlbykpIHtcbiAgICAgICAgICAgIHZpZGVvLmxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc3RvcFZpZGVvSWZOZWVkKHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghXy5pc05pbCh2aWRlbykgJiYgKCFfLmlzTmlsKHZpZGVvLnNyYykgfHwgIV8uaXNOaWwodmlkZW8uc3JjT2JqZWN0KSkpIHtcbiAgICAgICAgICAgIFZpZXdVdGlsLnN0b3BWaWRlbyh2aWRlbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHN0b3BWaWRlbyh2aWRlbzogSFRNTFZpZGVvRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBpZiAoXy5pc05pbCh2aWRlbykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2aWRlby5zcmNPYmplY3QgaW5zdGFuY2VvZiBNZWRpYVN0cmVhbSkge1xuICAgICAgICAgICAgbGV0IHRyYWNrcyA9IHZpZGVvLnNyY09iamVjdC5nZXRUcmFja3MoKTtcbiAgICAgICAgICAgIHRyYWNrcy5mb3JFYWNoKHRyYWNrID0+IHRyYWNrLnN0b3AoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2aWRlby5zcmNPYmplY3QgPSBudWxsO1xuXG4gICAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgICAgIHZpZGVvLnNyYyA9ICcnO1xuICAgICAgICB2aWRlby5sb2FkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkaXNwb3NlVmlkZW8odmlkZW86IEhUTUxWaWRlb0VsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgVmlld1V0aWwuc3RvcFZpZGVvKHZpZGVvKTtcbiAgICAgICAgVmlld1V0aWwucmVtb3ZlQ2hpbGQodmlkZW8ucGFyZW50Tm9kZSwgdmlkZW8pO1xuICAgICAgICB2aWRlby5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRpc3Bvc2VWaWRlb3MoY29udGFpbmVyOiBJVmlld0VsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29udGFpbmVyID0gVmlld1V0aWwucGFyc2VFbGVtZW50KGNvbnRhaW5lcik7XG4gICAgICAgIGZvciAobGV0IGkgPSBjb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gY29udGFpbmVyLmNoaWxkcmVuLml0ZW0oaSk7XG4gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBWaWV3VXRpbC5kaXNwb3NlVmlkZW8oaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vXG4gICAgLy9cdE9iamVjdCBNZXRob2RzXG4gICAgLy9cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgcHVibGljIHN0YXRpYyBkaXNwb3NlT2JqZWN0cyhjb250YWluZXI6IElWaWV3RWxlbWVudCwgaXNJRUJyb3dzZXI/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnRhaW5lciA9IFZpZXdVdGlsLnBhcnNlRWxlbWVudChjb250YWluZXIpO1xuICAgICAgICBmb3IgKGxldCBpID0gY29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgaXRlbSA9IGNvbnRhaW5lci5jaGlsZHJlbi5pdGVtKGkpO1xuICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBIVE1MT2JqZWN0RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIFZpZXdVdGlsLmRpc3Bvc2VPYmplY3QoaXRlbSwgaXNJRUJyb3dzZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkaXNwb3NlT2JqZWN0KG9iamVjdDogSFRNTE9iamVjdEVsZW1lbnQsIGlzSUVCcm93c2VyPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoaXNJRUJyb3dzZXIgJiYgb2JqZWN0WydyZWFkeVN0YXRlJ10gPT09IDQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKF8uaXNGdW5jdGlvbihvYmplY3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdFtpXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFZpZXdVdGlsLnJlbW92ZUNoaWxkKG9iamVjdC5wYXJlbnROb2RlLCBvYmplY3QpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgSVZpZXdFbGVtZW50PFQgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiA9IEhUTUxFbGVtZW50IHwgRWxlbWVudFJlZjxUPiB8IFZpZXdDb250YWluZXJSZWY7XG4iXX0=
|