@ngxs/router-plugin 3.7.4 → 3.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,552 +1,446 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { NgZone, Injectable, OnDestroy } from '@angular/core';
7
- import { NavigationCancel, NavigationError, Router, RouterStateSnapshot, RoutesRecognized, ResolveEnd, UrlSerializer, NavigationStart, NavigationEnd } from '@angular/router';
8
- import { LocationStrategy, Location } from '@angular/common';
9
- import { Action, Selector, State, StateContext, Store } from '@ngxs/store';
10
- import { isAngularInTestMode } from '@ngxs/store/internals';
11
- import { Subscription } from 'rxjs';
12
- import { first } from 'rxjs/operators';
13
- import { Navigate, RouterCancel, RouterError, RouterNavigation, RouterDataResolved } from './router.actions';
14
- import { RouterStateSerializer } from './serializer';
15
- /**
16
- * @record
17
- * @template T
18
- */
19
- export function RouterStateModel() { }
20
- if (false) {
21
- /** @type {?|undefined} */
22
- RouterStateModel.prototype.state;
23
- /** @type {?|undefined} */
24
- RouterStateModel.prototype.navigationId;
25
- /** @type {?} */
26
- RouterStateModel.prototype.trigger;
27
- }
28
- var RouterState = /** @class */ (function () {
29
- function RouterState(_store, _router, _serializer, _ngZone, _urlSerializer, _locationStrategy, _location) {
30
- this._store = _store;
31
- this._router = _router;
32
- this._serializer = _serializer;
33
- this._ngZone = _ngZone;
34
- this._urlSerializer = _urlSerializer;
35
- this._locationStrategy = _locationStrategy;
36
- this._location = _location;
37
- /**
38
- * Determines how navigation was performed by the `RouterState` itself
39
- * or outside via `new Navigate(...)`
40
- */
41
- this._trigger = 'none';
42
- /**
43
- * That's the serialized state from the `Router` class
44
- */
45
- this._routerState = null;
46
- /**
47
- * That's the value of the `RouterState` state
48
- */
49
- this._storeState = null;
50
- this._lastRoutesRecognized = (/** @type {?} */ (null));
51
- this._subscription = new Subscription();
52
- this.setUpStoreListener();
53
- this.setUpRouterEventsListener();
54
- this.checkInitialNavigationOnce();
55
- }
56
- RouterState_1 = RouterState;
57
- /**
58
- * @template T
59
- * @param {?} state
60
- * @return {?}
61
- */
62
- RouterState.state = /**
63
- * @template T
64
- * @param {?} state
65
- * @return {?}
66
- */
67
- function (state) {
68
- return state && state.state;
69
- };
70
- /**
71
- * @param {?} state
72
- * @return {?}
73
- */
74
- RouterState.url = /**
75
- * @param {?} state
76
- * @return {?}
77
- */
78
- function (state) {
79
- return state && state.state && state.state.url;
80
- };
81
- /**
82
- * @return {?}
83
- */
84
- RouterState.prototype.ngOnDestroy = /**
85
- * @return {?}
86
- */
87
- function () {
88
- this._subscription.unsubscribe();
89
- };
90
- /**
91
- * @param {?} _
92
- * @param {?} action
93
- * @return {?}
94
- */
95
- RouterState.prototype.navigate = /**
96
- * @param {?} _
97
- * @param {?} action
98
- * @return {?}
99
- */
100
- function (_, action) {
101
- var _this = this;
102
- return this._ngZone.run((/**
103
- * @return {?}
104
- */
105
- function () {
106
- return _this._router.navigate(action.path, tslib_1.__assign({ queryParams: action.queryParams }, action.extras));
107
- }));
108
- };
109
- /**
110
- * @param {?} ctx
111
- * @param {?} action
112
- * @return {?}
113
- */
114
- RouterState.prototype.angularRouterAction = /**
115
- * @param {?} ctx
116
- * @param {?} action
117
- * @return {?}
118
- */
119
- function (ctx, action) {
120
- ctx.setState(tslib_1.__assign({}, ctx.getState(), { trigger: action.trigger, state: action.routerState, navigationId: action.event.id }));
121
- };
122
- /**
123
- * @private
124
- * @return {?}
125
- */
126
- RouterState.prototype.setUpStoreListener = /**
127
- * @private
128
- * @return {?}
129
- */
130
- function () {
131
- var _this = this;
132
- /** @type {?} */
133
- var subscription = this._store
134
- .select(RouterState_1)
135
- .subscribe((/**
136
- * @param {?} state
137
- * @return {?}
138
- */
139
- function (state) {
140
- _this.navigateIfNeeded(state);
141
- }));
142
- this._subscription.add(subscription);
143
- };
144
- /**
145
- * @private
146
- * @return {?}
147
- */
148
- RouterState.prototype.setUpRouterEventsListener = /**
149
- * @private
150
- * @return {?}
151
- */
152
- function () {
153
- var _this = this;
154
- /** @type {?} */
155
- var subscription = this._router.events.subscribe((/**
156
- * @param {?} event
157
- * @return {?}
158
- */
159
- function (event) {
160
- if (event instanceof NavigationStart) {
161
- _this.navigationStart();
162
- }
163
- else if (event instanceof RoutesRecognized) {
164
- _this._lastRoutesRecognized = event;
165
- }
166
- else if (event instanceof ResolveEnd) {
167
- _this.dispatchRouterDataResolved(event);
168
- }
169
- else if (event instanceof NavigationCancel) {
170
- _this.dispatchRouterCancel(event);
171
- _this.reset();
172
- }
173
- else if (event instanceof NavigationError) {
174
- _this.dispatchRouterError(event);
175
- _this.reset();
176
- }
177
- else if (event instanceof NavigationEnd) {
178
- _this.navigationEnd();
179
- _this.reset();
180
- }
181
- }));
182
- this._subscription.add(subscription);
183
- };
184
- /**
185
- * @private
186
- * @return {?}
187
- */
188
- RouterState.prototype.navigationStart = /**
189
- * @private
190
- * @return {?}
191
- */
192
- function () {
193
- this._routerState = this._serializer.serialize(this._router.routerState.snapshot);
194
- if (this._trigger !== 'none') {
195
- this._storeState = this._store.selectSnapshot(RouterState_1);
196
- }
197
- };
198
- /**
199
- * @private
200
- * @return {?}
201
- */
202
- RouterState.prototype.navigationEnd = /**
203
- * @private
204
- * @return {?}
205
- */
206
- function () {
207
- if (this.shouldDispatchRouterNavigation()) {
208
- this.dispatchRouterNavigation();
209
- }
210
- };
211
- /**
212
- * @private
213
- * @return {?}
214
- */
215
- RouterState.prototype.shouldDispatchRouterNavigation = /**
216
- * @private
217
- * @return {?}
218
- */
219
- function () {
220
- if (!this._storeState)
221
- return true;
222
- return this._trigger !== 'store';
223
- };
224
- /**
225
- * @private
226
- * @param {?} state
227
- * @return {?}
228
- */
229
- RouterState.prototype.navigateIfNeeded = /**
230
- * @private
231
- * @param {?} state
232
- * @return {?}
233
- */
234
- function (state) {
235
- var _this = this;
236
- /** @type {?} */
237
- var canSkipNavigation = !this._storeState ||
238
- !this._storeState.state ||
239
- !state ||
240
- state.trigger === 'router' ||
241
- this._router.url === this._storeState.state.url;
242
- if (canSkipNavigation) {
243
- return;
244
- }
245
- this._trigger = 'store';
246
- this._ngZone.run((/**
247
- * @return {?}
248
- */
249
- function () {
250
- _this._router.navigateByUrl((/** @type {?} */ ((/** @type {?} */ (_this._storeState)).state)).url);
251
- }));
252
- };
253
- /**
254
- * @private
255
- * @return {?}
256
- */
257
- RouterState.prototype.dispatchRouterNavigation = /**
258
- * @private
259
- * @return {?}
260
- */
261
- function () {
262
- /** @type {?} */
263
- var nextRouterState = this._serializer.serialize(this._lastRoutesRecognized.state);
264
- this.dispatchRouterAction(new RouterNavigation(nextRouterState, new RoutesRecognized(this._lastRoutesRecognized.id, this._lastRoutesRecognized.url, this._lastRoutesRecognized.urlAfterRedirects, nextRouterState), this._trigger));
265
- };
266
- /**
267
- * @private
268
- * @param {?} event
269
- * @return {?}
270
- */
271
- RouterState.prototype.dispatchRouterCancel = /**
272
- * @private
273
- * @param {?} event
274
- * @return {?}
275
- */
276
- function (event) {
277
- this.dispatchRouterAction(new RouterCancel((/** @type {?} */ (this._routerState)), this._storeState, event, this._trigger));
278
- };
279
- /**
280
- * @private
281
- * @param {?} event
282
- * @return {?}
283
- */
284
- RouterState.prototype.dispatchRouterError = /**
285
- * @private
286
- * @param {?} event
287
- * @return {?}
288
- */
289
- function (event) {
290
- this.dispatchRouterAction(new RouterError((/** @type {?} */ (this._routerState)), this._storeState, new NavigationError(event.id, event.url, "" + event), this._trigger));
291
- };
292
- /**
293
- * @private
294
- * @template T
295
- * @param {?} action
296
- * @return {?}
297
- */
298
- RouterState.prototype.dispatchRouterAction = /**
299
- * @private
300
- * @template T
301
- * @param {?} action
302
- * @return {?}
303
- */
304
- function (action) {
305
- this._trigger = 'router';
306
- try {
307
- this._store.dispatch(action);
308
- }
309
- finally {
310
- this._trigger = 'none';
311
- }
312
- };
313
- /**
314
- * @private
315
- * @param {?} event
316
- * @return {?}
317
- */
318
- RouterState.prototype.dispatchRouterDataResolved = /**
319
- * @private
320
- * @param {?} event
321
- * @return {?}
322
- */
323
- function (event) {
324
- /** @type {?} */
325
- var routerState = this._serializer.serialize(event.state);
326
- this.dispatchRouterAction(new RouterDataResolved(routerState, event, this._trigger));
327
- };
328
- /**
329
- * @private
330
- * @return {?}
331
- */
332
- RouterState.prototype.reset = /**
333
- * @private
334
- * @return {?}
335
- */
336
- function () {
337
- this._trigger = 'none';
338
- this._storeState = null;
339
- this._routerState = null;
340
- };
341
- /**
342
- * No sense to mess up the `setUpRouterEventsListener` method as we have
343
- * to perform this check only once and unsubscribe after the first event
344
- * is triggered
345
- */
346
- /**
347
- * No sense to mess up the `setUpRouterEventsListener` method as we have
348
- * to perform this check only once and unsubscribe after the first event
349
- * is triggered
350
- * @private
351
- * @return {?}
352
- */
353
- RouterState.prototype.checkInitialNavigationOnce = /**
354
- * No sense to mess up the `setUpRouterEventsListener` method as we have
355
- * to perform this check only once and unsubscribe after the first event
356
- * is triggered
357
- * @private
358
- * @return {?}
359
- */
360
- function () {
361
- var _this = this;
362
- // Caretaker note: we have still left the `typeof` condition in order to avoid
363
- // creating a breaking change for projects that still use the View Engine.
364
- if ((typeof ngDevMode === 'undefined' || ngDevMode) &&
365
- // Angular is running tests in development mode thus we can be sure that this method will be
366
- // skipped in tests.
367
- isAngularInTestMode()) {
368
- return;
369
- }
370
- /** @type {?} */
371
- var subscription = this._router.events
372
- .pipe(first((/**
373
- * @param {?} event
374
- * @return {?}
375
- */
376
- function (event) { return event instanceof RoutesRecognized; })))
377
- .subscribe((/**
378
- * @param {?} __0
379
- * @return {?}
380
- */
381
- function (_a) {
382
- // `location.pathname` always equals manually entered URL in the address bar
383
- // e.g. `location.pathname === '/foo'`, but the `router` state has been initialized
384
- // with another URL (e.g. used in combination with `NgxsStoragePlugin`), thus the
385
- // `RouterNavigation` action will be dispatched and the user will be redirected to the
386
- // previously saved URL. We want to prevent such behavior, so we perform this check
387
- var url = _a.url;
388
- // `location.pathname` always equals manually entered URL in the address bar
389
- // e.g. `location.pathname === '/foo'`, but the `router` state has been initialized
390
- // with another URL (e.g. used in combination with `NgxsStoragePlugin`), thus the
391
- // `RouterNavigation` action will be dispatched and the user will be redirected to the
392
- // previously saved URL. We want to prevent such behavior, so we perform this check
393
- // `url` is a recognized URL by the Angular's router, while `currentUrl` is an actual URL
394
- // entered in the browser's address bar
395
- // `PathLocationStrategy.prototype.path()` returns a concatenation of
396
- // `PlatformLocation.pathname` and normalized `PlatformLocation.search`.
397
- // `Location.prototype.normalize` strips base href from the URL,
398
- // if `baseHref` (declared in angular.json) for example is `/en`
399
- // and the URL is `/test#anchor` - then `_locationStrategy.path(true)` will return `/en/test#anchor`,
400
- // but `/en/test#anchor` is not known to the Angular's router, so we have to strip `/en`
401
- // from the URL
402
- /** @type {?} */
403
- var currentUrl = _this._location.normalize(_this._locationStrategy.path(true));
404
- /** @type {?} */
405
- var currentUrlTree = _this._urlSerializer.parse(currentUrl);
406
- // We need to serialize the URL because in that example `/test/?redirect=https://google.com/`
407
- // Angular will recognize it as `/test?redirect=https:%2F%2Fwww.google.com%2F`
408
- // so we have to run the `currentUrl` via the `UrlSerializer` that will encode characters
409
- /** @type {?} */
410
- var currentSerializedUrl = _this._urlSerializer.serialize(currentUrlTree);
411
- // If URLs differ from each other - we've got to perform a redirect to the manually entered URL
412
- // in the address bar, as it must have a priority
413
- if (currentSerializedUrl !== url) {
414
- _this._router.navigateByUrl(currentUrl);
415
- }
416
- }));
417
- this._subscription.add(subscription);
418
- };
419
- var RouterState_1;
420
- RouterState.ctorParameters = function () { return [
421
- { type: Store },
422
- { type: Router },
423
- { type: RouterStateSerializer },
424
- { type: NgZone },
425
- { type: UrlSerializer },
426
- { type: LocationStrategy },
427
- { type: Location }
428
- ]; };
429
- RouterState.decorators = [
430
- { type: Injectable }
431
- ];
432
- /** @nocollapse */
433
- RouterState.ctorParameters = function () { return [
434
- { type: Store },
435
- { type: Router },
436
- { type: RouterStateSerializer },
437
- { type: NgZone },
438
- { type: UrlSerializer },
439
- { type: LocationStrategy },
440
- { type: Location }
441
- ]; };
442
- tslib_1.__decorate([
443
- Action(Navigate),
444
- tslib_1.__metadata("design:type", Function),
445
- tslib_1.__metadata("design:paramtypes", [Object, Navigate]),
446
- tslib_1.__metadata("design:returntype", void 0)
447
- ], RouterState.prototype, "navigate", null);
448
- tslib_1.__decorate([
449
- Action([RouterNavigation, RouterError, RouterCancel, RouterDataResolved]),
450
- tslib_1.__metadata("design:type", Function),
451
- tslib_1.__metadata("design:paramtypes", [Object, Object]),
452
- tslib_1.__metadata("design:returntype", void 0)
453
- ], RouterState.prototype, "angularRouterAction", null);
454
- tslib_1.__decorate([
455
- Selector(),
456
- tslib_1.__metadata("design:type", Function),
457
- tslib_1.__metadata("design:paramtypes", [Object]),
458
- tslib_1.__metadata("design:returntype", void 0)
459
- ], RouterState, "state", null);
460
- tslib_1.__decorate([
461
- Selector(),
462
- tslib_1.__metadata("design:type", Function),
463
- tslib_1.__metadata("design:paramtypes", [Object]),
464
- tslib_1.__metadata("design:returntype", Object)
465
- ], RouterState, "url", null);
466
- RouterState = RouterState_1 = tslib_1.__decorate([
467
- State({
468
- name: 'router',
469
- defaults: {
470
- state: undefined,
471
- navigationId: undefined,
472
- trigger: 'none'
473
- }
474
- }),
475
- tslib_1.__metadata("design:paramtypes", [Store,
476
- Router,
477
- RouterStateSerializer,
478
- NgZone,
479
- UrlSerializer,
480
- LocationStrategy,
481
- Location])
482
- ], RouterState);
483
- return RouterState;
484
- }());
485
- export { RouterState };
486
- if (false) {
487
- /**
488
- * Determines how navigation was performed by the `RouterState` itself
489
- * or outside via `new Navigate(...)`
490
- * @type {?}
491
- * @private
492
- */
493
- RouterState.prototype._trigger;
494
- /**
495
- * That's the serialized state from the `Router` class
496
- * @type {?}
497
- * @private
498
- */
499
- RouterState.prototype._routerState;
500
- /**
501
- * That's the value of the `RouterState` state
502
- * @type {?}
503
- * @private
504
- */
505
- RouterState.prototype._storeState;
506
- /**
507
- * @type {?}
508
- * @private
509
- */
510
- RouterState.prototype._lastRoutesRecognized;
511
- /**
512
- * @type {?}
513
- * @private
514
- */
515
- RouterState.prototype._subscription;
516
- /**
517
- * @type {?}
518
- * @private
519
- */
520
- RouterState.prototype._store;
521
- /**
522
- * @type {?}
523
- * @private
524
- */
525
- RouterState.prototype._router;
526
- /**
527
- * @type {?}
528
- * @private
529
- */
530
- RouterState.prototype._serializer;
531
- /**
532
- * @type {?}
533
- * @private
534
- */
535
- RouterState.prototype._ngZone;
536
- /**
537
- * @type {?}
538
- * @private
539
- */
540
- RouterState.prototype._urlSerializer;
541
- /**
542
- * @type {?}
543
- * @private
544
- */
545
- RouterState.prototype._locationStrategy;
546
- /**
547
- * @type {?}
548
- * @private
549
- */
550
- RouterState.prototype._location;
551
- }
552
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLnN0YXRlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5neHMvcm91dGVyLXBsdWdpbi8iLCJzb3VyY2VzIjpbInNyYy9yb3V0ZXIuc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsTUFBTSxFQUNOLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLGFBQWEsRUFDYixlQUFlLEVBQ2YsYUFBYSxFQUNkLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXZDLE9BQU8sRUFDTCxRQUFRLEVBRVIsWUFBWSxFQUNaLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sY0FBYyxDQUFDOzs7OztBQUVyRCxzQ0FJQzs7O0lBSEMsaUNBQVU7O0lBQ1Ysd0NBQXNCOztJQUN0QixtQ0FBdUI7OztJQW1EdkIscUJBQ1UsTUFBYSxFQUNiLE9BQWUsRUFDZixXQUF1RCxFQUN2RCxPQUFlLEVBQ2YsY0FBNkIsRUFDN0IsaUJBQW1DLEVBQ25DLFNBQW1CO1FBTm5CLFdBQU0sR0FBTixNQUFNLENBQU87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QUFhO2dCQUNWLGdCQUFnQjtnQkFDeEIsUUFBUTs7O2dCQXZDOUIsVUFBVTs7OztnQkFyQ3FDLEtBQUs7Z0JBVG5ELE1BQU07Z0JBc0JDLHFCQUFxQjtnQkExQnJCLE1BQU07Z0JBUWIsYUFBYTtnQkFJTixnQkFBZ0I7Z0JBQUUsUUFBUTs7SUF5RmpDO1FBREMsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7eURBQ21DLFFBQVE7OytDQU8zRDtJQUdEO1FBREMsTUFBTSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDOzs7OzBEQVd6RTtJQWhERDtRQURDLFFBQVEsRUFBRTs7OztrQ0FHVjtJQUdEO1FBREMsUUFBUSxFQUFFOzs7O2dDQUdWO0lBN0JVLFdBQVc7UUFUdkIsS0FBSyxDQUFtQjtZQUN2QixJQUFJLEVBQUUsUUFBUTtZQUNkLFFBQVEsRUFBRTtnQkFDUixLQUFLLEVBQUUsU0FBUztnQkFDaEIsWUFBWSxFQUFFLFNBQVM7Z0JBQ3ZCLE9BQU8sRUFBRSxNQUFNO2FBQ2hCO1NBQ0YsQ0FBQztpREFrQ2tCLEtBQUs7WUFDSixNQUFNO1lBQ0YscUJBQXFCO1lBQ3pCLE1BQU07WUFDQyxhQUFhO1lBQ1YsZ0JBQWdCO1lBQ3hCLFFBQVE7T0F0Q2xCLFdBQVcsQ0F5UHZCO0lBQUQsa0JBQUM7Q0FBQSxJQUFBO1NBelBZLFdBQVc7Ozs7Ozs7O0lBS3RCLCtCQUF5Qzs7Ozs7O0lBS3pDLG1DQUF3RDs7Ozs7O0lBS3hELGtDQUFvRDs7Ozs7SUFFcEQsNENBQXdEOzs7OztJQUV4RCxvQ0FBMkM7Ozs7O0lBYXpDLDZCQUFxQjs7Ozs7SUFDckIsOEJBQXVCOzs7OztJQUN2QixrQ0FBK0Q7Ozs7O0lBQy9ELDhCQUF1Qjs7Ozs7SUFDdkIscUNBQXFDOzs7OztJQUNyQyx3Q0FBMkM7Ozs7O0lBQzNDLGdDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nWm9uZSwgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgTmF2aWdhdGlvbkNhbmNlbCxcclxuICBOYXZpZ2F0aW9uRXJyb3IsXHJcbiAgUm91dGVyLFxyXG4gIFJvdXRlclN0YXRlU25hcHNob3QsXHJcbiAgUm91dGVzUmVjb2duaXplZCxcclxuICBSZXNvbHZlRW5kLFxyXG4gIFVybFNlcmlhbGl6ZXIsXHJcbiAgTmF2aWdhdGlvblN0YXJ0LFxyXG4gIE5hdmlnYXRpb25FbmRcclxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBMb2NhdGlvblN0cmF0ZWd5LCBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEFjdGlvbiwgU2VsZWN0b3IsIFN0YXRlLCBTdGF0ZUNvbnRleHQsIFN0b3JlIH0gZnJvbSAnQG5neHMvc3RvcmUnO1xyXG5pbXBvcnQgeyBpc0FuZ3VsYXJJblRlc3RNb2RlIH0gZnJvbSAnQG5neHMvc3RvcmUvaW50ZXJuYWxzJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBOYXZpZ2F0ZSxcclxuICBSb3V0ZXJBY3Rpb24sXHJcbiAgUm91dGVyQ2FuY2VsLFxyXG4gIFJvdXRlckVycm9yLFxyXG4gIFJvdXRlck5hdmlnYXRpb24sXHJcbiAgUm91dGVyRGF0YVJlc29sdmVkXHJcbn0gZnJvbSAnLi9yb3V0ZXIuYWN0aW9ucyc7XHJcbmltcG9ydCB7IFJvdXRlclN0YXRlU2VyaWFsaXplciB9IGZyb20gJy4vc2VyaWFsaXplcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlclN0YXRlTW9kZWw8VCA9IFJvdXRlclN0YXRlU25hcHNob3Q+IHtcclxuICBzdGF0ZT86IFQ7XHJcbiAgbmF2aWdhdGlvbklkPzogbnVtYmVyO1xyXG4gIHRyaWdnZXI6IFJvdXRlclRyaWdnZXI7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJvdXRlclRyaWdnZXIgPSAnbm9uZScgfCAncm91dGVyJyB8ICdzdG9yZSc7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIFdpbGwgYmUgcHJvdmlkZWQgdGhyb3VnaCBUZXJzZXIgZ2xvYmFsIGRlZmluaXRpb25zIGJ5IEFuZ3VsYXIgQ0xJXHJcbiAqIGR1cmluZyB0aGUgcHJvZHVjdGlvbiBidWlsZC4gVGhpcyBpcyBob3cgQW5ndWxhciBkb2VzIHRyZWUtc2hha2luZyBpbnRlcm5hbGx5LlxyXG4gKi9cclxuZGVjbGFyZSBjb25zdCBuZ0Rldk1vZGU6IGJvb2xlYW47XHJcblxyXG5AU3RhdGU8Um91dGVyU3RhdGVNb2RlbD4oe1xyXG4gIG5hbWU6ICdyb3V0ZXInLFxyXG4gIGRlZmF1bHRzOiB7XHJcbiAgICBzdGF0ZTogdW5kZWZpbmVkLFxyXG4gICAgbmF2aWdhdGlvbklkOiB1bmRlZmluZWQsXHJcbiAgICB0cmlnZ2VyOiAnbm9uZSdcclxuICB9XHJcbn0pXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFJvdXRlclN0YXRlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIGhvdyBuYXZpZ2F0aW9uIHdhcyBwZXJmb3JtZWQgYnkgdGhlIGBSb3V0ZXJTdGF0ZWAgaXRzZWxmXHJcbiAgICogb3Igb3V0c2lkZSB2aWEgYG5ldyBOYXZpZ2F0ZSguLi4pYFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3RyaWdnZXI6IFJvdXRlclRyaWdnZXIgPSAnbm9uZSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoYXQncyB0aGUgc2VyaWFsaXplZCBzdGF0ZSBmcm9tIHRoZSBgUm91dGVyYCBjbGFzc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgX3JvdXRlclN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoYXQncyB0aGUgdmFsdWUgb2YgdGhlIGBSb3V0ZXJTdGF0ZWAgc3RhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF9zdG9yZVN0YXRlOiBSb3V0ZXJTdGF0ZU1vZGVsIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgX2xhc3RSb3V0ZXNSZWNvZ25pemVkOiBSb3V0ZXNSZWNvZ25pemVkID0gbnVsbCE7XHJcblxyXG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgQFNlbGVjdG9yKClcclxuICBzdGF0aWMgc3RhdGU8VCA9IFJvdXRlclN0YXRlU25hcHNob3Q+KHN0YXRlOiBSb3V0ZXJTdGF0ZU1vZGVsPFQ+KSB7XHJcbiAgICByZXR1cm4gc3RhdGUgJiYgc3RhdGUuc3RhdGU7XHJcbiAgfVxyXG5cclxuICBAU2VsZWN0b3IoKVxyXG4gIHN0YXRpYyB1cmwoc3RhdGU6IFJvdXRlclN0YXRlTW9kZWwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHN0YXRlICYmIHN0YXRlLnN0YXRlICYmIHN0YXRlLnN0YXRlLnVybDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc3RvcmU6IFN0b3JlLFxyXG4gICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIF9zZXJpYWxpemVyOiBSb3V0ZXJTdGF0ZVNlcmlhbGl6ZXI8Um91dGVyU3RhdGVTbmFwc2hvdD4sXHJcbiAgICBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSxcclxuICAgIHByaXZhdGUgX3VybFNlcmlhbGl6ZXI6IFVybFNlcmlhbGl6ZXIsXHJcbiAgICBwcml2YXRlIF9sb2NhdGlvblN0cmF0ZWd5OiBMb2NhdGlvblN0cmF0ZWd5LFxyXG4gICAgcHJpdmF0ZSBfbG9jYXRpb246IExvY2F0aW9uXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNldFVwU3RvcmVMaXN0ZW5lcigpO1xyXG4gICAgdGhpcy5zZXRVcFJvdXRlckV2ZW50c0xpc3RlbmVyKCk7XHJcbiAgICB0aGlzLmNoZWNrSW5pdGlhbE5hdmlnYXRpb25PbmNlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgQEFjdGlvbihOYXZpZ2F0ZSlcclxuICBuYXZpZ2F0ZShfOiBTdGF0ZUNvbnRleHQ8Um91dGVyU3RhdGVNb2RlbD4sIGFjdGlvbjogTmF2aWdhdGUpIHtcclxuICAgIHJldHVybiB0aGlzLl9uZ1pvbmUucnVuKCgpID0+XHJcbiAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShhY3Rpb24ucGF0aCwge1xyXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBhY3Rpb24ucXVlcnlQYXJhbXMsXHJcbiAgICAgICAgLi4uYWN0aW9uLmV4dHJhc1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIEBBY3Rpb24oW1JvdXRlck5hdmlnYXRpb24sIFJvdXRlckVycm9yLCBSb3V0ZXJDYW5jZWwsIFJvdXRlckRhdGFSZXNvbHZlZF0pXHJcbiAgYW5ndWxhclJvdXRlckFjdGlvbihcclxuICAgIGN0eDogU3RhdGVDb250ZXh0PFJvdXRlclN0YXRlTW9kZWw+LFxyXG4gICAgYWN0aW9uOiBSb3V0ZXJBY3Rpb248Um91dGVyU3RhdGVNb2RlbCwgUm91dGVyU3RhdGVTbmFwc2hvdD5cclxuICApOiB2b2lkIHtcclxuICAgIGN0eC5zZXRTdGF0ZSh7XHJcbiAgICAgIC4uLmN0eC5nZXRTdGF0ZSgpLFxyXG4gICAgICB0cmlnZ2VyOiBhY3Rpb24udHJpZ2dlcixcclxuICAgICAgc3RhdGU6IGFjdGlvbi5yb3V0ZXJTdGF0ZSxcclxuICAgICAgbmF2aWdhdGlvbklkOiBhY3Rpb24uZXZlbnQuaWRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRVcFN0b3JlTGlzdGVuZXIoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLl9zdG9yZVxyXG4gICAgICAuc2VsZWN0KFJvdXRlclN0YXRlKVxyXG4gICAgICAuc3Vic2NyaWJlKChzdGF0ZTogUm91dGVyU3RhdGVNb2RlbCB8IHVuZGVmaW5lZCkgPT4ge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGVJZk5lZWRlZChzdGF0ZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoc3Vic2NyaXB0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VXBSb3V0ZXJFdmVudHNMaXN0ZW5lcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuX3JvdXRlci5ldmVudHMuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU3RhcnQoKTtcclxuICAgICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFJvdXRlc1JlY29nbml6ZWQpIHtcclxuICAgICAgICB0aGlzLl9sYXN0Um91dGVzUmVjb2duaXplZCA9IGV2ZW50O1xyXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgUmVzb2x2ZUVuZCkge1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hSb3V0ZXJEYXRhUmVzb2x2ZWQoZXZlbnQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkNhbmNlbCkge1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hSb3V0ZXJDYW5jZWwoZXZlbnQpO1xyXG4gICAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvcikge1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hSb3V0ZXJFcnJvcihldmVudCk7XHJcbiAgICAgICAgdGhpcy5yZXNldCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkVuZCgpO1xyXG4gICAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChzdWJzY3JpcHRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uU3RhcnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yb3V0ZXJTdGF0ZSA9IHRoaXMuX3NlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuX3JvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3RyaWdnZXIgIT09ICdub25lJykge1xyXG4gICAgICB0aGlzLl9zdG9yZVN0YXRlID0gdGhpcy5fc3RvcmUuc2VsZWN0U25hcHNob3QoUm91dGVyU3RhdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uRW5kKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2hvdWxkRGlzcGF0Y2hSb3V0ZXJOYXZpZ2F0aW9uKCkpIHtcclxuICAgICAgdGhpcy5kaXNwYXRjaFJvdXRlck5hdmlnYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvdWxkRGlzcGF0Y2hSb3V0ZXJOYXZpZ2F0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLl9zdG9yZVN0YXRlKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiB0aGlzLl90cmlnZ2VyICE9PSAnc3RvcmUnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZUlmTmVlZGVkKHN0YXRlOiBSb3V0ZXJTdGF0ZU1vZGVsIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICBjb25zdCBjYW5Ta2lwTmF2aWdhdGlvbiA9XHJcbiAgICAgICF0aGlzLl9zdG9yZVN0YXRlIHx8XHJcbiAgICAgICF0aGlzLl9zdG9yZVN0YXRlLnN0YXRlIHx8XHJcbiAgICAgICFzdGF0ZSB8fFxyXG4gICAgICBzdGF0ZS50cmlnZ2VyID09PSAncm91dGVyJyB8fFxyXG4gICAgICB0aGlzLl9yb3V0ZXIudXJsID09PSB0aGlzLl9zdG9yZVN0YXRlLnN0YXRlLnVybDtcclxuXHJcbiAgICBpZiAoY2FuU2tpcE5hdmlnYXRpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3RyaWdnZXIgPSAnc3RvcmUnO1xyXG4gICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuX3N0b3JlU3RhdGUhLnN0YXRlIS51cmwpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpc3BhdGNoUm91dGVyTmF2aWdhdGlvbigpOiB2b2lkIHtcclxuICAgIGNvbnN0IG5leHRSb3V0ZXJTdGF0ZSA9IHRoaXMuX3NlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuX2xhc3RSb3V0ZXNSZWNvZ25pemVkLnN0YXRlKTtcclxuXHJcbiAgICB0aGlzLmRpc3BhdGNoUm91dGVyQWN0aW9uKFxyXG4gICAgICBuZXcgUm91dGVyTmF2aWdhdGlvbihcclxuICAgICAgICBuZXh0Um91dGVyU3RhdGUsXHJcbiAgICAgICAgbmV3IFJvdXRlc1JlY29nbml6ZWQoXHJcbiAgICAgICAgICB0aGlzLl9sYXN0Um91dGVzUmVjb2duaXplZC5pZCxcclxuICAgICAgICAgIHRoaXMuX2xhc3RSb3V0ZXNSZWNvZ25pemVkLnVybCxcclxuICAgICAgICAgIHRoaXMuX2xhc3RSb3V0ZXNSZWNvZ25pemVkLnVybEFmdGVyUmVkaXJlY3RzLFxyXG4gICAgICAgICAgbmV4dFJvdXRlclN0YXRlXHJcbiAgICAgICAgKSxcclxuICAgICAgICB0aGlzLl90cmlnZ2VyXHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRpc3BhdGNoUm91dGVyQ2FuY2VsKGV2ZW50OiBOYXZpZ2F0aW9uQ2FuY2VsKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc3BhdGNoUm91dGVyQWN0aW9uKFxyXG4gICAgICBuZXcgUm91dGVyQ2FuY2VsKHRoaXMuX3JvdXRlclN0YXRlISwgdGhpcy5fc3RvcmVTdGF0ZSwgZXZlbnQsIHRoaXMuX3RyaWdnZXIpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaXNwYXRjaFJvdXRlckVycm9yKGV2ZW50OiBOYXZpZ2F0aW9uRXJyb3IpOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzcGF0Y2hSb3V0ZXJBY3Rpb24oXHJcbiAgICAgIG5ldyBSb3V0ZXJFcnJvcihcclxuICAgICAgICB0aGlzLl9yb3V0ZXJTdGF0ZSEsXHJcbiAgICAgICAgdGhpcy5fc3RvcmVTdGF0ZSxcclxuICAgICAgICBuZXcgTmF2aWdhdGlvbkVycm9yKGV2ZW50LmlkLCBldmVudC51cmwsIGAke2V2ZW50fWApLFxyXG4gICAgICAgIHRoaXMuX3RyaWdnZXJcclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGlzcGF0Y2hSb3V0ZXJBY3Rpb248VD4oYWN0aW9uOiBSb3V0ZXJBY3Rpb248VD4pOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyaWdnZXIgPSAncm91dGVyJztcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChhY3Rpb24pO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5fdHJpZ2dlciA9ICdub25lJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGlzcGF0Y2hSb3V0ZXJEYXRhUmVzb2x2ZWQoZXZlbnQ6IFJlc29sdmVFbmQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJvdXRlclN0YXRlID0gdGhpcy5fc2VyaWFsaXplci5zZXJpYWxpemUoZXZlbnQuc3RhdGUpO1xyXG4gICAgdGhpcy5kaXNwYXRjaFJvdXRlckFjdGlvbihuZXcgUm91dGVyRGF0YVJlc29sdmVkKHJvdXRlclN0YXRlLCBldmVudCwgdGhpcy5fdHJpZ2dlcikpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RyaWdnZXIgPSAnbm9uZSc7XHJcbiAgICB0aGlzLl9zdG9yZVN0YXRlID0gbnVsbDtcclxuICAgIHRoaXMuX3JvdXRlclN0YXRlID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5vIHNlbnNlIHRvIG1lc3MgdXAgdGhlIGBzZXRVcFJvdXRlckV2ZW50c0xpc3RlbmVyYCBtZXRob2QgYXMgd2UgaGF2ZVxyXG4gICAqIHRvIHBlcmZvcm0gdGhpcyBjaGVjayBvbmx5IG9uY2UgYW5kIHVuc3Vic2NyaWJlIGFmdGVyIHRoZSBmaXJzdCBldmVudFxyXG4gICAqIGlzIHRyaWdnZXJlZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2hlY2tJbml0aWFsTmF2aWdhdGlvbk9uY2UoKTogdm9pZCB7XHJcbiAgICAvLyBDYXJldGFrZXIgbm90ZTogd2UgaGF2ZSBzdGlsbCBsZWZ0IHRoZSBgdHlwZW9mYCBjb25kaXRpb24gaW4gb3JkZXIgdG8gYXZvaWRcclxuICAgIC8vIGNyZWF0aW5nIGEgYnJlYWtpbmcgY2hhbmdlIGZvciBwcm9qZWN0cyB0aGF0IHN0aWxsIHVzZSB0aGUgVmlldyBFbmdpbmUuXHJcbiAgICBpZiAoXHJcbiAgICAgICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpICYmXHJcbiAgICAgIC8vIEFuZ3VsYXIgaXMgcnVubmluZyB0ZXN0cyBpbiBkZXZlbG9wbWVudCBtb2RlIHRodXMgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGlzIG1ldGhvZCB3aWxsIGJlXHJcbiAgICAgIC8vIHNraXBwZWQgaW4gdGVzdHMuXHJcbiAgICAgIGlzQW5ndWxhckluVGVzdE1vZGUoKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLl9yb3V0ZXIuZXZlbnRzXHJcbiAgICAgIC5waXBlKGZpcnN0KChldmVudCk6IGV2ZW50IGlzIFJvdXRlc1JlY29nbml6ZWQgPT4gZXZlbnQgaW5zdGFuY2VvZiBSb3V0ZXNSZWNvZ25pemVkKSlcclxuICAgICAgLnN1YnNjcmliZSgoeyB1cmwgfSkgPT4ge1xyXG4gICAgICAgIC8vIGBsb2NhdGlvbi5wYXRobmFtZWAgYWx3YXlzIGVxdWFscyBtYW51YWxseSBlbnRlcmVkIFVSTCBpbiB0aGUgYWRkcmVzcyBiYXJcclxuICAgICAgICAvLyBlLmcuIGBsb2NhdGlvbi5wYXRobmFtZSA9PT0gJy9mb28nYCwgYnV0IHRoZSBgcm91dGVyYCBzdGF0ZSBoYXMgYmVlbiBpbml0aWFsaXplZFxyXG4gICAgICAgIC8vIHdpdGggYW5vdGhlciBVUkwgKGUuZy4gdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGBOZ3hzU3RvcmFnZVBsdWdpbmApLCB0aHVzIHRoZVxyXG4gICAgICAgIC8vIGBSb3V0ZXJOYXZpZ2F0aW9uYCBhY3Rpb24gd2lsbCBiZSBkaXNwYXRjaGVkIGFuZCB0aGUgdXNlciB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gdGhlXHJcbiAgICAgICAgLy8gcHJldmlvdXNseSBzYXZlZCBVUkwuIFdlIHdhbnQgdG8gcHJldmVudCBzdWNoIGJlaGF2aW9yLCBzbyB3ZSBwZXJmb3JtIHRoaXMgY2hlY2tcclxuXHJcbiAgICAgICAgLy8gYHVybGAgaXMgYSByZWNvZ25pemVkIFVSTCBieSB0aGUgQW5ndWxhcidzIHJvdXRlciwgd2hpbGUgYGN1cnJlbnRVcmxgIGlzIGFuIGFjdHVhbCBVUkxcclxuICAgICAgICAvLyBlbnRlcmVkIGluIHRoZSBicm93c2VyJ3MgYWRkcmVzcyBiYXJcclxuICAgICAgICAvLyBgUGF0aExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLnBhdGgoKWAgcmV0dXJucyBhIGNvbmNhdGVuYXRpb24gb2ZcclxuICAgICAgICAvLyBgUGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZWAgYW5kIG5vcm1hbGl6ZWQgYFBsYXRmb3JtTG9jYXRpb24uc2VhcmNoYC5cclxuXHJcbiAgICAgICAgLy8gYExvY2F0aW9uLnByb3RvdHlwZS5ub3JtYWxpemVgIHN0cmlwcyBiYXNlIGhyZWYgZnJvbSB0aGUgVVJMLFxyXG4gICAgICAgIC8vIGlmIGBiYXNlSHJlZmAgKGRlY2xhcmVkIGluIGFuZ3VsYXIuanNvbikgZm9yIGV4YW1wbGUgaXMgYC9lbmBcclxuICAgICAgICAvLyBhbmQgdGhlIFVSTCBpcyBgL3Rlc3QjYW5jaG9yYCAtIHRoZW4gYF9sb2NhdGlvblN0cmF0ZWd5LnBhdGgodHJ1ZSlgIHdpbGwgcmV0dXJuIGAvZW4vdGVzdCNhbmNob3JgLFxyXG4gICAgICAgIC8vIGJ1dCBgL2VuL3Rlc3QjYW5jaG9yYCBpcyBub3Qga25vd24gdG8gdGhlIEFuZ3VsYXIncyByb3V0ZXIsIHNvIHdlIGhhdmUgdG8gc3RyaXAgYC9lbmBcclxuICAgICAgICAvLyBmcm9tIHRoZSBVUkxcclxuICAgICAgICBjb25zdCBjdXJyZW50VXJsID0gdGhpcy5fbG9jYXRpb24ubm9ybWFsaXplKHRoaXMuX2xvY2F0aW9uU3RyYXRlZ3kucGF0aCh0cnVlKSk7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFVybFRyZWUgPSB0aGlzLl91cmxTZXJpYWxpemVyLnBhcnNlKGN1cnJlbnRVcmwpO1xyXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gc2VyaWFsaXplIHRoZSBVUkwgYmVjYXVzZSBpbiB0aGF0IGV4YW1wbGUgYC90ZXN0Lz9yZWRpcmVjdD1odHRwczovL2dvb2dsZS5jb20vYFxyXG4gICAgICAgIC8vIEFuZ3VsYXIgd2lsbCByZWNvZ25pemUgaXQgYXMgYC90ZXN0P3JlZGlyZWN0PWh0dHBzOiUyRiUyRnd3dy5nb29nbGUuY29tJTJGYFxyXG4gICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gcnVuIHRoZSBgY3VycmVudFVybGAgdmlhIHRoZSBgVXJsU2VyaWFsaXplcmAgdGhhdCB3aWxsIGVuY29kZSBjaGFyYWN0ZXJzXHJcbiAgICAgICAgY29uc3QgY3VycmVudFNlcmlhbGl6ZWRVcmwgPSB0aGlzLl91cmxTZXJpYWxpemVyLnNlcmlhbGl6ZShjdXJyZW50VXJsVHJlZSk7XHJcblxyXG4gICAgICAgIC8vIElmIFVSTHMgZGlmZmVyIGZyb20gZWFjaCBvdGhlciAtIHdlJ3ZlIGdvdCB0byBwZXJmb3JtIGEgcmVkaXJlY3QgdG8gdGhlIG1hbnVhbGx5IGVudGVyZWQgVVJMXHJcbiAgICAgICAgLy8gaW4gdGhlIGFkZHJlc3MgYmFyLCBhcyBpdCBtdXN0IGhhdmUgYSBwcmlvcml0eVxyXG4gICAgICAgIGlmIChjdXJyZW50U2VyaWFsaXplZFVybCAhPT0gdXJsKSB7XHJcbiAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGVCeVVybChjdXJyZW50VXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoc3Vic2NyaXB0aW9uKTtcclxuICB9XHJcbn1cclxuIl19
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import * as tslib_1 from "tslib";
6
+ import { NgZone, Injectable, OnDestroy } from '@angular/core';
7
+ import { NavigationCancel, NavigationError, Router, RouterStateSnapshot, RoutesRecognized, ResolveEnd, NavigationStart, NavigationEnd } from '@angular/router';
8
+ import { Action, Selector, State, StateContext, Store } from '@ngxs/store';
9
+ import { Subscription } from 'rxjs';
10
+ import { Navigate, RouterCancel, RouterError, RouterNavigation, RouterDataResolved } from './router.actions';
11
+ import { RouterStateSerializer } from './serializer';
12
+ /**
13
+ * @record
14
+ * @template T
15
+ */
16
+ export function RouterStateModel() { }
17
+ if (false) {
18
+ /** @type {?|undefined} */
19
+ RouterStateModel.prototype.state;
20
+ /** @type {?|undefined} */
21
+ RouterStateModel.prototype.navigationId;
22
+ /** @type {?} */
23
+ RouterStateModel.prototype.trigger;
24
+ }
25
+ var RouterState = /** @class */ (function () {
26
+ function RouterState(_store, _router, _serializer, _ngZone) {
27
+ this._store = _store;
28
+ this._router = _router;
29
+ this._serializer = _serializer;
30
+ this._ngZone = _ngZone;
31
+ /**
32
+ * Determines how navigation was performed by the `RouterState` itself
33
+ * or outside via `new Navigate(...)`
34
+ */
35
+ this._trigger = 'none';
36
+ /**
37
+ * That's the serialized state from the `Router` class
38
+ */
39
+ this._routerState = null;
40
+ /**
41
+ * That's the value of the `RouterState` state
42
+ */
43
+ this._storeState = null;
44
+ this._lastRoutesRecognized = (/** @type {?} */ (null));
45
+ this._subscription = new Subscription();
46
+ this.setUpStoreListener();
47
+ this.setUpRouterEventsListener();
48
+ }
49
+ RouterState_1 = RouterState;
50
+ /**
51
+ * @template T
52
+ * @param {?} state
53
+ * @return {?}
54
+ */
55
+ RouterState.state = /**
56
+ * @template T
57
+ * @param {?} state
58
+ * @return {?}
59
+ */
60
+ function (state) {
61
+ return state && state.state;
62
+ };
63
+ /**
64
+ * @param {?} state
65
+ * @return {?}
66
+ */
67
+ RouterState.url = /**
68
+ * @param {?} state
69
+ * @return {?}
70
+ */
71
+ function (state) {
72
+ return state && state.state && state.state.url;
73
+ };
74
+ /**
75
+ * @return {?}
76
+ */
77
+ RouterState.prototype.ngOnDestroy = /**
78
+ * @return {?}
79
+ */
80
+ function () {
81
+ this._subscription.unsubscribe();
82
+ };
83
+ /**
84
+ * @param {?} _
85
+ * @param {?} action
86
+ * @return {?}
87
+ */
88
+ RouterState.prototype.navigate = /**
89
+ * @param {?} _
90
+ * @param {?} action
91
+ * @return {?}
92
+ */
93
+ function (_, action) {
94
+ var _this = this;
95
+ return this._ngZone.run((/**
96
+ * @return {?}
97
+ */
98
+ function () {
99
+ return _this._router.navigate(action.path, tslib_1.__assign({ queryParams: action.queryParams }, action.extras));
100
+ }));
101
+ };
102
+ /**
103
+ * @param {?} ctx
104
+ * @param {?} action
105
+ * @return {?}
106
+ */
107
+ RouterState.prototype.angularRouterAction = /**
108
+ * @param {?} ctx
109
+ * @param {?} action
110
+ * @return {?}
111
+ */
112
+ function (ctx, action) {
113
+ ctx.setState(tslib_1.__assign({}, ctx.getState(), { trigger: action.trigger, state: action.routerState, navigationId: action.event.id }));
114
+ };
115
+ /**
116
+ * @private
117
+ * @return {?}
118
+ */
119
+ RouterState.prototype.setUpStoreListener = /**
120
+ * @private
121
+ * @return {?}
122
+ */
123
+ function () {
124
+ var _this = this;
125
+ /** @type {?} */
126
+ var subscription = this._store
127
+ .select(RouterState_1)
128
+ .subscribe((/**
129
+ * @param {?} state
130
+ * @return {?}
131
+ */
132
+ function (state) {
133
+ _this.navigateIfNeeded(state);
134
+ }));
135
+ this._subscription.add(subscription);
136
+ };
137
+ /**
138
+ * @private
139
+ * @return {?}
140
+ */
141
+ RouterState.prototype.setUpRouterEventsListener = /**
142
+ * @private
143
+ * @return {?}
144
+ */
145
+ function () {
146
+ var _this = this;
147
+ /** @type {?} */
148
+ var subscription = this._router.events.subscribe((/**
149
+ * @param {?} event
150
+ * @return {?}
151
+ */
152
+ function (event) {
153
+ if (event instanceof NavigationStart) {
154
+ _this.navigationStart();
155
+ }
156
+ else if (event instanceof RoutesRecognized) {
157
+ _this._lastRoutesRecognized = event;
158
+ }
159
+ else if (event instanceof ResolveEnd) {
160
+ _this.dispatchRouterDataResolved(event);
161
+ }
162
+ else if (event instanceof NavigationCancel) {
163
+ _this.dispatchRouterCancel(event);
164
+ _this.reset();
165
+ }
166
+ else if (event instanceof NavigationError) {
167
+ _this.dispatchRouterError(event);
168
+ _this.reset();
169
+ }
170
+ else if (event instanceof NavigationEnd) {
171
+ _this.navigationEnd();
172
+ _this.reset();
173
+ }
174
+ }));
175
+ this._subscription.add(subscription);
176
+ };
177
+ /**
178
+ * @private
179
+ * @return {?}
180
+ */
181
+ RouterState.prototype.navigationStart = /**
182
+ * @private
183
+ * @return {?}
184
+ */
185
+ function () {
186
+ this._routerState = this._serializer.serialize(this._router.routerState.snapshot);
187
+ if (this._trigger !== 'none') {
188
+ this._storeState = this._store.selectSnapshot(RouterState_1);
189
+ }
190
+ };
191
+ /**
192
+ * @private
193
+ * @return {?}
194
+ */
195
+ RouterState.prototype.navigationEnd = /**
196
+ * @private
197
+ * @return {?}
198
+ */
199
+ function () {
200
+ if (this.shouldDispatchRouterNavigation()) {
201
+ this.dispatchRouterNavigation();
202
+ }
203
+ };
204
+ /**
205
+ * @private
206
+ * @return {?}
207
+ */
208
+ RouterState.prototype.shouldDispatchRouterNavigation = /**
209
+ * @private
210
+ * @return {?}
211
+ */
212
+ function () {
213
+ if (!this._storeState)
214
+ return true;
215
+ return this._trigger !== 'store';
216
+ };
217
+ /**
218
+ * @private
219
+ * @param {?} state
220
+ * @return {?}
221
+ */
222
+ RouterState.prototype.navigateIfNeeded = /**
223
+ * @private
224
+ * @param {?} state
225
+ * @return {?}
226
+ */
227
+ function (state) {
228
+ var _this = this;
229
+ if (state && state.trigger === 'devtools') {
230
+ this._storeState = this._store.selectSnapshot(RouterState_1);
231
+ }
232
+ /** @type {?} */
233
+ var canSkipNavigation = !this._storeState ||
234
+ !this._storeState.state ||
235
+ !state ||
236
+ state.trigger === 'router' ||
237
+ this._router.url === this._storeState.state.url;
238
+ if (canSkipNavigation) {
239
+ return;
240
+ }
241
+ this._trigger = 'store';
242
+ this._ngZone.run((/**
243
+ * @return {?}
244
+ */
245
+ function () {
246
+ _this._router.navigateByUrl((/** @type {?} */ ((/** @type {?} */ (_this._storeState)).state)).url);
247
+ }));
248
+ };
249
+ /**
250
+ * @private
251
+ * @return {?}
252
+ */
253
+ RouterState.prototype.dispatchRouterNavigation = /**
254
+ * @private
255
+ * @return {?}
256
+ */
257
+ function () {
258
+ /** @type {?} */
259
+ var nextRouterState = this._serializer.serialize(this._lastRoutesRecognized.state);
260
+ this.dispatchRouterAction(new RouterNavigation(nextRouterState, new RoutesRecognized(this._lastRoutesRecognized.id, this._lastRoutesRecognized.url, this._lastRoutesRecognized.urlAfterRedirects, nextRouterState), this._trigger));
261
+ };
262
+ /**
263
+ * @private
264
+ * @param {?} event
265
+ * @return {?}
266
+ */
267
+ RouterState.prototype.dispatchRouterCancel = /**
268
+ * @private
269
+ * @param {?} event
270
+ * @return {?}
271
+ */
272
+ function (event) {
273
+ this.dispatchRouterAction(new RouterCancel((/** @type {?} */ (this._routerState)), this._storeState, event, this._trigger));
274
+ };
275
+ /**
276
+ * @private
277
+ * @param {?} event
278
+ * @return {?}
279
+ */
280
+ RouterState.prototype.dispatchRouterError = /**
281
+ * @private
282
+ * @param {?} event
283
+ * @return {?}
284
+ */
285
+ function (event) {
286
+ this.dispatchRouterAction(new RouterError((/** @type {?} */ (this._routerState)), this._storeState, new NavigationError(event.id, event.url, "" + event), this._trigger));
287
+ };
288
+ /**
289
+ * @private
290
+ * @template T
291
+ * @param {?} action
292
+ * @return {?}
293
+ */
294
+ RouterState.prototype.dispatchRouterAction = /**
295
+ * @private
296
+ * @template T
297
+ * @param {?} action
298
+ * @return {?}
299
+ */
300
+ function (action) {
301
+ this._trigger = 'router';
302
+ try {
303
+ this._store.dispatch(action);
304
+ }
305
+ finally {
306
+ this._trigger = 'none';
307
+ }
308
+ };
309
+ /**
310
+ * @private
311
+ * @param {?} event
312
+ * @return {?}
313
+ */
314
+ RouterState.prototype.dispatchRouterDataResolved = /**
315
+ * @private
316
+ * @param {?} event
317
+ * @return {?}
318
+ */
319
+ function (event) {
320
+ /** @type {?} */
321
+ var routerState = this._serializer.serialize(event.state);
322
+ this.dispatchRouterAction(new RouterDataResolved(routerState, event, this._trigger));
323
+ };
324
+ /**
325
+ * @private
326
+ * @return {?}
327
+ */
328
+ RouterState.prototype.reset = /**
329
+ * @private
330
+ * @return {?}
331
+ */
332
+ function () {
333
+ this._trigger = 'none';
334
+ this._storeState = null;
335
+ this._routerState = null;
336
+ };
337
+ var RouterState_1;
338
+ RouterState.ctorParameters = function () { return [
339
+ { type: Store },
340
+ { type: Router },
341
+ { type: RouterStateSerializer },
342
+ { type: NgZone }
343
+ ]; };
344
+ RouterState.decorators = [
345
+ { type: Injectable }
346
+ ];
347
+ /** @nocollapse */
348
+ RouterState.ctorParameters = function () { return [
349
+ { type: Store },
350
+ { type: Router },
351
+ { type: RouterStateSerializer },
352
+ { type: NgZone }
353
+ ]; };
354
+ tslib_1.__decorate([
355
+ Action(Navigate),
356
+ tslib_1.__metadata("design:type", Function),
357
+ tslib_1.__metadata("design:paramtypes", [Object, Navigate]),
358
+ tslib_1.__metadata("design:returntype", void 0)
359
+ ], RouterState.prototype, "navigate", null);
360
+ tslib_1.__decorate([
361
+ Action([RouterNavigation, RouterError, RouterCancel, RouterDataResolved]),
362
+ tslib_1.__metadata("design:type", Function),
363
+ tslib_1.__metadata("design:paramtypes", [Object, Object]),
364
+ tslib_1.__metadata("design:returntype", void 0)
365
+ ], RouterState.prototype, "angularRouterAction", null);
366
+ tslib_1.__decorate([
367
+ Selector(),
368
+ tslib_1.__metadata("design:type", Function),
369
+ tslib_1.__metadata("design:paramtypes", [Object]),
370
+ tslib_1.__metadata("design:returntype", void 0)
371
+ ], RouterState, "state", null);
372
+ tslib_1.__decorate([
373
+ Selector(),
374
+ tslib_1.__metadata("design:type", Function),
375
+ tslib_1.__metadata("design:paramtypes", [Object]),
376
+ tslib_1.__metadata("design:returntype", Object)
377
+ ], RouterState, "url", null);
378
+ RouterState = RouterState_1 = tslib_1.__decorate([
379
+ State({
380
+ name: 'router',
381
+ defaults: {
382
+ state: undefined,
383
+ navigationId: undefined,
384
+ trigger: 'none'
385
+ }
386
+ }),
387
+ tslib_1.__metadata("design:paramtypes", [Store,
388
+ Router,
389
+ RouterStateSerializer,
390
+ NgZone])
391
+ ], RouterState);
392
+ return RouterState;
393
+ }());
394
+ export { RouterState };
395
+ if (false) {
396
+ /**
397
+ * Determines how navigation was performed by the `RouterState` itself
398
+ * or outside via `new Navigate(...)`
399
+ * @type {?}
400
+ * @private
401
+ */
402
+ RouterState.prototype._trigger;
403
+ /**
404
+ * That's the serialized state from the `Router` class
405
+ * @type {?}
406
+ * @private
407
+ */
408
+ RouterState.prototype._routerState;
409
+ /**
410
+ * That's the value of the `RouterState` state
411
+ * @type {?}
412
+ * @private
413
+ */
414
+ RouterState.prototype._storeState;
415
+ /**
416
+ * @type {?}
417
+ * @private
418
+ */
419
+ RouterState.prototype._lastRoutesRecognized;
420
+ /**
421
+ * @type {?}
422
+ * @private
423
+ */
424
+ RouterState.prototype._subscription;
425
+ /**
426
+ * @type {?}
427
+ * @private
428
+ */
429
+ RouterState.prototype._store;
430
+ /**
431
+ * @type {?}
432
+ * @private
433
+ */
434
+ RouterState.prototype._router;
435
+ /**
436
+ * @type {?}
437
+ * @private
438
+ */
439
+ RouterState.prototype._serializer;
440
+ /**
441
+ * @type {?}
442
+ * @private
443
+ */
444
+ RouterState.prototype._ngZone;
445
+ }
446
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLnN0YXRlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5neHMvcm91dGVyLXBsdWdpbi8iLCJzb3VyY2VzIjpbInNyYy9yb3V0ZXIuc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsTUFBTSxFQUNOLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLGVBQWUsRUFDZixhQUFhLEVBQ2QsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFDTCxRQUFRLEVBRVIsWUFBWSxFQUNaLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sY0FBYyxDQUFDOzs7OztBQUVyRCxzQ0FJQzs7O0lBSEMsaUNBQVU7O0lBQ1Ysd0NBQXNCOztJQUN0QixtQ0FBdUI7OztJQWtEdkIscUJBQ1UsTUFBYSxFQUNiLE9BQWUsRUFDZixXQUF1RCxFQUN2RCxPQUFlO1FBSGYsV0FBTSxHQUFOLE1BQU0sQ0FBTztRQUNiLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixnQkFBVyxHQUFYLFdBQVcsQ0FBNEM7UUFDdkQsWUFBTyxHQUFQLE9BQU8sQ0FBUTs7Ozs7UUE5QmpCLGFBQVEsR0FBa0IsTUFBTSxDQUFDOzs7O1FBS2pDLGlCQUFZLEdBQStCLElBQUksQ0FBQzs7OztRQUtoRCxnQkFBVyxHQUE0QixJQUFJLENBQUM7UUFFNUMsMEJBQXFCLEdBQXFC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QUFDLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7OzswREFXekU7SUE1Q0Q7UUFEQyxRQUFRLEVBQUU7Ozs7a0NBR1Y7SUFHRDtRQURDLFFBQVEsRUFBRTs7OztnQ0FHVjtJQTdCVSxXQUFXO1FBVHZCLEtBQUssQ0FBbUI7WUFDdkIsSUFBSSxFQUFFLFFBQVE7WUFDZCxRQUFRLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLFlBQVksRUFBRSxTQUFTO2dCQUN2QixPQUFPLEVBQUUsTUFBTTthQUNoQjtTQUNGLENBQUM7aURBa0NrQixLQUFLO1lBQ0osTUFBTTtZQUNGLHFCQUFxQjtZQUN6QixNQUFNO09BbkNkLFdBQVcsQ0FvTXZCO0lBQUQsa0JBQUM7Q0FBQSxJQUFBO1NBcE1ZLFdBQVc7Ozs7Ozs7O0lBS3RCLCtCQUF5Qzs7Ozs7O0lBS3pDLG1DQUF3RDs7Ozs7O0lBS3hELGtDQUFvRDs7Ozs7SUFFcEQsNENBQXdEOzs7OztJQUV4RCxvQ0FBMkM7Ozs7O0lBYXpDLDZCQUFxQjs7Ozs7SUFDckIsOEJBQXVCOzs7OztJQUN2QixrQ0FBK0Q7Ozs7O0lBQy9ELDhCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nWm9uZSwgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBOYXZpZ2F0aW9uQ2FuY2VsLFxuICBOYXZpZ2F0aW9uRXJyb3IsXG4gIFJvdXRlcixcbiAgUm91dGVyU3RhdGVTbmFwc2hvdCxcbiAgUm91dGVzUmVjb2duaXplZCxcbiAgUmVzb2x2ZUVuZCxcbiAgTmF2aWdhdGlvblN0YXJ0LFxuICBOYXZpZ2F0aW9uRW5kXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBBY3Rpb24sIFNlbGVjdG9yLCBTdGF0ZSwgU3RhdGVDb250ZXh0LCBTdG9yZSB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBOYXZpZ2F0ZSxcbiAgUm91dGVyQWN0aW9uLFxuICBSb3V0ZXJDYW5jZWwsXG4gIFJvdXRlckVycm9yLFxuICBSb3V0ZXJOYXZpZ2F0aW9uLFxuICBSb3V0ZXJEYXRhUmVzb2x2ZWRcbn0gZnJvbSAnLi9yb3V0ZXIuYWN0aW9ucyc7XG5pbXBvcnQgeyBSb3V0ZXJTdGF0ZVNlcmlhbGl6ZXIgfSBmcm9tICcuL3NlcmlhbGl6ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlclN0YXRlTW9kZWw8VCA9IFJvdXRlclN0YXRlU25hcHNob3Q+IHtcbiAgc3RhdGU/OiBUO1xuICBuYXZpZ2F0aW9uSWQ/OiBudW1iZXI7XG4gIHRyaWdnZXI6IFJvdXRlclRyaWdnZXI7XG59XG5cbmV4cG9ydCB0eXBlIFJvdXRlclRyaWdnZXIgPVxuICB8ICdub25lJ1xuICB8ICdyb3V0ZXInXG4gIHwgJ3N0b3JlJ1xuICAvLyBUaGUgYGRldnRvb2xzYCB0cmlnZ2VyIG1lYW5zIHRoYXQgdGhlIHN0YXRlIGNoYW5nZSBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgUmVkdXggRGV2VG9vbHMgKGUuZy4gd2hlbiB0aGUgdGltZS10cmF2ZWxpbmcgaXMgdXNlZCkuXG4gIHwgJ2RldnRvb2xzJztcblxuQFN0YXRlPFJvdXRlclN0YXRlTW9kZWw+KHtcbiAgbmFtZTogJ3JvdXRlcicsXG4gIGRlZmF1bHRzOiB7XG4gICAgc3RhdGU6IHVuZGVmaW5lZCxcbiAgICBuYXZpZ2F0aW9uSWQ6IHVuZGVmaW5lZCxcbiAgICB0cmlnZ2VyOiAnbm9uZSdcbiAgfVxufSlcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSb3V0ZXJTdGF0ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGhvdyBuYXZpZ2F0aW9uIHdhcyBwZXJmb3JtZWQgYnkgdGhlIGBSb3V0ZXJTdGF0ZWAgaXRzZWxmXG4gICAqIG9yIG91dHNpZGUgdmlhIGBuZXcgTmF2aWdhdGUoLi4uKWBcbiAgICovXG4gIHByaXZhdGUgX3RyaWdnZXI6IFJvdXRlclRyaWdnZXIgPSAnbm9uZSc7XG5cbiAgLyoqXG4gICAqIFRoYXQncyB0aGUgc2VyaWFsaXplZCBzdGF0ZSBmcm9tIHRoZSBgUm91dGVyYCBjbGFzc1xuICAgKi9cbiAgcHJpdmF0ZSBfcm91dGVyU3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVGhhdCdzIHRoZSB2YWx1ZSBvZiB0aGUgYFJvdXRlclN0YXRlYCBzdGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfc3RvcmVTdGF0ZTogUm91dGVyU3RhdGVNb2RlbCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2xhc3RSb3V0ZXNSZWNvZ25pemVkOiBSb3V0ZXNSZWNvZ25pemVkID0gbnVsbCE7XG5cbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIEBTZWxlY3RvcigpXG4gIHN0YXRpYyBzdGF0ZTxUID0gUm91dGVyU3RhdGVTbmFwc2hvdD4oc3RhdGU6IFJvdXRlclN0YXRlTW9kZWw8VD4pIHtcbiAgICByZXR1cm4gc3RhdGUgJiYgc3RhdGUuc3RhdGU7XG4gIH1cblxuICBAU2VsZWN0b3IoKVxuICBzdGF0aWMgdXJsKHN0YXRlOiBSb3V0ZXJTdGF0ZU1vZGVsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gc3RhdGUgJiYgc3RhdGUuc3RhdGUgJiYgc3RhdGUuc3RhdGUudXJsO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfc3RvcmU6IFN0b3JlLFxuICAgIHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgX3NlcmlhbGl6ZXI6IFJvdXRlclN0YXRlU2VyaWFsaXplcjxSb3V0ZXJTdGF0ZVNuYXBzaG90PixcbiAgICBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZVxuICApIHtcbiAgICB0aGlzLnNldFVwU3RvcmVMaXN0ZW5lcigpO1xuICAgIHRoaXMuc2V0VXBSb3V0ZXJFdmVudHNMaXN0ZW5lcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBAQWN0aW9uKE5hdmlnYXRlKVxuICBuYXZpZ2F0ZShfOiBTdGF0ZUNvbnRleHQ8Um91dGVyU3RhdGVNb2RlbD4sIGFjdGlvbjogTmF2aWdhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5fbmdab25lLnJ1bigoKSA9PlxuICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKGFjdGlvbi5wYXRoLCB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBhY3Rpb24ucXVlcnlQYXJhbXMsXG4gICAgICAgIC4uLmFjdGlvbi5leHRyYXNcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIEBBY3Rpb24oW1JvdXRlck5hdmlnYXRpb24sIFJvdXRlckVycm9yLCBSb3V0ZXJDYW5jZWwsIFJvdXRlckRhdGFSZXNvbHZlZF0pXG4gIGFuZ3VsYXJSb3V0ZXJBY3Rpb24oXG4gICAgY3R4OiBTdGF0ZUNvbnRleHQ8Um91dGVyU3RhdGVNb2RlbD4sXG4gICAgYWN0aW9uOiBSb3V0ZXJBY3Rpb248Um91dGVyU3RhdGVNb2RlbCwgUm91dGVyU3RhdGVTbmFwc2hvdD5cbiAgKTogdm9pZCB7XG4gICAgY3R4LnNldFN0YXRlKHtcbiAgICAgIC4uLmN0eC5nZXRTdGF0ZSgpLFxuICAgICAgdHJpZ2dlcjogYWN0aW9uLnRyaWdnZXIsXG4gICAgICBzdGF0ZTogYWN0aW9uLnJvdXRlclN0YXRlLFxuICAgICAgbmF2aWdhdGlvbklkOiBhY3Rpb24uZXZlbnQuaWRcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VXBTdG9yZUxpc3RlbmVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuX3N0b3JlXG4gICAgICAuc2VsZWN0KFJvdXRlclN0YXRlKVxuICAgICAgLnN1YnNjcmliZSgoc3RhdGU6IFJvdXRlclN0YXRlTW9kZWwgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZUlmTmVlZGVkKHN0YXRlKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChzdWJzY3JpcHRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRVcFJvdXRlckV2ZW50c0xpc3RlbmVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuX3JvdXRlci5ldmVudHMuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25TdGFydCgpO1xuICAgICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFJvdXRlc1JlY29nbml6ZWQpIHtcbiAgICAgICAgdGhpcy5fbGFzdFJvdXRlc1JlY29nbml6ZWQgPSBldmVudDtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBSZXNvbHZlRW5kKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hSb3V0ZXJEYXRhUmVzb2x2ZWQoZXZlbnQpO1xuICAgICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25DYW5jZWwpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaFJvdXRlckNhbmNlbChldmVudCk7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaFJvdXRlckVycm9yKGV2ZW50KTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uRW5kKCk7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoc3Vic2NyaXB0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgbmF2aWdhdGlvblN0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX3JvdXRlclN0YXRlID0gdGhpcy5fc2VyaWFsaXplci5zZXJpYWxpemUodGhpcy5fcm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90KTtcblxuICAgIGlmICh0aGlzLl90cmlnZ2VyICE9PSAnbm9uZScpIHtcbiAgICAgIHRoaXMuX3N0b3JlU3RhdGUgPSB0aGlzLl9zdG9yZS5zZWxlY3RTbmFwc2hvdChSb3V0ZXJTdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uRW5kKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3VsZERpc3BhdGNoUm91dGVyTmF2aWdhdGlvbigpKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoUm91dGVyTmF2aWdhdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkRGlzcGF0Y2hSb3V0ZXJOYXZpZ2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fc3RvcmVTdGF0ZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuX3RyaWdnZXIgIT09ICdzdG9yZSc7XG4gIH1cblxuICBwcml2YXRlIG5hdmlnYXRlSWZOZWVkZWQoc3RhdGU6IFJvdXRlclN0YXRlTW9kZWwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoc3RhdGUgJiYgc3RhdGUudHJpZ2dlciA9PT0gJ2RldnRvb2xzJykge1xuICAgICAgdGhpcy5fc3RvcmVTdGF0ZSA9IHRoaXMuX3N0b3JlLnNlbGVjdFNuYXBzaG90KFJvdXRlclN0YXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBjYW5Ta2lwTmF2aWdhdGlvbiA9XG4gICAgICAhdGhpcy5fc3RvcmVTdGF0ZSB8fFxuICAgICAgIXRoaXMuX3N0b3JlU3RhdGUuc3RhdGUgfHxcbiAgICAgICFzdGF0ZSB8fFxuICAgICAgc3RhdGUudHJpZ2dlciA9PT0gJ3JvdXRlcicgfHxcbiAgICAgIHRoaXMuX3JvdXRlci51cmwgPT09IHRoaXMuX3N0b3JlU3RhdGUuc3RhdGUudXJsO1xuXG4gICAgaWYgKGNhblNraXBOYXZpZ2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fdHJpZ2dlciA9ICdzdG9yZSc7XG4gICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLl9zdG9yZVN0YXRlIS5zdGF0ZSEudXJsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2hSb3V0ZXJOYXZpZ2F0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHRSb3V0ZXJTdGF0ZSA9IHRoaXMuX3NlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuX2xhc3RSb3V0ZXNSZWNvZ25pemVkLnN0YXRlKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hSb3V0ZXJBY3Rpb24oXG4gICAgICBuZXcgUm91dGVyTmF2aWdhdGlvbihcbiAgICAgICAgbmV4dFJvdXRlclN0YXRlLFxuICAgICAgICBuZXcgUm91dGVzUmVjb2duaXplZChcbiAgICAgICAgICB0aGlzLl9sYXN0Um91dGVzUmVjb2duaXplZC5pZCxcbiAgICAgICAgICB0aGlzLl9sYXN0Um91dGVzUmVjb2duaXplZC51cmwsXG4gICAgICAgICAgdGhpcy5fbGFzdFJvdXRlc1JlY29nbml6ZWQudXJsQWZ0ZXJSZWRpcmVjdHMsXG4gICAgICAgICAgbmV4dFJvdXRlclN0YXRlXG4gICAgICAgICksXG4gICAgICAgIHRoaXMuX3RyaWdnZXJcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaFJvdXRlckNhbmNlbChldmVudDogTmF2aWdhdGlvbkNhbmNlbCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2hSb3V0ZXJBY3Rpb24oXG4gICAgICBuZXcgUm91dGVyQ2FuY2VsKHRoaXMuX3JvdXRlclN0YXRlISwgdGhpcy5fc3RvcmVTdGF0ZSwgZXZlbnQsIHRoaXMuX3RyaWdnZXIpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2hSb3V0ZXJFcnJvcihldmVudDogTmF2aWdhdGlvbkVycm9yKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaFJvdXRlckFjdGlvbihcbiAgICAgIG5ldyBSb3V0ZXJFcnJvcihcbiAgICAgICAgdGhpcy5fcm91dGVyU3RhdGUhLFxuICAgICAgICB0aGlzLl9zdG9yZVN0YXRlLFxuICAgICAgICBuZXcgTmF2aWdhdGlvbkVycm9yKGV2ZW50LmlkLCBldmVudC51cmwsIGAke2V2ZW50fWApLFxuICAgICAgICB0aGlzLl90cmlnZ2VyXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2hSb3V0ZXJBY3Rpb248VD4oYWN0aW9uOiBSb3V0ZXJBY3Rpb248VD4pOiB2b2lkIHtcbiAgICB0aGlzLl90cmlnZ2VyID0gJ3JvdXRlcic7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fdHJpZ2dlciA9ICdub25lJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoUm91dGVyRGF0YVJlc29sdmVkKGV2ZW50OiBSZXNvbHZlRW5kKTogdm9pZCB7XG4gICAgY29uc3Qgcm91dGVyU3RhdGUgPSB0aGlzLl9zZXJpYWxpemVyLnNlcmlhbGl6ZShldmVudC5zdGF0ZSk7XG4gICAgdGhpcy5kaXNwYXRjaFJvdXRlckFjdGlvbihuZXcgUm91dGVyRGF0YVJlc29sdmVkKHJvdXRlclN0YXRlLCBldmVudCwgdGhpcy5fdHJpZ2dlcikpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl90cmlnZ2VyID0gJ25vbmUnO1xuICAgIHRoaXMuX3N0b3JlU3RhdGUgPSBudWxsO1xuICAgIHRoaXMuX3JvdXRlclN0YXRlID0gbnVsbDtcbiAgfVxufVxuIl19