@covalent/guided-tour 3.1.2 → 4.0.0-beta.2
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/_guided-tour-theme.scss +4 -3
- package/_guided-tour.scss +17 -2
- package/covalent-guided-tour.d.ts +1 -0
- package/esm2020/covalent-guided-tour.mjs +5 -0
- package/esm2020/guided-tour.module.mjs +20 -0
- package/esm2020/guided-tour.service.mjs +155 -0
- package/esm2020/guided.tour.mjs +414 -0
- package/esm2020/index.mjs +2 -0
- package/esm2020/public-api.mjs +4 -0
- package/fesm2015/{covalent-guided-tour.js → covalent-guided-tour.mjs} +123 -590
- package/fesm2015/covalent-guided-tour.mjs.map +1 -0
- package/fesm2020/covalent-guided-tour.mjs +588 -0
- package/fesm2020/covalent-guided-tour.mjs.map +1 -0
- package/guided-tour.module.d.ts +5 -0
- package/guided-tour.service.d.ts +3 -0
- package/package.json +32 -17
- package/bundles/covalent-guided-tour.umd.js +0 -1369
- package/bundles/covalent-guided-tour.umd.js.map +0 -1
- package/bundles/covalent-guided-tour.umd.min.js +0 -16
- package/bundles/covalent-guided-tour.umd.min.js.map +0 -1
- package/covalent-guided-tour.metadata.json +0 -1
- package/esm2015/covalent-guided-tour.js +0 -10
- package/esm2015/guided-tour.module.js +0 -19
- package/esm2015/guided-tour.service.js +0 -312
- package/esm2015/guided.tour.js +0 -722
- package/esm2015/index.js +0 -7
- package/esm2015/public-api.js +0 -9
- package/fesm2015/covalent-guided-tour.js.map +0 -1
|
@@ -0,0 +1,414 @@
|
|
|
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
|
+
if (step.attachToOptions?.skipFromStepCount === true) {
|
|
115
|
+
showProgress = function () {
|
|
116
|
+
return;
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
else if (step.attachToOptions?.skipFromStepCount === undefined ||
|
|
120
|
+
step.attachToOptions?.skipFromStepCount === false) {
|
|
121
|
+
step.count = ++stepTotal;
|
|
122
|
+
showProgress = appendProgressFunc.bind(this);
|
|
123
|
+
}
|
|
124
|
+
return Object.assign({}, step, {
|
|
125
|
+
when: {
|
|
126
|
+
show: showProgress,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
const finishButton = {
|
|
131
|
+
text: finishLabel,
|
|
132
|
+
action: this['finish'].bind(this),
|
|
133
|
+
classes: MAT_BUTTON,
|
|
134
|
+
};
|
|
135
|
+
const voidButton = {
|
|
136
|
+
text: '',
|
|
137
|
+
action() {
|
|
138
|
+
return;
|
|
139
|
+
},
|
|
140
|
+
classes: MAT_BUTTON_INVISIBLE,
|
|
141
|
+
};
|
|
142
|
+
// listen to the destroyed event to clean up all the streams
|
|
143
|
+
this._destroyedEvent$.pipe(first()).subscribe(() => {
|
|
144
|
+
backEvent$.complete();
|
|
145
|
+
forwardEvent$.complete();
|
|
146
|
+
destroyedEvent$.next();
|
|
147
|
+
destroyedEvent$.complete();
|
|
148
|
+
});
|
|
149
|
+
const totalSteps = steps.length;
|
|
150
|
+
steps.forEach((step, index) => {
|
|
151
|
+
// create buttons specific for the step
|
|
152
|
+
// this is done to create more control on events
|
|
153
|
+
const nextButton = {
|
|
154
|
+
text: 'chevron_right',
|
|
155
|
+
action: () => {
|
|
156
|
+
// intercept the next action and trigger event
|
|
157
|
+
forwardEvent$.next();
|
|
158
|
+
this.shepherdTour.next();
|
|
159
|
+
},
|
|
160
|
+
classes: MAT_ICON_BUTTON,
|
|
161
|
+
};
|
|
162
|
+
const backButton = {
|
|
163
|
+
text: 'chevron_left',
|
|
164
|
+
action: () => {
|
|
165
|
+
// intercept the back action and trigger event
|
|
166
|
+
backEvent$.next();
|
|
167
|
+
_backFlow = true;
|
|
168
|
+
// check if 'goBackTo' is set to jump to a particular step, else just go back
|
|
169
|
+
if (step.attachToOptions && step.attachToOptions.goBackTo) {
|
|
170
|
+
this.shepherdTour.show(step.attachToOptions.goBackTo, false);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
this.shepherdTour.back();
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
classes: step.advanceOnOptions?.allowGoBack === false ? MAT_BUTTON_INVISIBLE : MAT_ICON_BUTTON,
|
|
177
|
+
};
|
|
178
|
+
// check if highlight was provided for the step, else fallback into shepherds usage
|
|
179
|
+
step.highlightClass =
|
|
180
|
+
step.attachToOptions && step.attachToOptions.highlight ? 'shepherd-highlight' : step.highlightClass;
|
|
181
|
+
// Adding buttons in the steps if no buttons are defined
|
|
182
|
+
if (!step.buttons || step.buttons.length === 0) {
|
|
183
|
+
if (index === 0) {
|
|
184
|
+
// first step
|
|
185
|
+
step.buttons = [nextButton];
|
|
186
|
+
}
|
|
187
|
+
else if (index === totalSteps - 1) {
|
|
188
|
+
// last step
|
|
189
|
+
step.buttons = [backButton, finishButton];
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
step.buttons = [backButton, nextButton];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// checks "advanceOn" to override listeners
|
|
196
|
+
let advanceOn = step.advanceOn;
|
|
197
|
+
// remove the shepherd "advanceOn" infavor of ours if the event is part of our list
|
|
198
|
+
if ((typeof advanceOn === 'object' &&
|
|
199
|
+
!Array.isArray(advanceOn) &&
|
|
200
|
+
overriddenEvents.indexOf(advanceOn.event.split('.')[0]) > -1) ||
|
|
201
|
+
advanceOn instanceof Array) {
|
|
202
|
+
step.advanceOn = undefined;
|
|
203
|
+
step.buttons =
|
|
204
|
+
step.advanceOnOptions && step.advanceOnOptions.allowGoBack ? [backButton, voidButton] : [voidButton];
|
|
205
|
+
}
|
|
206
|
+
// adds a default beforeShowPromise function
|
|
207
|
+
step.beforeShowPromise = () => {
|
|
208
|
+
return new Promise((resolve) => {
|
|
209
|
+
const additionalCapabilitiesSetup = () => {
|
|
210
|
+
if (advanceOn && !step.advanceOn) {
|
|
211
|
+
if (!Array.isArray(advanceOn)) {
|
|
212
|
+
advanceOn = [advanceOn];
|
|
213
|
+
}
|
|
214
|
+
const advanceArr$ = [];
|
|
215
|
+
advanceOn.forEach((_, i) => {
|
|
216
|
+
const advanceEvent$ = new Subject();
|
|
217
|
+
advanceArr$.push(advanceEvent$);
|
|
218
|
+
// we start a timer of attempts to find an element in the dom
|
|
219
|
+
this._bindEvent(advanceOn[i], step.advanceOnOptions, advanceEvent$, destroyedEvent$);
|
|
220
|
+
});
|
|
221
|
+
const advanceSubs = forkJoin(...advanceArr$)
|
|
222
|
+
.pipe(takeUntil(merge(destroyedEvent$, backEvent$)))
|
|
223
|
+
.subscribe(() => {
|
|
224
|
+
// check if we need to advance to a specific step, else advance to next step
|
|
225
|
+
if (step.advanceOnOptions && step.advanceOnOptions.jumpTo) {
|
|
226
|
+
this.shepherdTour.show(step.advanceOnOptions.jumpTo);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
this.shepherdTour.next();
|
|
230
|
+
}
|
|
231
|
+
forwardEvent$.next();
|
|
232
|
+
advanceSubs.unsubscribe();
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
// if abortOn was passed on the step, we bind the event and execute complete
|
|
236
|
+
if (step.abortOn) {
|
|
237
|
+
const abortArr$ = [];
|
|
238
|
+
step.abortOn.forEach((abortOn) => {
|
|
239
|
+
const abortEvent$ = new Subject();
|
|
240
|
+
abortArr$.push(abortEvent$);
|
|
241
|
+
this._bindEvent(abortOn, undefined, abortEvent$, destroyedEvent$);
|
|
242
|
+
});
|
|
243
|
+
const abortSubs = merge(...abortArr$)
|
|
244
|
+
.pipe(takeUntil(merge(destroyedEvent$, backEvent$, forwardEvent$)))
|
|
245
|
+
.subscribe(() => {
|
|
246
|
+
this.shepherdTour.complete();
|
|
247
|
+
abortSubs.unsubscribe();
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
const _stopTimer$ = new Subject();
|
|
252
|
+
const _retriesReached$ = new Subject();
|
|
253
|
+
const _retryAttempts$ = new BehaviorSubject(-1);
|
|
254
|
+
let id;
|
|
255
|
+
// checks if "attachTo" is a string or an object to get the id of an element
|
|
256
|
+
if (typeof step.attachTo === 'string') {
|
|
257
|
+
id = step.attachTo;
|
|
258
|
+
}
|
|
259
|
+
else if (typeof step.attachTo === 'object' && typeof step.attachTo.element === 'string') {
|
|
260
|
+
id = step.attachTo.element;
|
|
261
|
+
}
|
|
262
|
+
// if we have an id as a string in either case, we use it (we ignore it if its HTMLElement)
|
|
263
|
+
if (id) {
|
|
264
|
+
// if current step is the first step of the tour, we set the buttons to be only "next"
|
|
265
|
+
// 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
|
|
266
|
+
if (this.shepherdTour.getCurrentStep() === this.shepherdTour.steps[0]) {
|
|
267
|
+
this.shepherdTour.getCurrentStep().updateStepOptions({
|
|
268
|
+
buttons: originalSteps[index].advanceOn ? [voidButton] : [nextButton],
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
// register to the attempts observable to notify deeveloper when number has been reached
|
|
272
|
+
_retryAttempts$
|
|
273
|
+
.pipe(skip(1), takeUntil(merge(_stopTimer$.asObservable(), destroyedEvent$)), skipWhile((val) => {
|
|
274
|
+
if (step.attachToOptions && step.attachToOptions.retries !== undefined) {
|
|
275
|
+
return val < step.attachToOptions.retries;
|
|
276
|
+
}
|
|
277
|
+
return val < SHEPHERD_DEFAULT_FIND_ATTEMPTS;
|
|
278
|
+
}))
|
|
279
|
+
.subscribe((attempts) => {
|
|
280
|
+
_retriesReached$.next();
|
|
281
|
+
_retriesReached$.complete();
|
|
282
|
+
// if attempts have been reached, we check "skipIfNotFound" to move on to the next step
|
|
283
|
+
if (step.attachToOptions && step.attachToOptions.skipIfNotFound) {
|
|
284
|
+
// if we get to this step coming back from a step and it wasnt found
|
|
285
|
+
// then we either check if its the first step and try going forward
|
|
286
|
+
// or we keep going back until we find a step that actually exists
|
|
287
|
+
if (_backFlow) {
|
|
288
|
+
if (this.shepherdTour.steps.indexOf(this.shepherdTour.getCurrentStep()) === 0) {
|
|
289
|
+
this.shepherdTour.next();
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
this.shepherdTour.back();
|
|
293
|
+
}
|
|
294
|
+
_backFlow = false;
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
// destroys current step if we need to skip it to remove it from the tour
|
|
298
|
+
const currentStep = this.shepherdTour.getCurrentStep();
|
|
299
|
+
currentStep.destroy();
|
|
300
|
+
this.shepherdTour.next();
|
|
301
|
+
this.shepherdTour.removeStep(currentStep.id);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
else if (step.attachToOptions && step.attachToOptions.else) {
|
|
305
|
+
// if "skipIfNotFound" is not true, then we check if "else" has been set to jump to a specific step
|
|
306
|
+
this.shepherdTour.show(step.attachToOptions.else);
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
// tslint:disable-next-line:no-console
|
|
310
|
+
console.warn(`Retries reached trying to find ${id}. Retried ${attempts} times.`);
|
|
311
|
+
// else we show the step regardless
|
|
312
|
+
resolve();
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
// we start a timer of attempts to find an element in the dom
|
|
316
|
+
timer((step.attachToOptions && step.attachToOptions.timeBeforeShow) || SHEPHERD_DEFAULT_FIND_TIME_BEFORE_SHOW, (step.attachToOptions && step.attachToOptions.interval) || SHEPHERD_DEFAULT_FIND_INTERVAL)
|
|
317
|
+
.pipe(
|
|
318
|
+
// the timer will continue either until we find the element or the number of attempts has been reached
|
|
319
|
+
takeUntil(merge(_stopTimer$, _retriesReached$, destroyedEvent$)))
|
|
320
|
+
.subscribe(() => {
|
|
321
|
+
const element = document.querySelector(id);
|
|
322
|
+
// if the element has been found, we stop the timer and resolve the promise
|
|
323
|
+
if (element) {
|
|
324
|
+
_stopTimer$.next();
|
|
325
|
+
_stopTimer$.complete();
|
|
326
|
+
additionalCapabilitiesSetup();
|
|
327
|
+
resolve();
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
_retryAttempts$.next(_retryAttempts$.value + 1);
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
// stop find interval if user stops the tour
|
|
334
|
+
destroyedEvent$.subscribe(() => {
|
|
335
|
+
_stopTimer$.next();
|
|
336
|
+
_stopTimer$.complete();
|
|
337
|
+
_retriesReached$.next();
|
|
338
|
+
_retriesReached$.complete();
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
// resolve observable until the timeBeforeShow has passsed or use default
|
|
343
|
+
timer((step.attachToOptions && step.attachToOptions.timeBeforeShow) || SHEPHERD_DEFAULT_FIND_TIME_BEFORE_SHOW)
|
|
344
|
+
.pipe(takeUntil(merge(destroyedEvent$)))
|
|
345
|
+
.subscribe(() => {
|
|
346
|
+
resolve();
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
};
|
|
351
|
+
});
|
|
352
|
+
return steps;
|
|
353
|
+
}
|
|
354
|
+
_bindEvent(eventOn, eventOnOptions, event$, destroyedEvent$) {
|
|
355
|
+
const selector = eventOn.selector;
|
|
356
|
+
const event = eventOn.event;
|
|
357
|
+
// we start a timer of attempts to find an element in the dom
|
|
358
|
+
const timerSubs = timer((eventOnOptions && eventOnOptions.timeBeforeShow) || SHEPHERD_DEFAULT_FIND_TIME_BEFORE_SHOW, (eventOnOptions && eventOnOptions.interval) || SHEPHERD_DEFAULT_FIND_INTERVAL)
|
|
359
|
+
.pipe(takeUntil(destroyedEvent$))
|
|
360
|
+
.subscribe(() => {
|
|
361
|
+
const element = document.querySelector(selector);
|
|
362
|
+
// if the element has been found, we stop the timer and resolve the promise
|
|
363
|
+
if (element) {
|
|
364
|
+
timerSubs.unsubscribe();
|
|
365
|
+
if (event === ITourEvent.added) {
|
|
366
|
+
// if event is "Added" trigger a soon as this is attached.
|
|
367
|
+
event$.next();
|
|
368
|
+
event$.complete();
|
|
369
|
+
}
|
|
370
|
+
else if (event === ITourEvent.click ||
|
|
371
|
+
event === ITourEvent.pointerover ||
|
|
372
|
+
event.indexOf(ITourEvent.keyup) > -1) {
|
|
373
|
+
// we use normal listeners for mouseevents
|
|
374
|
+
const mainEvent = event.split('.')[0];
|
|
375
|
+
const subEvent = event.split('.')[1];
|
|
376
|
+
fromEvent(element, mainEvent)
|
|
377
|
+
.pipe(takeUntil(merge(event$.asObservable(), destroyedEvent$)), filter(($event) => {
|
|
378
|
+
// only trigger if the event is a keyboard event and part of out list
|
|
379
|
+
if ($event instanceof KeyboardEvent) {
|
|
380
|
+
if (keyEvents.get($event.keyCode) === subEvent) {
|
|
381
|
+
return true;
|
|
382
|
+
}
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
return true;
|
|
387
|
+
}
|
|
388
|
+
}))
|
|
389
|
+
.subscribe(() => {
|
|
390
|
+
event$.next();
|
|
391
|
+
event$.complete();
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
else if (event === ITourEvent.removed) {
|
|
395
|
+
// and we will use MutationObserver for DOM events
|
|
396
|
+
const observer = new MutationObserver(() => {
|
|
397
|
+
if (!document.body.contains(element)) {
|
|
398
|
+
event$.next();
|
|
399
|
+
event$.complete();
|
|
400
|
+
observer.disconnect();
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
// stop listenining if tour is closed
|
|
404
|
+
destroyedEvent$.subscribe(() => {
|
|
405
|
+
observer.disconnect();
|
|
406
|
+
});
|
|
407
|
+
// observe for any DOM interaction in the element
|
|
408
|
+
observer.observe(element, { childList: true, subtree: true, attributes: true });
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZGVkLnRvdXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGxhdGZvcm0vZ3VpZGVkLXRvdXIvZ3VpZGVkLnRvdXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxRQUFRLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQWdCLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakcsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUszRSxNQUFNLENBQU4sSUFBWSxVQU1YO0FBTkQsV0FBWSxVQUFVO0lBQ3BCLDZCQUFpQixDQUFBO0lBQ2pCLHlDQUE2QixDQUFBO0lBQzdCLDZCQUFpQixDQUFBO0lBQ2pCLDZCQUFpQixDQUFBO0lBQ2pCLGlDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFOVyxVQUFVLEtBQVYsVUFBVSxRQU1yQjtBQTBDRCxNQUFlLGtCQUFrQjtDQVFoQztBQUVELE1BQU0sc0NBQXNDLEdBQVcsR0FBRyxDQUFDO0FBQzNELE1BQU0sOEJBQThCLEdBQVcsR0FBRyxDQUFDO0FBQ25ELE1BQU0sOEJBQThCLEdBQVcsRUFBRSxDQUFDO0FBRWxELE1BQU0sZ0JBQWdCLEdBQWE7SUFDakMsVUFBVSxDQUFDLEtBQUs7SUFDaEIsVUFBVSxDQUFDLFdBQVc7SUFDdEIsVUFBVSxDQUFDLE9BQU87SUFDbEIsVUFBVSxDQUFDLEtBQUs7SUFDaEIsVUFBVSxDQUFDLEtBQUs7Q0FDakIsQ0FBQztBQUVGLE1BQU0sU0FBUyxHQUF3QixJQUFJLEdBQUcsQ0FBaUI7SUFDN0QsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDO0NBQ1osQ0FBQyxDQUFDO0FBRUgsTUFBTSxr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a0Q7b0JBQ2xELE1BQU0sUUFBUSxHQUFxQixJQUFJLGdCQUFnQixDQUFDLEdBQUcsRUFBRTt3QkFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFOzRCQUNwQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQ2QsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDOzRCQUNsQixRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7eUJBQ3ZCO29CQUNILENBQUMsQ0FBQyxDQUFDO29CQUVILHFDQUFxQztvQkFDckMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7d0JBQzdCLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDeEIsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsaURBQWlEO29CQUNqRCxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDakY7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNoZXBoZXJkIGZyb20gJ3NoZXBoZXJkLmpzJztcbmltcG9ydCB7IHRpbWVyLCBTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QsIG1lcmdlLCBTdWJzY3JpcHRpb24sIGZyb21FdmVudCwgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCwgc2tpcFdoaWxlLCBmaWx0ZXIsIHNraXAsIGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5leHBvcnQgdHlwZSBUb3VyU3RlcCA9IFNoZXBoZXJkLlN0ZXAuU3RlcE9wdGlvbnM7XG5leHBvcnQgdHlwZSBUb3VyU3RlcEJ1dHRvbiA9IFNoZXBoZXJkLlN0ZXAuU3RlcE9wdGlvbnNCdXR0b247XG5cbmV4cG9ydCBlbnVtIElUb3VyRXZlbnQge1xuICAnY2xpY2snID0gJ2NsaWNrJyxcbiAgJ3BvaW50ZXJvdmVyJyA9ICdwb2ludGVyb3ZlcicsXG4gICdrZXl1cCcgPSAna2V5dXAnLFxuICAnYWRkZWQnID0gJ2FkZGVkJywgLy8gYWRkZWQgdG8gRE9NXG4gICdyZW1vdmVkJyA9ICdyZW1vdmVkJywgLy8gcmVtb3ZlZCBmcm9tIERPTVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUb3VyRXZlbnRPbiB7XG4gIHNlbGVjdG9yPzogc3RyaW5nOyAvLyBjc3Mgc2VsZWN0b3JcbiAgZXZlbnQ/OiBrZXlvZiB0eXBlb2YgSVRvdXJFdmVudDsgLy8gY2xpY2ssIHBvaW50ZXJvdmVyLCBrZXl1cCwgYWRkZWQsIHJlbW92ZWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVG91ckV2ZW50T25PcHRpb25zIHtcbiAgdGltZUJlZm9yZVNob3c/OiBudW1iZXI7IC8vIGRlbGF5IGJlZm9yZSBzdGVwIGlzIGRpc3BsYXllZFxuICBpbnRlcnZhbD86IG51bWJlcjsgLy8gdGltZSBiZXR3ZWVuIHNlYXJjaGVzIGZvciBlbGVtZW50LCBkZWZhdWx0cyB0byA1MDBtc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUb3VyQWJvcnRPbiBleHRlbmRzIElUb3VyRXZlbnRPbiB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIElUb3VyT3B0aW9ucyBleHRlbmRzIFNoZXBoZXJkLlRvdXIuVG91ck9wdGlvbnMge1xuICBhYm9ydE9uPzogSVRvdXJBYm9ydE9uW107IC8vIGV2ZW50cyB0byBhYm9ydCBvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUb3VyU3RlcEF0dGFjaFRvT3B0aW9ucyBleHRlbmRzIElUb3VyRXZlbnRPbk9wdGlvbnMge1xuICBoaWdobGlnaHQ/OiBib29sZWFuO1xuICByZXRyaWVzPzogbnVtYmVyOyAvLyAjIG51bSBvZiBhdHRlbXB0cyB0byBmaW5kIGVsZW1lbnRcbiAgc2tpcElmTm90Rm91bmQ/OiBib29sZWFuOyAvLyBpZiBlbGVtZW50IGlzIG5vdCBmb3VuZCBhZnRlciBuIHJldHJpZXMsIG1vdmUgb24gdG8gbmV4dCBzdGVwXG4gIGVsc2U/OiBzdHJpbmc7IC8vIGlmIGVsZW1lbnQgaXMgbm90IGZvdW5kLCBnbyB0byBzdGVwIHdpdGggdGhpcyBpZFxuICBnb0JhY2tUbz86IHN0cmluZzsgLy8gYmFjayBidXR0b24gZ29lcyBiYWNrIHRvIHN0ZXAgd2l0aCB0aGlzIGlkXG4gIHNraXBGcm9tU3RlcENvdW50PzogYm9vbGVhbjsgLy8gc2hvdy9oaWRlIHByb2dyZXNzIG9uIHN0ZXBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVG91clN0ZXBBZHZhbmNlT24gZXh0ZW5kcyBJVG91ckV2ZW50T24ge31cblxuZXhwb3J0IGludGVyZmFjZSBJVG91clN0ZXBBZHZhbmNlT25PcHRpb25zIGV4dGVuZHMgSVRvdXJFdmVudE9uT3B0aW9ucyB7XG4gIGp1bXBUbz86IHN0cmluZzsgLy8gbmV4dCBidXR0b24gd2lsbCBqdW1wIHRvIHN0ZXAgd2l0aCB0aGlzIGlkXG4gIGFsbG93R29CYWNrPzogYm9vbGVhbjsgLy8gYWxsb3cgYmFjayB3aXRoaW4gdGhpcyBzdGVwXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRvdXJTdGVwIGV4dGVuZHMgVG91clN0ZXAge1xuICBhdHRhY2hUb09wdGlvbnM/OiBJVG91clN0ZXBBdHRhY2hUb09wdGlvbnM7XG4gIGFkdmFuY2VPbk9wdGlvbnM/OiBJVG91clN0ZXBBZHZhbmNlT25PcHRpb25zO1xuICBhZHZhbmNlT24/OiBJVG91clN0ZXBBZHZhbmNlT25bXSB8IElUb3VyU3RlcEFkdmFuY2VPbiB8IGFueTtcbiAgYWJvcnRPbj86IElUb3VyQWJvcnRPbltdO1xuICBjb3VudD86IG51bWJlcjtcbn1cblxuYWJzdHJhY3QgY2xhc3MgVG91ckJ1dHRvbnNBY3Rpb25zIHtcbiAgYWJzdHJhY3QgbmV4dCgpOiB2b2lkO1xuXG4gIGFic3RyYWN0IGJhY2soKTogdm9pZDtcblxuICBhYnN0cmFjdCBjYW5jZWwoKTogdm9pZDtcblxuICBhYnN0cmFjdCBmaW5pc2goKTogdm9pZDtcbn1cblxuY29uc3QgU0hFUEhFUkRfREVGQVVMVF9GSU5EX1RJTUVfQkVGT1JFX1NIT1c6IG51bWJlciA9IDEwMDtcbmNvbnN0IFNIRVBIRVJEX0RFRkFVTFRfRklORF9JTlRFUlZBTDogbnVtYmVyID0gNTAwO1xuY29uc3QgU0hFUEhFUkRfREVGQVVMVF9GSU5EX0FUVEVNUFRTOiBudW1iZXIgPSAyMDtcblxuY29uc3Qgb3ZlcnJpZGRlbkV2ZW50czogc3RyaW5nW10gPSBbXG4gIElUb3VyRXZlbnQuY2xpY2ssXG4gIElUb3VyRXZlbnQucG9pbnRlcm92ZXIsXG4gIElUb3VyRXZlbnQucmVtb3ZlZCxcbiAgSVRvdXJFdmVudC5hZGRlZCxcbiAgSVRvdXJFdmVudC5rZXl1cCxcbl07XG5cbmNvbnN0IGtleUV2ZW50czogTWFwPG51bWJlciwgc3RyaW5nPiA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KFtcbiAgWzEzLCAnZW50ZXInXSxcbiAgWzI3LCAnZXNjJ10sXG5dKTtcblxuY29uc3QgZGVmYXVsdFN0ZXBPcHRpb25zOiBUb3VyU3RlcCA9IHtcbiAgc2Nyb2xsVG86IHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSxcbiAgY2FuY2VsSWNvbjoge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gIH0sXG59O1xuXG5jb25zdCBNQVRfSUNPTl9CVVRUT046IHN0cmluZyA9ICdtYXQtaWNvbi1idXR0b24gbWF0ZXJpYWwtaWNvbnMgbWF0LWJ1dHRvbi1iYXNlJztcbmNvbnN0IE1BVF9CVVRUT046IHN0cmluZyA9ICdtYXQtYnV0dG9uLWJhc2UgbWF0LWJ1dHRvbic7XG5jb25zdCBNQVRfQlVUVE9OX0lOVklTSUJMRTogc3RyaW5nID0gJ3NoZXBoZXJkLXZvaWQtYnV0dG9uJztcblxuZXhwb3J0IGNsYXNzIENvdmFsZW50R3VpZGVkVG91ciBleHRlbmRzIFRvdXJCdXR0b25zQWN0aW9ucyB7XG4gIHByaXZhdGUgX2Rlc3Ryb3llZEV2ZW50JDogU3ViamVjdDx2b2lkPjtcblxuICBzaGVwaGVyZFRvdXI6IFNoZXBoZXJkLlRvdXI7XG4gIHN0ZXBPcHRpb25zOiBJVG91clN0ZXA7XG5cbiAgY29uc3RydWN0b3Ioc3RlcE9wdGlvbnM6IElUb3VyU3RlcCA9IGRlZmF1bHRTdGVwT3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnN0ZXBPcHRpb25zID0gc3RlcE9wdGlvbnM7XG4gICAgdGhpcy5uZXdUb3VyKCk7XG4gIH1cblxuICBuZXdUb3VyKG9wdHM/OiBJVG91ck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnNoZXBoZXJkVG91ciA9IG5ldyBTaGVwaGVyZC5Ub3VyKFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge1xuICAgICAgICAgIGRlZmF1bHRTdGVwT3B0aW9uczogdGhpcy5zdGVwT3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAgb3B0cyxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHRoaXMuX2Rlc3Ryb3llZEV2ZW50JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgLy8gbGlzdGVuIHRvIGNhbmNlbCBhbmQgY29tcGxldGUgdG8gY2xlYW4gdXAgYWJvcnRPbiBldmVudHNcbiAgICBtZXJnZShmcm9tRXZlbnQodGhpcy5zaGVwaGVyZFRvdXIsICdjYW5jZWwnKSwgZnJvbUV2ZW50KHRoaXMuc2hlcGhlcmRUb3VyLCAnY29tcGxldGUnKSlcbiAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZGVzdHJveWVkRXZlbnQkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fZGVzdHJveWVkRXZlbnQkLmNvbXBsZXRlKCk7XG4gICAgICB9KTtcblxuICAgIC8vIGlmIGFib3J0T24gd2FzIHBhc3NlZCwgd2UgYmluZCB0aGUgZXZlbnQgYW5kIGV4ZWN1dGUgY29tcGxldGVcbiAgICBpZiAob3B0cyAmJiBvcHRzLmFib3J0T24pIHtcbiAgICAgIGNvbnN0IGFib3J0QXJyJDogU3ViamVjdDx2b2lkPltdID0gW107XG4gICAgICBvcHRzLmFib3J0T24uZm9yRWFjaCgoYWJvcnRPbjogSVRvdXJBYm9ydE9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGFib3J0RXZlbnQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAgICAgYWJvcnRBcnIkLnB1c2goYWJvcnRFdmVudCQpO1xuICAgICAgICB0aGlzLl9iaW5kRXZlbnQoYWJvcnRPbiwgdW5kZWZpbmVkLCBhYm9ydEV2ZW50JCwgdGhpcy5fZGVzdHJveWVkRXZlbnQkKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhYm9ydFN1YnM6IFN1YnNjcmlwdGlvbiA9IG1lcmdlKC4uLmFib3J0QXJyJClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZEV2ZW50JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hlcGhlcmRUb3VyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgYWJvcnRTdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5zaGVwaGVyZFRvdXIuYmFjaygpO1xuICB9XG5cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuc2hlcGhlcmRUb3VyLmNhbmNlbCgpO1xuICB9XG5cbiAgbmV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLnNoZXBoZXJkVG91ci5uZXh0KCk7XG4gIH1cblxuICBmaW5pc2goKTogdm9pZCB7XG4gICAgdGhpcy5zaGVwaGVyZFRvdXIuY29tcGxldGUoKTtcbiAgfVxuXG4gIGFkZFN0ZXBzKHN0ZXBzOiBJVG91clN0ZXBbXSk6IHZvaWQge1xuICAgIHRoaXMuc2hlcGhlcmRUb3VyLmFkZFN0ZXBzKHRoaXMuX3ByZXBhcmVUb3VyKHN0ZXBzKSk7XG4gIH1cblxuICBzdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLnNoZXBoZXJkVG91ci5zdGFydCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9wcmVwYXJlVG91cihvcmlnaW5hbFN0ZXBzOiBJVG91clN0ZXBbXSwgZmluaXNoTGFiZWw6IHN0cmluZyA9ICdmaW5pc2gnKTogSVRvdXJTdGVwW10ge1xuICAgIC8vIGNyZWF0ZSBTdWJqZWN0cyBmb3IgYmFjayBhbmQgZm9yd2FyZCBldmVudHNcbiAgICBjb25zdCBiYWNrRXZlbnQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBjb25zdCBmb3J3YXJkRXZlbnQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBsZXQgX2JhY2tGbG93OiBib29sZWFuID0gZmFsc2U7XG4gICAgLy8gY3JlYXRlIFN1YmplY3QgZm9yIHlvdXIgZW5kXG4gICAgY29uc3QgZGVzdHJveWVkRXZlbnQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgdGhlIHN0ZXAgcHJvZ3Jlc3MgaW4gdGhlIGZvb3RlciBvZiB0aGUgc2hlcGhlcmQgdG9vbHRpcFxuICAgICAqL1xuICAgIGNvbnN0IGFwcGVuZFByb2dyZXNzRnVuYzogRnVuY3Rpb24gPSBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAvLyBnZXQgYWxsIHRoZSBmb290ZXJzIHRoYXQgYXJlIGF2YWlsYWJsZSBpbiB0aGUgRE9NXG4gICAgICBjb25zdCBmb290ZXJzOiBFbGVtZW50W10gPSBBcnJheS5mcm9tPEVsZW1lbnQ+KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaGVwaGVyZC1mb290ZXInKSk7XG4gICAgICAvLyBnZXQgdGhlIGxhc3QgZm9vdGVyIHNpbmNlIFNoZXBoZXJkIGFsd2F5cyBwdXRzIHRoZSBhY3RpdmUgb25lIGF0IHRoZSBlbmRcbiAgICAgIGNvbnN0IGZvb3RlcjogRWxlbWVudCA9IGZvb3RlcnNbZm9vdGVycy5sZW5ndGggLSAxXTtcbiAgICAgIC8vIGdlbmVyYXRlIHN0ZXBzIGh0bWwgZWxlbWVudFxuICAgICAgY29uc3QgcHJvZ3Jlc3M6IEhUTUxTcGFuRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgIHByb2dyZXNzLmNsYXNzTmFtZSA9ICdzaGVwaGVyZC1wcm9ncmVzcyc7XG4gICAgICBwcm9ncmVzcy5pbm5lclRleHQgPSBgJHt0aGlzLnNoZXBoZXJkVG91ci5jdXJyZW50U3RlcC5vcHRpb25zLmNvdW50fS8ke3N0ZXBUb3RhbH1gO1xuICAgICAgLy8gaW5zZXJ0IGludG8gdGhlIGZvb3RlciBiZWZvcmUgdGhlIGZpcnN0IGJ1dHRvblxuICAgICAgZm9vdGVyLmluc2VydEJlZm9yZShwcm9ncmVzcywgZm9vdGVyLnF1ZXJ5U2VsZWN0b3IoJy5zaGVwaGVyZC1idXR0b24nKSk7XG4gICAgfTtcblxuICAgIGxldCBzdGVwVG90YWw6IG51bWJlciA9IDA7XG4gICAgY29uc3Qgc3RlcHM6IElUb3VyU3RlcFtdID0gb3JpZ2luYWxTdGVwcy5tYXAoKHN0ZXA6IElUb3VyU3RlcCkgPT4ge1xuICAgICAgbGV0IHNob3dQcm9ncmVzczogRnVuY3Rpb247XG4gICAgICBpZiAoc3RlcC5hdHRhY2hUb09wdGlvbnM/LnNraXBGcm9tU3RlcENvdW50ID09PSB0cnVlKSB7XG4gICAgICAgIHNob3dQcm9ncmVzcyA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBzdGVwLmF0dGFjaFRvT3B0aW9ucz8uc2tpcEZyb21TdGVwQ291bnQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBzdGVwLmF0dGFjaFRvT3B0aW9ucz8uc2tpcEZyb21TdGVwQ291bnQgPT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgc3RlcC5jb3VudCA9ICsrc3RlcFRvdGFsO1xuICAgICAgICBzaG93UHJvZ3Jlc3MgPSBhcHBlbmRQcm9ncmVzc0Z1bmMuYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGVwLCB7XG4gICAgICAgIHdoZW46IHtcbiAgICAgICAgICBzaG93OiBzaG93UHJvZ3Jlc3MsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbmlzaEJ1dHRvbjogVG91clN0ZXBCdXR0b24gPSB7XG4gICAgICB0ZXh0OiBmaW5pc2hMYWJlbCxcbiAgICAgIGFjdGlvbjogdGhpc1snZmluaXNoJ10uYmluZCh0aGlzKSxcbiAgICAgIGNsYXNzZXM6IE1BVF9CVVRUT04sXG4gICAgfTtcblxuICAgIGNvbnN0IHZvaWRCdXR0b246IFRvdXJTdGVwQnV0dG9uID0ge1xuICAgICAgdGV4dDogJycsXG4gICAgICBhY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0sXG4gICAgICBjbGFzc2VzOiBNQVRfQlVUVE9OX0lOVklTSUJMRSxcbiAgICB9O1xuXG4gICAgLy8gbGlzdGVuIHRvIHRoZSBkZXN0cm95ZWQgZXZlbnQgdG8gY2xlYW4gdXAgYWxsIHRoZSBzdHJlYW1zXG4gICAgdGhpcy5fZGVzdHJveWVkRXZlbnQkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGJhY2tFdmVudCQuY29tcGxldGUoKTtcbiAgICAgIGZvcndhcmRFdmVudCQuY29tcGxldGUoKTtcbiAgICAgIGRlc3Ryb3llZEV2ZW50JC5uZXh0KCk7XG4gICAgICBkZXN0cm95ZWRFdmVudCQuY29tcGxldGUoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRvdGFsU3RlcHM6IG51bWJlciA9IHN0ZXBzLmxlbmd0aDtcbiAgICBzdGVwcy5mb3JFYWNoKChzdGVwOiBJVG91clN0ZXAsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIC8vIGNyZWF0ZSBidXR0b25zIHNwZWNpZmljIGZvciB0aGUgc3RlcFxuICAgICAgLy8gdGhpcyBpcyBkb25lIHRvIGNyZWF0ZSBtb3JlIGNvbnRyb2wgb24gZXZlbnRzXG4gICAgICBjb25zdCBuZXh0QnV0dG9uOiBUb3VyU3RlcEJ1dHRvbiA9IHtcbiAgICAgICAgdGV4dDogJ2NoZXZyb25fcmlnaHQnLFxuICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAvLyBpbnRlcmNlcHQgdGhlIG5leHQgYWN0aW9uIGFuZCB0cmlnZ2VyIGV2ZW50XG4gICAgICAgICAgZm9yd2FyZEV2ZW50JC5uZXh0KCk7XG4gICAgICAgICAgdGhpcy5zaGVwaGVyZFRvdXIubmV4dCgpO1xuICAgICAgICB9LFxuICAgICAgICBjbGFzc2VzOiBNQVRfSUNPTl9CVVRUT04sXG4gICAgICB9O1xuICAgICAgY29uc3QgYmFja0J1dHRvbjogVG91clN0ZXBCdXR0b24gPSB7XG4gICAgICAgIHRleHQ6ICdjaGV2cm9uX2xlZnQnLFxuICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAvLyBpbnRlcmNlcHQgdGhlIGJhY2sgYWN0aW9uIGFuZCB0cmlnZ2VyIGV2ZW50XG4gICAgICAgICAgYmFja0V2ZW50JC5uZXh0KCk7XG4gICAgICAgICAgX2JhY2tGbG93ID0gdHJ1ZTtcbiAgICAgICAgICAvLyBjaGVjayBpZiAnZ29CYWNrVG8nIGlzIHNldCB0byBqdW1wIHRvIGEgcGFydGljdWxhciBzdGVwLCBlbHNlIGp1c3QgZ28gYmFja1xuICAgICAgICAgIGlmIChzdGVwLmF0dGFjaFRvT3B0aW9ucyAmJiBzdGVwLmF0dGFjaFRvT3B0aW9ucy5nb0JhY2tUbykge1xuICAgICAgICAgICAgdGhpcy5zaGVwaGVyZFRvdXIuc2hvdyhzdGVwLmF0dGFjaFRvT3B0aW9ucy5nb0JhY2tUbywgZmFsc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNoZXBoZXJkVG91ci5iYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjbGFzc2VzOiBzdGVwLmFkdmFuY2VPbk9wdGlvbnM/LmFsbG93R29CYWNrID09PSBmYWxzZSA/IE1BVF9CVVRUT05fSU5WSVNJQkxFIDogTUFUX0lDT05fQlVUVE9OLFxuICAgICAgfTtcblxuICAgICAgLy8gY2hlY2sgaWYgaGlnaGxpZ2h0IHdhcyBwcm92aWRlZCBmb3IgdGhlIHN0ZXAsIGVsc2UgZmFsbGJhY2sgaW50byBzaGVwaGVyZHMgdXNhZ2VcbiAgICAgIHN0ZXAuaGlnaGxpZ2h0Q2xhc3MgPVxuICAgICAgICBzdGVwLmF0dGFjaFRvT3B0aW9ucyAmJiBzdGVwLmF0dGFjaFRvT3B0aW9ucy5oaWdobGlnaHQgPyAnc2hlcGhlcmQtaGlnaGxpZ2h0JyA6IHN0ZXAuaGlnaGxpZ2h0Q2xhc3M7XG5cbiAgICAgIC8vIEFkZGluZyBidXR0b25zIGluIHRoZSBzdGVwcyBpZiBubyBidXR0b25zIGFyZSBkZWZpbmVkXG4gICAgICBpZiAoIXN0ZXAuYnV0dG9ucyB8fCBzdGVwLmJ1dHRvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIC8vIGZpcnN0IHN0ZXBcbiAgICAgICAgICBzdGVwLmJ1dHRvbnMgPSBbbmV4dEJ1dHRvbl07XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHRvdGFsU3RlcHMgLSAxKSB7XG4gICAgICAgICAgLy8gbGFzdCBzdGVwXG4gICAgICAgICAgc3RlcC5idXR0b25zID0gW2JhY2tCdXR0b24sIGZpbmlzaEJ1dHRvbl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RlcC5idXR0b25zID0gW2JhY2tCdXR0b24sIG5leHRCdXR0b25dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrcyBcImFkdmFuY2VPblwiIHRvIG92ZXJyaWRlIGxpc3RlbmVyc1xuICAgICAgbGV0IGFkdmFuY2VPbjogSVRvdXJTdGVwQWR2YW5jZU9uW10gfCBJVG91clN0ZXBBZHZhbmNlT24gPSBzdGVwLmFkdmFuY2VPbjtcbiAgICAgIC8vIHJlbW92ZSB0aGUgc2hlcGhlcmQgXCJhZHZhbmNlT25cIiBpbmZhdm9yIG9mIG91cnMgaWYgdGhlIGV2ZW50IGlzIHBhcnQgb2Ygb3VyIGxpc3RcbiAgICAgIGlmIChcbiAgICAgICAgKHR5cGVvZiBhZHZhbmNlT24gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgIUFycmF5LmlzQXJyYXkoYWR2YW5jZU9uKSAmJlxuICAgICAgICAgIG92ZXJyaWRkZW5FdmVudHMuaW5kZXhPZihhZHZhbmNlT24uZXZlbnQuc3BsaXQoJy4nKVswXSkgPiAtMSkgfHxcbiAgICAgICAgYWR2YW5jZU9uIGluc3RhbmNlb2YgQXJyYXlcbiAgICAgICkge1xuICAgICAgICBzdGVwLmFkdmFuY2VPbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgc3RlcC5idXR0b25zID1cbiAgICAgICAgICBzdGVwLmFkdmFuY2VPbk9wdGlvbnMgJiYgc3RlcC5hZHZhbmNlT25PcHRpb25zLmFsbG93R29CYWNrID8gW2JhY2tCdXR0b24sIHZvaWRCdXR0b25dIDogW3ZvaWRCdXR0b25dO1xuICAgICAgfVxuICAgICAgLy8gYWRkcyBhIGRlZmF1bHQgYmVmb3JlU2hvd1Byb21pc2UgZnVuY3Rpb25cbiAgICAgIHN0ZXAuYmVmb3JlU2hvd1Byb21pc2UgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogKHZhbHVlPzogYW55KSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgY29uc3QgYWRkaXRpb25hbENhcGFiaWxpdGllc1NldHVwOiBGdW5jdGlvbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChhZHZhbmNlT24gJiYgIXN0ZXAuYWR2YW5jZU9uKSB7XG4gICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhZHZhbmNlT24pKSB7XG4gICAgICAgICAgICAgICAgYWR2YW5jZU9uID0gW2FkdmFuY2VPbl07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBhZHZhbmNlQXJyJDogU3ViamVjdDx2b2lkPltdID0gW107XG4gICAgICAgICAgICAgIGFkdmFuY2VPbi5mb3JFYWNoKChfOiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkdmFuY2VFdmVudCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgICAgICAgICAgICAgIGFkdmFuY2VBcnIkLnB1c2goYWR2YW5jZUV2ZW50JCk7XG4gICAgICAgICAgICAgICAgLy8gd2Ugc3RhcnQgYSB0aW1lciBvZiBhdHRlbXB0cyB0byBmaW5kIGFuIGVsZW1lbnQgaW4gdGhlIGRvbVxuICAgICAgICAgICAgICAgIHRoaXMuX2JpbmRFdmVudChhZHZhbmNlT25baV0sIHN0ZXAuYWR2YW5jZU9uT3B0aW9ucywgYWR2YW5jZUV2ZW50JCwgZGVzdHJveWVkRXZlbnQkKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnN0IGFkdmFuY2VTdWJzOiBTdWJzY3JpcHRpb24gPSBmb3JrSm9pbiguLi5hZHZhbmNlQXJyJClcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwobWVyZ2UoZGVzdHJveWVkRXZlbnQkLCBiYWNrRXZlbnQkKSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIGFkdmFuY2UgdG8gYSBzcGVjaWZpYyBzdGVwLCBlbHNlIGFkdmFuY2UgdG8gbmV4dCBzdGVwXG4gICAgICAgICAgICAgICAgICBpZiAoc3RlcC5hZHZhbmNlT25PcHRpb25zICYmIHN0ZXAuYWR2YW5jZU9uT3B0aW9ucy5qdW1wVG8pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGVwaGVyZFRvdXIuc2hvdyhzdGVwLmFkdmFuY2VPbk9wdGlvbnMuanVtcFRvKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hlcGhlcmRUb3VyLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGZvcndhcmRFdmVudCQubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgYWR2YW5jZVN1YnMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgYWJvcnRPbiB3YXMgcGFzc2VkIG9uIHRoZSBzdGVwLCB3ZSBiaW5kIHRoZSBldmVudCBhbmQgZXhlY3V0ZSBjb21wbGV0ZVxuICAgICAgICAgICAgaWYgKHN0ZXAuYWJvcnRPbikge1xuICAgICAgICAgICAgICBjb25zdCBhYm9ydEFyciQ6IFN1YmplY3Q8dm9pZD5bXSA9IFtdO1xuICAgICAgICAgICAgICBzdGVwLmFib3J0T24uZm9yRWFjaCgoYWJvcnRPbjogSVRvdXJBYm9ydE9uKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWJvcnRFdmVudCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgICAgICAgICAgICAgIGFib3J0QXJyJC5wdXNoKGFib3J0RXZlbnQkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kRXZlbnQoYWJvcnRPbiwgdW5kZWZpbmVkLCBhYm9ydEV2ZW50JCwgZGVzdHJveWVkRXZlbnQkKTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgYWJvcnRTdWJzOiBTdWJzY3JpcHRpb24gPSBtZXJnZSguLi5hYm9ydEFyciQpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKG1lcmdlKGRlc3Ryb3llZEV2ZW50JCwgYmFja0V2ZW50JCwgZm9yd2FyZEV2ZW50JCkpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zaGVwaGVyZFRvdXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgIGFib3J0U3Vicy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBfc3RvcFRpbWVyJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgICAgICAgY29uc3QgX3JldHJpZXNSZWFjaGVkJDogU3ViamVjdDxudW1iZXI+ID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuICAgICAgICAgIGNvbnN0IF9yZXRyeUF0dGVtcHRzJDogQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oLTEpO1xuXG4gICAgICAgICAgbGV0IGlkOiBzdHJpbmc7XG4gICAgICAgICAgLy8gY2hlY2tzIGlmIFwiYXR0YWNoVG9cIiBpcyBhIHN0cmluZyBvciBhbiBvYmplY3QgdG8gZ2V0IHRoZSBpZCBvZiBhbiBlbGVtZW50XG4gICAgICAgICAgaWYgKHR5cGVvZiBzdGVwLmF0dGFjaFRvID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWQgPSBzdGVwLmF0dGFjaFRvO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0ZXAuYXR0YWNoVG8gPT09ICdvYmplY3QnICYmIHR5cGVvZiBzdGVwLmF0dGFjaFRvLmVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZCA9IHN0ZXAuYXR0YWNoVG8uZWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBpZCBhcyBhIHN0cmluZyBpbiBlaXRoZXIgY2FzZSwgd2UgdXNlIGl0ICh3ZSBpZ25vcmUgaXQgaWYgaXRzIEhUTUxFbGVtZW50KVxuICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgLy8gaWYgY3VycmVudCBzdGVwIGlzIHRoZSBmaXJzdCBzdGVwIG9mIHRoZSB0b3VyLCB3ZSBzZXQgdGhlIGJ1dHRvbnMgdG8gYmUgb25seSBcIm5leHRcIlxuICAgICAgICAgICAgLy8gd2UgaGFkIHRvIHVzZSBgYW55YCBzaW5jZSB0aGUgdG91ciBkb2VzbnQgZXhwb3NlIHRoZSBzdGVwcyBpbiBhbnkgZmFzaGlvbiBub3IgYSB3YXkgdG8gY2hlY2sgaWYgd2UgaGF2ZSBtb2RpZmllZCB0aGVtIGF0IGFsbFxuICAgICAgICAgICAgaWYgKHRoaXMuc2hlcGhlcmRUb3VyLmdldEN1cnJlbnRTdGVwKCkgPT09ICg8YW55PnRoaXMuc2hlcGhlcmRUb3VyKS5zdGVwc1swXSkge1xuICAgICAgICAgICAgICB0aGlzLnNoZXBoZXJkVG91ci5nZXRDdXJyZW50U3RlcCgpLnVwZGF0ZVN0ZXBPcHRpb25zKHtcbiAgICAgICAgICAgICAgICBidXR0b25zOiBvcmlnaW5hbFN0ZXBzW2luZGV4XS5hZHZhbmNlT24gPyBbdm9pZEJ1dHRvbl0gOiBbbmV4dEJ1dHRvbl0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdG8gdGhlIGF0dGVtcHRzIG9ic2VydmFibGUgdG8gbm90aWZ5IGRlZXZlbG9wZXIgd2hlbiBudW1iZXIgaGFzIGJlZW4gcmVhY2hlZFxuICAgICAgICAgICAgX3JldHJ5QXR0ZW1wdHMkXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHNraXAoMSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKG1lcmdlKF9zdG9wVGltZXIkLmFzT2JzZXJ2YWJsZSgpLCBkZXN0cm95ZWRFdmVudCQpKSxcbiAgICAgICAgICAgICAgICBza2lwV2hpbGUoKHZhbDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoc3RlcC5hdHRhY2hUb09wdGlvbnMgJiYgc3RlcC5hdHRhY2hUb09wdGlvbnMucmV0cmllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwgPCBzdGVwLmF0dGFjaFRvT3B0aW9ucy5yZXRyaWVzO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbCA8IFNIRVBIRVJEX0RFRkFVTFRfRklORF9BVFRFTVBUUztcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKChhdHRlbXB0czogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgX3JldHJpZXNSZWFjaGVkJC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgX3JldHJpZXNSZWFjaGVkJC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIC8vIGlmIGF0dGVtcHRzIGhhdmUgYmVlbiByZWFjaGVkLCB3ZSBjaGVjayBcInNraXBJZk5vdEZvdW5kXCIgdG8gbW92ZSBvbiB0byB0aGUgbmV4dCBzdGVwXG4gICAgICAgICAgICAgICAgaWYgKHN0ZXAuYXR0YWNoVG9PcHRpb25zICYmIHN0ZXAuYXR0YWNoVG9PcHRpb25zLnNraXBJZk5vdEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBnZXQgdG8gdGhpcyBzdGVwIGNvbWluZyBiYWNrIGZyb20gYSBzdGVwIGFuZCBpdCB3YXNudCBmb3VuZFxuICAgICAgICAgICAgICAgICAgLy8gdGhlbiB3ZSBlaXRoZXIgY2hlY2sgaWYgaXRzIHRoZSBmaXJzdCBzdGVwIGFuZCB0cnkgZ29pbmcgZm9yd2FyZFxuICAgICAgICAgICAgICAgICAgLy8gb3Igd2Uga2VlcCBnb2luZyBiYWNrIHVudGlsIHdlIGZpbmQgYSBzdGVwIHRoYXQgYWN0dWFsbHkgZXhpc3RzXG4gICAgICAgICAgICAgICAgICBpZiAoX2JhY2tGbG93KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoPGFueT50aGlzLnNoZXBoZXJkVG91cikuc3RlcHMuaW5kZXhPZih0aGlzLnNoZXBoZXJkVG91ci5nZXRDdXJyZW50U3RlcCgpKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hlcGhlcmRUb3VyLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoZXBoZXJkVG91ci5iYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX2JhY2tGbG93ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBkZXN0cm95cyBjdXJyZW50IHN0ZXAgaWYgd2UgbmVlZCB0byBza2lwIGl0IHRvIHJlbW92ZSBpdCBmcm9tIHRoZSB0b3VyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGVwOiBTaGVwaGVyZC5TdGVwID0gdGhpcy5zaGVwaGVyZFRvdXIuZ2V0Q3VycmVudFN0ZXAoKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ZXAuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoZXBoZXJkVG91ci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hlcGhlcmRUb3VyLnJlbW92ZVN0ZXAoKDxTaGVwaGVyZC5TdGVwLlN0ZXBPcHRpb25zPmN1cnJlbnRTdGVwKS5pZCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGVwLmF0dGFjaFRvT3B0aW9ucyAmJiBzdGVwLmF0dGFjaFRvT3B0aW9ucy5lbHNlKSB7XG4gICAgICAgICAgICAgICAgICAvLyBpZiBcInNraXBJZk5vdEZvdW5kXCIgaXMgbm90IHRydWUsIHRoZW4gd2UgY2hlY2sgaWYgXCJlbHNlXCIgaGFzIGJlZW4gc2V0IHRvIGp1bXAgdG8gYSBzcGVjaWZpYyBzdGVwXG4gICAgICAgICAgICAgICAgICB0aGlzLnNoZXBoZXJkVG91ci5zaG93KHN0ZXAuYXR0YWNoVG9PcHRpb25zLmVsc2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBSZXRyaWVzIHJlYWNoZWQgdHJ5aW5nIHRvIGZpbmQgJHtpZH0uIFJldHJpZWQgICR7YXR0ZW1wdHN9IHRpbWVzLmApO1xuICAgICAgICAgICAgICAgICAgLy8gZWxzZSB3ZSBzaG93IHRoZSBzdGVwIHJlZ2FyZGxlc3NcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyB3ZSBzdGFydCBhIHRpbWVyIG9mIGF0dGVtcHRzIHRvIGZpbmQgYW4gZWxlbWVudCBpbiB0aGUgZG9tXG4gICAgICAgICAgICB0aW1lcihcbiAgICAgICAgICAgICAgKHN0ZXAuYXR0YWNoVG9PcHRpb25zICYmIHN0ZXAuYXR0YWNoVG9PcHRpb25zLnRpbWVCZWZvcmVTaG93KSB8fCBTSEVQSEVSRF9ERUZBVUxUX0ZJTkRfVElNRV9CRUZPUkVfU0hPVyxcbiAgICAgICAgICAgICAgKHN0ZXAuYXR0YWNoVG9PcHRpb25zICYmIHN0ZXAuYXR0YWNoVG9PcHRpb25zLmludGVydmFsKSB8fCBTSEVQSEVSRF9ERUZBVUxUX0ZJTkRfSU5URVJWQUwsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lciB3aWxsIGNvbnRpbnVlIGVpdGhlciB1bnRpbCB3ZSBmaW5kIHRoZSBlbGVtZW50IG9yIHRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgaGFzIGJlZW4gcmVhY2hlZFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbChtZXJnZShfc3RvcFRpbWVyJCwgX3JldHJpZXNSZWFjaGVkJCwgZGVzdHJveWVkRXZlbnQkKSksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlkKTtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBoYXMgYmVlbiBmb3VuZCwgd2Ugc3RvcCB0aGUgdGltZXIgYW5kIHJlc29sdmUgdGhlIHByb21pc2VcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgX3N0b3BUaW1lciQubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgX3N0b3BUaW1lciQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxDYXBhYmlsaXRpZXNTZXR1cCgpO1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBfcmV0cnlBdHRlbXB0cyQubmV4dChfcmV0cnlBdHRlbXB0cyQudmFsdWUgKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBzdG9wIGZpbmQgaW50ZXJ2YWwgaWYgdXNlciBzdG9wcyB0aGUgdG91clxuICAgICAgICAgICAgZGVzdHJveWVkRXZlbnQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIF9zdG9wVGltZXIkLm5leHQoKTtcbiAgICAgICAgICAgICAgX3N0b3BUaW1lciQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgX3JldHJpZXNSZWFjaGVkJC5uZXh0KCk7XG4gICAgICAgICAgICAgIF9yZXRyaWVzUmVhY2hlZCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyByZXNvbHZlIG9ic2VydmFibGUgdW50aWwgdGhlIHRpbWVCZWZvcmVTaG93IGhhcyBwYXNzc2VkIG9yIHVzZSBkZWZhdWx0XG4gICAgICAgICAgICB0aW1lcihcbiAgICAgICAgICAgICAgKHN0ZXAuYXR0YWNoVG9PcHRpb25zICYmIHN0ZXAuYXR0YWNoVG9PcHRpb25zLnRpbWVCZWZvcmVTaG93KSB8fCBTSEVQSEVSRF9ERUZBVUxUX0ZJTkRfVElNRV9CRUZPUkVfU0hPVyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKG1lcmdlKGRlc3Ryb3llZEV2ZW50JCkpKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiBzdGVwcztcbiAgfVxuXG4gIHByaXZhdGUgX2JpbmRFdmVudChcbiAgICBldmVudE9uOiBJVG91ckV2ZW50T24sXG4gICAgZXZlbnRPbk9wdGlvbnM6IElUb3VyRXZlbnRPbk9wdGlvbnMsXG4gICAgZXZlbnQkOiBTdWJqZWN0PHZvaWQ+LFxuICAgIGRlc3Ryb3llZEV2ZW50JDogU3ViamVjdDx2b2lkPixcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0b3I6IHN0cmluZyA9IGV2ZW50T24uc2VsZWN0b3I7XG4gICAgY29uc3QgZXZlbnQ6IHN0cmluZyA9IGV2ZW50T24uZXZlbnQ7XG4gICAgLy8gd2Ugc3RhcnQgYSB0aW1lciBvZiBhdHRlbXB0cyB0byBmaW5kIGFuIGVsZW1lbnQgaW4gdGhlIGRvbVxuICAgIGNvbnN0IHRpbWVyU3ViczogU3Vic2NyaXB0aW9uID0gdGltZXIoXG4gICAgICAoZXZlbnRPbk9wdGlvbnMgJiYgZXZlbnRPbk9wdGlvbnMudGltZUJlZm9yZVNob3cpIHx8IFNIRVBIRVJEX0RFRkFVTFRfRklORF9USU1FX0JFRk9SRV9TSE9XLFxuICAgICAgKGV2ZW50T25PcHRpb25zICYmIGV2ZW50T25PcHRpb25zLmludGVydmFsKSB8fCBTSEVQSEVSRF9ERUZBVUxUX0ZJTkRfSU5URVJWQUwsXG4gICAgKVxuICAgICAgLnBpcGUodGFrZVVudGlsKGRlc3Ryb3llZEV2ZW50JCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaGFzIGJlZW4gZm91bmQsIHdlIHN0b3AgdGhlIHRpbWVyIGFuZCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgdGltZXJTdWJzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgICBpZiAoZXZlbnQgPT09IElUb3VyRXZlbnQuYWRkZWQpIHtcbiAgICAgICAgICAgIC8vIGlmIGV2ZW50IGlzIFwiQWRkZWRcIiB0cmlnZ2VyIGEgc29vbiBhcyB0aGlzIGlzIGF0dGFjaGVkLlxuICAgICAgICAgICAgZXZlbnQkLm5leHQoKTtcbiAgICAgICAgICAgIGV2ZW50JC5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBldmVudCA9PT0gSVRvdXJFdmVudC5jbGljayB8fFxuICAgICAgICAgICAgZXZlbnQgPT09IElUb3VyRXZlbnQucG9pbnRlcm92ZXIgfHxcbiAgICAgICAgICAgIGV2ZW50LmluZGV4T2YoSVRvdXJFdmVudC5rZXl1cCkgPiAtMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gd2UgdXNlIG5vcm1hbCBsaXN0ZW5lcnMgZm9yIG1vdXNlZXZlbnRzXG4gICAgICAgICAgICBjb25zdCBtYWluRXZlbnQ6IHN0cmluZyA9IGV2ZW50LnNwbGl0KCcuJylbMF07XG4gICAgICAgICAgICBjb25zdCBzdWJFdmVudDogc3RyaW5nID0gZXZlbnQuc3BsaXQoJy4nKVsxXTtcbiAgICAgICAgICAgIGZyb21FdmVudChlbGVtZW50LCBtYWluRXZlbnQpXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbChtZXJnZShldmVudCQuYXNPYnNlcnZhYmxlKCksIGRlc3Ryb3llZEV2ZW50JCkpLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gb25seSB0cmlnZ2VyIGlmIHRoZSBldmVudCBpcyBhIGtleWJvYXJkIGV2ZW50IGFuZCBwYXJ0IG9mIG91dCBsaXN0XG4gICAgICAgICAgICAgICAgICBpZiAoJGV2ZW50IGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5RXZlbnRzLmdldCgkZXZlbnQua2V5Q29kZSkgPT09IHN1YkV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQkLm5leHQoKTtcbiAgICAgICAgICAgICAgICBldmVudCQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PT0gSVRvdXJFdmVudC5yZW1vdmVkKSB7XG4gICAgICAgICAgICAvLyBhbmQgd2Ugd2lsbCB1c2UgTXV0YXRpb25PYnNlcnZlciBmb3IgRE9NIGV2ZW50c1xuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyhlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGV2ZW50JC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQkLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gc3RvcCBsaXN0ZW5pbmluZyBpZiB0b3VyIGlzIGNsb3NlZFxuICAgICAgICAgICAgZGVzdHJveWVkRXZlbnQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gb2JzZXJ2ZSBmb3IgYW55IERPTSBpbnRlcmFjdGlvbiBpbiB0aGUgZWxlbWVudFxuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './public-api';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGxhdGZvcm0vZ3VpZGVkLXRvdXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './guided-tour.module';
|
|
2
|
+
export * from './guided-tour.service';
|
|
3
|
+
export * from './guided.tour';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbGF0Zm9ybS9ndWlkZWQtdG91ci9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZ3VpZGVkLXRvdXIubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vZ3VpZGVkLXRvdXIuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2d1aWRlZC50b3VyJztcbiJdfQ==
|