@ngxs/router-plugin 3.7.3 → 3.7.4-dev.master-327646e

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