@coolon/angular-ui-powerups 0.0.96 → 0.0.98

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.
Files changed (93) hide show
  1. package/bundles/coolon-angular-ui-powerups.umd.js +2960 -2288
  2. package/bundles/coolon-angular-ui-powerups.umd.js.map +1 -1
  3. package/bundles/coolon-angular-ui-powerups.umd.min.js +1 -1
  4. package/bundles/coolon-angular-ui-powerups.umd.min.js.map +1 -1
  5. package/coolon-angular-ui-powerups.d.ts +17 -20
  6. package/coolon-angular-ui-powerups.metadata.json +1 -1
  7. package/esm2015/coolon-angular-ui-powerups.js +17 -20
  8. package/esm2015/index.js +2 -2
  9. package/esm2015/lib/interaction/components/activity-container/activity-container.component.js +16 -52
  10. package/esm2015/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.js +16 -47
  11. package/esm2015/lib/interaction/index.js +4 -2
  12. package/esm2015/lib/interaction/interaction-context-base.js +158 -0
  13. package/esm2015/lib/interaction/interaction-context.js +58 -78
  14. package/esm2015/lib/interaction/interaction.module.js +1 -1
  15. package/esm2015/lib/interaction/services/dialog-interaction-context.js +163 -0
  16. package/esm2015/lib/interaction/services/dialog-interaction.service.js +68 -181
  17. package/esm2015/lib/interaction/services/modal-interaction.service.js +109 -0
  18. package/esm2015/lib/place/components/place-outlet/place-outlet.component.js +9 -43
  19. package/esm2015/lib/place/guards/abstract-place.guard.js +165 -0
  20. package/esm2015/lib/place/guards/consolidated-param-map.js +133 -0
  21. package/esm2015/lib/place/guards/interaction.guard.js +113 -0
  22. package/esm2015/lib/place/guards/navigation-state.js +613 -0
  23. package/esm2015/lib/place/guards/place-component-deactivation-handler.js +87 -0
  24. package/esm2015/lib/place/index.js +7 -5
  25. package/esm2015/lib/place/place-component.js +1 -1
  26. package/esm2015/lib/place/place-router.js +162 -236
  27. package/esm2015/lib/place/place.module.js +2 -4
  28. package/esm2015/lib/place/route/visit-sanitiser.js +2 -2
  29. package/esm2015/lib/place/url-snapshot.js +96 -0
  30. package/esm2015/public_api.js +3 -3
  31. package/esm5/coolon-angular-ui-powerups.js +17 -20
  32. package/esm5/index.js +2 -2
  33. package/esm5/lib/interaction/components/activity-container/activity-container.component.js +23 -74
  34. package/esm5/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.js +26 -76
  35. package/esm5/lib/interaction/index.js +4 -2
  36. package/esm5/lib/interaction/interaction-context-base.js +211 -0
  37. package/esm5/lib/interaction/interaction-context.js +72 -94
  38. package/esm5/lib/interaction/interaction.module.js +1 -1
  39. package/esm5/lib/interaction/services/dialog-interaction-context.js +188 -0
  40. package/esm5/lib/interaction/services/dialog-interaction.service.js +83 -232
  41. package/esm5/lib/interaction/services/modal-interaction.service.js +153 -0
  42. package/esm5/lib/place/components/place-outlet/place-outlet.component.js +9 -43
  43. package/esm5/lib/place/guards/abstract-place.guard.js +212 -0
  44. package/esm5/lib/place/guards/consolidated-param-map.js +161 -0
  45. package/esm5/lib/place/guards/interaction.guard.js +125 -0
  46. package/esm5/lib/place/guards/navigation-state.js +764 -0
  47. package/esm5/lib/place/guards/place-component-deactivation-handler.js +104 -0
  48. package/esm5/lib/place/index.js +7 -5
  49. package/esm5/lib/place/place-component.js +1 -1
  50. package/esm5/lib/place/place-router.js +191 -294
  51. package/esm5/lib/place/place.module.js +2 -4
  52. package/esm5/lib/place/route/visit-sanitiser.js +2 -2
  53. package/esm5/lib/place/url-snapshot.js +120 -0
  54. package/esm5/public_api.js +3 -3
  55. package/fesm2015/coolon-angular-ui-powerups.js +2135 -1587
  56. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  57. package/fesm5/coolon-angular-ui-powerups.js +3083 -2412
  58. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  59. package/lib/interaction/components/activity-container/activity-container.component.d.ts +6 -11
  60. package/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.d.ts +4 -9
  61. package/lib/interaction/index.d.ts +3 -1
  62. package/lib/interaction/interaction-context-base.d.ts +27 -0
  63. package/lib/interaction/interaction-context.d.ts +18 -15
  64. package/lib/interaction/services/dialog-interaction-context.d.ts +18 -0
  65. package/lib/interaction/services/dialog-interaction.service.d.ts +14 -23
  66. package/lib/interaction/services/modal-interaction.service.d.ts +15 -0
  67. package/lib/place/components/place-outlet/place-outlet.component.d.ts +1 -4
  68. package/lib/place/guards/abstract-place.guard.d.ts +19 -0
  69. package/lib/place/guards/consolidated-param-map.d.ts +14 -0
  70. package/lib/{interaction/guards/interaction-guard.service.d.ts → place/guards/interaction.guard.d.ts} +8 -4
  71. package/lib/place/guards/navigation-state.d.ts +96 -0
  72. package/lib/place/guards/place-component-deactivation-handler.d.ts +12 -0
  73. package/lib/place/index.d.ts +6 -4
  74. package/lib/place/place-component.d.ts +1 -1
  75. package/lib/place/place-router.d.ts +25 -33
  76. package/lib/place/url-snapshot.d.ts +16 -0
  77. package/package.json +1 -1
  78. package/schematics/place-routes/place-def.js +2 -2
  79. package/schematics/place-routes/templates/place-routes.ts.template +9 -16
  80. package/esm2015/lib/interaction/guards/interaction-guard.service.js +0 -85
  81. package/esm2015/lib/place/guards/abstract-enter-place.guard.js +0 -315
  82. package/esm2015/lib/place/guards/leave-place.guard.js +0 -47
  83. package/esm2015/lib/place/navigation-session.js +0 -279
  84. package/esm2015/lib/place/places/noop-gateway-place.component.js +0 -58
  85. package/esm5/lib/interaction/guards/interaction-guard.service.js +0 -94
  86. package/esm5/lib/place/guards/abstract-enter-place.guard.js +0 -387
  87. package/esm5/lib/place/guards/leave-place.guard.js +0 -55
  88. package/esm5/lib/place/navigation-session.js +0 -353
  89. package/esm5/lib/place/places/noop-gateway-place.component.js +0 -61
  90. package/lib/place/guards/abstract-enter-place.guard.d.ts +0 -33
  91. package/lib/place/guards/leave-place.guard.d.ts +0 -8
  92. package/lib/place/navigation-session.d.ts +0 -43
  93. package/lib/place/places/noop-gateway-place.component.d.ts +0 -10
@@ -5,46 +5,41 @@
5
5
  import * as tslib_1 from "tslib";
6
6
  import { Location } from '@angular/common';
7
7
  import { Injectable } from '@angular/core';
8
- import { NavigationEnd, NavigationError, NavigationStart, Router, UrlSegment, UrlSerializer } from '@angular/router';
9
- import { assert, Dsl, GarbageCollector, Logger, MutableListModel, MutableValueModel, Trace } from '@coolon/pectin';
8
+ import { NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router, UrlSerializer } from '@angular/router';
9
+ import { assert, Dsl, GarbageCollector, lang, Logger, MutableListModel, MutableValueModel } from '@coolon/pectin';
10
10
  import _ from 'lodash';
11
- import { InteractionContext } from '../interaction/interaction-context';
12
- import { NavigationSession } from './navigation-session';
13
- import { PlaceComponent } from './place-component';
11
+ import { ModalInteractionService } from '../interaction/services/modal-interaction.service';
12
+ import { NavigationState } from './guards/navigation-state';
14
13
  import { PlaceHistory } from './place-history';
15
- import { NoopGatewayPlace } from './places/noop-gateway-place.component';
16
- import { Visit } from './visit';
14
+ import { UrlSnapshot } from './url-snapshot';
17
15
  import * as i0 from "@angular/core";
18
16
  import * as i1 from "@angular/router";
