@covalent/guided-tour 4.0.0-beta.2 → 4.1.0-develop.10

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.
@@ -0,0 +1,438 @@
1
+ import Shepherd from 'shepherd.js';
2
+ import { timer, Subject, BehaviorSubject, merge, fromEvent, forkJoin, } from 'rxjs';
3
+ import { takeUntil, skipWhile, filter, skip, first } from 'rxjs/operators';
4
+ export var ITourEvent;
5
+ (function (ITourEvent) {
6
+ ITourEvent["click"] = "click";
7
+ ITourEvent["pointerover"] = "pointerover";
8
+ ITourEvent["keyup"] = "keyup";
9
+ ITourEvent["added"] = "added";
10
+ ITourEvent["removed"] = "removed";
11
+ })(ITourEvent || (ITourEvent = {}));
12
+ class TourButtonsActions {
13
+ }
14
+ const SHEPHERD_DEFAULT_FIND_TIME_BEFORE_SHOW = 100;
15
+ const SHEPHERD_DEFAULT_FIND_INTERVAL = 500;
16
+ const SHEPHERD_DEFAULT_FIND_ATTEMPTS = 20;
17
+ const overriddenEvents = [
18
+ ITourEvent.click,
19
+ ITourEvent.pointerover,
20
+ ITourEvent.removed,
21
+ ITourEvent.added,
22
+ ITourEvent.keyup,
23
+ ];
24
+ const keyEvents = new Map([
25
+ [13, 'enter'],
26
+ [27, 'esc'],
27
+ ]);
28
+ const defaultStepOptions = {
29
+ scrollTo: { behavior: 'smooth', block: 'center' },
30
+ cancelIcon: {
31
+ enabled: true,
32
+ },
33
+ };
34
+ const MAT_ICON_BUTTON = 'mat-icon-button material-icons mat-button-base';
35
+ const MAT_BUTTON = 'mat-button-base mat-button';
36
+ const MAT_BUTTON_INVISIBLE = 'shepherd-void-button';
37
+ export class CovalentGuidedTour extends TourButtonsActions {
38
+ constructor(stepOptions = defaultStepOptions) {
39
+ super();
40
+ this.stepOptions = stepOptions;
41
+ this.newTour();
42
+ }
43
+ newTour(opts) {
44
+ this.shepherdTour = new Shepherd.Tour(Object.assign({
45
+ defaultStepOptions: this.stepOptions,
46
+ }, opts));
47
+ this._destroyedEvent$ = new Subject();
48
+ // listen to cancel and complete to clean up abortOn events
49
+ merge(fromEvent(this.shepherdTour, 'cancel'), fromEvent(this.shepherdTour, 'complete'))
50
+ .pipe(first())
51
+ .subscribe(() => {
52
+ this._destroyedEvent$.next();
53
+ this._destroyedEvent$.complete();
54
+ });
55
+ // if abortOn was passed, we bind the event and execute complete
56
+ if (opts && opts.abortOn) {
57
+ const abortArr$ = [];
58
+ opts.abortOn.forEach((abortOn) => {
59
+ const abortEvent$ = new Subject();
60
+ abortArr$.push(abortEvent$);
61
+ this._bindEvent(abortOn, undefined, abortEvent$, this._destroyedEvent$);
62
+ });
63
+ const abortSubs = merge(...abortArr$)
64
+ .pipe(takeUntil(this._destroyedEvent$))
65
+ .subscribe(() => {
66
+ this.shepherdTour.complete();
67
+ abortSubs.unsubscribe();
68
+ });
69
+ }
70
+ }
71
+ back() {
72
+ this.shepherdTour.back();
73
+ }
74
+ cancel() {
75
+ this.shepherdTour.cancel();
76
+ }
77
+ next() {
78
+ this.shepherdTour.next();
79
+ }
80
+ finish() {
81
+ this.shepherdTour.complete();
82
+ }
83
+ addSteps(steps) {
84
+ this.shepherdTour.addSteps(this._prepareTour(steps));
85
+ }
86
+ start() {
87
+ this.shepherdTour.start();
88
+ }
89
+ _prepareTour(originalSteps, finishLabel = 'finish') {
90
+ // create Subjects for back and forward events
91
+ const backEvent$ = new Subject();
92
+ const forwardEvent$ = new Subject();
93
+ let _backFlow = false;
94
+ // create Subject for your end
95
+ const destroyedEvent$ = new Subject();
96
+ /**
97
+ * This function adds the step progress in the footer of the shepherd tooltip
98
+ */
99
+ const appendProgressFunc = function () {
100
+ // get all the footers that are available in the DOM
101
+ const footers = Array.from(document.querySelectorAll('.shepherd-footer'));
102
+ // get the last footer since Shepherd always puts the active one at the end
103
+ const footer = footers[footers.length - 1];
104
+ // generate steps html element
105
+ const progress = document.createElement('span');
106
+ progress.className = 'shepherd-progress';
107
+ progress.innerText = `${this.shepherdTour.currentStep.options.count}/${stepTotal}`;
108
+ // insert into the footer before the first button
109
+ footer.insertBefore(progress, footer.querySelector('.shepherd-button'));
110
+ };
111
+ let stepTotal = 0;
112
+ const steps = originalSteps.map((step) => {
113
+ let showProgress = () => {
114
+ //
115
+ };
116
+ if (step.attachToOptions?.skipFromStepCount === true) {
117
+ showProgress = function () {
118
+ return;
119
+ };
120
+ }
121
+ else if (step.attachToOptions?.skipFromStepCount === undefined ||
122
+ step.attachToOptions?.skipFromStepCount === false) {
123
+ step.count = ++stepTotal;
124
+ showProgress = appendProgressFunc.bind(this);
125
+ }
126
+ return Object.assign({}, step, {
127
+ when: {
128
+ show: showProgress,
129
+ },
130
+ });
131
+ });
132
+ const finishButton = {
133
+ text: finishLabel,
134
+ action: this['finish'].bind(this),
135
+ classes: MAT_BUTTON,
136
+ };
137
+ const voidButton = {
138
+ text: '',
139
+ action() {
140
+ return;
141
+ },
142
+ classes: MAT_BUTTON_INVISIBLE,
143
+ };
144
+ // listen to the destroyed event to clean up all the streams
145
+ this._destroyedEvent$.pipe(first()).subscribe(() => {
146
+ backEvent$.complete();
147
+ forwardEvent$.complete();
148
+ destroyedEvent$.next();
149
+ destroyedEvent$.complete();
150
+ });
151
+ const totalSteps = steps.length;
152
+ steps.forEach((step, index) => {
153
+ // create buttons specific for the step
154
+ // this is done to create more control on events
155
+ const nextButton = {
156
+ text: 'chevron_right',
157
+ action: () => {
158
+ // intercept the next action and trigger event
159
+ forwardEvent$.next();
160
+ this.shepherdTour.next();
161
+ },
162
+ classes: MAT_ICON_BUTTON,
163
+ };
164
+ const backButton = {
165
+ text: 'chevron_left',
166
+ action: () => {
167
+ // intercept the back action and trigger event
168
+ backEvent$.next();
169
+ _backFlow = true;
170
+ // check if 'goBackTo' is set to jump to a particular step, else just go back
171
+ if (step.attachToOptions && step.attachToOptions.goBackTo) {
172
+ this.shepherdTour.show(step.attachToOptions.goBackTo, false);
173
+ }
174
+ else {
175
+ this.shepherdTour.back();
176
+ }
177
+ },
178
+ classes: step.advanceOnOptions?.allowGoBack === false
179
+ ? MAT_BUTTON_INVISIBLE
180
+ : MAT_ICON_BUTTON,
181
+ };
182
+ // check if highlight was provided for the step, else fallback into shepherds usage
183
+ step.highlightClass =
184
+ step.attachToOptions && step.attachToOptions.highlight
185
+ ? 'shepherd-highlight'
186
+ : step.highlightClass;
187
+ // Adding buttons in the steps if no buttons are defined
188
+ if (!step.buttons || step.buttons.length === 0) {
189
+ if (index === 0) {
190
+ // first step
191
+ step.buttons = [nextButton];
192
+ }
193
+ else if (index === totalSteps - 1) {
194
+ // last step
195
+ step.buttons = [backButton, finishButton];
196
+ }
197
+ else {
198
+ step.buttons = [backButton, nextButton];
199
+ }
200
+ }
201
+ // checks "advanceOn" to override listeners
202
+ let advanceOn = step.advanceOn;
203
+ // remove the shepherd "advanceOn" infavor of ours if the event is part of our list
204
+ if ((typeof advanceOn === 'object' &&
205
+ !Array.isArray(advanceOn) &&
206
+ advanceOn.event &&
207
+ overriddenEvents.indexOf(advanceOn.event.split('.')[0]) > -1) ||
208
+ advanceOn instanceof Array) {
209
+ step.advanceOn = undefined;
210
+ step.buttons =
211
+ step.advanceOnOptions && step.advanceOnOptions.allowGoBack
212
+ ? [backButton, voidButton]
213
+ : [voidButton];
214
+ }
215
+ // adds a default beforeShowPromise function
216
+ step.beforeShowPromise = () => {
217
+ return new Promise((resolve) => {
218
+ const additionalCapabilitiesSetup = () => {
219
+ if (advanceOn && !step.advanceOn) {
220
+ if (!Array.isArray(advanceOn)) {
221
+ advanceOn = [advanceOn];
222
+ }
223
+ const advanceArr$ = [];
224
+ advanceOn.forEach((_, i) => {
225
+ const advanceEvent$ = new Subject();
226
+ advanceArr$.push(advanceEvent$);
227
+ // we start a timer of attempts to find an element in the dom
228
+ this._bindEvent(_, step.advanceOnOptions, advanceEvent$, destroyedEvent$);
229
+ });
230
+ const advanceSubs = forkJoin(...advanceArr$)
231
+ .pipe(takeUntil(merge(destroyedEvent$, backEvent$)))
232
+ .subscribe(() => {
233
+ // check if we need to advance to a specific step, else advance to next step
234
+ if (step.advanceOnOptions && step.advanceOnOptions.jumpTo) {
235
+ this.shepherdTour.show(step.advanceOnOptions.jumpTo);
236
+ }
237
+ else {
238
+ this.shepherdTour.next();
239
+ }
240
+ forwardEvent$.next();
241
+ advanceSubs.unsubscribe();
242
+ });
243
+ }
244
+ // if abortOn was passed on the step, we bind the event and execute complete
245
+ if (step.abortOn) {
246
+ const abortArr$ = [];
247
+ step.abortOn.forEach((abortOn) => {
248
+ const abortEvent$ = new Subject();
249
+ abortArr$.push(abortEvent$);
250
+ this._bindEvent(abortOn, undefined, abortEvent$, destroyedEvent$);
251
+ });
252
+ const abortSubs = merge(...abortArr$)
253
+ .pipe(takeUntil(merge(destroyedEvent$, backEvent$, forwardEvent$)))
254
+ .subscribe(() => {
255
+ this.shepherdTour.complete();
256
+ abortSubs.unsubscribe();
257
+ });
258
+ }
259
+ };
260
+ const _stopTimer$ = new Subject();
261
+ const _retriesReached$ = new Subject();
262
+ const _retryAttempts$ = new BehaviorSubject(-1);
263
+ let id;
264
+ // checks if "attachTo" is a string or an object to get the id of an element
265
+ if (typeof step.attachTo === 'string') {
266
+ id = step.attachTo;
267
+ }
268
+ else if (typeof step.attachTo === 'object' &&
269
+ typeof step.attachTo.element === 'string') {
270
+ id = step.attachTo.element;
271
+ }
272
+ // if we have an id as a string in either case, we use it (we ignore it if its HTMLElement)
273
+ if (id) {
274
+ // if current step is the first step of the tour, we set the buttons to be only "next"
275
+ // we had to use `any` since the tour doesnt expose the steps in any fashion nor a way to check if we have modified them at all
276
+ if (this.shepherdTour.getCurrentStep() ===
277
+ this.shepherdTour.steps[0]) {
278
+ this.shepherdTour.getCurrentStep()?.updateStepOptions({
279
+ buttons: originalSteps[index].advanceOn
280
+ ? [voidButton]
281
+ : [nextButton],
282
+ });
283
+ }
284
+ // register to the attempts observable to notify deeveloper when number has been reached
285
+ _retryAttempts$
286
+ .pipe(skip(1), takeUntil(merge(_stopTimer$.asObservable(), destroyedEvent$)), skipWhile((val) => {
287
+ if (step.attachToOptions &&
288
+ step.attachToOptions.retries !== undefined) {
289
+ return val < step.attachToOptions.retries;
290
+ }
291
+ return val < SHEPHERD_DEFAULT_FIND_ATTEMPTS;
292
+ }))
293
+ .subscribe((attempts) => {
294
+ _retriesReached$.next(1);
295
+ _retriesReached$.complete();
296
+ // if attempts have been reached, we check "skipIfNotFound" to move on to the next step
297
+ if (step.attachToOptions &&
298
+ step.attachToOptions.skipIfNotFound) {
299
+ // if we get to this step coming back from a step and it wasnt found
300
+ // then we either check if its the first step and try going forward
301
+ // or we keep going back until we find a step that actually exists
302
+ if (_backFlow) {
303
+ if (this.shepherdTour.steps.indexOf(this.shepherdTour.getCurrentStep()) === 0) {
304
+ this.shepherdTour.next();
305
+ }
306
+ else {
307
+ this.shepherdTour.back();
308
+ }
309
+ _backFlow = false;
310
+ }
311
+ else {
312
+ // destroys current step if we need to skip it to remove it from the tour
313
+ const currentStep = this.shepherdTour.getCurrentStep();
314
+ currentStep?.destroy();
315
+ this.shepherdTour.next();
316
+ this.shepherdTour.removeStep(currentStep?.id ?? '');
317
+ }
318
+ }
319
+ else if (step.attachToOptions && step.attachToOptions.else) {
320
+ // if "skipIfNotFound" is not true, then we check if "else" has been set to jump to a specific step
321
+ this.shepherdTour.show(step.attachToOptions.else);
322
+ }
323
+ else {
324
+ // tslint:disable-next-line:no-console
325
+ console.warn(`Retries reached trying to find ${id}. Retried ${attempts} times.`);
326
+ // else we show the step regardless
327
+ resolve();
328
+ }
329
+ });
330
+ // we start a timer of attempts to find an element in the dom
331
+ timer((step.attachToOptions && step.attachToOptions.timeBeforeShow) ||
332
+ SHEPHERD_DEFAULT_FIND_TIME_BEFORE_SHOW, (step.attachToOptions && step.attachToOptions.interval) ||
333
+ SHEPHERD_DEFAULT_FIND_INTERVAL)
334
+ .pipe(
335
+ // the timer will continue either until we find the element or the number of attempts has been reached
336
+ takeUntil(merge(_stopTimer$, _retriesReached$, destroyedEvent$)))
337
+ .subscribe(() => {
338
+ const element = document.querySelector(id ?? '');
339
+ // if the element has been found, we stop the timer and resolve the promise
340
+ if (element) {
341
+ _stopTimer$.next();
342
+ _stopTimer$.complete();
343
+ additionalCapabilitiesSetup();
344
+ resolve();
345
+ }
346
+ else {
347
+ _retryAttempts$.next(_retryAttempts$.value + 1);
348
+ }
349
+ });
350
+ // stop find interval if user stops the tour
351
+ destroyedEvent$.subscribe(() => {
352
+ _stopTimer$.next();
353
+ _stopTimer$.complete();
354
+ _retriesReached$.next(1);
355
+ _retriesReached$.complete();
356
+ });
357
+ }
358
+ else {
359
+ // resolve observable until the timeBeforeShow has passsed or use default
360
+ timer((step.attachToOptions && step.attachToOptions.timeBeforeShow) ||
361
+ SHEPHERD_DEFAULT_FIND_TIME_BEFORE_SHOW)
362
+ .pipe(takeUntil(merge(destroyedEvent$)))
363
+ .subscribe(() => {
364
+ resolve();
365
+ });
366
+ }
367
+ });
368
+ };
369
+ });
370
+ return steps;
371
+ }
372
+ _bindEvent(eventOn, eventOnOptions, event$, destroyedEvent$) {
373
+ const selector = eventOn.selector ?? '';
374
+ const event = eventOn.event;
375
+ // we start a timer of attempts to find an element in the dom
376
+ const timerSubs = timer((eventOnOptions && eventOnOptions.timeBeforeShow) ||
377
+ SHEPHERD_DEFAULT_FIND_TIME_BEFORE_SHOW, (eventOnOptions && eventOnOptions.interval) ||
378
+ SHEPHERD_DEFAULT_FIND_INTERVAL)
379
+ .pipe(takeUntil(destroyedEvent$))
380
+ .subscribe(() => {
381
+ const element = document.querySelector(selector);
382
+ // if the element has been found, we stop the timer and resolve the promise
383
+ if (element) {
384
+ timerSubs.unsubscribe();
385
+ if (event === ITourEvent.added) {
386
+ // if event is "Added" trigger a soon as this is attached.
387
+ event$.next();
388
+ event$.complete();
389
+ }
390
+ else if (event === ITourEvent.click ||
391
+ event === ITourEvent.pointerover ||
392
+ (event && event.indexOf(ITourEvent.keyup) > -1)) {
393
+ // we use normal listeners for mouseevents
394
+ const mainEvent = event?.split('.')[0];
395
+ const subEvent = event?.split('.')[1];
396
+ fromEvent(element, mainEvent)
397
+ .pipe(takeUntil(merge(event$.asObservable(), destroyedEvent$)), filter(($event) => {
398
+ // only trigger if the event is a keyboard event and part of out list
399
+ if ($event instanceof KeyboardEvent) {
400
+ if (keyEvents.get($event.keyCode) === subEvent) {
401
+ return true;
402
+ }
403
+ return false;
404
+ }
405
+ else {
406
+ return true;
407
+ }
408
+ }))
409
+ .subscribe(() => {
410
+ event$.next();
411
+ event$.complete();
412
+ });
413
+ }
414
+ else if (event === ITourEvent.removed) {
415
+ // and we will use MutationObserver for DOM events
416
+ const observer = new MutationObserver(() => {
417
+ if (!document.body.contains(element)) {
418
+ event$.next();
419
+ event$.complete();
420
+ observer.disconnect();
421
+ }
422
+ });
423
+ // stop listenining if tour is closed
424
+ destroyedEvent$.subscribe(() => {
425
+ observer.disconnect();
426
+ });
427
+ // observe for any DOM interaction in the element
428
+ observer.observe(element, {
429
+ childList: true,
430
+ subtree: true,
431
+ attributes: true,
432
+ });
433
+ }
434
+ }
435
+ });
436
+ }
437
+ }
438
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZGVkLnRvdXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItZ3VpZGVkLXRvdXIvc3JjL2xpYi9ndWlkZWQudG91ci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFFBQVEsTUFBTSxhQUFhLENBQUM7QUFDbkMsT0FBTyxFQUNMLEtBQUssRUFDTCxPQUFPLEVBQ1AsZUFBZSxFQUNmLEtBQUssRUFFTCxTQUFTLEVBQ1QsUUFBUSxHQUNULE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUszRSxNQUFNLENBQU4sSUFBWSxVQU1YO0FBTkQsV0FBWSxVQUFVO0lBQ3BCLDZCQUFpQixDQUFBO0lBQ2pCLHlDQUE2QixDQUFBO0lBQzdCLDZCQUFpQixDQUFBO0lBQ2pCLDZCQUFpQixDQUFBO0lBQ2pCLGlDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFOVyxVQUFVLEtBQVYsVUFBVSxRQU1yQjtBQXNDRCxNQUFlLGtCQUFrQjtDQVFoQztBQUVELE1BQU0sc0NBQXNDLEdBQUcsR0FBRyxDQUFDO0FBQ25ELE1BQU0sOEJBQThCLEdBQUcsR0FBRyxDQUFDO0FBQzNDLE1BQU0sOEJBQThCLEdBQUcsRUFBRSxDQUFDO0FBRTFDLE1BQU0sZ0JBQWdCLEdBQWE7SUFDakMsVUFBVSxDQUFDLEtBQUs7SUFDaEIsVUFBVSxDQUFDLFdBQVc7SUFDdEIsVUFBVSxDQUFDLE9BQU87SUFDbEIsVUFBVSxDQUFDLEtBQUs7SUFDaEIsVUFBVSxDQUFDLEtBQUs7Q0FDakIsQ0FBQztBQUVGLE1BQU0sU0FBUyxHQUF3QixJQUFJLEdBQUcsQ0FBaUI7SUFDN0QsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDO0NBQ1osQ0FBQyxDQUFDO0FB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QUMsR0FBRyxFQUFFO3dCQUNkLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDZCxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3BCLENBQUMsQ0FBQyxDQUFDO2lCQUNOO3FCQUFNLElBQUksS0FBSyxLQUFLLFVBQVUsQ0FBQyxPQUFPLEVBQUU7b0JBQ3ZDLGtEQUFrRDtvQkFDbEQsTUFBTSxRQUFRLEdBQXFCLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFO3dCQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7NEJBQ3BDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0QkFDZCxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7NEJBQ2xCLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQzt5QkFDdkI7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBRUgscUNBQXFDO29CQUNyQyxlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTt3QkFDN0IsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN4QixDQUFDLENBQUMsQ0FBQztvQkFDSCxpREFBaUQ7b0JBQ2pELFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO3dCQUN4QixTQUFTLEVBQUUsSUFBSTt3QkFDZixPQUFPLEVBQUUsSUFBSTt3QkFDYixVQUFVLEVBQUUsSUFBSTtxQkFDakIsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTaGVwaGVyZCBmcm9tICdzaGVwaGVyZC5qcyc7XG5pbXBvcnQge1xuICB0aW1lcixcbiAgU3ViamVjdCxcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBtZXJnZSxcbiAgU3Vic2NyaXB0aW9uLFxuICBmcm9tRXZlbnQsXG4gIGZvcmtKb2luLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCwgc2tpcFdoaWxlLCBmaWx0ZXIsIHNraXAsIGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5leHBvcnQgdHlwZSBUb3VyU3RlcCA9IFNoZXBoZXJkLlN0ZXAuU3RlcE9wdGlvbnM7XG5leHBvcnQgdHlwZSBUb3VyU3RlcEJ1dHRvbiA9IFNoZXBoZXJkLlN0ZXAuU3RlcE9wdGlvbnNCdXR0b247XG5cbmV4cG9ydCBlbnVtIElUb3VyRXZlbnQge1xuICAnY2xpY2snID0gJ2NsaWNrJyxcbiAgJ3BvaW50ZXJvdmVyJyA9ICdwb2ludGVyb3ZlcicsXG4gICdrZXl1cCcgPSAna2V5dXAnLFxuICAnYWRkZWQnID0gJ2FkZGVkJywgLy8gYWRkZWQgdG8gRE9NXG4gICdyZW1vdmVkJyA9ICdyZW1vdmVkJywgLy8gcmVtb3ZlZCBmcm9tIERPTVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUb3VyRXZlbnRPbiB7XG4gIHNlbGVjdG9yPzogc3RyaW5nOyAvLyBjc3Mgc2VsZWN0b3JcbiAgZXZlbnQ/OiBrZXlvZiB0eXBlb2YgSVRvdXJFdmVudDsgLy8gY2xpY2ssIHBvaW50ZXJvdmVyLCBrZXl1cCwgYWRkZWQsIHJlbW92ZWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVG91ckV2ZW50T25PcHRpb25zIHtcbiAgdGltZUJlZm9yZVNob3c/OiBudW1iZXI7IC8vIGRlbGF5IGJlZm9yZSBzdGVwIGlzIGRpc3BsYXllZFxuICBpbnRlcnZhbD86IG51bWJlcjsgLy8gdGltZSBiZXR3ZWVuIHNlYXJjaGVzIGZvciBlbGVtZW50LCBkZWZhdWx0cyB0byA1MDBtc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUb3VyT3B0aW9ucyBleHRlbmRzIFNoZXBoZXJkLlRvdXIuVG91ck9wdGlvbnMge1xuICBhYm9ydE9uPzogSVRvdXJFdmVudE9uW107IC8vIGV2ZW50cyB0byBhYm9ydCBvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUb3VyU3RlcEF0dGFjaFRvT3B0aW9ucyBleHRlbmRzIElUb3VyRXZlbnRPbk9wdGlvbnMge1xuICBoaWdobGlnaHQ/OiBib29sZWFuO1xuICByZXRyaWVzPzogbnVtYmVyOyAvLyAjIG51bSBvZiBhdHRlbXB0cyB0byBmaW5kIGVsZW1lbnRcbiAgc2tpcElmTm90Rm91bmQ/OiBib29sZWFuOyAvLyBpZiBlbGVtZW50IGlzIG5vdCBmb3VuZCBhZnRlciBuIHJldHJpZXMsIG1vdmUgb24gdG8gbmV4dCBzdGVwXG4gIGVsc2U/OiBzdHJpbmc7IC8vIGlmIGVsZW1lbnQgaXMgbm90IGZvdW5kLCBnbyB0byBzdGVwIHdpdGggdGhpcyBpZFxuICBnb0JhY2tUbz86IHN0cmluZzsgLy8gYmFjayBidXR0b24gZ29lcyBiYWNrIHRvIHN0ZXAgd2l0aCB0aGlzIGlkXG4gIHNraXBGcm9tU3RlcENvdW50PzogYm9vbGVhbjsgLy8gc2hvdy9oaWRlIHByb2dyZXNzIG9uIHN0ZXBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVG91clN0ZXBBZHZhbmNlT25PcHRpb25zIGV4dGVuZHMgSVRvdXJFdmVudE9uT3B0aW9ucyB7XG4gIGp1bXBUbz86IHN0cmluZzsgLy8gbmV4dCBidXR0b24gd2lsbCBqdW1wIHRvIHN0ZXAgd2l0aCB0aGlzIGlkXG4gIGFsbG93R29CYWNrPzogYm9vbGVhbjsgLy8gYWxsb3cgYmFjayB3aXRoaW4gdGhpcyBzdGVwXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRvdXJTdGVwIGV4dGVuZHMgVG91clN0ZXAge1xuICBhdHRhY2hUb09wdGlvbnM/OiBJVG91clN0ZXBBdHRhY2hUb09wdGlvbnM7XG4gIGFkdmFuY2VPbk9wdGlvbnM/OiBJVG91clN0ZXBBZHZhbmNlT25PcHRpb25zO1xuICBhZHZhbmNlT24/OiBJVG91ckV2ZW50T25bXSB8IElUb3VyRXZlbnRPbiB8IGFueTtcbiAgYWJvcnRPbj86IElUb3VyRXZlbnRPbltdO1xuICBjb3VudD86IG51bWJlcjtcbn1cblxuYWJzdHJhY3QgY2xhc3MgVG91ckJ1dHRvbnNBY3Rpb25zIHtcbiAgYWJzdHJhY3QgbmV4dCgpOiB2b2lkO1xuXG4gIGFic3RyYWN0IGJhY2soKTogdm9pZDtcblxuICBhYnN0cmFjdCBjYW5jZWwoKTogdm9pZDtcblxuICBhYnN0cmFjdCBmaW5pc2goKTogdm9pZDtcbn1cblxuY29uc3QgU0hFUEhFUkRfREVGQVVMVF9GSU5EX1RJTUVfQkVGT1JFX1NIT1cgPSAxMDA7XG5jb25zdCBTSEVQSEVSRF9ERUZBVUxUX0ZJTkRfSU5URVJWQUwgPSA1MDA7XG5jb25zdCBTSEVQSEVSRF9ERUZBVUxUX0ZJTkRfQVRURU1QVFMgPSAyMDtcblxuY29uc3Qgb3ZlcnJpZGRlbkV2ZW50czogc3RyaW5nW10gPSBbXG4gIElUb3VyRXZlbnQuY2xpY2ssXG4gIElUb3VyRXZlbnQucG9pbnRlcm92ZXIsXG4gIElUb3VyRXZlbnQucmVtb3ZlZCxcbiAgSVRvdXJFdmVudC5hZGRlZCxcbiAgSVRvdXJFdmVudC5rZXl1cCxcbl07XG5cbmNvbnN0IGtleUV2ZW50czogTWFwPG51bWJlciwgc3RyaW5nPiA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KFtcbiAgWzEzLCAnZW50ZXInXSxcbiAgWzI3LCAnZXNjJ10sXG5dKTtcblxuY29uc3QgZGVmYXVsdFN0ZXBPcHRpb25zOiBUb3VyU3RlcCA9IHtcbiAgc2Nyb2xsVG86IHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSxcbiAgY2FuY2VsSWNvbjoge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gIH0sXG59O1xuXG5jb25zdCBNQVRfSUNPTl9CVVRUT04gPSAnbWF0LWljb24tYnV0dG9uIG1hdGVyaWFsLWljb25zIG1hdC1idXR0b24tYmFzZSc7XG5jb25zdCBNQVRfQlVUVE9OID0gJ21hdC1idXR0b24tYmFzZSBtYXQtYnV0dG9uJztcbmNvbnN0IE1BVF9CVVRUT05fSU5WSVNJQkxFID0gJ3NoZXBoZXJkLXZvaWQtYnV0dG9uJztcblxuZXhwb3J0IGNsYXNzIENvdmFsZW50R3VpZGVkVG91ciBleHRlbmRzIFRvdXJCdXR0b25zQWN0aW9ucyB7XG4gIHByaXZhdGUgX2Rlc3Ryb3llZEV2ZW50JCE6IFN1YmplY3Q8dm9pZD47XG5cbiAgc2hlcGhlcmRUb3VyITogU2hlcGhlcmQuVG91cjtcbiAgc3RlcE9wdGlvbnM6IElUb3VyU3RlcDtcblxuICBjb25zdHJ1Y3RvcihzdGVwT3B0aW9uczogSVRvdXJTdGVwID0gZGVmYXVsdFN0ZXBPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc3RlcE9wdGlvbnMgPSBzdGVwT3B0aW9ucztcbiAgICB0aGlzLm5ld1RvdXIoKTtcbiAgfVxuXG4gIG5ld1RvdXIob3B0cz86IElUb3VyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuc2hlcGhlcmRUb3VyID0gbmV3IFNoZXBoZXJkLlRvdXIoXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7XG4gICAgICAgICAgZGVmYXVsdFN0ZXBPcHRpb25zOiB0aGlzLnN0ZXBPcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgICBvcHRzXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuX2Rlc3Ryb3llZEV2ZW50JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgLy8gbGlzdGVuIHRvIGNhbmNlbCBhbmQgY29tcGxldGUgdG8gY2xlYW4gdXAgYWJvcnRPbiBldmVudHNcbiAgICBtZXJnZShcbiAgICAgIGZyb21FdmVudCh0aGlzLnNoZXBoZXJkVG91ciwgJ2NhbmNlbCcpLFxuICAgICAgZnJvbUV2ZW50KHRoaXMuc2hlcGhlcmRUb3VyLCAnY29tcGxldGUnKVxuICAgIClcbiAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZGVzdHJveWVkRXZlbnQkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fZGVzdHJveWVkRXZlbnQkLmNvbXBsZXRlKCk7XG4gICAgICB9KTtcblxuICAgIC8vIGlmIGFib3J0T24gd2FzIHBhc3NlZCwgd2UgYmluZCB0aGUgZXZlbnQgYW5kIGV4ZWN1dGUgY29tcGxldGVcbiAgICBpZiAob3B0cyAmJiBvcHRzLmFib3J0T24pIHtcbiAgICAgIGNvbnN0IGFib3J0QXJyJDogU3ViamVjdDx2b2lkPltdID0gW107XG4gICAgICBvcHRzLmFib3J0T24uZm9yRWFjaCgoYWJvcnRPbjogSVRvdXJFdmVudE9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGFib3J0RXZlbnQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAgICAgYWJvcnRBcnIkLnB1c2goYWJvcnRFdmVudCQpO1xuICAgICAgICB0aGlzLl9iaW5kRXZlbnQoYWJvcnRPbiwgdW5kZWZpbmVkLCBhYm9ydEV2ZW50JCwgdGhpcy5fZGVzdHJveWVkRXZlbnQkKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhYm9ydFN1YnM6IFN1YnNjcmlwdGlvbiA9IG1lcmdlKC4uLmFib3J0QXJyJClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZEV2ZW50JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hlcGhlcmRUb3VyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgYWJvcnRTdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5zaGVwaGVyZFRvdXIuYmFjaygpO1xuICB9XG5cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuc2hlcGhlcmRUb3VyLmNhbmNlbCgpO1xuICB9XG5cbiAgbmV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLnNoZXBoZXJkVG91ci5uZXh0KCk7XG4gIH1cblxuICBmaW5pc2goKTogdm9pZCB7XG4gICAgdGhpcy5zaGVwaGVyZFRvdXIuY29tcGxldGUoKTtcbiAgfVxuXG4gIGFkZFN0ZXBzKHN0ZXBzOiBJVG91clN0ZXBbXSk6IHZvaWQge1xuICAgIHRoaXMuc2hlcGhlcmRUb3VyLmFkZFN0ZXBzKHRoaXMuX3ByZXBhcmVUb3VyKHN0ZXBzKSk7XG4gIH1cblxuICBzdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLnNoZXBoZXJkVG91ci5zdGFydCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9wcmVwYXJlVG91cihcbiAgICBvcmlnaW5hbFN0ZXBzOiBJVG91clN0ZXBbXSxcbiAgICBmaW5pc2hMYWJlbDogc3RyaW5nID0gJ2ZpbmlzaCdcbiAgKTogSVRvdXJTdGVwW10ge1xuICAgIC8vIGNyZWF0ZSBTdWJqZWN0cyBmb3IgYmFjayBhbmQgZm9yd2FyZCBldmVudHNcbiAgICBjb25zdCBiYWNrRXZlbnQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBjb25zdCBmb3J3YXJkRXZlbnQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBsZXQgX2JhY2tGbG93ID0gZmFsc2U7XG4gICAgLy8gY3JlYXRlIFN1YmplY3QgZm9yIHlvdXIgZW5kXG4gICAgY29uc3QgZGVzdHJveWVkRXZlbnQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgdGhlIHN0ZXAgcHJvZ3Jlc3MgaW4gdGhlIGZvb3RlciBvZiB0aGUgc2hlcGhlcmQgdG9vbHRpcFxuICAgICAqL1xuICAgIGNvbnN0IGFwcGVuZFByb2dyZXNzRnVuYyA9IGZ1bmN0aW9uICh0aGlzOiBhbnkpOiB2b2lkIHtcbiAgICAgIC8vIGdldCBhbGwgdGhlIGZvb3RlcnMgdGhhdCBhcmUgYXZhaWxhYmxlIGluIHRoZSBET01cbiAgICAgIGNvbnN0IGZvb3RlcnM6IEVsZW1lbnRbXSA9IEFycmF5LmZyb208RWxlbWVudD4oXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaGVwaGVyZC1mb290ZXInKVxuICAgICAgKTtcbiAgICAgIC8vIGdldCB0aGUgbGFzdCBmb290ZXIgc2luY2UgU2hlcGhlcmQgYWx3YXlzIHB1dHMgdGhlIGFjdGl2ZSBvbmUgYXQgdGhlIGVuZFxuICAgICAgY29uc3QgZm9vdGVyOiBFbGVtZW50ID0gZm9vdGVyc1tmb290ZXJzLmxlbmd0aCAtIDFdO1xuICAgICAgLy8gZ2VuZXJhdGUgc3RlcHMgaHRtbCBlbGVtZW50XG4gICAgICBjb25zdCBwcm9ncmVzczogSFRNTFNwYW5FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgcHJvZ3Jlc3MuY2xhc3NOYW1lID0gJ3NoZXBoZXJkLXByb2dyZXNzJztcbiAgICAgIHByb2dyZXNzLmlubmVyVGV4dCA9IGAke3RoaXMuc2hlcGhlcmRUb3VyLmN1cnJlbnRTdGVwLm9wdGlvbnMuY291bnR9LyR7c3RlcFRvdGFsfWA7XG4gICAgICAvLyBpbnNlcnQgaW50byB0aGUgZm9vdGVyIGJlZm9yZSB0aGUgZmlyc3QgYnV0dG9uXG4gICAgICBmb290ZXIuaW5zZXJ0QmVmb3JlKHByb2dyZXNzLCBmb290ZXIucXVlcnlTZWxlY3RvcignLnNoZXBoZXJkLWJ1dHRvbicpKTtcbiAgICB9O1xuXG4gICAgbGV0IHN0ZXBUb3RhbCA9IDA7XG4gICAgY29uc3Qgc3RlcHM6IElUb3VyU3RlcFtdID0gb3JpZ2luYWxTdGVwcy5tYXAoKHN0ZXA6IElUb3VyU3RlcCkgPT4ge1xuICAgICAgbGV0IHNob3dQcm9ncmVzczogKCkgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAgICAgLy9cbiAgICAgIH07XG4gICAgICBpZiAoc3RlcC5hdHRhY2hUb09wdGlvbnM/LnNraXBGcm9tU3RlcENvdW50ID09PSB0cnVlKSB7XG4gICAgICAgIHNob3dQcm9ncmVzcyA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBzdGVwLmF0dGFjaFRvT3B0aW9ucz8uc2tpcEZyb21TdGVwQ291bnQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBzdGVwLmF0dGFjaFRvT3B0aW9ucz8uc2tpcEZyb21TdGVwQ291bnQgPT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgc3RlcC5jb3VudCA9ICsrc3RlcFRvdGFsO1xuICAgICAgICBzaG93UHJvZ3Jlc3MgPSBhcHBlbmRQcm9ncmVzc0Z1bmMuYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGVwLCB7XG4gICAgICAgIHdoZW46IHtcbiAgICAgICAgICBzaG93OiBzaG93UHJvZ3Jlc3MsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbmlzaEJ1dHRvbjogVG91clN0ZXBCdXR0b24gPSB7XG4gICAgICB0ZXh0OiBmaW5pc2hMYWJlbCxcbiAgICAgIGFjdGlvbjogdGhpc1snZmluaXNoJ10uYmluZCh0aGlzKSxcbiAgICAgIGNsYXNzZXM6IE1BVF9CVVRUT04sXG4gICAgfTtcblxuICAgIGNvbnN0IHZvaWRCdXR0b246IFRvdXJTdGVwQnV0dG9uID0ge1xuICAgICAgdGV4dDogJycsXG4gICAgICBhY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0sXG4gICAgICBjbGFzc2VzOiBNQVRfQlVUVE9OX0lOVklTSUJMRSxcbiAgICB9O1xuXG4gICAgLy8gbGlzdGVuIHRvIHRoZSBkZXN0cm95ZWQgZXZlbnQgdG8gY2xlYW4gdXAgYWxsIHRoZSBzdHJlYW1zXG4gICAgdGhpcy5fZGVzdHJveWVkRXZlbnQkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGJhY2tFdmVudCQuY29tcGxldGUoKTtcbiAgICAgIGZvcndhcmRFdmVudCQuY29tcGxldGUoKTtcbiAgICAgIGRlc3Ryb3llZEV2ZW50JC5uZXh0KCk7XG4gICAgICBkZXN0cm95ZWRFdmVudCQuY29tcGxldGUoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRvdGFsU3RlcHM6IG51bWJlciA9IHN0ZXBzLmxlbmd0aDtcbiAgICBzdGVwcy5mb3JFYWNoKChzdGVwOiBJVG91clN0ZXAsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIC8vIGNyZWF0ZSBidXR0b25zIHNwZWNpZmljIGZvciB0aGUgc3RlcFxuICAgICAgLy8gdGhpcyBpcyBkb25lIHRvIGNyZWF0ZSBtb3JlIGNvbnRyb2wgb24gZXZlbnRzXG4gICAgICBjb25zdCBuZXh0QnV0dG9uOiBUb3VyU3RlcEJ1dHRvbiA9IHtcbiAgICAgICAgdGV4dDogJ2NoZXZyb25fcmlnaHQnLFxuICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAvLyBpbnRlcmNlcHQgdGhlIG5leHQgYWN0aW9uIGFuZCB0cmlnZ2VyIGV2ZW50XG4gICAgICAgICAgZm9yd2FyZEV2ZW50JC5uZXh0KCk7XG4gICAgICAgICAgdGhpcy5zaGVwaGVyZFRvdXIubmV4dCgpO1xuICAgICAgICB9LFxuICAgICAgICBjbGFzc2VzOiBNQVRfSUNPTl9CVVRUT04sXG4gICAgICB9O1xuICAgICAgY29uc3QgYmFja0J1dHRvbjogVG91clN0ZXBCdXR0b24gPSB7XG4gICAgICAgIHRleHQ6ICdjaGV2cm9uX2xlZnQnLFxuICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAvLyBpbnRlcmNlcHQgdGhlIGJhY2sgYWN0aW9uIGFuZCB0cmlnZ2VyIGV2ZW50XG4gICAgICAgICAgYmFja0V2ZW50JC5uZXh0KCk7XG4gICAgICAgICAgX2JhY2tGbG93ID0gdHJ1ZTtcbiAgICAgICAgICAvLyBjaGVjayBpZiAnZ29CYWNrVG8nIGlzIHNldCB0byBqdW1wIHRvIGEgcGFydGljdWxhciBzdGVwLCBlbHNlIGp1c3QgZ28gYmFja1xuICAgICAgICAgIGlmIChzdGVwLmF0dGFjaFRvT3B0aW9ucyAmJiBzdGVwLmF0dGFjaFRvT3B0aW9ucy5nb0JhY2tUbykge1xuICAgICAgICAgICAgdGhpcy5zaGVwaGVyZFRvdXIuc2hvdyhzdGVwLmF0dGFjaFRvT3B0aW9ucy5nb0JhY2tUbywgZmFsc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNoZXBoZXJkVG91ci5iYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjbGFzc2VzOlxuICAgICAgICAgIHN0ZXAuYWR2YW5jZU9uT3B0aW9ucz8uYWxsb3dHb0JhY2sgPT09IGZhbHNlXG4gICAgICAgICAgICA/IE1BVF9CVVRUT05fSU5WSVNJQkxFXG4gICAgICAgICAgICA6IE1BVF9JQ09OX0JVVFRPTixcbiAgICAgIH07XG5cbiAgICAgIC8vIGNoZWNrIGlmIGhpZ2hsaWdodCB3YXMgcHJvdmlkZWQgZm9yIHRoZSBzdGVwLCBlbHNlIGZhbGxiYWNrIGludG8gc2hlcGhlcmRzIHVzYWdlXG4gICAgICBzdGVwLmhpZ2hsaWdodENsYXNzID1cbiAgICAgICAgc3RlcC5hdHRhY2hUb09wdGlvbnMgJiYgc3RlcC5hdHRhY2hUb09wdGlvbnMuaGlnaGxpZ2h0XG4gICAgICAgICAgPyAnc2hlcGhlcmQtaGlnaGxpZ2h0J1xuICAgICAgICAgIDogc3RlcC5oaWdobGlnaHRDbGFzcztcblxuICAgICAgLy8gQWRkaW5nIGJ1dHRvbnMgaW4gdGhlIHN0ZXBzIGlmIG5vIGJ1dHRvbnMgYXJlIGRlZmluZWRcbiAgICAgIGlmICghc3RlcC5idXR0b25zIHx8IHN0ZXAuYnV0dG9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gZmlyc3Qgc3RlcFxuICAgICAgICAgIHN0ZXAuYnV0dG9ucyA9IFtuZXh0QnV0dG9uXTtcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PT0gdG90YWxTdGVwcyAtIDEpIHtcbiAgICAgICAgICAvLyBsYXN0IHN0ZXBcbiAgICAgICAgICBzdGVwLmJ1dHRvbnMgPSBbYmFja0J1dHRvbiwgZmluaXNoQnV0dG9uXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGVwLmJ1dHRvbnMgPSBbYmFja0J1dHRvbiwgbmV4dEJ1dHRvbl07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2tzIFwiYWR2YW5jZU9uXCIgdG8gb3ZlcnJpZGUgbGlzdGVuZXJzXG4gICAgICBsZXQgYWR2YW5jZU9uOiBJVG91ckV2ZW50T25bXSB8IElUb3VyRXZlbnRPbiA9IHN0ZXAuYWR2YW5jZU9uO1xuICAgICAgLy8gcmVtb3ZlIHRoZSBzaGVwaGVyZCBcImFkdmFuY2VPblwiIGluZmF2b3Igb2Ygb3VycyBpZiB0aGUgZXZlbnQgaXMgcGFydCBvZiBvdXIgbGlzdFxuICAgICAgaWYgKFxuICAgICAgICAodHlwZW9mIGFkdmFuY2VPbiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAhQXJyYXkuaXNBcnJheShhZHZhbmNlT24pICYmXG4gICAgICAgICAgYWR2YW5jZU9uLmV2ZW50ICYmXG4gICAgICAgICAgb3ZlcnJpZGRlbkV2ZW50cy5pbmRleE9mKGFkdmFuY2VPbi5ldmVudC5zcGxpdCgnLicpWzBdKSA+IC0xKSB8fFxuICAgICAgICBhZHZhbmNlT24gaW5zdGFuY2VvZiBBcnJheVxuICAgICAgKSB7XG4gICAgICAgIHN0ZXAuYWR2YW5jZU9uID0gdW5kZWZpbmVkO1xuICAgICAgICBzdGVwLmJ1dHRvbnMgPVxuICAgICAgICAgIHN0ZXAuYWR2YW5jZU9uT3B0aW9ucyAmJiBzdGVwLmFkdmFuY2VPbk9wdGlvbnMuYWxsb3dHb0JhY2tcbiAgICAgICAgICAgID8gW2JhY2tCdXR0b24sIHZvaWRCdXR0b25dXG4gICAgICAgICAgICA6IFt2b2lkQnV0dG9uXTtcbiAgICAgIH1cbiAgICAgIC8vIGFkZHMgYSBkZWZhdWx0IGJlZm9yZVNob3dQcm9taXNlIGZ1bmN0aW9uXG4gICAgICBzdGVwLmJlZm9yZVNob3dQcm9taXNlID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6ICh2YWx1ZT86IGFueSkgPT4gdm9pZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxDYXBhYmlsaXRpZXNTZXR1cDogKCkgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChhZHZhbmNlT24gJiYgIXN0ZXAuYWR2YW5jZU9uKSB7XG4gICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhZHZhbmNlT24pKSB7XG4gICAgICAgICAgICAgICAgYWR2YW5jZU9uID0gW2FkdmFuY2VPbl07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBhZHZhbmNlQXJyJDogU3ViamVjdDx2b2lkPltdID0gW107XG4gICAgICAgICAgICAgIGFkdmFuY2VPbi5mb3JFYWNoKChfOiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkdmFuY2VFdmVudCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgICAgICAgICAgICAgIGFkdmFuY2VBcnIkLnB1c2goYWR2YW5jZUV2ZW50JCk7XG5cbiAgICAgICAgICAgICAgICAvLyB3ZSBzdGFydCBhIHRpbWVyIG9mIGF0dGVtcHRzIHRvIGZpbmQgYW4gZWxlbWVudCBpbiB0aGUgZG9tXG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZEV2ZW50KFxuICAgICAgICAgICAgICAgICAgXyxcbiAgICAgICAgICAgICAgICAgIHN0ZXAuYWR2YW5jZU9uT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIGFkdmFuY2VFdmVudCQsXG4gICAgICAgICAgICAgICAgICBkZXN0cm95ZWRFdmVudCRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29uc3QgYWR2YW5jZVN1YnM6IFN1YnNjcmlwdGlvbiA9IGZvcmtKb2luKC4uLmFkdmFuY2VBcnIkKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbChtZXJnZShkZXN0cm95ZWRFdmVudCQsIGJhY2tFdmVudCQpKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gYWR2YW5jZSB0byBhIHNwZWNpZmljIHN0ZXAsIGVsc2UgYWR2YW5jZSB0byBuZXh0IHN0ZXBcbiAgICAgICAgICAgICAgICAgIGlmIChzdGVwLmFkdmFuY2VPbk9wdGlvbnMgJiYgc3RlcC5hZHZhbmNlT25PcHRpb25zLmp1bXBUbykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoZXBoZXJkVG91ci5zaG93KHN0ZXAuYWR2YW5jZU9uT3B0aW9ucy5qdW1wVG8pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGVwaGVyZFRvdXIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZm9yd2FyZEV2ZW50JC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICBhZHZhbmNlU3Vicy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiBhYm9ydE9uIHdhcyBwYXNzZWQgb24gdGhlIHN0ZXAsIHdlIGJpbmQgdGhlIGV2ZW50IGFuZCBleGVjdXRlIGNvbXBsZXRlXG4gICAgICAgICAgICBpZiAoc3RlcC5hYm9ydE9uKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFib3J0QXJyJDogU3ViamVjdDx2b2lkPltdID0gW107XG4gICAgICAgICAgICAgIHN0ZXAuYWJvcnRPbi5mb3JFYWNoKChhYm9ydE9uOiBJVG91ckV2ZW50T24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhYm9ydEV2ZW50JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgICAgICAgICAgICAgYWJvcnRBcnIkLnB1c2goYWJvcnRFdmVudCQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2JpbmRFdmVudChcbiAgICAgICAgICAgICAgICAgIGFib3J0T24sXG4gICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBhYm9ydEV2ZW50JCxcbiAgICAgICAgICAgICAgICAgIGRlc3Ryb3llZEV2ZW50JFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGFib3J0U3ViczogU3Vic2NyaXB0aW9uID0gbWVyZ2UoLi4uYWJvcnRBcnIkKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKG1lcmdlKGRlc3Ryb3llZEV2ZW50JCwgYmFja0V2ZW50JCwgZm9yd2FyZEV2ZW50JCkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zaGVwaGVyZFRvdXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgIGFib3J0U3Vicy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBfc3RvcFRpbWVyJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgICAgICAgY29uc3QgX3JldHJpZXNSZWFjaGVkJDogU3ViamVjdDxudW1iZXI+ID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuICAgICAgICAgIGNvbnN0IF9yZXRyeUF0dGVtcHRzJDogQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4gPVxuICAgICAgICAgICAgbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KC0xKTtcblxuICAgICAgICAgIGxldCBpZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIC8vIGNoZWNrcyBpZiBcImF0dGFjaFRvXCIgaXMgYSBzdHJpbmcgb3IgYW4gb2JqZWN0IHRvIGdldCB0aGUgaWQgb2YgYW4gZWxlbWVudFxuICAgICAgICAgIGlmICh0eXBlb2Ygc3RlcC5hdHRhY2hUbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlkID0gc3RlcC5hdHRhY2hUbztcbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHN0ZXAuYXR0YWNoVG8gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICB0eXBlb2Ygc3RlcC5hdHRhY2hUby5lbGVtZW50ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWQgPSBzdGVwLmF0dGFjaFRvLmVsZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gaWQgYXMgYSBzdHJpbmcgaW4gZWl0aGVyIGNhc2UsIHdlIHVzZSBpdCAod2UgaWdub3JlIGl0IGlmIGl0cyBIVE1MRWxlbWVudClcbiAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIC8vIGlmIGN1cnJlbnQgc3RlcCBpcyB0aGUgZmlyc3Qgc3RlcCBvZiB0aGUgdG91ciwgd2Ugc2V0IHRoZSBidXR0b25zIHRvIGJlIG9ubHkgXCJuZXh0XCJcbiAgICAgICAgICAgIC8vIHdlIGhhZCB0byB1c2UgYGFueWAgc2luY2UgdGhlIHRvdXIgZG9lc250IGV4cG9zZSB0aGUgc3RlcHMgaW4gYW55IGZhc2hpb24gbm9yIGEgd2F5IHRvIGNoZWNrIGlmIHdlIGhhdmUgbW9kaWZpZWQgdGhlbSBhdCBhbGxcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGhpcy5zaGVwaGVyZFRvdXIuZ2V0Q3VycmVudFN0ZXAoKSA9PT1cbiAgICAgICAgICAgICAgKDxhbnk+dGhpcy5zaGVwaGVyZFRvdXIpLnN0ZXBzWzBdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5zaGVwaGVyZFRvdXIuZ2V0Q3VycmVudFN0ZXAoKT8udXBkYXRlU3RlcE9wdGlvbnMoe1xuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IG9yaWdpbmFsU3RlcHNbaW5kZXhdLmFkdmFuY2VPblxuICAgICAgICAgICAgICAgICAgPyBbdm9pZEJ1dHRvbl1cbiAgICAgICAgICAgICAgICAgIDogW25leHRCdXR0b25dLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRvIHRoZSBhdHRlbXB0cyBvYnNlcnZhYmxlIHRvIG5vdGlmeSBkZWV2ZWxvcGVyIHdoZW4gbnVtYmVyIGhhcyBiZWVuIHJlYWNoZWRcbiAgICAgICAgICAgIF9yZXRyeUF0dGVtcHRzJFxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBza2lwKDEpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbChtZXJnZShfc3RvcFRpbWVyJC5hc09ic2VydmFibGUoKSwgZGVzdHJveWVkRXZlbnQkKSksXG4gICAgICAgICAgICAgICAgc2tpcFdoaWxlKCh2YWw6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzdGVwLmF0dGFjaFRvT3B0aW9ucyAmJlxuICAgICAgICAgICAgICAgICAgICBzdGVwLmF0dGFjaFRvT3B0aW9ucy5yZXRyaWVzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsIDwgc3RlcC5hdHRhY2hUb09wdGlvbnMucmV0cmllcztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwgPCBTSEVQSEVSRF9ERUZBVUxUX0ZJTkRfQVRURU1QVFM7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKChhdHRlbXB0czogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgX3JldHJpZXNSZWFjaGVkJC5uZXh0KDEpO1xuICAgICAgICAgICAgICAgIF9yZXRyaWVzUmVhY2hlZCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAvLyBpZiBhdHRlbXB0cyBoYXZlIGJlZW4gcmVhY2hlZCwgd2UgY2hlY2sgXCJza2lwSWZOb3RGb3VuZFwiIHRvIG1vdmUgb24gdG8gdGhlIG5leHQgc3RlcFxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHN0ZXAuYXR0YWNoVG9PcHRpb25zICYmXG4gICAgICAgICAgICAgICAgICBzdGVwLmF0dGFjaFRvT3B0aW9ucy5za2lwSWZOb3RGb3VuZFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZ2V0IHRvIHRoaXMgc3RlcCBjb21pbmcgYmFjayBmcm9tIGEgc3RlcCBhbmQgaXQgd2FzbnQgZm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgZWl0aGVyIGNoZWNrIGlmIGl0cyB0aGUgZmlyc3Qgc3RlcCBhbmQgdHJ5IGdvaW5nIGZvcndhcmRcbiAgICAgICAgICAgICAgICAgIC8vIG9yIHdlIGtlZXAgZ29pbmcgYmFjayB1bnRpbCB3ZSBmaW5kIGEgc3RlcCB0aGF0IGFjdHVhbGx5IGV4aXN0c1xuICAgICAgICAgICAgICAgICAgaWYgKF9iYWNrRmxvdykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcy5zaGVwaGVyZFRvdXIpLnN0ZXBzLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoZXBoZXJkVG91ci5nZXRDdXJyZW50U3RlcCgpXG4gICAgICAgICAgICAgICAgICAgICAgKSA9PT0gMFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoZXBoZXJkVG91ci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGVwaGVyZFRvdXIuYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9iYWNrRmxvdyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVzdHJveXMgY3VycmVudCBzdGVwIGlmIHdlIG5lZWQgdG8gc2tpcCBpdCB0byByZW1vdmUgaXQgZnJvbSB0aGUgdG91clxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U3RlcCA9IHRoaXMuc2hlcGhlcmRUb3VyLmdldEN1cnJlbnRTdGVwKCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGVwPy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hlcGhlcmRUb3VyLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGVwaGVyZFRvdXIucmVtb3ZlU3RlcChjdXJyZW50U3RlcD8uaWQgPz8gJycpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RlcC5hdHRhY2hUb09wdGlvbnMgJiYgc3RlcC5hdHRhY2hUb09wdGlvbnMuZWxzZSkge1xuICAgICAgICAgICAgICAgICAgLy8gaWYgXCJza2lwSWZOb3RGb3VuZFwiIGlzIG5vdCB0cnVlLCB0aGVuIHdlIGNoZWNrIGlmIFwiZWxzZVwiIGhhcyBiZWVuIHNldCB0byBqdW1wIHRvIGEgc3BlY2lmaWMgc3RlcFxuICAgICAgICAgICAgICAgICAgdGhpcy5zaGVwaGVyZFRvdXIuc2hvdyhzdGVwLmF0dGFjaFRvT3B0aW9ucy5lbHNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgYFJldHJpZXMgcmVhY2hlZCB0cnlpbmcgdG8gZmluZCAke2lkfS4gUmV0cmllZCAgJHthdHRlbXB0c30gdGltZXMuYFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIC8vIGVsc2Ugd2Ugc2hvdyB0aGUgc3RlcCByZWdhcmRsZXNzXG4gICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gd2Ugc3RhcnQgYSB0aW1lciBvZiBhdHRlbXB0cyB0byBmaW5kIGFuIGVsZW1lbnQgaW4gdGhlIGRvbVxuICAgICAgICAgICAgdGltZXIoXG4gICAgICAgICAgICAgIChzdGVwLmF0dGFjaFRvT3B0aW9ucyAmJiBzdGVwLmF0dGFjaFRvT3B0aW9ucy50aW1lQmVmb3JlU2hvdykgfHxcbiAgICAgICAgICAgICAgICBTSEVQSEVSRF9ERUZBVUxUX0ZJTkRfVElNRV9CRUZPUkVfU0hPVyxcbiAgICAgICAgICAgICAgKHN0ZXAuYXR0YWNoVG9PcHRpb25zICYmIHN0ZXAuYXR0YWNoVG9PcHRpb25zLmludGVydmFsKSB8fFxuICAgICAgICAgICAgICAgIFNIRVBIRVJEX0RFRkFVTFRfRklORF9JTlRFUlZBTFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAvLyB0aGUgdGltZXIgd2lsbCBjb250aW51ZSBlaXRoZXIgdW50aWwgd2UgZmluZCB0aGUgZWxlbWVudCBvciB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzIGhhcyBiZWVuIHJlYWNoZWRcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwobWVyZ2UoX3N0b3BUaW1lciQsIF9yZXRyaWVzUmVhY2hlZCQsIGRlc3Ryb3llZEV2ZW50JCkpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaWQgPz8gJycpO1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IGhhcyBiZWVuIGZvdW5kLCB3ZSBzdG9wIHRoZSB0aW1lciBhbmQgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICBfc3RvcFRpbWVyJC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICBfc3RvcFRpbWVyJC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbENhcGFiaWxpdGllc1NldHVwKCk7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIF9yZXRyeUF0dGVtcHRzJC5uZXh0KF9yZXRyeUF0dGVtcHRzJC52YWx1ZSArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIHN0b3AgZmluZCBpbnRlcnZhbCBpZiB1c2VyIHN0b3BzIHRoZSB0b3VyXG4gICAgICAgICAgICBkZXN0cm95ZWRFdmVudCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgX3N0b3BUaW1lciQubmV4dCgpO1xuICAgICAgICAgICAgICBfc3RvcFRpbWVyJC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICBfcmV0cmllc1JlYWNoZWQkLm5leHQoMSk7XG4gICAgICAgICAgICAgIF9yZXRyaWVzUmVhY2hlZCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyByZXNvbHZlIG9ic2VydmFibGUgdW50aWwgdGhlIHRpbWVCZWZvcmVTaG93IGhhcyBwYXNzc2VkIG9yIHVzZSBkZWZhdWx0XG4gICAgICAgICAgICB0aW1lcihcbiAgICAgICAgICAgICAgKHN0ZXAuYXR0YWNoVG9PcHRpb25zICYmIHN0ZXAuYXR0YWNoVG9PcHRpb25zLnRpbWVCZWZvcmVTaG93KSB8fFxuICAgICAgICAgICAgICAgIFNIRVBIRVJEX0RFRkFVTFRfRklORF9USU1FX0JFRk9SRV9TSE9XXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbChtZXJnZShkZXN0cm95ZWRFdmVudCQpKSlcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3RlcHM7XG4gIH1cblxuICBwcml2YXRlIF9iaW5kRXZlbnQoXG4gICAgZXZlbnRPbjogSVRvdXJFdmVudE9uLFxuICAgIGV2ZW50T25PcHRpb25zOiBJVG91ckV2ZW50T25PcHRpb25zIHwgdW5kZWZpbmVkLFxuICAgIGV2ZW50JDogU3ViamVjdDx2b2lkPixcbiAgICBkZXN0cm95ZWRFdmVudCQ6IFN1YmplY3Q8dm9pZD5cbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBldmVudE9uLnNlbGVjdG9yID8/ICcnO1xuICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRPbi5ldmVudDtcbiAgICAvLyB3ZSBzdGFydCBhIHRpbWVyIG9mIGF0dGVtcHRzIHRvIGZpbmQgYW4gZWxlbWVudCBpbiB0aGUgZG9tXG4gICAgY29uc3QgdGltZXJTdWJzOiBTdWJzY3JpcHRpb24gPSB0aW1lcihcbiAgICAgIChldmVudE9uT3B0aW9ucyAmJiBldmVudE9uT3B0aW9ucy50aW1lQmVmb3JlU2hvdykgfHxcbiAgICAgICAgU0hFUEhFUkRfREVGQVVMVF9GSU5EX1RJTUVfQkVGT1JFX1NIT1csXG4gICAgICAoZXZlbnRPbk9wdGlvbnMgJiYgZXZlbnRPbk9wdGlvbnMuaW50ZXJ2YWwpIHx8XG4gICAgICAgIFNIRVBIRVJEX0RFRkFVTFRfRklORF9JTlRFUlZBTFxuICAgIClcbiAgICAgIC5waXBlKHRha2VVbnRpbChkZXN0cm95ZWRFdmVudCQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaGFzIGJlZW4gZm91bmQsIHdlIHN0b3AgdGhlIHRpbWVyIGFuZCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgdGltZXJTdWJzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgICBpZiAoZXZlbnQgPT09IElUb3VyRXZlbnQuYWRkZWQpIHtcbiAgICAgICAgICAgIC8vIGlmIGV2ZW50IGlzIFwiQWRkZWRcIiB0cmlnZ2VyIGEgc29vbiBhcyB0aGlzIGlzIGF0dGFjaGVkLlxuICAgICAgICAgICAgZXZlbnQkLm5leHQoKTtcbiAgICAgICAgICAgIGV2ZW50JC5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBldmVudCA9PT0gSVRvdXJFdmVudC5jbGljayB8fFxuICAgICAgICAgICAgZXZlbnQgPT09IElUb3VyRXZlbnQucG9pbnRlcm92ZXIgfHxcbiAgICAgICAgICAgIChldmVudCAmJiBldmVudC5pbmRleE9mKElUb3VyRXZlbnQua2V5dXApID4gLTEpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyB3ZSB1c2Ugbm9ybWFsIGxpc3RlbmVycyBmb3IgbW91c2VldmVudHNcbiAgICAgICAgICAgIGNvbnN0IG1haW5FdmVudCA9IGV2ZW50Py5zcGxpdCgnLicpWzBdO1xuICAgICAgICAgICAgY29uc3Qgc3ViRXZlbnQgPSBldmVudD8uc3BsaXQoJy4nKVsxXTtcbiAgICAgICAgICAgIGZyb21FdmVudChlbGVtZW50LCBtYWluRXZlbnQpXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbChtZXJnZShldmVudCQuYXNPYnNlcnZhYmxlKCksIGRlc3Ryb3llZEV2ZW50JCkpLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gb25seSB0cmlnZ2VyIGlmIHRoZSBldmVudCBpcyBhIGtleWJvYXJkIGV2ZW50IGFuZCBwYXJ0IG9mIG91dCBsaXN0XG4gICAgICAgICAgICAgICAgICBpZiAoJGV2ZW50IGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5RXZlbnRzLmdldCgkZXZlbnQua2V5Q29kZSkgPT09IHN1YkV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudCQubmV4dCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50JC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSBJVG91ckV2ZW50LnJlbW92ZWQpIHtcbiAgICAgICAgICAgIC8vIGFuZCB3ZSB3aWxsIHVzZSBNdXRhdGlvbk9ic2VydmVyIGZvciBET00gZXZlbnRzXG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQkLm5leHQoKTtcbiAgICAgICAgICAgICAgICBldmVudCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBzdG9wIGxpc3RlbmluaW5nIGlmIHRvdXIgaXMgY2xvc2VkXG4gICAgICAgICAgICBkZXN0cm95ZWRFdmVudCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBvYnNlcnZlIGZvciBhbnkgRE9NIGludGVyYWN0aW9uIGluIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,4 @@
1
+ export * from './lib/guided-tour.module';
2
+ export * from './lib/guided-tour.service';
3
+ export * from './lib/guided.tour';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1ndWlkZWQtdG91ci9zcmMvcHVibGljX2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2d1aWRlZC10b3VyLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9ndWlkZWQtdG91ci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2d1aWRlZC50b3VyJztcbiJdfQ==