19
- import * as i2 from "../interaction/interaction-context";
20
- import * as i3 from "@angular/common";
21
- import * as i4 from "./place-history";
22
- /** @type {?} */
23
- var noopPlaceDef = PlaceComponent.getDefinition(NoopGatewayPlace);
17
+ import * as i2 from "@angular/common";
18
+ import * as i3 from "./place-history";
19
+ import * as i4 from "../interaction/services/modal-interaction.service";
24
20
  var PlaceRouter = /** @class */ (function (_super) {
25
21
  tslib_1.__extends(PlaceRouter, _super);
26
- function PlaceRouter(router, urlSerializer, interactionContext, angularLocation, placeHistory) {
22
+ function PlaceRouter(router, urlSerializer, angularLocation, placeHistory, modalInteractionService) {
27
23
  var _this = _super.call(this) || this;
28
24
  _this.router = router;
29
25
  _this.urlSerializer = urlSerializer;
30
- _this.interactionContext = interactionContext;
31
26
  _this.angularLocation = angularLocation;
32
27
  _this.placeHistory = placeHistory;
28
+ _this.modalInteractionService = modalInteractionService;
33
29
  _this.firstRoute = true;
34
30
  _this._navigationSessionModel = new MutableValueModel();
35
31
  _this._activeVisits = new MutableListModel();
36
- _this.initialRedirectStarted = false;
37
- _this.initialRedirectFinished = false;
38
32
  var _a = Dsl.disposeWith(_this), chain = _a.chain, valueOf = _a.valueOf, before = _a.before, when = _a.when, after = _a.after, observe = _a.observe, switchOn = _a.switchOn;
39
33
  _this.activeVisitIndex = chain(_this._activeVisits).indexBy('placeDefinition');
40
- _this.navigationSessionFactory = new NavigationSession.Factory(interactionContext);
41
- angularLocation.onUrlChange((/**
42
- * @param {?} url
34
+ _this.navigationSessionActive = chain(_this.navigationSessionModel).pluck('active');
35
+ _this._navigationSessionContext = new NavigationState.Context(_this.router, _this.modalInteractionService, _this.angularLocation, (/**
36
+ * @param {?} session
43
37
  * @return {?}
44
38
  */
45
- function (url) {
46
- console.log("location.onUrlChange -> " + url);
39
+ function (session) {
40
+ _this.processNavigationSuccess(session);
47
41
  }));
42
+ _this._navigationSessionModel.value = new NavigationState.Idle(_this._navigationSessionContext);
48
43
  // TODO: make setup the callbacks in during module initiation to make this testable.
49
44
  _this.router.events.subscribe((/**
50
45
  * @param {?} event
@@ -55,30 +50,84 @@ var PlaceRouter = /** @class */ (function (_super) {
55
50
  // ======================
56
51
  // NavigationStart -> .... -> NavigationCancel --> redirect, go around again in the same session
57
52
  // NavigationStart -> .... -> NavigationEnd --> navigation complete, end session.
58
- // NavigationStart -> .... -> NavigationError --> navigation canceled, end session.
53
+ // NavigationStart -> .... -> NavigationError --> navigation aborted, end session.
59
54
  // =======================
60
55
  if (event instanceof NavigationStart) {
61
- _this.onAngularRouterStarted(event);
56
+ _this.runStateTransition((/**
57
+ * @param {?} session
58
+ * @return {?}
59
+ */
60
+ function (session) { return session.onStart(event); }));
62
61
  }
63
62
  if (event instanceof NavigationEnd) {
64
- _this.onAngularRouterFinished(false);
63
+ _this.runStateTransition((/**
64
+ * @param {?} session
65
+ * @return {?}
66
+ */
67
+ function (session) { return session.onEnd(event); }));
65
68
  }
66
69
  if (event instanceof NavigationError) {
67
- _this.onAngularRouterFinished(true);
70
+ _this.runStateTransition((/**
71
+ * @param {?} session
72
+ * @return {?}
73
+ */
74
+ function (session) { return session.onError(event); }));
75
+ }
76
+ if (event instanceof NavigationCancel) {
77
+ _this.runStateTransition((/**
78
+ * @param {?} session
79
+ * @return {?}
80
+ */
81
+ function (session) { return session.onCancel(event); }));
68
82
  }
69
83
  }));
70
- _this.navigationSessionActive = chain(_this.navigationSessionModel).isNotNil();
71
- _this.navigationSessionActive.subscribe((/**
72
- * @param {?} active
84
+ // Push dialog state to the url so we can capture the back button.
85
+ _this.modalInteractionService.addActivityListener(new PlaceRouter.InteractionRouteMediator(_this.navigationSessionActive, _this.router));
86
+ // The angular router doesn't always fire router events when the back button is pushed while a navigation
87
+ // session is in progress. Sometimes we only know about it from the url change.
88
+ angularLocation.onUrlChange((/**
89
+ * @param {?} url
73
90
  * @return {?}
74
91
  */
75
- function (active) {
76
- console.log('navigationSessionActive', active);
92
+ function (url) {
93
+ console.log("#### url changed ->", { url: url, navIsActive: _this.navigationSessionActive.value });
94
+ /** @type {?} */
95
+ var interactionContext = _this.navigationSessionActive.value && _this.navigationSession.interactionContext;
96
+ if (interactionContext && interactionContext.isActive()) {
97
+ Logger.get(_this).info("back button pressed during navigation session interaction");
98
+ _this.runStateTransition((/**
99
+ * @param {?} navigationSession
100
+ * @return {?}
101
+ */
102
+ function (navigationSession) { return navigationSession.onBackClickedDuringNavigationInteraction(url); }));
103
+ }
77
104
  }));
78
105
  return _this;
79
- // const txo = new TransactionObserver().onEvent(e => console.log(e.toString()));
80
- // txo.observe('this.navigationSessionModel', this.navigationSessionModel);
81
106
  }
107
+ /**
108
+ * @private
109
+ * @param {?} session
110
+ * @return {?}
111
+ */
112
+ PlaceRouter.prototype.processNavigationSuccess = /**
113
+ * @private
114
+ * @param {?} session
115
+ * @return {?}
116
+ */
117
+ function (session) {
118
+ var _this = this;
119
+ // We need to update the visits before the session finishes. This allows the placeOutets to ignore visit
120
+ // changes that occur while routerNavigationActive is true.
121
+ assert.isTruthy(this.navigationSessionActive.value);
122
+ /** @type {?} */
123
+ var visits = session.getVisits();
124
+ visits.forEach((/**
125
+ * @param {?} v
126
+ * @return {?}
127
+ */
128
+ function (v) { return _this.placeHistory.add(v); }));
129
+ this._activeVisits.value = visits;
130
+ };
82
131
  Object.defineProperty(PlaceRouter.prototype, "navigationSession", {
83
132
  get: /**
84
133
  * @return {?}
@@ -154,19 +203,6 @@ var PlaceRouter = /** @class */ (function (_super) {
154
203
  });
155
204
  });
156
205
  };
157
- /**
158
- * @param {?} visit
159
- * @param {?=} navigationExtras
160
- * @return {?}
161
- */
162
- PlaceRouter.prototype.createRedirectFor = /**
163
- * @param {?} visit
164
- * @param {?=} navigationExtras
165
- * @return {?}
166
- */
167
- function (visit, navigationExtras) {
168
- return this.router.createUrlTree(this.createRouteParameters(visit), navigationExtras);
169
- };
170
206
  // @Trace()
171
207
  // @Trace()
172
208
  /**
@@ -199,15 +235,6 @@ var PlaceRouter = /** @class */ (function (_super) {
199
235
  function (router) {
200
236
  /** @type {?} */
201
237
  var commands = _this.parseUrl(_this.router.routerState.snapshot).createRedirectCommandsFor(next);
202
- // // we have to to use the definition for route id as our redirection always includes
203
- // // the id in the url segements (but leaves it blank when there's no id). I.e. in the
204
- // // no id case we're doing the following redirect [<placePath>, ""] -> ["..", <id>]
205
- // const relativePath = !!previous.placeDefinition.hasRouteId() ? '..' : '.';
206
- // const commands = [
207
- // relativePath,
208
- // ...this.createRouteParameters(next),
209
- // ...this.extractChildPath(activatedRoute.snapshot)
210
- // ];
211
238
  console.log('### Push Changes to route Redirect', { commands: commands });
212
239
  return router.navigate(commands);
213
240
  }))];
@@ -218,32 +245,49 @@ var PlaceRouter = /** @class */ (function (_super) {
218
245
  };
219
246
  /**
220
247
  * @param {?} visit
221
- * @param {?} customNavigation
248
+ * @param {?} runNavigationCommands
222
249
  * @return {?}
223
250
  */
224
251
  PlaceRouter.prototype.doNavigation = /**
225
252
  * @param {?} visit
226
- * @param {?} customNavigation
253
+ * @param {?} runNavigationCommands
227
254
  * @return {?}
228
255
  */
229
- function (visit, customNavigation) {
256
+ function (visit, runNavigationCommands) {
230
257
  return tslib_1.__awaiter(this, void 0, void 0, function () {
258
+ var _this = this;
231
259
  return tslib_1.__generator(this, function (_a) {
232
260
  switch (_a.label) {
233
261
  case 0:
234
- this._navigationSessionModel.value = this.navigationSessionFactory.createInternal(visit);
262
+ if (this.navigationSessionActive.value) {
263
+ lang.illegalState('Navigation already in progress');
264
+ }
265
+ this.runStateTransition((/**
266
+ * @param {?} current
267
+ * @return {?}
268
+ */
269
+ function (current) {
270
+ /** @type {?} */
271
+ var session = new NavigationState.Active(_this._navigationSessionContext, false, _this.router.routerState.snapshot.url);
272
+ session.storeVisit(visit);
273
+ return session;
274
+ }));
235
275
  _a.label = 1;
236
276
  case 1:
237
277
  _a.trys.push([1, , 3, 4]);
238
- return [4 /*yield*/, customNavigation(this.router)];
278
+ return [4 /*yield*/, runNavigationCommands(this.router)];
239
279
  case 2:
240
280
  _a.sent();
241
281
  return [3 /*break*/, 4];
242
282
  case 3:
243
283
  // Router has finished (since there was no router change required) so we
244
284
  // need to end the navigation session.
245
- if (this.navigationSession && !this.router.getCurrentNavigation()) {
246
- this.onAngularRouterFinished(false);
285
+ if (this.navigationSession.active && !this.router.getCurrentNavigation()) {
286
+ this.runStateTransition((/**
287
+ * @param {?} session
288
+ * @return {?}
289
+ */
290
+ function (session) { return session.onEnd(new NavigationEnd(-1, '', '')); }));
247
291
  }
248
292
  return [7 /*endfinally*/];
249
293
  case 4: return [2 /*return*/];
@@ -252,87 +296,42 @@ var PlaceRouter = /** @class */ (function (_super) {
252
296
  });
253
297
  };
254
298
  /**
255
- * @private
256
- * @param {?} visit
299
+ * @protected
300
+ * @param {?} transition
257
301
  * @return {?}
258
302
  */
259
- PlaceRouter.prototype.createRouteParameters = /**
260
- * @private
261
- * @param {?} visit
303
+ PlaceRouter.prototype.runStateTransition = /**
304
+ * @protected
305
+ * @param {?} transition
262
306
  * @return {?}
263
307
  */
264
- function (visit) {
308
+ function (transition) {
265
309
  /** @type {?} */
266
- var def = visit.placeDefinition;
267
- return visit.hasRouteId() ?
268
- [def.getFormattedRouteId(visit), def.getFormattedRouteParameters(visit)] :
269
- [def.getFormattedRouteParameters(visit)];
270
- };
271
- // @Trace()
272
- // @Trace()
273
- /**
274
- * @private
275
- * @param {?} event
276
- * @return {?}
277
- */
278
- PlaceRouter.prototype.onAngularRouterStarted =
279
- // @Trace()
280
- /**
281
- * @private
282
- * @param {?} event
283
- * @return {?}
284
- */
285
- function (event) {
286
- if (!this.navigationSession) { // We been activated by an external route rather than placeRouter.go(visit)
287
- console.log('navigation started', { firstTime: this.firstRoute });
288
- /** @type {?} */
289
- var session = this.navigationSessionFactory.createExternal(this.firstRoute);
290
- if (event.navigationTrigger === 'popstate') {
291
- session.setPopstateReturnUrl(this.router.routerState.snapshot.url);
292
- }
293
- this._navigationSessionModel.value = session;
310
+ var previous = this._navigationSessionModel.value;
311
+ /** @type {?} */
312
+ var next = transition(this.navigationSession);
313
+ this._navigationSessionModel.value = next;
314
+ if (next !== previous) {
315
+ previous.dispose();
316
+ Logger.get(this).info("Router State Transition: " + previous.toString() + " -> " + next.toString());
294
317
  }
295
- this.firstRoute = false;
296
318
  };
297
- // @Trace()
298
- // @Trace()
299
319
  /**
300
320
  * @private
301
- * @param {?} cancelled
321
+ * @param {?} visit
302
322
  * @return {?}
303
323
  */
304
- PlaceRouter.prototype.onAngularRouterFinished =
305
- // @Trace()
306
- /**
324
+ PlaceRouter.prototype.createRouteParameters = /**
307
325
  * @private
308
- * @param {?} cancelled
326
+ * @param {?} visit
309
327
  * @return {?}
310
328
  */
311
- function (cancelled) {
312
- var _this = this;
329
+ function (visit) {
313
330
  /** @type {?} */
314
- var session = this._navigationSessionModel.value;
315
- if (!cancelled) {
316
- // Update visits before we end the navigation session. This allows the placeOutets to
317
- // ignore visit changes that occur while the navigation is in progress
318
- /** @type {?} */
319
- var visits = session.getVisits();
320
- visits.forEach((/**
321
- * @param {?} v
322
- * @return {?}
323
- */
324
- function (v) { return _this.placeHistory.add(v); }));
325
- this._activeVisits.value = visits;
326
- }
327
- else {
328
- // Angular doesn't preserve the url when a guard cancels the back button.
329
- // See https://github.com/angular/angular/issues/13586#issuecomment-432795720
330
- if (session.isPopState) {
331
- console.log('cancelled during popstate');
332
- this.angularLocation.go(session.popStateReturnUrl);
333
- }
334
- }
335
- this._navigationSessionModel.value = null;
331
+ var def = visit.placeDefinition;
332
+ return visit.hasRouteId() ?
333
+ [def.getFormattedRouteId(visit), def.getFormattedRouteParameters(visit)] :
334
+ [def.getFormattedRouteParameters(visit)];
336
335
  };
337
336
  /**
338
337
  * @param {?} activatedRoute
@@ -358,50 +357,7 @@ var PlaceRouter = /** @class */ (function (_super) {
358
357
  * @return {?}
359
358
  */
360
359
  function (snapshot) {
361
- return new PlaceRouter.UrlHelper(this.urlSerializer.parse(snapshot.url));
362
- };
363
- // TODO: this all only sort of works. Opening dialogs and clicking back multiple times breaks things.
364
- // TODO: next stage is to investigate tracking dialog state in a different placeoutlet and keeping those
365
- // TODO: urls out of the history.
366
- // TODO: this all only sort of works. Opening dialogs and clicking back multiple times breaks things.
367
- // TODO: next stage is to investigate tracking dialog state in a different placeoutlet and keeping those
368
- // TODO: urls out of the history.
369
- /**
370
- * @param {?} activatedRoute
371
- * @param {?} state
372
- * @return {?}
373
- */
374
- PlaceRouter.prototype.performInitialNavigationIntercept =
375
- // TODO: this all only sort of works. Opening dialogs and clicking back multiple times breaks things.
376
- // TODO: next stage is to investigate tracking dialog state in a different placeoutlet and keeping those
377
- // TODO: urls out of the history.
378
- /**
379
- * @param {?} activatedRoute
380
- * @param {?} state
381
- * @return {?}
382
- */
383
- function (activatedRoute, state) {
384
- assert.isTruthy(this.isInitialNavigation());
385
- Logger.get(this).info("Redirecting to: " + noopPlaceDef.path, { returnUrl: state.url });
386
- if (!this.initialRedirectFinished) {
387
- this.initialRedirectFinished = true;
388
- return this.router.createUrlTree([noopPlaceDef.path, {
389
- returnUrl: state.url
390
- }], {
391
- replaceUrl: true,
392
- // make sure we update our history
393
- skipLocationChange: false
394
- });
395
- }
396
- };
397
- /**
398
- * @return {?}
399
- */
400
- PlaceRouter.prototype.isInitialNavigation = /**
401
- * @return {?}
402
- */
403
- function () {
404
- return this.navigationSession.firstNavigation && !this.initialRedirectFinished;
360
+ return new UrlSnapshot(this.urlSerializer.parse(snapshot.url));
405
361
  };
406
362
  PlaceRouter.decorators = [
407
363
  { type: Injectable, args: [{
@@ -412,17 +368,11 @@ var PlaceRouter = /** @class */ (function (_super) {
412
368
  PlaceRouter.ctorParameters = function () { return [
413
369
  { type: Router },
414
370
  { type: UrlSerializer },
415
- { type: InteractionContext },
416
371
  { type: Location },
417
- { type: PlaceHistory }
372
+ { type: PlaceHistory },
373
+ { type: ModalInteractionService }
418
374
  ]; };
419
- /** @nocollapse */ PlaceRouter.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function PlaceRouter_Factory() { return new PlaceRouter(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i1.UrlSerializer), i0.ɵɵinject(i2.InteractionContext), i0.ɵɵinject(i3.Location), i0.ɵɵinject(i4.PlaceHistory)); }, token: PlaceRouter, providedIn: "root" });
420
- tslib_1.__decorate([
421
- Trace(),
422
- tslib_1.__metadata("design:type", Function),
423
- tslib_1.__metadata("design:paramtypes", [Visit, Object]),
424
- tslib_1.__metadata("design:returntype", Promise)
425
- ], PlaceRouter.prototype, "navigate", null);
375
+ /** @nocollapse */ PlaceRouter.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function PlaceRouter_Factory() { return new PlaceRouter(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i1.UrlSerializer), i0.ɵɵinject(i2.Location), i0.ɵɵinject(i3.PlaceHistory), i0.ɵɵinject(i4.ModalInteractionService)); }, token: PlaceRouter, providedIn: "root" });
426
376
  return PlaceRouter;
427
377
  }(GarbageCollector));
428
378
  export { PlaceRouter };
@@ -450,159 +400,106 @@ if (false) {
450
400
  * @type {?}
451
401
  * @private
452
402
  */
453
- PlaceRouter.prototype.navigationSessionFactory;
403
+ PlaceRouter.prototype._navigationSessionContext;
454
404
  /**
455
405
  * @type {?}
456
406
  * @private
457
407
  */
458
- PlaceRouter.prototype.initialRedirectStarted;
408
+ PlaceRouter.prototype.router;
459
409
  /**
460
410
  * @type {?}
461
411
  * @private
462
412
  */
463
- PlaceRouter.prototype.initialRedirectFinished;
413
+ PlaceRouter.prototype.urlSerializer;
464
414
  /**
465
415
  * @type {?}
466
416
  * @private
467
417
  */
468
- PlaceRouter.prototype.router;
418
+ PlaceRouter.prototype.angularLocation;
469
419
  /**
470
420
  * @type {?}
471
421
  * @private
472
422
  */
473
- PlaceRouter.prototype.urlSerializer;
423
+ PlaceRouter.prototype.placeHistory;
474
424
  /**
475
425
  * @type {?}
476
426
  * @private
477
427
  */
478
- PlaceRouter.prototype.interactionContext;
479
- /** @type {?} */
480
- PlaceRouter.prototype.angularLocation;
481
- /** @type {?} */
482
- PlaceRouter.prototype.placeHistory;
428
+ PlaceRouter.prototype.modalInteractionService;
483
429
  }
484
430
  (function (PlaceRouter) {
485
- var UrlHelper = /** @class */ (function () {
486
- function UrlHelper(urlTree) {
487
- this.urlTree = urlTree;
488
- console.log({ segments: this.urlTree.root.children.primary.segments });
431
+ PlaceRouter.INTERACTION_ROUTER_OUTLET = 'aup-interaction';
432
+ var InteractionRouteMediator = /** @class */ (function () {
433
+ function InteractionRouteMediator(navigationSessionModelActive, router) {
434
+ this.navigationSessionModelActive = navigationSessionModelActive;
435
+ this.router = router;
489
436
  }
490
- /**
491
- * @return {?}
492
- */
493
- UrlHelper.prototype.cloneUrlSegmentList = /**
494
- * @return {?}
495
- */
496
- function () {
497
- return tslib_1.__spread(this.urlTree.root.children.primary.segments);
498
- };
499
- /**
500
- * @param {?} visit
501
- * @return {?}
502
- */
503
- UrlHelper.prototype.updateVisitSegments = /**
504
- * @param {?} visit
505
- * @return {?}
506
- */
507
- function (visit) {
508
- // Ugly, but it works for now.
509
- /** @type {?} */
510
- var segments = this.cloneUrlSegmentList();
511
- /** @type {?} */
512
- var visitSegments = this.convertToUrlSegments(visit);
513
- /** @type {?} */
514
- var replaceAt = segments.findIndex((/**
515
- * @param {?} segment
437
+ Object.defineProperty(InteractionRouteMediator.prototype, "isNavigating", {
438
+ get: /**
516
439
  * @return {?}
517
440
  */
518
- function (segment) { return segment.path === visitSegments[0].path; }));
519
- // do not use the return value, it's the items that were removed!
520
- segments.splice.apply(segments, tslib_1.__spread([replaceAt, visitSegments.length], visitSegments));
521
- return segments;
522
- };
523
- /**
524
- * Converts the visit into segments. Please not that these segments are not e
525
- * @param visit
526
- */
441
+ function () {
442
+ return this.navigationSessionModelActive.value;
443
+ },
444
+ enumerable: true,
445
+ configurable: true
446
+ });
447
+ // If we're not in a navigation we push
448
+ // @Trace()
449
+ // If we're not in a navigation we push
450
+ // @Trace()
527
451
  /**
528
- * Converts the visit into segments. Please not that these segments are not e
529
- * @param {?} visit
530
- * @return {?}
531
- */
532
- UrlHelper.prototype.convertToUrlSegments = /**
533
- * Converts the visit into segments. Please not that these segments are not e
534
- * @param {?} visit
535
452
  * @return {?}
536
453
  */
537
- function (visit) {
538
- return visit.placeDefinition.hasRouteId() ?
539
- [
540
- // NOTE:
541
- // It's important to attach the params to the root path and not the id. If we attach them
542
- // to an empty id then the angular router won't match the pattern.
543
- new UrlSegment(visit.placeDefinition.path, visit.placeDefinition.getFormattedRouteParameters(visit)),
544
- new UrlSegment(visit.placeDefinition.getFormattedRouteId(visit), {})
545
- ]
546
- :
547
- [
548
- new UrlSegment(visit.placeDefinition.path, visit.placeDefinition.getFormattedRouteParameters(visit))
549
- ];
550
- };
454
+ InteractionRouteMediator.prototype.onActivityStarted =
455
+ // If we're not in a navigation we push
456
+ // @Trace()
551
457
  /**
552
- * @param {?} visit
553
- * @return {?}
554
- */
555
- UrlHelper.prototype.createRedirectCommandsFor = /**
556
- * @param {?} visit
557
458
  * @return {?}
558
459
  */
559
- function (visit) {
560
- /** @type {?} */
561
- var segments = this.updateVisitSegments(visit);
562
- /** @type {?} */
563
- var commands = [];
564
- segments.forEach((/**
565
- * @param {?} s
566
- * @return {?}
567
- */
568
- function (s) {
569
- commands.push(s.path);
570
- if (s.parameterMap.keys.length > 0) {
571
- commands.push(s.parameters);
572
- }
573
- }));
574
- return commands;
460
+ function () {
461
+ var _a;
462
+ if (!this.isNavigating) {
463
+ this.router.navigate(['.', {
464
+ outlets: (_a = {},
465
+ _a[PlaceRouter.INTERACTION_ROUTER_OUTLET] = ['modal'] // "open" must be a valid route for this outlet.
466
+ ,
467
+ _a)
468
+ }], {
469
+ replaceUrl: false
470
+ });
471
+ }
575
472
  };
473
+ // @Trace()
474
+ // @Trace()
576
475
  /**
577
- * @param {?} placeDef
578
476
  * @return {?}
579
477
  */
580
- UrlHelper.prototype.includesPathOf = /**
581
- * @param {?} placeDef
478
+ InteractionRouteMediator.prototype.onActivityFinished =
479
+ // @Trace()
480
+ /**
582
481
  * @return {?}
583
482
  */
584
- function (placeDef) {
585
- return this.cloneUrlSegmentList().find((/**
586
- * @param {?} s
587
- * @return {?}
588
- */
589
- function (s) { return s.path === placeDef.path; }));
483
+ function () {
484
+ var _a;
485
+ if (!this.isNavigating) {
486
+ this.router.navigate(['.', {
487
+ outlets: (_a = {},
488
+ _a[PlaceRouter.INTERACTION_ROUTER_OUTLET] = null,
489
+ _a)
490
+ }], {
491
+ replaceUrl: true // remove the interaction from the history.
492
+ });
493
+ }
590
494
  };
591
- tslib_1.__decorate([
592
- Trace(),
593
- tslib_1.__metadata("design:type", Function),
594
- tslib_1.__metadata("design:paramtypes", [Visit]),
595
- tslib_1.__metadata("design:returntype", Array)
596
- ], UrlHelper.prototype, "createRedirectCommandsFor", null);
597
- return UrlHelper;
495
+ return InteractionRouteMediator;
598
496
  }());
599
- PlaceRouter.UrlHelper = UrlHelper;
497
+ PlaceRouter.InteractionRouteMediator = InteractionRouteMediator;
600
498
  if (false) {
601
- /**
602
- * @type {?}
603
- * @private
604
- */
605
- UrlHelper.prototype.urlTree;
499
+ /** @type {?} */
500
+ InteractionRouteMediator.prototype.navigationSessionModelActive;
501
+ /** @type {?} */
502
+ InteractionRouteMediator.prototype.router;
606
503
  }
607
504
  })(PlaceRouter || (PlaceRouter = {}));
608
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Utcm91dGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3BsYWNlLXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFHTCxhQUFhLEVBQ2IsZUFBZSxFQUNmLGVBQWUsRUFDZixNQUFNLEVBRU4sVUFBVSxFQUNWLGFBQWEsRUFFZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxNQUFNLEVBRU4sR0FBRyxFQUNILGdCQUFnQixFQUdoQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixLQUFLLEVBRU4sTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7Ozs7O0lBRzFCLFlBQVksR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDO0FBRW5FO0lBR2lDLHVDQUFnQjtJQWEvQyxxQkFBNkIsTUFBYyxFQUNkLGFBQTRCLEVBQ3JDLGtCQUFzQyxFQUNyQyxlQUF5QixFQUN6QixZQUEwQjtRQUovQyxZQUtFLGlCQUFPLFNBaUNSO1FB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Q0FBQztnQkFDdEIsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNsQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDN0I7WUFDSCxDQUFDLEVBQUMsQ0FBQztZQUNILE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7Ozs7O1FBRUQsa0NBQWM7Ozs7UUFBZCxVQUFlLFFBQXlCO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsSUFBSTs7OztZQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSSxFQUF4QixDQUF3QixFQUFDLENBQUM7UUFDeEUsQ0FBQztRQWZEO1lBREMsS0FBSyxFQUFFOztxREFDeUIsS0FBSzs7a0VBV3JDO1FBTUgsZ0JBQUM7S0FBQSxBQXpERCxJQXlEQztJQXpEWSxxQkFBUyxZQXlEckIsQ0FBQTs7Ozs7O1FBdkRhLDRCQUF3Qjs7QUF3RHhDLENBQUMsRUE3RGdCLFdBQVcsS0FBWCxXQUFXLFFBNkQzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFjdGl2YXRlZFJvdXRlLFxuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBOYXZpZ2F0aW9uRW5kLFxuICBOYXZpZ2F0aW9uRXJyb3IsIE5hdmlnYXRpb25FeHRyYXMsXG4gIE5hdmlnYXRpb25TdGFydCxcbiAgUm91dGVyLFxuICBSb3V0ZXJTdGF0ZVNuYXBzaG90LFxuICBVcmxTZWdtZW50LFxuICBVcmxTZXJpYWxpemVyLFxuICBVcmxUcmVlXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIEJvb2xlYW5WYWx1ZU1vZGVsQ2hhaW4sXG4gIERzbCxcbiAgR2FyYmFnZUNvbGxlY3RvcixcbiAgSGFzT25lSW5kZXhDaGFpbixcbiAgTGlzdE1vZGVsLFxuICBMb2dnZXIsXG4gIE11dGFibGVMaXN0TW9kZWwsXG4gIE11dGFibGVWYWx1ZU1vZGVsLFxuICBUcmFjZSxcbiAgVmFsdWVNb2RlbFxufSBmcm9tICdAY29vbG9uL3BlY3Rpbic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25Db250ZXh0IH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24tY29udGV4dCc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU2Vzc2lvbiB9IGZyb20gJy4vbmF2aWdhdGlvbi1zZXNzaW9uJztcbmltcG9ydCB7IFBsYWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbGFjZS1jb21wb25lbnQnO1xuaW1wb3J0IHsgUGxhY2VEZWZpbml0aW9uIH0gZnJvbSAnLi9wbGFjZS1kZWZpbml0aW9uJztcbmltcG9ydCB7IFBsYWNlSGlzdG9yeSB9IGZyb20gJy4vcGxhY2UtaGlzdG9yeSc7XG5pbXBvcnQgeyBOb29wR2F0ZXdheVBsYWNlIH0gZnJvbSAnLi9wbGFjZXMvbm9vcC1nYXRld2F5LXBsYWNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWaXNpdCB9IGZyb20gJy4vdmlzaXQnO1xuXG5cbmNvbnN0IG5vb3BQbGFjZURlZiA9IFBsYWNlQ29tcG9uZW50LmdldERlZmluaXRpb24oTm9vcEdhdGV3YXlQbGFjZSk7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBsYWNlUm91dGVyIGV4dGVuZHMgR2FyYmFnZUNvbGxlY3RvciB7XG5cbiAgcHJpdmF0ZSBmaXJzdFJvdXRlID0gdHJ1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsPE5hdmlnYXRpb25TZXNzaW9uPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hY3RpdmVWaXNpdHMgPSBuZXcgTXV0YWJsZUxpc3RNb2RlbDxWaXNpdD4oKTtcblxuICByZWFkb25seSBuYXZpZ2F0aW9uU2Vzc2lvbkFjdGl2ZTogQm9vbGVhblZhbHVlTW9kZWxDaGFpbjtcbiAgcmVhZG9ubHkgYWN0aXZlVmlzaXRJbmRleDogSGFzT25lSW5kZXhDaGFpbjwncGxhY2VEZWZpbml0aW9uJywgVmlzaXQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IG5hdmlnYXRpb25TZXNzaW9uRmFjdG9yeTogTmF2aWdhdGlvblNlc3Npb24uRmFjdG9yeTtcbiAgcHJpdmF0ZSBpbml0aWFsUmVkaXJlY3RTdGFydGVkID0gZmFsc2U7XG4gIHByaXZhdGUgaW5pdGlhbFJlZGlyZWN0RmluaXNoZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHVybFNlcmlhbGl6ZXI6IFVybFNlcmlhbGl6ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgaW50ZXJhY3Rpb25Db250ZXh0OiBJbnRlcmFjdGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgIHJlYWRvbmx5IGFuZ3VsYXJMb2NhdGlvbjogTG9jYXRpb24sXG4gICAgICAgICAgICAgIHJlYWRvbmx5IHBsYWNlSGlzdG9yeTogUGxhY2VIaXN0b3J5KSB7XG4gICAgc3VwZXIoKTtcbiAgICBjb25zdCB7IGNoYWluLCB2YWx1ZU9mLCBiZWZvcmUsIHdoZW4sIGFmdGVyLCBvYnNlcnZlLCBzd2l0Y2hPbiB9ID0gRHNsLmRpc3Bvc2VXaXRoKHRoaXMpO1xuICAgIHRoaXMuYWN0aXZlVmlzaXRJbmRleCA9IGNoYWluKHRoaXMuX2FjdGl2ZVZpc2l0cykuaW5kZXhCeSgncGxhY2VEZWZpbml0aW9uJyk7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbkZhY3RvcnkgPSBuZXcgTmF2aWdhdGlvblNlc3Npb24uRmFjdG9yeShpbnRlcmFjdGlvbkNvbnRleHQpO1xuICAgIGFuZ3VsYXJMb2NhdGlvbi5vblVybENoYW5nZSh1cmwgPT4ge1xuICAgICAgY29uc29sZS5sb2coYGxvY2F0aW9uLm9uVXJsQ2hhbmdlIC0+ICR7dXJsfWApO1xuICAgIH0pO1xuXG4gICAgLy8gVE9ETzogbWFrZSBzZXR1cCB0aGUgY2FsbGJhY2tzIGluIGR1cmluZyBtb2R1bGUgaW5pdGlhdGlvbiB0byBtYWtlIHRoaXMgdGVzdGFibGUuXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAvLyBSb3V0aW5nIGV2ZW50IHNlcXVlbmNlXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBOYXZpZ2F0aW9uU3RhcnQgLT4gLi4uLiAtPiBOYXZpZ2F0aW9uQ2FuY2VsIC0tPiByZWRpcmVjdCwgZ28gYXJvdW5kIGFnYWluIGluIHRoZSBzYW1lIHNlc3Npb25cbiAgICAgIC8vIE5hdmlnYXRpb25TdGFydCAtPiAuLi4uIC0+IE5hdmlnYXRpb25FbmQgLS0+IG5hdmlnYXRpb24gY29tcGxldGUsIGVuZCBzZXNzaW9uLlxuICAgICAgLy8gTmF2aWdhdGlvblN0YXJ0IC0+IC4uLi4gLT4gTmF2aWdhdGlvbkVycm9yIC0tPiBuYXZpZ2F0aW9uIGNhbmNlbGVkLCBlbmQgc2Vzc2lvbi5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQpIHtcbiAgICAgICAgdGhpcy5vbkFuZ3VsYXJSb3V0ZXJTdGFydGVkKGV2ZW50KTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgdGhpcy5vbkFuZ3VsYXJSb3V0ZXJGaW5pc2hlZChmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcbiAgICAgICAgdGhpcy5vbkFuZ3VsYXJSb3V0ZXJGaW5pc2hlZCh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubmF2aWdhdGlvblNlc3Npb25BY3RpdmUgPSBjaGFpbih0aGlzLm5hdmlnYXRpb25TZXNzaW9uTW9kZWwpLmlzTm90TmlsKCk7XG4gICAgdGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbkFjdGl2ZS5zdWJzY3JpYmUoYWN0aXZlID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCduYXZpZ2F0aW9uU2Vzc2lvbkFjdGl2ZScsIGFjdGl2ZSk7XG4gICAgfSk7XG4gICAgLy8gY29uc3QgdHhvID0gbmV3IFRyYW5zYWN0aW9uT2JzZXJ2ZXIoKS5vbkV2ZW50KGUgPT4gY29uc29sZS5sb2coZS50b1N0cmluZygpKSk7XG4gICAgLy8gdHhvLm9ic2VydmUoJ3RoaXMubmF2aWdhdGlvblNlc3Npb25Nb2RlbCcsIHRoaXMubmF2aWdhdGlvblNlc3Npb25Nb2RlbCk7XG4gIH1cblxuICBnZXQgbmF2aWdhdGlvblNlc3Npb24oKTogTmF2aWdhdGlvblNlc3Npb24ge1xuICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnZhbHVlO1xuICB9XG5cbiAgZ2V0IG5hdmlnYXRpb25TZXNzaW9uTW9kZWwoKTogVmFsdWVNb2RlbDxOYXZpZ2F0aW9uU2Vzc2lvbj4ge1xuICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnJlYWRvbmx5O1xuICB9XG5cbiAgZ2V0IGFjdGl2ZVZpc2l0cygpOiBMaXN0TW9kZWw8VmlzaXQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlVmlzaXRzLnJlYWRvbmx5O1xuICB9XG5cbiAgLyoqXG4gICAqICBwbGFjZVJvdXRlci5uYXZpZ2F0ZShwbGFjZURlc3RpbmF0aW9ucy5zb21lUGxhY2UuY3JlYXRlVmlzaXQocm91dGVJZCwgLi4udmlzaXRQYXJhbXMpKTtcbiAgICogQHBhcmFtIHZpc2l0XG4gICAqL1xuICBAVHJhY2UoKVxuICBhc3luYyBuYXZpZ2F0ZSh2aXNpdDogVmlzaXQsIG9wdGlvbnM/OiB7IHJlbGF0aXZlVG86IEFjdGl2YXRlZFJvdXRlIH0pIHtcbiAgICB0aGlzLmRvTmF2aWdhdGlvbih2aXNpdCwgYXN5bmMgcm91dGVyID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgICAgICB2aXNpdC5wbGFjZURlZmluaXRpb24ucGF0aCxcbiAgICAgICAgLi4udGhpcy5jcmVhdGVSb3V0ZVBhcmFtZXRlcnModmlzaXQpXG4gICAgICBdO1xuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoY29tbWFuZHMsIHtcbiAgICAgICAgcmVsYXRpdmVUbzogb3B0aW9ucyA/IG9wdGlvbnMucmVsYXRpdmVUbyA6IG51bGxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlUmVkaXJlY3RGb3IodmlzaXQ6VmlzaXQsIG5hdmlnYXRpb25FeHRyYXM/OiBOYXZpZ2F0aW9uRXh0cmFzKSB7XG4gICAgcmV0dXJuIHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUodGhpcy5jcmVhdGVSb3V0ZVBhcmFtZXRlcnModmlzaXQpLCBuYXZpZ2F0aW9uRXh0cmFzKTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG4gIGFzeW5jIHB1c2hWaXNpdENoYW5nZXNUb1JvdXRlKGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgcHJldmlvdXM6IFZpc2l0LCBuZXh0OiBWaXNpdCkge1xuXG4gICAgLy8gd2UgaGF2ZSB0byBwdXNoIHRvIGhpc3Rvcnkgc28gb3VyIHJlbWVtYmVyIHNhbml0aXNlcnMgZG9uJ3QgcGljayB1cCB0aGUgcHJldmlvdXMgdmFsdWVcbiAgICAvLyB3aGVuIGl0J3MgYmVlbiBjbGVhcmVkIGJ5IHRoZSB1c2VyLlxuICAgIHRoaXMucGxhY2VIaXN0b3J5LmFkZChuZXh0KTtcblxuICAgIC8vIEZJWE1FOiBubyByb3V0ZSBpZCAtPiByb3V0ZSBpZCBkdXBsaWNhdGVzIHJvdXRlIHBhcmFtZXRlcnNcbiAgICBpZiAobmV4dC5oYXNSb3V0aW5nQ2hhbmdlZEZyb20ocHJldmlvdXMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb05hdmlnYXRpb24obmV4dCwgcm91dGVyID0+IHtcbiAgICAgICAgY29uc3QgY29tbWFuZHMgPSB0aGlzLnBhcnNlVXJsKHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90KS5jcmVhdGVSZWRpcmVjdENvbW1hbmRzRm9yKG5leHQpO1xuICAgICAgICAvLyAvLyB3ZSBoYXZlIHRvIHRvIHVzZSB0aGUgZGVmaW5pdGlvbiBmb3Igcm91dGUgaWQgYXMgb3VyIHJlZGlyZWN0aW9uIGFsd2F5cyBpbmNsdWRlc1xuICAgICAgICAvLyAvLyB0aGUgaWQgaW4gdGhlIHVybCBzZWdlbWVudHMgKGJ1dCBsZWF2ZXMgaXQgYmxhbmsgd2hlbiB0aGVyZSdzIG5vIGlkKS4gSS5lLiBpbiB0aGVcbiAgICAgICAgLy8gLy8gbm8gaWQgY2FzZSB3ZSdyZSBkb2luZyB0aGUgZm9sbG93aW5nIHJlZGlyZWN0IFs8cGxhY2VQYXRoPiwgXCJcIl0gLT4gW1wiLi5cIiwgPGlkPl1cbiAgICAgICAgLy8gY29uc3QgcmVsYXRpdmVQYXRoID0gISFwcmV2aW91cy5wbGFjZURlZmluaXRpb24uaGFzUm91dGVJZCgpID8gJy4uJyA6ICcuJztcbiAgICAgICAgLy8gY29uc3QgY29tbWFuZHMgPSBbXG4gICAgICAgIC8vICAgcmVsYXRpdmVQYXRoLFxuICAgICAgICAvLyAgIC4uLnRoaXMuY3JlYXRlUm91dGVQYXJhbWV0ZXJzKG5leHQpLFxuICAgICAgICAvLyAgIC4uLnRoaXMuZXh0cmFjdENoaWxkUGF0aChhY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdClcbiAgICAgICAgLy8gXTtcbiAgICAgICAgY29uc29sZS5sb2coJyMjIyBQdXNoIENoYW5nZXMgdG8gcm91dGUgUmVkaXJlY3QnLCB7IGNvbW1hbmRzIH0pO1xuICAgICAgICByZXR1cm4gcm91dGVyLm5hdmlnYXRlKGNvbW1hbmRzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRvTmF2aWdhdGlvbih2aXNpdDogVmlzaXQsIGN1c3RvbU5hdmlnYXRpb246IChyb3V0ZXI6IFJvdXRlcikgPT4gYW55KSB7XG4gICAgdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZSA9IHRoaXMubmF2aWdhdGlvblNlc3Npb25GYWN0b3J5LmNyZWF0ZUludGVybmFsKHZpc2l0KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY3VzdG9tTmF2aWdhdGlvbih0aGlzLnJvdXRlcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJvdXRlciBoYXMgZmluaXNoZWQgKHNpbmNlIHRoZXJlIHdhcyBubyByb3V0ZXIgY2hhbmdlIHJlcXVpcmVkKSBzbyB3ZVxuICAgICAgLy8gbmVlZCB0byBlbmQgdGhlIG5hdmlnYXRpb24gc2Vzc2lvbi5cbiAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25TZXNzaW9uICYmICF0aGlzLnJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbigpKSB7XG4gICAgICAgIHRoaXMub25Bbmd1bGFyUm91dGVyRmluaXNoZWQoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUm91dGVQYXJhbWV0ZXJzKHZpc2l0OiBWaXNpdCkge1xuICAgIGNvbnN0IGRlZiA9IHZpc2l0LnBsYWNlRGVmaW5pdGlvbjtcbiAgICByZXR1cm4gdmlzaXQuaGFzUm91dGVJZCgpID9cbiAgICAgIFtkZWYuZ2V0Rm9ybWF0dGVkUm91dGVJZCh2aXNpdCksIGRlZi5nZXRGb3JtYXR0ZWRSb3V0ZVBhcmFtZXRlcnModmlzaXQpXSA6XG4gICAgICBbZGVmLmdldEZvcm1hdHRlZFJvdXRlUGFyYW1ldGVycyh2aXNpdCldO1xuICB9XG5cbiAgLy8gQFRyYWNlKClcbiAgcHJpdmF0ZSBvbkFuZ3VsYXJSb3V0ZXJTdGFydGVkKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpIHtcbiAgICBpZiAoIXRoaXMubmF2aWdhdGlvblNlc3Npb24pIHsgLy8gV2UgYmVlbiBhY3RpdmF0ZWQgYnkgYW4gZXh0ZXJuYWwgcm91dGUgcmF0aGVyIHRoYW4gcGxhY2VSb3V0ZXIuZ28odmlzaXQpXG4gICAgICBjb25zb2xlLmxvZygnbmF2aWdhdGlvbiBzdGFydGVkJywgeyBmaXJzdFRpbWU6IHRoaXMuZmlyc3RSb3V0ZSB9KTtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLm5hdmlnYXRpb25TZXNzaW9uRmFjdG9yeS5jcmVhdGVFeHRlcm5hbCh0aGlzLmZpcnN0Um91dGUpO1xuICAgICAgaWYgKGV2ZW50Lm5hdmlnYXRpb25UcmlnZ2VyID09PSAncG9wc3RhdGUnKSB7XG4gICAgICAgIHNlc3Npb24uc2V0UG9wc3RhdGVSZXR1cm5VcmwodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWUgPSBzZXNzaW9uO1xuICAgIH1cbiAgICB0aGlzLmZpcnN0Um91dGUgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG4gIHByaXZhdGUgb25Bbmd1bGFyUm91dGVyRmluaXNoZWQoY2FuY2VsbGVkOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWU7XG4gICAgaWYgKCFjYW5jZWxsZWQpIHtcbiAgICAgIC8vIFVwZGF0ZSB2aXNpdHMgYmVmb3JlIHdlIGVuZCB0aGUgbmF2aWdhdGlvbiBzZXNzaW9uLiAgVGhpcyBhbGxvd3MgdGhlIHBsYWNlT3V0ZXRzIHRvXG4gICAgICAvLyBpZ25vcmUgdmlzaXQgY2hhbmdlcyB0aGF0IG9jY3VyIHdoaWxlIHRoZSBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzXG4gICAgICBjb25zdCB2aXNpdHMgPSBzZXNzaW9uLmdldFZpc2l0cygpO1xuICAgICAgdmlzaXRzLmZvckVhY2godiA9PiB0aGlzLnBsYWNlSGlzdG9yeS5hZGQodikpO1xuICAgICAgdGhpcy5fYWN0aXZlVmlzaXRzLnZhbHVlID0gdmlzaXRzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBbmd1bGFyIGRvZXNuJ3QgcHJlc2VydmUgdGhlIHVybCB3aGVuIGEgZ3VhcmQgY2FuY2VscyB0aGUgYmFjayBidXR0b24uXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM1ODYjaXNzdWVjb21tZW50LTQzMjc5NTcyMFxuICAgICAgaWYgKHNlc3Npb24uaXNQb3BTdGF0ZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnY2FuY2VsbGVkIGR1cmluZyBwb3BzdGF0ZScpO1xuICAgICAgICB0aGlzLmFuZ3VsYXJMb2NhdGlvbi5nbyhzZXNzaW9uLnBvcFN0YXRlUmV0dXJuVXJsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZSA9IG51bGw7XG4gIH1cblxuICBleHRyYWN0Q2hpbGRQYXRoKGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogYW55W10ge1xuICAgIHJldHVybiBfLmZsYXR0ZW4oYWN0aXZhdGVkUm91dGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IGNoaWxkLnVybCkpO1xuICB9XG5cbiAgcGFyc2VVcmwoc25hcHNob3Q6IFJvdXRlclN0YXRlU25hcHNob3QpOiBQbGFjZVJvdXRlci5VcmxIZWxwZXIge1xuICAgIHJldHVybiBuZXcgUGxhY2VSb3V0ZXIuVXJsSGVscGVyKHRoaXMudXJsU2VyaWFsaXplci5wYXJzZShzbmFwc2hvdC51cmwpKTtcbiAgfVxuXG4gIC8vIFRPRE86IHRoaXMgYWxsIG9ubHkgc29ydCBvZiB3b3Jrcy4gIE9wZW5pbmcgZGlhbG9ncyBhbmQgY2xpY2tpbmcgYmFjayBtdWx0aXBsZSB0aW1lcyBicmVha3MgdGhpbmdzLlxuICAvLyBUT0RPOiBuZXh0IHN0YWdlIGlzIHRvIGludmVzdGlnYXRlIHRyYWNraW5nIGRpYWxvZyBzdGF0ZSBpbiBhIGRpZmZlcmVudCBwbGFjZW91dGxldCBhbmQga2VlcGluZyB0aG9zZVxuICAvLyBUT0RPOiB1cmxzIG91dCBvZiB0aGUgaGlzdG9yeS5cbiAgcGVyZm9ybUluaXRpYWxOYXZpZ2F0aW9uSW50ZXJjZXB0KGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCkge1xuICAgIGFzc2VydC5pc1RydXRoeSh0aGlzLmlzSW5pdGlhbE5hdmlnYXRpb24oKSk7XG4gICAgTG9nZ2VyLmdldCh0aGlzKS5pbmZvKGBSZWRpcmVjdGluZyB0bzogJHtub29wUGxhY2VEZWYucGF0aH1gLCB7IHJldHVyblVybDogc3RhdGUudXJsIH0pO1xuICAgIGlmICghdGhpcy5pbml0aWFsUmVkaXJlY3RGaW5pc2hlZCkge1xuICAgICAgdGhpcy5pbml0aWFsUmVkaXJlY3RGaW5pc2hlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbbm9vcFBsYWNlRGVmLnBhdGgsIHtcbiAgICAgICAgcmV0dXJuVXJsOiBzdGF0ZS51cmxcbiAgICAgIH1dLCB7XG4gICAgICAgIHJlcGxhY2VVcmw6IHRydWUsIC8vIG1ha2Ugc3VyZSB3ZSB1cGRhdGUgb3VyIGhpc3RvcnlcbiAgICAgICAgc2tpcExvY2F0aW9uQ2hhbmdlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNJbml0aWFsTmF2aWdhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbi5maXJzdE5hdmlnYXRpb24gJiYgIXRoaXMuaW5pdGlhbFJlZGlyZWN0RmluaXNoZWQ7XG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBQbGFjZVJvdXRlciB7XG5cblxuICBleHBvcnQgY2xhc3MgVXJsSGVscGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdXJsVHJlZTogVXJsVHJlZSkge1xuICAgICAgY29uc29sZS5sb2coeyBzZWdtZW50czogdGhpcy51cmxUcmVlLnJvb3QuY2hpbGRyZW4ucHJpbWFyeS5zZWdtZW50cyB9KTtcbiAgICB9XG5cbiAgICBjbG9uZVVybFNlZ21lbnRMaXN0KCk6IFVybFNlZ21lbnRbXSB7XG4gICAgICByZXR1cm4gWy4uLnRoaXMudXJsVHJlZS5yb290LmNoaWxkcmVuLnByaW1hcnkuc2VnbWVudHNdO1xuICAgIH1cblxuICAgIHVwZGF0ZVZpc2l0U2VnbWVudHModmlzaXQ6IFZpc2l0KTogVXJsU2VnbWVudFtdIHtcbiAgICAgIC8vIFVnbHksIGJ1dCBpdCB3b3JrcyBmb3Igbm93LlxuICAgICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLmNsb25lVXJsU2VnbWVudExpc3QoKTtcbiAgICAgIGNvbnN0IHZpc2l0U2VnbWVudHMgPSB0aGlzLmNvbnZlcnRUb1VybFNlZ21lbnRzKHZpc2l0KTtcbiAgICAgIGNvbnN0IHJlcGxhY2VBdCA9IHNlZ21lbnRzLmZpbmRJbmRleChzZWdtZW50ID0+IHNlZ21lbnQucGF0aCA9PT0gdmlzaXRTZWdtZW50c1swXS5wYXRoKTtcbiAgICAgIC8vIGRvIG5vdCB1c2UgdGhlIHJldHVybiB2YWx1ZSwgaXQncyB0aGUgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQhXG4gICAgICBzZWdtZW50cy5zcGxpY2UocmVwbGFjZUF0LCB2aXNpdFNlZ21lbnRzLmxlbmd0aCwgLi4udmlzaXRTZWdtZW50cyk7XG4gICAgICByZXR1cm4gc2VnbWVudHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIHZpc2l0IGludG8gc2VnbWVudHMuICBQbGVhc2Ugbm90IHRoYXQgdGhlc2Ugc2VnbWVudHMgYXJlIG5vdCBlXG4gICAgICogQHBhcmFtIHZpc2l0XG4gICAgICovXG4gICAgY29udmVydFRvVXJsU2VnbWVudHModmlzaXQ6IFZpc2l0KTogVXJsU2VnbWVudFtdIHtcbiAgICAgIHJldHVybiB2aXNpdC5wbGFjZURlZmluaXRpb24uaGFzUm91dGVJZCgpID9cbiAgICAgICAgW1xuICAgICAgICAgIC8vIE5PVEU6XG4gICAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gYXR0YWNoIHRoZSBwYXJhbXMgdG8gdGhlIHJvb3QgcGF0aCBhbmQgbm90IHRoZSBpZC4gIElmIHdlIGF0dGFjaCB0aGVtXG4gICAgICAgICAgLy8gdG8gYW4gZW1wdHkgaWQgdGhlbiB0aGUgYW5ndWxhciByb3V0ZXIgd29uJ3QgbWF0Y2ggdGhlIHBhdHRlcm4uXG4gICAgICAgICAgbmV3IFVybFNlZ21lbnQodmlzaXQucGxhY2VEZWZpbml0aW9uLnBhdGgsIHZpc2l0LnBsYWNlRGVmaW5pdGlvbi5nZXRGb3JtYXR0ZWRSb3V0ZVBhcmFtZXRlcnModmlzaXQpKSxcbiAgICAgICAgICBuZXcgVXJsU2VnbWVudCh2aXNpdC5wbGFjZURlZmluaXRpb24uZ2V0Rm9ybWF0dGVkUm91dGVJZCh2aXNpdCksIHt9KV1cbiAgICAgICAgOlxuICAgICAgICBbXG4gICAgICAgICAgbmV3IFVybFNlZ21lbnQodmlzaXQucGxhY2VEZWZpbml0aW9uLnBhdGgsIHZpc2l0LnBsYWNlRGVmaW5pdGlvbi5nZXRGb3JtYXR0ZWRSb3V0ZVBhcmFtZXRlcnModmlzaXQpKVxuICAgICAgICBdO1xuICAgIH1cblxuXG4gICAgQFRyYWNlKClcbiAgICBjcmVhdGVSZWRpcmVjdENvbW1hbmRzRm9yKHZpc2l0OiBWaXNpdCk6IGFueVtdIHtcblxuICAgICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnVwZGF0ZVZpc2l0U2VnbWVudHModmlzaXQpO1xuICAgICAgY29uc3QgY29tbWFuZHMgPSBbXTtcbiAgICAgIHNlZ21lbnRzLmZvckVhY2gocyA9PiB7XG4gICAgICAgIGNvbW1hbmRzLnB1c2gocy5wYXRoKTtcbiAgICAgICAgaWYgKHMucGFyYW1ldGVyTWFwLmtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbW1hbmRzLnB1c2gocy5wYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29tbWFuZHM7XG4gICAgfVxuXG4gICAgaW5jbHVkZXNQYXRoT2YocGxhY2VEZWY6IFBsYWNlRGVmaW5pdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuY2xvbmVVcmxTZWdtZW50TGlzdCgpLmZpbmQocyA9PiBzLnBhdGggPT09IHBsYWNlRGVmLnBhdGgpO1xuICAgIH1cblxuICB9XG59XG4iXX0=
505
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Utcm91dGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3BsYWNlLXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFHTCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGVBQWUsRUFDZixlQUFlLEVBQ2YsTUFBTSxFQUVOLGFBQWEsRUFDZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxNQUFNLEVBQ04sR0FBRyxFQUNILGdCQUFnQixFQUVoQixJQUFJLEVBRUosTUFBTSxFQUNOLGdCQUFnQixFQUNoQixpQkFBaUIsRUFFbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDNUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQUk3QztJQUdpQyx1Q0FBZ0I7SUFXL0MscUJBQTZCLE1BQWMsRUFDZCxhQUE0QixFQUM1QixlQUF5QixFQUN6QixZQUEwQixFQUMxQix1QkFBZ0Q7UUFKN0UsWUFLRSxpQkFBTyxTQTRDUjtRQWpENEIsWUFBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1CQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHFCQUFlLEdBQWYsZUFBZSxDQUFVO1FBQ3pCLGtCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLDZCQUF1QixHQUF2Qix1QkFBdUIsQ0FB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Q0FBQyx5QkFBeUIsSUFBRyxJQUFJOytCQUM5QztxQkFDRixDQUFDLEVBQUU7b0JBQ0YsVUFBVSxFQUFFLElBQUksQ0FBQywyQ0FBMkM7aUJBQzdELENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQztRQUVILCtCQUFDO0lBQUQsQ0FBQyxBQW5DRCxJQW1DQztJQW5DWSxvQ0FBd0IsMkJBbUNwQyxDQUFBOzs7UUFsQ2EsZ0VBQTBEOztRQUFFLDBDQUF1Qjs7QUFvQ25HLENBQUMsRUF6Q2dCLFdBQVcsS0FBWCxXQUFXLFFBeUMzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFjdGl2YXRlZFJvdXRlLFxuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBOYXZpZ2F0aW9uQ2FuY2VsLFxuICBOYXZpZ2F0aW9uRW5kLFxuICBOYXZpZ2F0aW9uRXJyb3IsXG4gIE5hdmlnYXRpb25TdGFydCxcbiAgUm91dGVyLFxuICBSb3V0ZXJTdGF0ZVNuYXBzaG90LFxuICBVcmxTZXJpYWxpemVyXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIERzbCxcbiAgR2FyYmFnZUNvbGxlY3RvcixcbiAgSGFzT25lSW5kZXhDaGFpbixcbiAgbGFuZyxcbiAgTGlzdE1vZGVsLFxuICBMb2dnZXIsXG4gIE11dGFibGVMaXN0TW9kZWwsXG4gIE11dGFibGVWYWx1ZU1vZGVsLFxuICBWYWx1ZU1vZGVsXG59IGZyb20gJ0Bjb29sb24vcGVjdGluJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbkNvbnRleHQgfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi1jb250ZXh0JztcbmltcG9ydCB7IE1vZGFsSW50ZXJhY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vc2VydmljZXMvbW9kYWwtaW50ZXJhY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU3RhdGUgfSBmcm9tICcuL2d1YXJkcy9uYXZpZ2F0aW9uLXN0YXRlJztcbmltcG9ydCB7IFBsYWNlSGlzdG9yeSB9IGZyb20gJy4vcGxhY2UtaGlzdG9yeSc7XG5pbXBvcnQgeyBVcmxTbmFwc2hvdCB9IGZyb20gJy4vdXJsLXNuYXBzaG90JztcbmltcG9ydCB7IFZpc2l0IH0gZnJvbSAnLi92aXNpdCc7XG5cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGxhY2VSb3V0ZXIgZXh0ZW5kcyBHYXJiYWdlQ29sbGVjdG9yIHtcblxuICBwcml2YXRlIGZpcnN0Um91dGUgPSB0cnVlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX25hdmlnYXRpb25TZXNzaW9uTW9kZWwgPSBuZXcgTXV0YWJsZVZhbHVlTW9kZWw8TmF2aWdhdGlvblN0YXRlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hY3RpdmVWaXNpdHMgPSBuZXcgTXV0YWJsZUxpc3RNb2RlbDxWaXNpdD4oKTtcblxuICByZWFkb25seSBuYXZpZ2F0aW9uU2Vzc2lvbkFjdGl2ZTogVmFsdWVNb2RlbDxib29sZWFuPjtcbiAgcmVhZG9ubHkgYWN0aXZlVmlzaXRJbmRleDogSGFzT25lSW5kZXhDaGFpbjwncGxhY2VEZWZpbml0aW9uJywgVmlzaXQ+O1xuICBwcml2YXRlIF9uYXZpZ2F0aW9uU2Vzc2lvbkNvbnRleHQ6IE5hdmlnYXRpb25TdGF0ZS5Db250ZXh0O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdXJsU2VyaWFsaXplcjogVXJsU2VyaWFsaXplcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhbmd1bGFyTG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHBsYWNlSGlzdG9yeTogUGxhY2VIaXN0b3J5LFxuICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsSW50ZXJhY3Rpb25TZXJ2aWNlOiBNb2RhbEludGVyYWN0aW9uU2VydmljZSkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3QgeyBjaGFpbiwgdmFsdWVPZiwgYmVmb3JlLCB3aGVuLCBhZnRlciwgb2JzZXJ2ZSwgc3dpdGNoT24gfSA9IERzbC5kaXNwb3NlV2l0aCh0aGlzKTtcbiAgICB0aGlzLmFjdGl2ZVZpc2l0SW5kZXggPSBjaGFpbih0aGlzLl9hY3RpdmVWaXNpdHMpLmluZGV4QnkoJ3BsYWNlRGVmaW5pdGlvbicpO1xuICAgIHRoaXMubmF2aWdhdGlvblNlc3Npb25BY3RpdmUgPSBjaGFpbih0aGlzLm5hdmlnYXRpb25TZXNzaW9uTW9kZWwpLnBsdWNrKCdhY3RpdmUnKTtcbiAgICB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbkNvbnRleHQgPSBuZXcgTmF2aWdhdGlvblN0YXRlLkNvbnRleHQodGhpcy5yb3V0ZXIsIHRoaXMubW9kYWxJbnRlcmFjdGlvblNlcnZpY2UsIHRoaXMuYW5ndWxhckxvY2F0aW9uLCBzZXNzaW9uID0+IHtcbiAgICAgIHRoaXMucHJvY2Vzc05hdmlnYXRpb25TdWNjZXNzKHNlc3Npb24pO1xuICAgIH0pO1xuICAgIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWUgPSBuZXcgTmF2aWdhdGlvblN0YXRlLklkbGUodGhpcy5fbmF2aWdhdGlvblNlc3Npb25Db250ZXh0KTtcblxuICAgIC8vIFRPRE86IG1ha2Ugc2V0dXAgdGhlIGNhbGxiYWNrcyBpbiBkdXJpbmcgbW9kdWxlIGluaXRpYXRpb24gdG8gbWFrZSB0aGlzIHRlc3RhYmxlLlxuICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgLy8gUm91dGluZyBldmVudCBzZXF1ZW5jZVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gTmF2aWdhdGlvblN0YXJ0IC0+IC4uLi4gLT4gTmF2aWdhdGlvbkNhbmNlbCAtLT4gcmVkaXJlY3QsIGdvIGFyb3VuZCBhZ2FpbiBpbiB0aGUgc2FtZSBzZXNzaW9uXG4gICAgICAvLyBOYXZpZ2F0aW9uU3RhcnQgLT4gLi4uLiAtPiBOYXZpZ2F0aW9uRW5kIC0tPiBuYXZpZ2F0aW9uIGNvbXBsZXRlLCBlbmQgc2Vzc2lvbi5cbiAgICAgIC8vIE5hdmlnYXRpb25TdGFydCAtPiAuLi4uIC0+IE5hdmlnYXRpb25FcnJvciAtLT4gbmF2aWdhdGlvbiBhYm9ydGVkLCBlbmQgc2Vzc2lvbi5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQpIHtcbiAgICAgICAgdGhpcy5ydW5TdGF0ZVRyYW5zaXRpb24oc2Vzc2lvbiA9PiBzZXNzaW9uLm9uU3RhcnQoZXZlbnQpKTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgdGhpcy5ydW5TdGF0ZVRyYW5zaXRpb24oc2Vzc2lvbiA9PiBzZXNzaW9uLm9uRW5kKGV2ZW50KSk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcbiAgICAgICAgdGhpcy5ydW5TdGF0ZVRyYW5zaXRpb24oc2Vzc2lvbiA9PiBzZXNzaW9uLm9uRXJyb3IoZXZlbnQpKTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25DYW5jZWwpIHtcbiAgICAgICAgdGhpcy5ydW5TdGF0ZVRyYW5zaXRpb24oc2Vzc2lvbiA9PiBzZXNzaW9uLm9uQ2FuY2VsKGV2ZW50KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBQdXNoIGRpYWxvZyBzdGF0ZSB0byB0aGUgdXJsIHNvIHdlIGNhbiBjYXB0dXJlIHRoZSBiYWNrIGJ1dHRvbi5cbiAgICB0aGlzLm1vZGFsSW50ZXJhY3Rpb25TZXJ2aWNlLmFkZEFjdGl2aXR5TGlzdGVuZXIobmV3IFBsYWNlUm91dGVyLkludGVyYWN0aW9uUm91dGVNZWRpYXRvcih0aGlzLm5hdmlnYXRpb25TZXNzaW9uQWN0aXZlLCB0aGlzLnJvdXRlcikpO1xuXG4gICAgLy8gVGhlIGFuZ3VsYXIgcm91dGVyIGRvZXNuJ3QgYWx3YXlzIGZpcmUgcm91dGVyIGV2ZW50cyB3aGVuIHRoZSBiYWNrIGJ1dHRvbiBpcyBwdXNoZWQgd2hpbGUgYSBuYXZpZ2F0aW9uXG4gICAgLy8gc2Vzc2lvbiBpcyBpbiBwcm9ncmVzcy4gIFNvbWV0aW1lcyB3ZSBvbmx5IGtub3cgYWJvdXQgaXQgZnJvbSB0aGUgdXJsIGNoYW5nZS5cbiAgICBhbmd1bGFyTG9jYXRpb24ub25VcmxDaGFuZ2UodXJsID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGAjIyMjIHVybCBjaGFuZ2VkIC0+YCwgeyB1cmwsIG5hdklzQWN0aXZlOiB0aGlzLm5hdmlnYXRpb25TZXNzaW9uQWN0aXZlLnZhbHVlIH0pO1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb25Db250ZXh0ID0gdGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbkFjdGl2ZS52YWx1ZSAmJiB0aGlzLm5hdmlnYXRpb25TZXNzaW9uLmludGVyYWN0aW9uQ29udGV4dDtcbiAgICAgIGlmIChpbnRlcmFjdGlvbkNvbnRleHQgJiYgaW50ZXJhY3Rpb25Db250ZXh0LmlzQWN0aXZlKCkpIHtcbiAgICAgICAgTG9nZ2VyLmdldCh0aGlzKS5pbmZvKGBiYWNrIGJ1dHRvbiBwcmVzc2VkIGR1cmluZyBuYXZpZ2F0aW9uIHNlc3Npb24gaW50ZXJhY3Rpb25gKTtcbiAgICAgICAgdGhpcy5ydW5TdGF0ZVRyYW5zaXRpb24obmF2aWdhdGlvblNlc3Npb24gPT4gbmF2aWdhdGlvblNlc3Npb24ub25CYWNrQ2xpY2tlZER1cmluZ05hdmlnYXRpb25JbnRlcmFjdGlvbih1cmwpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc05hdmlnYXRpb25TdWNjZXNzKHNlc3Npb246IE5hdmlnYXRpb25TdGF0ZSkge1xuICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSB2aXNpdHMgYmVmb3JlIHRoZSBzZXNzaW9uIGZpbmlzaGVzLiAgVGhpcyBhbGxvd3MgdGhlIHBsYWNlT3V0ZXRzIHRvIGlnbm9yZSB2aXNpdFxuICAgIC8vIGNoYW5nZXMgdGhhdCBvY2N1ciB3aGlsZSByb3V0ZXJOYXZpZ2F0aW9uQWN0aXZlIGlzIHRydWUuXG4gICAgYXNzZXJ0LmlzVHJ1dGh5KHRoaXMubmF2aWdhdGlvblNlc3Npb25BY3RpdmUudmFsdWUpO1xuICAgIGNvbnN0IHZpc2l0cyA9IHNlc3Npb24uZ2V0VmlzaXRzKCk7XG4gICAgdmlzaXRzLmZvckVhY2godiA9PiB0aGlzLnBsYWNlSGlzdG9yeS5hZGQodikpO1xuICAgIHRoaXMuX2FjdGl2ZVZpc2l0cy52YWx1ZSA9IHZpc2l0cztcbiAgfVxuXG4gIGdldCBuYXZpZ2F0aW9uU2Vzc2lvbigpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnZhbHVlO1xuICB9XG5cbiAgZ2V0IG5hdmlnYXRpb25TZXNzaW9uTW9kZWwoKTogVmFsdWVNb2RlbDxOYXZpZ2F0aW9uU3RhdGU+IHtcbiAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC5yZWFkb25seTtcbiAgfVxuXG4gIGdldCBhY3RpdmVWaXNpdHMoKTogTGlzdE1vZGVsPFZpc2l0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVZpc2l0cy5yZWFkb25seTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgcGxhY2VSb3V0ZXIubmF2aWdhdGUocGxhY2VEZXN0aW5hdGlvbnMuc29tZVBsYWNlLmNyZWF0ZVZpc2l0KHJvdXRlSWQsIC4uLnZpc2l0UGFyYW1zKSk7XG4gICAqIEBwYXJhbSB2aXNpdFxuICAgKi9cbiAgYXN5bmMgbmF2aWdhdGUodmlzaXQ6IFZpc2l0LCBvcHRpb25zPzogeyByZWxhdGl2ZVRvOiBBY3RpdmF0ZWRSb3V0ZSB9KSB7XG4gICAgdGhpcy5kb05hdmlnYXRpb24odmlzaXQsIGFzeW5jIHJvdXRlciA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kcyA9IFtcbiAgICAgICAgdmlzaXQucGxhY2VEZWZpbml0aW9uLnBhdGgsXG4gICAgICAgIC4uLnRoaXMuY3JlYXRlUm91dGVQYXJhbWV0ZXJzKHZpc2l0KVxuICAgICAgXTtcbiAgICAgIGF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlKGNvbW1hbmRzLCB7XG4gICAgICAgIHJlbGF0aXZlVG86IG9wdGlvbnMgPyBvcHRpb25zLnJlbGF0aXZlVG8gOiBudWxsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG4gIGFzeW5jIHB1c2hWaXNpdENoYW5nZXNUb1JvdXRlKGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgcHJldmlvdXM6IFZpc2l0LCBuZXh0OiBWaXNpdCkge1xuICAgIC8vIHdlIGhhdmUgdG8gcHVzaCB0byBoaXN0b3J5IHNvIG91ciByZW1lbWJlciBzYW5pdGlzZXJzIGRvbid0IHBpY2sgdXAgdGhlIHByZXZpb3VzIHZhbHVlXG4gICAgLy8gd2hlbiBpdCdzIGJlZW4gY2xlYXJlZCBieSB0aGUgdXNlci5cbiAgICB0aGlzLnBsYWNlSGlzdG9yeS5hZGQobmV4dCk7XG5cbiAgICAvLyBGSVhNRTogbm8gcm91dGUgaWQgLT4gcm91dGUgaWQgZHVwbGljYXRlcyByb3V0ZSBwYXJhbWV0ZXJzXG4gICAgaWYgKG5leHQuaGFzUm91dGluZ0NoYW5nZWRGcm9tKHByZXZpb3VzKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9OYXZpZ2F0aW9uKG5leHQsIHJvdXRlciA9PiB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmRzID0gdGhpcy5wYXJzZVVybCh0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdCkuY3JlYXRlUmVkaXJlY3RDb21tYW5kc0ZvcihuZXh0KTtcbiAgICAgICAgY29uc29sZS5sb2coJyMjIyBQdXNoIENoYW5nZXMgdG8gcm91dGUgUmVkaXJlY3QnLCB7IGNvbW1hbmRzIH0pO1xuICAgICAgICByZXR1cm4gcm91dGVyLm5hdmlnYXRlKGNvbW1hbmRzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRvTmF2aWdhdGlvbih2aXNpdDogVmlzaXQsIHJ1bk5hdmlnYXRpb25Db21tYW5kczogKHJvdXRlcjogUm91dGVyKSA9PiBhbnkpIHtcbiAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbkFjdGl2ZS52YWx1ZSkge1xuICAgICAgbGFuZy5pbGxlZ2FsU3RhdGUoJ05hdmlnYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcycpO1xuICAgIH1cblxuICAgIHRoaXMucnVuU3RhdGVUcmFuc2l0aW9uKGN1cnJlbnQgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBOYXZpZ2F0aW9uU3RhdGUuQWN0aXZlKHRoaXMuX25hdmlnYXRpb25TZXNzaW9uQ29udGV4dCwgZmFsc2UsIHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybCk7XG4gICAgICBzZXNzaW9uLnN0b3JlVmlzaXQodmlzaXQpO1xuICAgICAgcmV0dXJuIHNlc3Npb247XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bk5hdmlnYXRpb25Db21tYW5kcyh0aGlzLnJvdXRlcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJvdXRlciBoYXMgZmluaXNoZWQgKHNpbmNlIHRoZXJlIHdhcyBubyByb3V0ZXIgY2hhbmdlIHJlcXVpcmVkKSBzbyB3ZVxuICAgICAgLy8gbmVlZCB0byBlbmQgdGhlIG5hdmlnYXRpb24gc2Vzc2lvbi5cbiAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25TZXNzaW9uLmFjdGl2ZSAmJiAhdGhpcy5yb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb24oKSkge1xuICAgICAgICB0aGlzLnJ1blN0YXRlVHJhbnNpdGlvbihzZXNzaW9uID0+IHNlc3Npb24ub25FbmQobmV3IE5hdmlnYXRpb25FbmQoLTEsICcnLCAnJykpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcnVuU3RhdGVUcmFuc2l0aW9uKHRyYW5zaXRpb246IChuYXZpZ2F0aW9uU2Vzc2lvbjogTmF2aWdhdGlvblN0YXRlKSA9PiBOYXZpZ2F0aW9uU3RhdGUpIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWU7XG4gICAgY29uc3QgbmV4dCA9IHRyYW5zaXRpb24odGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbik7XG4gICAgdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZSA9IG5leHQ7XG4gICAgaWYgKG5leHQgIT09IHByZXZpb3VzKSB7XG4gICAgICBwcmV2aW91cy5kaXNwb3NlKCk7XG4gICAgICBMb2dnZXIuZ2V0KHRoaXMpLmluZm8oYFJvdXRlciBTdGF0ZSBUcmFuc2l0aW9uOiAke3ByZXZpb3VzLnRvU3RyaW5nKCl9IC0+ICR7bmV4dC50b1N0cmluZygpfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUm91dGVQYXJhbWV0ZXJzKHZpc2l0OiBWaXNpdCkge1xuICAgIGNvbnN0IGRlZiA9IHZpc2l0LnBsYWNlRGVmaW5pdGlvbjtcbiAgICByZXR1cm4gdmlzaXQuaGFzUm91dGVJZCgpID9cbiAgICAgIFtkZWYuZ2V0Rm9ybWF0dGVkUm91dGVJZCh2aXNpdCksIGRlZi5nZXRGb3JtYXR0ZWRSb3V0ZVBhcmFtZXRlcnModmlzaXQpXSA6XG4gICAgICBbZGVmLmdldEZvcm1hdHRlZFJvdXRlUGFyYW1ldGVycyh2aXNpdCldO1xuICB9XG5cbiAgZXh0cmFjdENoaWxkUGF0aChhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGFueVtdIHtcbiAgICByZXR1cm4gXy5mbGF0dGVuKGFjdGl2YXRlZFJvdXRlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiBjaGlsZC51cmwpKTtcbiAgfVxuXG4gIHBhcnNlVXJsKHNuYXBzaG90OiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogVXJsU25hcHNob3Qge1xuICAgIHJldHVybiBuZXcgVXJsU25hcHNob3QodGhpcy51cmxTZXJpYWxpemVyLnBhcnNlKHNuYXBzaG90LnVybCkpO1xuICB9XG5cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBQbGFjZVJvdXRlciB7XG5cbiAgZXhwb3J0IGNvbnN0IElOVEVSQUNUSU9OX1JPVVRFUl9PVVRMRVQgPSAnYXVwLWludGVyYWN0aW9uJztcblxuICBleHBvcnQgY2xhc3MgSW50ZXJhY3Rpb25Sb3V0ZU1lZGlhdG9yIGltcGxlbWVudHMgSW50ZXJhY3Rpb25Db250ZXh0Lkxpc3RlbmVyIHtcbiAgICBjb25zdHJ1Y3RvcihyZWFkb25seSBuYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsQWN0aXZlOiBWYWx1ZU1vZGVsPGJvb2xlYW4+LCByZWFkb25seSByb3V0ZXI6IFJvdXRlcikge1xuICAgIH1cblxuICAgIGdldCBpc05hdmlnYXRpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsQWN0aXZlLnZhbHVlO1xuICAgIH1cblxuICAgIC8vIElmIHdlJ3JlIG5vdCBpbiBhIG5hdmlnYXRpb24gd2UgcHVzaFxuICAgIC8vIEBUcmFjZSgpXG4gICAgb25BY3Rpdml0eVN0YXJ0ZWQoKTogdm9pZCB7XG4gICAgICBpZiAoIXRoaXMuaXNOYXZpZ2F0aW5nKSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLicsIHtcbiAgICAgICAgICBvdXRsZXRzOiB7XG4gICAgICAgICAgICBbUGxhY2VSb3V0ZXIuSU5URVJBQ1RJT05fUk9VVEVSX09VVExFVF06IFsnbW9kYWwnXSAvLyBcIm9wZW5cIiBtdXN0IGJlIGEgdmFsaWQgcm91dGUgZm9yIHRoaXMgb3V0bGV0LlxuICAgICAgICAgIH1cbiAgICAgICAgfV0sIHtcbiAgICAgICAgICByZXBsYWNlVXJsOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBAVHJhY2UoKVxuICAgIG9uQWN0aXZpdHlGaW5pc2hlZCgpOiB2b2lkIHtcbiAgICAgIGlmICghdGhpcy5pc05hdmlnYXRpbmcpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuJywge1xuICAgICAgICAgIG91dGxldHM6IHtcbiAgICAgICAgICAgIFtQbGFjZVJvdXRlci5JTlRFUkFDVElPTl9ST1VURVJfT1VUTEVUXTogbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgfV0sIHtcbiAgICAgICAgICByZXBsYWNlVXJsOiB0cnVlIC8vIHJlbW92ZSB0aGUgaW50ZXJhY3Rpb24gZnJvbSB0aGUgaGlzdG9yeS5cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxufVxuIl19