@coolon/angular-ui-powerups 0.0.96 → 0.0.97

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 +3099 -2285
  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 +15 -51
  10. package/esm2015/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.js +15 -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-session.js +590 -0
  23. package/esm2015/lib/place/guards/place-component-deactivation-handler.js +110 -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 +205 -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 +22 -73
  34. package/esm5/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.js +25 -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-session.js +741 -0
  47. package/esm5/lib/place/guards/place-component-deactivation-handler.js +138 -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 +324 -295
  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 +2244 -1654
  56. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  57. package/fesm5/coolon-angular-ui-powerups.js +3220 -2407
  58. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  59. package/lib/interaction/components/activity-container/activity-container.component.d.ts +5 -10
  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-session.d.ts +96 -0
  72. package/lib/place/guards/place-component-deactivation-handler.d.ts +14 -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 +23 -31
  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,52 +5,47 @@
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 { 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 { NavigationSession } from './guards/navigation-session';
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
- const 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
  export class PlaceRouter extends GarbageCollector {
25
21
  /**
26
22
  * @param {?} router
27
23
  * @param {?} urlSerializer
28
- * @param {?} interactionContext
29
24
  * @param {?} angularLocation
30
25
  * @param {?} placeHistory
26
+ * @param {?} modalInteractionService
31
27
  */
32
- constructor(router, urlSerializer, interactionContext, angularLocation, placeHistory) {
28
+ constructor(router, urlSerializer, angularLocation, placeHistory, modalInteractionService) {
33
29
  super();
34
30
  this.router = router;
35
31
  this.urlSerializer = urlSerializer;
36
- this.interactionContext = interactionContext;
37
32
  this.angularLocation = angularLocation;
38
33
  this.placeHistory = placeHistory;
34
+ this.modalInteractionService = modalInteractionService;
39
35
  this.firstRoute = true;
40
36
  this._navigationSessionModel = new MutableValueModel();
41
37
  this._activeVisits = new MutableListModel();
42
- this.initialRedirectStarted = false;
43
- this.initialRedirectFinished = false;
44
38
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
45
39
  this.activeVisitIndex = chain(this._activeVisits).indexBy('placeDefinition');
46
- this.navigationSessionFactory = new NavigationSession.Factory(interactionContext);
47
- angularLocation.onUrlChange((/**
48
- * @param {?} url
40
+ this.navigationSessionActive = chain(this.navigationSessionModel).pluck('active');
41
+ this._navigationSessionContext = new NavigationSession.Context(this.router, this.modalInteractionService, this.angularLocation, (/**
42
+ * @param {?} session
49
43
  * @return {?}
50
44
  */
51
- url => {
52
- console.log(`location.onUrlChange -> ${url}`);
45
+ session => {
46
+ this.processNavigationSuccess(session);
53
47
  }));
48
+ this._navigationSessionModel.value = new NavigationSession.Idle(this._navigationSessionContext);
54
49
  // TODO: make setup the callbacks in during module initiation to make this testable.
55
50
  this.router.events.subscribe((/**
56
51
  * @param {?} event
@@ -61,28 +56,75 @@ export class PlaceRouter extends GarbageCollector {
61
56
  // ======================
62
57
  // NavigationStart -> .... -> NavigationCancel --> redirect, go around again in the same session
63
58
  // NavigationStart -> .... -> NavigationEnd --> navigation complete, end session.
64
- // NavigationStart -> .... -> NavigationError --> navigation canceled, end session.
59
+ // NavigationStart -> .... -> NavigationError --> navigation aborted, end session.
65
60
  // =======================
66
61
  if (event instanceof NavigationStart) {
67
- this.onAngularRouterStarted(event);
62
+ this.runStateTransition((/**
63
+ * @param {?} session
64
+ * @return {?}
65
+ */
66
+ session => session.onStart(event)));
68
67
  }
69
68
  if (event instanceof NavigationEnd) {
70
- this.onAngularRouterFinished(false);
69
+ this.runStateTransition((/**
70
+ * @param {?} session
71
+ * @return {?}
72
+ */
73
+ session => session.onEnd(event)));
71
74
  }
72
75
  if (event instanceof NavigationError) {
73
- this.onAngularRouterFinished(true);
76
+ this.runStateTransition((/**
77
+ * @param {?} session
78
+ * @return {?}
79
+ */
80
+ session => session.onError(event)));
81
+ }
82
+ if (event instanceof NavigationCancel) {
83
+ this.runStateTransition((/**
84
+ * @param {?} session
85
+ * @return {?}
86
+ */
87
+ session => session.onCancel(event)));
74
88
  }
75
89
  }));
76
- this.navigationSessionActive = chain(this.navigationSessionModel).isNotNil();
77
- this.navigationSessionActive.subscribe((/**
78
- * @param {?} active
90
+ // Push dialog state to the url so we can capture the back button.
91
+ this.modalInteractionService.addActivityListener(new PlaceRouter.InteractionRouteMediator(this.navigationSessionActive, this.router));
92
+ // The angular router doesn't always fire router events when the back button is pushed while a navigation
93
+ // session is in progress. Sometimes we only know about it from the url change.
94
+ angularLocation.onUrlChange((/**
95
+ * @param {?} url
79
96
  * @return {?}
80
97
  */
81
- active => {
82
- console.log('navigationSessionActive', active);
98
+ url => {
99
+ console.log(`#### url changed -> ${url}`);
100
+ /** @type {?} */
101
+ const interactionContext = this.navigationSessionActive.value && this.navigationSession.interactionContext;
102
+ if (interactionContext && interactionContext.isActive()) {
103
+ Logger.get(this).info(`back button pressed during navigation session interaction`);
104
+ this.runStateTransition((/**
105
+ * @param {?} navigationSession
106
+ * @return {?}
107
+ */
108
+ navigationSession => navigationSession.onBackClickedDuringNavigationInteraction(url)));
109
+ }
83
110
  }));
84
- // const txo = new TransactionObserver().onEvent(e => console.log(e.toString()));
85
- // txo.observe('this.navigationSessionModel', this.navigationSessionModel);
111
+ }
112
+ /**
113
+ * @private
114
+ * @param {?} session
115
+ * @return {?}
116
+ */
117
+ processNavigationSuccess(session) {
118
+ /** @type {?} */
119
+ const visits = session.getVisits();
120
+ visits.forEach((/**
121
+ * @param {?} v
122
+ * @return {?}
123
+ */
124
+ v => this.placeHistory.add(v)));
125
+ // Update visits before we end the navigation session. This allows the placeOutets to
126
+ // ignore visit changes that occur while the navigation is in progress
127
+ this._activeVisits.value = visits;
86
128
  }
87
129
  /**
88
130
  * @return {?}
@@ -126,14 +168,6 @@ export class PlaceRouter extends GarbageCollector {
126
168
  })));
127
169
  });
128
170
  }
129
- /**
130
- * @param {?} visit
131
- * @param {?=} navigationExtras
132
- * @return {?}
133
- */
134
- createRedirectFor(visit, navigationExtras) {
135
- return this.router.createUrlTree(this.createRouteParameters(visit), navigationExtras);
136
- }
137
171
  // @Trace()
138
172
  /**
139
173
  * @param {?} activatedRoute
@@ -155,15 +189,6 @@ export class PlaceRouter extends GarbageCollector {
155
189
  router => {
156
190
  /** @type {?} */
157
191
  const commands = this.parseUrl(this.router.routerState.snapshot).createRedirectCommandsFor(next);
158
- // // we have to to use the definition for route id as our redirection always includes
159
- // // the id in the url segements (but leaves it blank when there's no id). I.e. in the
160
- // // no id case we're doing the following redirect [<placePath>, ""] -> ["..", <id>]
161
- // const relativePath = !!previous.placeDefinition.hasRouteId() ? '..' : '.';
162
- // const commands = [
163
- // relativePath,
164
- // ...this.createRouteParameters(next),
165
- // ...this.extractChildPath(activatedRoute.snapshot)
166
- // ];
167
192
  console.log('### Push Changes to route Redirect', { commands });
168
193
  return router.navigate(commands);
169
194
  }));
@@ -172,85 +197,112 @@ export class PlaceRouter extends GarbageCollector {
172
197
  }
173
198
  /**
174
199
  * @param {?} visit
175
- * @param {?} customNavigation
200
+ * @param {?} runNavigationCommands
176
201
  * @return {?}
177
202
  */
178
- doNavigation(visit, customNavigation) {
203
+ doNavigation(visit, runNavigationCommands) {
179
204
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
180
- this._navigationSessionModel.value = this.navigationSessionFactory.createInternal(visit);
205
+ if (this.navigationSessionActive.value) {
206
+ lang.illegalState('Navigation already in progress');
207
+ }
208
+ this.runStateTransition((/**
209
+ * @param {?} current
210
+ * @return {?}
211
+ */
212
+ current => {
213
+ /** @type {?} */
214
+ const session = new NavigationSession.Active(this._navigationSessionContext, false, this.router.routerState.snapshot.url);
215
+ session.storeVisit(visit);
216
+ return session;
217
+ }));
181
218
  try {
182
- yield customNavigation(this.router);
219
+ yield runNavigationCommands(this.router);
183
220
  }
184
221
  finally {
185
222
  // Router has finished (since there was no router change required) so we
186
223
  // need to end the navigation session.
187
- if (this.navigationSession && !this.router.getCurrentNavigation()) {
188
- this.onAngularRouterFinished(false);
224
+ if (this.navigationSession.active && !this.router.getCurrentNavigation()) {
225
+ this.runStateTransition((/**
226
+ * @param {?} session
227
+ * @return {?}
228
+ */
229
+ session => session.onEnd(new NavigationEnd(-1, '', ''))));
189
230
  }
190
231
  }
191
232
  });
192
233
  }
193
234
  /**
194
- * @private
195
- * @param {?} visit
235
+ * @protected
236
+ * @param {?} transition
196
237
  * @return {?}
197
238
  */
198
- createRouteParameters(visit) {
239
+ runStateTransition(transition) {
199
240
  /** @type {?} */
200
- const def = visit.placeDefinition;
201
- return visit.hasRouteId() ?
202
- [def.getFormattedRouteId(visit), def.getFormattedRouteParameters(visit)] :
203
- [def.getFormattedRouteParameters(visit)];
204
- }
205
- // @Trace()
206
- /**
207
- * @private
208
- * @param {?} event
209
- * @return {?}
210
- */
211
- onAngularRouterStarted(event) {
212
- if (!this.navigationSession) { // We been activated by an external route rather than placeRouter.go(visit)
213
- console.log('navigation started', { firstTime: this.firstRoute });
214
- /** @type {?} */
215
- const session = this.navigationSessionFactory.createExternal(this.firstRoute);
216
- if (event.navigationTrigger === 'popstate') {
217
- session.setPopstateReturnUrl(this.router.routerState.snapshot.url);
218
- }
219
- this._navigationSessionModel.value = session;
241
+ const previous = this._navigationSessionModel.value;
242
+ /** @type {?} */
243
+ const next = transition(this.navigationSession);
244
+ this._navigationSessionModel.value = next;
245
+ if (next !== previous) {
246
+ previous.dispose();
247
+ Logger.get(this).info(`Router State Transition: ${previous.toString()} -> ${next.toString()}`);
220
248
  }
221
- this.firstRoute = false;
222
249
  }
223
- // @Trace()
224
250
  /**
225
251
  * @private
226
- * @param {?} cancelled
252
+ * @param {?} visit
227
253
  * @return {?}
228
254
  */
229
- onAngularRouterFinished(cancelled) {
255
+ createRouteParameters(visit) {
230
256
  /** @type {?} */
231
- const session = this._navigationSessionModel.value;
232
- if (!cancelled) {
233
- // Update visits before we end the navigation session. This allows the placeOutets to
234
- // ignore visit changes that occur while the navigation is in progress
235
- /** @type {?} */
236
- const visits = session.getVisits();
237
- visits.forEach((/**
238
- * @param {?} v
239
- * @return {?}
240
- */
241
- v => this.placeHistory.add(v)));
242
- this._activeVisits.value = visits;
243
- }
244
- else {
245
- // Angular doesn't preserve the url when a guard cancels the back button.
246
- // See https://github.com/angular/angular/issues/13586#issuecomment-432795720
247
- if (session.isPopState) {
248
- console.log('cancelled during popstate');
249
- this.angularLocation.go(session.popStateReturnUrl);
250
- }
251
- }
252
- this._navigationSessionModel.value = null;
257
+ const def = visit.placeDefinition;
258
+ return visit.hasRouteId() ?
259
+ [def.getFormattedRouteId(visit), def.getFormattedRouteParameters(visit)] :
260
+ [def.getFormattedRouteParameters(visit)];
253
261
  }
262
+ // private onAngularRouterStarted(event: NavigationStart) {
263
+ // if (!this.navigationSession) {
264
+ // // We been activated by an external route rather than placeRouter.go(visit)
265
+ // this._navigationSessionModel.value = this.createExternalNavigationSession(event);
266
+ // }
267
+ // this.firstRoute = false;
268
+ // }
269
+ //
270
+ // private createExternalNavigationSession(event: NavigationStart) {
271
+ // return new NavigationSession.Active(
272
+ // this.modalInteractionService,
273
+ // this.angularLocation,
274
+ // // event.url,
275
+ // event.navigationTrigger === 'popstate'
276
+ // );
277
+ // }
278
+ // private onAngularRouterFinished(cancelled: boolean) {
279
+ // const session = this._navigationSessionModel.value;
280
+ // if (session.backClickedDuringCanDeactivateInteraction) {
281
+ // // we swallow this finished event but keep the session alive as we're going to
282
+ // // get another route started event, which will trigger anohter canDeactivate dialog
283
+ // // if we start a new session.
284
+ // // session.resetInteractionSession()
285
+ // } else {
286
+ // if (!cancelled) {
287
+ // const visits = session.getVisits();
288
+ // visits.forEach(v => this.placeHistory.add(v));
289
+ // // Update visits before we end the navigation session. This allows the placeOutets to
290
+ // // ignore visit changes that occur while the navigation is in progress
291
+ // this._activeVisits.value = visits;
292
+ // } else {
293
+ // // TODO: move this to the navigation session
294
+ // // Angular doesn't preserve the url when a guard cancels the back button.
295
+ // // See https://github.com/angular/angular/issues/13586#issuecomment-432795720
296
+ // // session.rememberPopStateReturnUrl(this.router.routerState.snapshot.url);
297
+ // if (session.isPopState) {
298
+ // console.log('cancelled during popstate');
299
+ // // this.angularLocation.go(session.previousUrl);
300
+ // }
301
+ // }
302
+ // session.dispose();
303
+ // this._navigationSessionModel.value = null;
304
+ // }
305
+ // }
254
306
  /**
255
307
  * @param {?} activatedRoute
256
308
  * @return {?}
@@ -267,35 +319,7 @@ export class PlaceRouter extends GarbageCollector {
267
319
  * @return {?}
268
320
  */
269
321
  parseUrl(snapshot) {
270
- return new PlaceRouter.UrlHelper(this.urlSerializer.parse(snapshot.url));
271
- }
272
- // TODO: this all only sort of works. Opening dialogs and clicking back multiple times breaks things.
273
- // TODO: next stage is to investigate tracking dialog state in a different placeoutlet and keeping those
274
- // TODO: urls out of the history.
275
- /**
276
- * @param {?} activatedRoute
277
- * @param {?} state
278
- * @return {?}
279
- */
280
- performInitialNavigationIntercept(activatedRoute, state) {
281
- assert.isTruthy(this.isInitialNavigation());
282
- Logger.get(this).info(`Redirecting to: ${noopPlaceDef.path}`, { returnUrl: state.url });
283
- if (!this.initialRedirectFinished) {
284
- this.initialRedirectFinished = true;
285
- return this.router.createUrlTree([noopPlaceDef.path, {
286
- returnUrl: state.url
287
- }], {
288
- replaceUrl: true,
289
- // make sure we update our history
290
- skipLocationChange: false
291
- });
292
- }
293
- }
294
- /**
295
- * @return {?}
296
- */
297
- isInitialNavigation() {
298
- return this.navigationSession.firstNavigation && !this.initialRedirectFinished;
322
+ return new UrlSnapshot(this.urlSerializer.parse(snapshot.url));
299
323
  }
300
324
  }
301
325
  PlaceRouter.decorators = [
@@ -307,17 +331,11 @@ PlaceRouter.decorators = [
307
331
  PlaceRouter.ctorParameters = () => [
308
332
  { type: Router },
309
333
  { type: UrlSerializer },
310
- { type: InteractionContext },
311
334
  { type: Location },
312
- { type: PlaceHistory }
335
+ { type: PlaceHistory },
336
+ { type: ModalInteractionService }
313
337
  ];
314
- /** @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" });
315
- tslib_1.__decorate([
316
- Trace(),
317
- tslib_1.__metadata("design:type", Function),
318
- tslib_1.__metadata("design:paramtypes", [Visit, Object]),
319
- tslib_1.__metadata("design:returntype", Promise)
320
- ], PlaceRouter.prototype, "navigate", null);
338
+ /** @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" });
321
339
  if (false) {
322
340
  /**
323
341
  * @type {?}
@@ -342,137 +360,88 @@ if (false) {
342
360
  * @type {?}
343
361
  * @private
344
362
  */
345
- PlaceRouter.prototype.navigationSessionFactory;
363
+ PlaceRouter.prototype._navigationSessionContext;
346
364
  /**
347
365
  * @type {?}
348
366
  * @private
349
367
  */
350
- PlaceRouter.prototype.initialRedirectStarted;
368
+ PlaceRouter.prototype.router;
351
369
  /**
352
370
  * @type {?}
353
371
  * @private
354
372
  */
355
- PlaceRouter.prototype.initialRedirectFinished;
373
+ PlaceRouter.prototype.urlSerializer;
356
374
  /**
357
375
  * @type {?}
358
376
  * @private
359
377
  */
360
- PlaceRouter.prototype.router;
378
+ PlaceRouter.prototype.angularLocation;
361
379
  /**
362
380
  * @type {?}
363
381
  * @private
364
382
  */
365
- PlaceRouter.prototype.urlSerializer;
383
+ PlaceRouter.prototype.placeHistory;
366
384
  /**
367
385
  * @type {?}
368
386
  * @private
369
387
  */
370
- PlaceRouter.prototype.interactionContext;
371
- /** @type {?} */
372
- PlaceRouter.prototype.angularLocation;
373
- /** @type {?} */
374
- PlaceRouter.prototype.placeHistory;
388
+ PlaceRouter.prototype.modalInteractionService;
375
389
  }
376
390
  (function (PlaceRouter) {
377
- class UrlHelper {
391
+ PlaceRouter.INTERACTION_ROUTER_OUTLET = 'aup-interaction';
392
+ class InteractionRouteMediator {
378
393
  /**
379
- * @param {?} urlTree
394
+ * @param {?} navigationSessionModelActive
395
+ * @param {?} router
380
396
  */
381
- constructor(urlTree) {
382
- this.urlTree = urlTree;
383
- console.log({ segments: this.urlTree.root.children.primary.segments });
397
+ constructor(navigationSessionModelActive, router) {
398
+ this.navigationSessionModelActive = navigationSessionModelActive;
399
+ this.router = router;
384
400
  }
385
401
  /**
386
402
  * @return {?}
387
403
  */
388
- cloneUrlSegmentList() {
389
- return [...this.urlTree.root.children.primary.segments];
404
+ get isNavigating() {
405
+ return this.navigationSessionModelActive.value;
390
406
  }
407
+ // If we're not in a navigation we push
408
+ // @Trace()
391
409
  /**
392
- * @param {?} visit
393
410
  * @return {?}
394
411
  */
395
- updateVisitSegments(visit) {
396
- // Ugly, but it works for now.
397
- /** @type {?} */
398
- const segments = this.cloneUrlSegmentList();
399
- /** @type {?} */
400
- const visitSegments = this.convertToUrlSegments(visit);
401
- /** @type {?} */
402
- const replaceAt = segments.findIndex((/**
403
- * @param {?} segment
404
- * @return {?}
405
- */
406
- segment => segment.path === visitSegments[0].path));
407
- // do not use the return value, it's the items that were removed!
408
- segments.splice(replaceAt, visitSegments.length, ...visitSegments);
409
- return segments;
410
- }
411
- /**
412
- * Converts the visit into segments. Please not that these segments are not e
413
- * @param {?} visit
414
- * @return {?}
415
- */
416
- convertToUrlSegments(visit) {
417
- return visit.placeDefinition.hasRouteId() ?
418
- [
419
- // NOTE:
420
- // It's important to attach the params to the root path and not the id. If we attach them
421
- // to an empty id then the angular router won't match the pattern.
422
- new UrlSegment(visit.placeDefinition.path, visit.placeDefinition.getFormattedRouteParameters(visit)),
423
- new UrlSegment(visit.placeDefinition.getFormattedRouteId(visit), {})
424
- ]
425
- :
426
- [
427
- new UrlSegment(visit.placeDefinition.path, visit.placeDefinition.getFormattedRouteParameters(visit))
428
- ];
429
- }
430
- /**
431
- * @param {?} visit
432
- * @return {?}
433
- */
434
- createRedirectCommandsFor(visit) {
435
- /** @type {?} */
436
- const segments = this.updateVisitSegments(visit);
437
- /** @type {?} */
438
- const commands = [];
439
- segments.forEach((/**
440
- * @param {?} s
441
- * @return {?}
442
- */
443
- s => {
444
- commands.push(s.path);
445
- if (s.parameterMap.keys.length > 0) {
446
- commands.push(s.parameters);
447
- }
448
- }));
449
- return commands;
412
+ onActivityStarted() {
413
+ if (!this.isNavigating) {
414
+ this.router.navigate(['.', {
415
+ outlets: {
416
+ [PlaceRouter.INTERACTION_ROUTER_OUTLET]: ['modal'] // "open" must be a valid route for this outlet.
417
+ }
418
+ }], {
419
+ replaceUrl: false,
420
+ });
421
+ }
450
422
  }
423
+ // @Trace()
451
424
  /**
452
- * @param {?} placeDef
453
425
  * @return {?}
454
426
  */
455
- includesPathOf(placeDef) {
456
- return this.cloneUrlSegmentList().find((/**
457
- * @param {?} s
458
- * @return {?}
459
- */
460
- s => s.path === placeDef.path));
427
+ onActivityFinished() {
428
+ if (!this.isNavigating) {
429
+ this.router.navigate(['.', {
430
+ outlets: {
431
+ [PlaceRouter.INTERACTION_ROUTER_OUTLET]: null
432
+ }
433
+ }], {
434
+ replaceUrl: true // remove the interaction from the history.
435
+ });
436
+ }
461
437
  }
462
438
  }
463
- tslib_1.__decorate([
464
- Trace(),
465
- tslib_1.__metadata("design:type", Function),
466
- tslib_1.__metadata("design:paramtypes", [Visit]),
467
- tslib_1.__metadata("design:returntype", Array)
468
- ], UrlHelper.prototype, "createRedirectCommandsFor", null);
469
- PlaceRouter.UrlHelper = UrlHelper;
439
+ PlaceRouter.InteractionRouteMediator = InteractionRouteMediator;
470
440
  if (false) {
471
- /**
472
- * @type {?}
473
- * @private
474
- */
475
- UrlHelper.prototype.urlTree;
441
+ /** @type {?} */
442
+ InteractionRouteMediator.prototype.navigationSessionModelActive;
443
+ /** @type {?} */
444
+ InteractionRouteMediator.prototype.router;
476
445
  }
477
446
  })(PlaceRouter || (PlaceRouter = {}));
478
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Utcm91dGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3BsYWNlLXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFHTCxhQUFhLEVBQ2IsZUFBZSxFQUNmLGVBQWUsRUFDZixNQUFNLEVBRU4sVUFBVSxFQUNWLGFBQWEsRUFFZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxNQUFNLEVBRU4sR0FBRyxFQUNILGdCQUFnQixFQUdoQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixLQUFLLEVBRU4sTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7Ozs7O01BRzFCLFlBQVksR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDO0FBS25FLE1BQU0sT0FBTyxXQUFZLFNBQVEsZ0JBQWdCOzs7Ozs7OztJQWEvQyxZQUE2QixNQUFjLEVBQ2QsYUFBNEIsRUFDckMsa0JBQXNDLEVBQ3JDLGVBQXlCLEVBQ3pCLFlBQTBCO1FBQzdD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QyxJQUFJLEVBQUMsQ0FBQztRQUN4RSxDQUFDO0tBRUY7SUFqQkM7UUFEQyxLQUFLLEVBQUU7O2lEQUN5QixLQUFLOzs4REFXckM7SUFuRFUscUJBQVMsWUF5RHJCLENBQUE7Ozs7OztRQXZEYSw0QkFBd0I7O0FBd0R4QyxDQUFDLEVBN0RnQixXQUFXLEtBQVgsV0FBVyxRQTZEM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBY3RpdmF0ZWRSb3V0ZSxcbiAgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgTmF2aWdhdGlvbkVuZCxcbiAgTmF2aWdhdGlvbkVycm9yLCBOYXZpZ2F0aW9uRXh0cmFzLFxuICBOYXZpZ2F0aW9uU3RhcnQsXG4gIFJvdXRlcixcbiAgUm91dGVyU3RhdGVTbmFwc2hvdCxcbiAgVXJsU2VnbWVudCxcbiAgVXJsU2VyaWFsaXplcixcbiAgVXJsVHJlZVxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBCb29sZWFuVmFsdWVNb2RlbENoYWluLFxuICBEc2wsXG4gIEdhcmJhZ2VDb2xsZWN0b3IsXG4gIEhhc09uZUluZGV4Q2hhaW4sXG4gIExpc3RNb2RlbCxcbiAgTG9nZ2VyLFxuICBNdXRhYmxlTGlzdE1vZGVsLFxuICBNdXRhYmxlVmFsdWVNb2RlbCxcbiAgVHJhY2UsXG4gIFZhbHVlTW9kZWxcbn0gZnJvbSAnQGNvb2xvbi9wZWN0aW4nO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEludGVyYWN0aW9uQ29udGV4dCB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLWNvbnRleHQnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlc3Npb24gfSBmcm9tICcuL25hdmlnYXRpb24tc2Vzc2lvbic7XG5pbXBvcnQgeyBQbGFjZUNvbXBvbmVudCB9IGZyb20gJy4vcGxhY2UtY29tcG9uZW50JztcbmltcG9ydCB7IFBsYWNlRGVmaW5pdGlvbiB9IGZyb20gJy4vcGxhY2UtZGVmaW5pdGlvbic7XG5pbXBvcnQgeyBQbGFjZUhpc3RvcnkgfSBmcm9tICcuL3BsYWNlLWhpc3RvcnknO1xuaW1wb3J0IHsgTm9vcEdhdGV3YXlQbGFjZSB9IGZyb20gJy4vcGxhY2VzL25vb3AtZ2F0ZXdheS1wbGFjZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmlzaXQgfSBmcm9tICcuL3Zpc2l0JztcblxuXG5jb25zdCBub29wUGxhY2VEZWYgPSBQbGFjZUNvbXBvbmVudC5nZXREZWZpbml0aW9uKE5vb3BHYXRld2F5UGxhY2UpO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbGFjZVJvdXRlciBleHRlbmRzIEdhcmJhZ2VDb2xsZWN0b3Ige1xuXG4gIHByaXZhdGUgZmlyc3RSb3V0ZSA9IHRydWU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbmF2aWdhdGlvblNlc3Npb25Nb2RlbCA9IG5ldyBNdXRhYmxlVmFsdWVNb2RlbDxOYXZpZ2F0aW9uU2Vzc2lvbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aXZlVmlzaXRzID0gbmV3IE11dGFibGVMaXN0TW9kZWw8VmlzaXQ+KCk7XG5cbiAgcmVhZG9ubHkgbmF2aWdhdGlvblNlc3Npb25BY3RpdmU6IEJvb2xlYW5WYWx1ZU1vZGVsQ2hhaW47XG4gIHJlYWRvbmx5IGFjdGl2ZVZpc2l0SW5kZXg6IEhhc09uZUluZGV4Q2hhaW48J3BsYWNlRGVmaW5pdGlvbicsIFZpc2l0PjtcbiAgcHJpdmF0ZSByZWFkb25seSBuYXZpZ2F0aW9uU2Vzc2lvbkZhY3Rvcnk6IE5hdmlnYXRpb25TZXNzaW9uLkZhY3Rvcnk7XG4gIHByaXZhdGUgaW5pdGlhbFJlZGlyZWN0U3RhcnRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGluaXRpYWxSZWRpcmVjdEZpbmlzaGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSB1cmxTZXJpYWxpemVyOiBVcmxTZXJpYWxpemVyLFxuICAgICAgICAgICAgICBwcml2YXRlIGludGVyYWN0aW9uQ29udGV4dDogSW50ZXJhY3Rpb25Db250ZXh0LFxuICAgICAgICAgICAgICByZWFkb25seSBhbmd1bGFyTG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICAgICAgICByZWFkb25seSBwbGFjZUhpc3Rvcnk6IFBsYWNlSGlzdG9yeSkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3QgeyBjaGFpbiwgdmFsdWVPZiwgYmVmb3JlLCB3aGVuLCBhZnRlciwgb2JzZXJ2ZSwgc3dpdGNoT24gfSA9IERzbC5kaXNwb3NlV2l0aCh0aGlzKTtcbiAgICB0aGlzLmFjdGl2ZVZpc2l0SW5kZXggPSBjaGFpbih0aGlzLl9hY3RpdmVWaXNpdHMpLmluZGV4QnkoJ3BsYWNlRGVmaW5pdGlvbicpO1xuICAgIHRoaXMubmF2aWdhdGlvblNlc3Npb25GYWN0b3J5ID0gbmV3IE5hdmlnYXRpb25TZXNzaW9uLkZhY3RvcnkoaW50ZXJhY3Rpb25Db250ZXh0KTtcbiAgICBhbmd1bGFyTG9jYXRpb24ub25VcmxDaGFuZ2UodXJsID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGBsb2NhdGlvbi5vblVybENoYW5nZSAtPiAke3VybH1gKTtcbiAgICB9KTtcblxuICAgIC8vIFRPRE86IG1ha2Ugc2V0dXAgdGhlIGNhbGxiYWNrcyBpbiBkdXJpbmcgbW9kdWxlIGluaXRpYXRpb24gdG8gbWFrZSB0aGlzIHRlc3RhYmxlLlxuICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgLy8gUm91dGluZyBldmVudCBzZXF1ZW5jZVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gTmF2aWdhdGlvblN0YXJ0IC0+IC4uLi4gLT4gTmF2aWdhdGlvbkNhbmNlbCAtLT4gcmVkaXJlY3QsIGdvIGFyb3VuZCBhZ2FpbiBpbiB0aGUgc2FtZSBzZXNzaW9uXG4gICAgICAvLyBOYXZpZ2F0aW9uU3RhcnQgLT4gLi4uLiAtPiBOYXZpZ2F0aW9uRW5kIC0tPiBuYXZpZ2F0aW9uIGNvbXBsZXRlLCBlbmQgc2Vzc2lvbi5cbiAgICAgIC8vIE5hdmlnYXRpb25TdGFydCAtPiAuLi4uIC0+IE5hdmlnYXRpb25FcnJvciAtLT4gbmF2aWdhdGlvbiBjYW5jZWxlZCwgZW5kIHNlc3Npb24uXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XG4gICAgICAgIHRoaXMub25Bbmd1bGFyUm91dGVyU3RhcnRlZChldmVudCk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgIHRoaXMub25Bbmd1bGFyUm91dGVyRmluaXNoZWQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVycm9yKSB7XG4gICAgICAgIHRoaXMub25Bbmd1bGFyUm91dGVyRmluaXNoZWQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm5hdmlnYXRpb25TZXNzaW9uQWN0aXZlID0gY2hhaW4odGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsKS5pc05vdE5pbCgpO1xuICAgIHRoaXMubmF2aWdhdGlvblNlc3Npb25BY3RpdmUuc3Vic2NyaWJlKGFjdGl2ZSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnbmF2aWdhdGlvblNlc3Npb25BY3RpdmUnLCBhY3RpdmUpO1xuICAgIH0pO1xuICAgIC8vIGNvbnN0IHR4byA9IG5ldyBUcmFuc2FjdGlvbk9ic2VydmVyKCkub25FdmVudChlID0+IGNvbnNvbGUubG9nKGUudG9TdHJpbmcoKSkpO1xuICAgIC8vIHR4by5vYnNlcnZlKCd0aGlzLm5hdmlnYXRpb25TZXNzaW9uTW9kZWwnLCB0aGlzLm5hdmlnYXRpb25TZXNzaW9uTW9kZWwpO1xuICB9XG5cbiAgZ2V0IG5hdmlnYXRpb25TZXNzaW9uKCk6IE5hdmlnYXRpb25TZXNzaW9uIHtcbiAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZTtcbiAgfVxuXG4gIGdldCBuYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsKCk6IFZhbHVlTW9kZWw8TmF2aWdhdGlvblNlc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC5yZWFkb25seTtcbiAgfVxuXG4gIGdldCBhY3RpdmVWaXNpdHMoKTogTGlzdE1vZGVsPFZpc2l0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVZpc2l0cy5yZWFkb25seTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgcGxhY2VSb3V0ZXIubmF2aWdhdGUocGxhY2VEZXN0aW5hdGlvbnMuc29tZVBsYWNlLmNyZWF0ZVZpc2l0KHJvdXRlSWQsIC4uLnZpc2l0UGFyYW1zKSk7XG4gICAqIEBwYXJhbSB2aXNpdFxuICAgKi9cbiAgQFRyYWNlKClcbiAgYXN5bmMgbmF2aWdhdGUodmlzaXQ6IFZpc2l0LCBvcHRpb25zPzogeyByZWxhdGl2ZVRvOiBBY3RpdmF0ZWRSb3V0ZSB9KSB7XG4gICAgdGhpcy5kb05hdmlnYXRpb24odmlzaXQsIGFzeW5jIHJvdXRlciA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kcyA9IFtcbiAgICAgICAgdmlzaXQucGxhY2VEZWZpbml0aW9uLnBhdGgsXG4gICAgICAgIC4uLnRoaXMuY3JlYXRlUm91dGVQYXJhbWV0ZXJzKHZpc2l0KVxuICAgICAgXTtcbiAgICAgIGF3YWl0IHRoaXMucm91dGVyLm5hdmlnYXRlKGNvbW1hbmRzLCB7XG4gICAgICAgIHJlbGF0aXZlVG86IG9wdGlvbnMgPyBvcHRpb25zLnJlbGF0aXZlVG8gOiBudWxsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVJlZGlyZWN0Rm9yKHZpc2l0OlZpc2l0LCBuYXZpZ2F0aW9uRXh0cmFzPzogTmF2aWdhdGlvbkV4dHJhcykge1xuICAgIHJldHVybiB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKHRoaXMuY3JlYXRlUm91dGVQYXJhbWV0ZXJzKHZpc2l0KSwgbmF2aWdhdGlvbkV4dHJhcyk7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuICBhc3luYyBwdXNoVmlzaXRDaGFuZ2VzVG9Sb3V0ZShhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsIHByZXZpb3VzOiBWaXNpdCwgbmV4dDogVmlzaXQpIHtcblxuICAgIC8vIHdlIGhhdmUgdG8gcHVzaCB0byBoaXN0b3J5IHNvIG91ciByZW1lbWJlciBzYW5pdGlzZXJzIGRvbid0IHBpY2sgdXAgdGhlIHByZXZpb3VzIHZhbHVlXG4gICAgLy8gd2hlbiBpdCdzIGJlZW4gY2xlYXJlZCBieSB0aGUgdXNlci5cbiAgICB0aGlzLnBsYWNlSGlzdG9yeS5hZGQobmV4dCk7XG5cbiAgICAvLyBGSVhNRTogbm8gcm91dGUgaWQgLT4gcm91dGUgaWQgZHVwbGljYXRlcyByb3V0ZSBwYXJhbWV0ZXJzXG4gICAgaWYgKG5leHQuaGFzUm91dGluZ0NoYW5nZWRGcm9tKHByZXZpb3VzKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZG9OYXZpZ2F0aW9uKG5leHQsIHJvdXRlciA9PiB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmRzID0gdGhpcy5wYXJzZVVybCh0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdCkuY3JlYXRlUmVkaXJlY3RDb21tYW5kc0ZvcihuZXh0KTtcbiAgICAgICAgLy8gLy8gd2UgaGF2ZSB0byB0byB1c2UgdGhlIGRlZmluaXRpb24gZm9yIHJvdXRlIGlkIGFzIG91ciByZWRpcmVjdGlvbiBhbHdheXMgaW5jbHVkZXNcbiAgICAgICAgLy8gLy8gdGhlIGlkIGluIHRoZSB1cmwgc2VnZW1lbnRzIChidXQgbGVhdmVzIGl0IGJsYW5rIHdoZW4gdGhlcmUncyBubyBpZCkuIEkuZS4gaW4gdGhlXG4gICAgICAgIC8vIC8vIG5vIGlkIGNhc2Ugd2UncmUgZG9pbmcgdGhlIGZvbGxvd2luZyByZWRpcmVjdCBbPHBsYWNlUGF0aD4sIFwiXCJdIC0+IFtcIi4uXCIsIDxpZD5dXG4gICAgICAgIC8vIGNvbnN0IHJlbGF0aXZlUGF0aCA9ICEhcHJldmlvdXMucGxhY2VEZWZpbml0aW9uLmhhc1JvdXRlSWQoKSA/ICcuLicgOiAnLic7XG4gICAgICAgIC8vIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgICAgICAvLyAgIHJlbGF0aXZlUGF0aCxcbiAgICAgICAgLy8gICAuLi50aGlzLmNyZWF0ZVJvdXRlUGFyYW1ldGVycyhuZXh0KSxcbiAgICAgICAgLy8gICAuLi50aGlzLmV4dHJhY3RDaGlsZFBhdGgoYWN0aXZhdGVkUm91dGUuc25hcHNob3QpXG4gICAgICAgIC8vIF07XG4gICAgICAgIGNvbnNvbGUubG9nKCcjIyMgUHVzaCBDaGFuZ2VzIHRvIHJvdXRlIFJlZGlyZWN0JywgeyBjb21tYW5kcyB9KTtcbiAgICAgICAgcmV0dXJuIHJvdXRlci5uYXZpZ2F0ZShjb21tYW5kcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkb05hdmlnYXRpb24odmlzaXQ6IFZpc2l0LCBjdXN0b21OYXZpZ2F0aW9uOiAocm91dGVyOiBSb3V0ZXIpID0+IGFueSkge1xuICAgIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWUgPSB0aGlzLm5hdmlnYXRpb25TZXNzaW9uRmFjdG9yeS5jcmVhdGVJbnRlcm5hbCh2aXNpdCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGN1c3RvbU5hdmlnYXRpb24odGhpcy5yb3V0ZXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSb3V0ZXIgaGFzIGZpbmlzaGVkIChzaW5jZSB0aGVyZSB3YXMgbm8gcm91dGVyIGNoYW5nZSByZXF1aXJlZCkgc28gd2VcbiAgICAgIC8vIG5lZWQgdG8gZW5kIHRoZSBuYXZpZ2F0aW9uIHNlc3Npb24uXG4gICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbiAmJiAhdGhpcy5yb3V0ZXIuZ2V0Q3VycmVudE5hdmlnYXRpb24oKSkge1xuICAgICAgICB0aGlzLm9uQW5ndWxhclJvdXRlckZpbmlzaGVkKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJvdXRlUGFyYW1ldGVycyh2aXNpdDogVmlzaXQpIHtcbiAgICBjb25zdCBkZWYgPSB2aXNpdC5wbGFjZURlZmluaXRpb247XG4gICAgcmV0dXJuIHZpc2l0Lmhhc1JvdXRlSWQoKSA/XG4gICAgICBbZGVmLmdldEZvcm1hdHRlZFJvdXRlSWQodmlzaXQpLCBkZWYuZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKHZpc2l0KV0gOlxuICAgICAgW2RlZi5nZXRGb3JtYXR0ZWRSb3V0ZVBhcmFtZXRlcnModmlzaXQpXTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG4gIHByaXZhdGUgb25Bbmd1bGFyUm91dGVyU3RhcnRlZChldmVudDogTmF2aWdhdGlvblN0YXJ0KSB7XG4gICAgaWYgKCF0aGlzLm5hdmlnYXRpb25TZXNzaW9uKSB7IC8vIFdlIGJlZW4gYWN0aXZhdGVkIGJ5IGFuIGV4dGVybmFsIHJvdXRlIHJhdGhlciB0aGFuIHBsYWNlUm91dGVyLmdvKHZpc2l0KVxuICAgICAgY29uc29sZS5sb2coJ25hdmlnYXRpb24gc3RhcnRlZCcsIHsgZmlyc3RUaW1lOiB0aGlzLmZpcnN0Um91dGUgfSk7XG4gICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbkZhY3RvcnkuY3JlYXRlRXh0ZXJuYWwodGhpcy5maXJzdFJvdXRlKTtcbiAgICAgIGlmIChldmVudC5uYXZpZ2F0aW9uVHJpZ2dlciA9PT0gJ3BvcHN0YXRlJykge1xuICAgICAgICBzZXNzaW9uLnNldFBvcHN0YXRlUmV0dXJuVXJsKHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnZhbHVlID0gc2Vzc2lvbjtcbiAgICB9XG4gICAgdGhpcy5maXJzdFJvdXRlID0gZmFsc2U7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuICBwcml2YXRlIG9uQW5ndWxhclJvdXRlckZpbmlzaGVkKGNhbmNlbGxlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnZhbHVlO1xuICAgIGlmICghY2FuY2VsbGVkKSB7XG4gICAgICAvLyBVcGRhdGUgdmlzaXRzIGJlZm9yZSB3ZSBlbmQgdGhlIG5hdmlnYXRpb24gc2Vzc2lvbi4gIFRoaXMgYWxsb3dzIHRoZSBwbGFjZU91dGV0cyB0b1xuICAgICAgLy8gaWdub3JlIHZpc2l0IGNoYW5nZXMgdGhhdCBvY2N1ciB3aGlsZSB0aGUgbmF2aWdhdGlvbiBpcyBpbiBwcm9ncmVzc1xuICAgICAgY29uc3QgdmlzaXRzID0gc2Vzc2lvbi5nZXRWaXNpdHMoKTtcbiAgICAgIHZpc2l0cy5mb3JFYWNoKHYgPT4gdGhpcy5wbGFjZUhpc3RvcnkuYWRkKHYpKTtcbiAgICAgIHRoaXMuX2FjdGl2ZVZpc2l0cy52YWx1ZSA9IHZpc2l0cztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQW5ndWxhciBkb2Vzbid0IHByZXNlcnZlIHRoZSB1cmwgd2hlbiBhIGd1YXJkIGNhbmNlbHMgdGhlIGJhY2sgYnV0dG9uLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEzNTg2I2lzc3VlY29tbWVudC00MzI3OTU3MjBcbiAgICAgIGlmIChzZXNzaW9uLmlzUG9wU3RhdGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2NhbmNlbGxlZCBkdXJpbmcgcG9wc3RhdGUnKTtcbiAgICAgICAgdGhpcy5hbmd1bGFyTG9jYXRpb24uZ28oc2Vzc2lvbi5wb3BTdGF0ZVJldHVyblVybCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWUgPSBudWxsO1xuICB9XG5cbiAgZXh0cmFjdENoaWxkUGF0aChhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGFueVtdIHtcbiAgICByZXR1cm4gXy5mbGF0dGVuKGFjdGl2YXRlZFJvdXRlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiBjaGlsZC51cmwpKTtcbiAgfVxuXG4gIHBhcnNlVXJsKHNuYXBzaG90OiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogUGxhY2VSb3V0ZXIuVXJsSGVscGVyIHtcbiAgICByZXR1cm4gbmV3IFBsYWNlUm91dGVyLlVybEhlbHBlcih0aGlzLnVybFNlcmlhbGl6ZXIucGFyc2Uoc25hcHNob3QudXJsKSk7XG4gIH1cblxuICAvLyBUT0RPOiB0aGlzIGFsbCBvbmx5IHNvcnQgb2Ygd29ya3MuICBPcGVuaW5nIGRpYWxvZ3MgYW5kIGNsaWNraW5nIGJhY2sgbXVsdGlwbGUgdGltZXMgYnJlYWtzIHRoaW5ncy5cbiAgLy8gVE9ETzogbmV4dCBzdGFnZSBpcyB0byBpbnZlc3RpZ2F0ZSB0cmFja2luZyBkaWFsb2cgc3RhdGUgaW4gYSBkaWZmZXJlbnQgcGxhY2VvdXRsZXQgYW5kIGtlZXBpbmcgdGhvc2VcbiAgLy8gVE9ETzogdXJscyBvdXQgb2YgdGhlIGhpc3RvcnkuXG4gIHBlcmZvcm1Jbml0aWFsTmF2aWdhdGlvbkludGVyY2VwdChhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpIHtcbiAgICBhc3NlcnQuaXNUcnV0aHkodGhpcy5pc0luaXRpYWxOYXZpZ2F0aW9uKCkpO1xuICAgIExvZ2dlci5nZXQodGhpcykuaW5mbyhgUmVkaXJlY3RpbmcgdG86ICR7bm9vcFBsYWNlRGVmLnBhdGh9YCwgeyByZXR1cm5Vcmw6IHN0YXRlLnVybCB9KTtcbiAgICBpZiAoIXRoaXMuaW5pdGlhbFJlZGlyZWN0RmluaXNoZWQpIHtcbiAgICAgIHRoaXMuaW5pdGlhbFJlZGlyZWN0RmluaXNoZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoW25vb3BQbGFjZURlZi5wYXRoLCB7XG4gICAgICAgIHJldHVyblVybDogc3RhdGUudXJsXG4gICAgICB9XSwge1xuICAgICAgICByZXBsYWNlVXJsOiB0cnVlLCAvLyBtYWtlIHN1cmUgd2UgdXBkYXRlIG91ciBoaXN0b3J5XG4gICAgICAgIHNraXBMb2NhdGlvbkNoYW5nZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlzSW5pdGlhbE5hdmlnYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlc3Npb24uZmlyc3ROYXZpZ2F0aW9uICYmICF0aGlzLmluaXRpYWxSZWRpcmVjdEZpbmlzaGVkO1xuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUGxhY2VSb3V0ZXIge1xuXG5cbiAgZXhwb3J0IGNsYXNzIFVybEhlbHBlciB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHVybFRyZWU6IFVybFRyZWUpIHtcbiAgICAgIGNvbnNvbGUubG9nKHsgc2VnbWVudHM6IHRoaXMudXJsVHJlZS5yb290LmNoaWxkcmVuLnByaW1hcnkuc2VnbWVudHMgfSk7XG4gICAgfVxuXG4gICAgY2xvbmVVcmxTZWdtZW50TGlzdCgpOiBVcmxTZWdtZW50W10ge1xuICAgICAgcmV0dXJuIFsuLi50aGlzLnVybFRyZWUucm9vdC5jaGlsZHJlbi5wcmltYXJ5LnNlZ21lbnRzXTtcbiAgICB9XG5cbiAgICB1cGRhdGVWaXNpdFNlZ21lbnRzKHZpc2l0OiBWaXNpdCk6IFVybFNlZ21lbnRbXSB7XG4gICAgICAvLyBVZ2x5LCBidXQgaXQgd29ya3MgZm9yIG5vdy5cbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5jbG9uZVVybFNlZ21lbnRMaXN0KCk7XG4gICAgICBjb25zdCB2aXNpdFNlZ21lbnRzID0gdGhpcy5jb252ZXJ0VG9VcmxTZWdtZW50cyh2aXNpdCk7XG4gICAgICBjb25zdCByZXBsYWNlQXQgPSBzZWdtZW50cy5maW5kSW5kZXgoc2VnbWVudCA9PiBzZWdtZW50LnBhdGggPT09IHZpc2l0U2VnbWVudHNbMF0ucGF0aCk7XG4gICAgICAvLyBkbyBub3QgdXNlIHRoZSByZXR1cm4gdmFsdWUsIGl0J3MgdGhlIGl0ZW1zIHRoYXQgd2VyZSByZW1vdmVkIVxuICAgICAgc2VnbWVudHMuc3BsaWNlKHJlcGxhY2VBdCwgdmlzaXRTZWdtZW50cy5sZW5ndGgsIC4uLnZpc2l0U2VnbWVudHMpO1xuICAgICAgcmV0dXJuIHNlZ21lbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSB2aXNpdCBpbnRvIHNlZ21lbnRzLiAgUGxlYXNlIG5vdCB0aGF0IHRoZXNlIHNlZ21lbnRzIGFyZSBub3QgZVxuICAgICAqIEBwYXJhbSB2aXNpdFxuICAgICAqL1xuICAgIGNvbnZlcnRUb1VybFNlZ21lbnRzKHZpc2l0OiBWaXNpdCk6IFVybFNlZ21lbnRbXSB7XG4gICAgICByZXR1cm4gdmlzaXQucGxhY2VEZWZpbml0aW9uLmhhc1JvdXRlSWQoKSA/XG4gICAgICAgIFtcbiAgICAgICAgICAvLyBOT1RFOlxuICAgICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIGF0dGFjaCB0aGUgcGFyYW1zIHRvIHRoZSByb290IHBhdGggYW5kIG5vdCB0aGUgaWQuICBJZiB3ZSBhdHRhY2ggdGhlbVxuICAgICAgICAgIC8vIHRvIGFuIGVtcHR5IGlkIHRoZW4gdGhlIGFuZ3VsYXIgcm91dGVyIHdvbid0IG1hdGNoIHRoZSBwYXR0ZXJuLlxuICAgICAgICAgIG5ldyBVcmxTZWdtZW50KHZpc2l0LnBsYWNlRGVmaW5pdGlvbi5wYXRoLCB2aXNpdC5wbGFjZURlZmluaXRpb24uZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKHZpc2l0KSksXG4gICAgICAgICAgbmV3IFVybFNlZ21lbnQodmlzaXQucGxhY2VEZWZpbml0aW9uLmdldEZvcm1hdHRlZFJvdXRlSWQodmlzaXQpLCB7fSldXG4gICAgICAgIDpcbiAgICAgICAgW1xuICAgICAgICAgIG5ldyBVcmxTZWdtZW50KHZpc2l0LnBsYWNlRGVmaW5pdGlvbi5wYXRoLCB2aXNpdC5wbGFjZURlZmluaXRpb24uZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKHZpc2l0KSlcbiAgICAgICAgXTtcbiAgICB9XG5cblxuICAgIEBUcmFjZSgpXG4gICAgY3JlYXRlUmVkaXJlY3RDb21tYW5kc0Zvcih2aXNpdDogVmlzaXQpOiBhbnlbXSB7XG5cbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy51cGRhdGVWaXNpdFNlZ21lbnRzKHZpc2l0KTtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gW107XG4gICAgICBzZWdtZW50cy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICBjb21tYW5kcy5wdXNoKHMucGF0aCk7XG4gICAgICAgIGlmIChzLnBhcmFtZXRlck1hcC5rZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKHMucGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbW1hbmRzO1xuICAgIH1cblxuICAgIGluY2x1ZGVzUGF0aE9mKHBsYWNlRGVmOiBQbGFjZURlZmluaXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmNsb25lVXJsU2VnbWVudExpc3QoKS5maW5kKHMgPT4gcy5wYXRoID09PSBwbGFjZURlZi5wYXRoKTtcbiAgICB9XG5cbiAgfVxufVxuIl19
447
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Utcm91dGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3BsYWNlLXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFHTCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGVBQWUsRUFDZixlQUFlLEVBQ2YsTUFBTSxFQUVOLGFBQWEsRUFDZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxHQUFHLEVBQ0gsZ0JBQWdCLEVBRWhCLElBQUksRUFFSixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUVsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFPN0MsTUFBTSxPQUFPLFdBQVksU0FBUSxnQkFBZ0I7Ozs7Ozs7O0lBVy9DLFlBQTZCLE1BQWMsRUFDZCxhQUE0QixFQUM1QixlQUF5QixFQUN6QixZQUEwQixFQUMxQix1QkFBZ0Q7UUFDM0UsS0FBSyxFQUFFLENBQUM7UUFMbUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLG9CQUFlLEdBQWYsZUFBZSxDQUFVO1FBQ3pCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLDRCQUF1QixHQUF2Qix1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aUNBQTRCLEdBQTVCLDRCQUE0QixDQUFxQjtZQUFXLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDL0YsQ0FBQzs7OztRQUVELElBQUksWUFBWTtZQUNkLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQztRQUNqRCxDQUFDOzs7Ozs7UUFJRCxpQkFBaUI7WUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUU7d0JBQ3pCLE9BQU8sRUFBRTs0QkFDUCxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsZ0RBQWdEO3lCQUNwRztxQkFDRixDQUFDLEVBQUU7b0JBQ0YsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQzs7Ozs7UUFHRCxrQkFBa0I7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFO3dCQUN6QixPQUFPLEVBQUU7NEJBQ1AsQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUMsRUFBRSxJQUFJO3lCQUM5QztxQkFDRixDQUFDLEVBQUU7b0JBQ0YsVUFBVSxFQUFFLElBQUksQ0FBQywyQ0FBMkM7aUJBQzdELENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQztLQUVGO0lBbkNZLG9DQUF3QiwyQkFtQ3BDLENBQUE7OztRQWxDYSxnRUFBMEQ7O1FBQUUsMENBQXVCOztBQW9DbkcsQ0FBQyxFQXpDZ0IsV0FBVyxLQUFYLFdBQVcsUUF5QzNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWN0aXZhdGVkUm91dGUsXG4gIEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXG4gIE5hdmlnYXRpb25DYW5jZWwsXG4gIE5hdmlnYXRpb25FbmQsXG4gIE5hdmlnYXRpb25FcnJvcixcbiAgTmF2aWdhdGlvblN0YXJ0LFxuICBSb3V0ZXIsXG4gIFJvdXRlclN0YXRlU25hcHNob3QsXG4gIFVybFNlcmlhbGl6ZXJcbn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIERzbCxcbiAgR2FyYmFnZUNvbGxlY3RvcixcbiAgSGFzT25lSW5kZXhDaGFpbixcbiAgbGFuZyxcbiAgTGlzdE1vZGVsLFxuICBMb2dnZXIsXG4gIE11dGFibGVMaXN0TW9kZWwsXG4gIE11dGFibGVWYWx1ZU1vZGVsLCBUcmFjZSxcbiAgVmFsdWVNb2RlbFxufSBmcm9tICdAY29vbG9uL3BlY3Rpbic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25Db250ZXh0IH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24tY29udGV4dCc7XG5pbXBvcnQgeyBNb2RhbEludGVyYWN0aW9uU2VydmljZSB9IGZyb20gJy4uL2ludGVyYWN0aW9uL3NlcnZpY2VzL21vZGFsLWludGVyYWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlc3Npb24gfSBmcm9tICcuL2d1YXJkcy9uYXZpZ2F0aW9uLXNlc3Npb24nO1xuaW1wb3J0IHsgUGxhY2VIaXN0b3J5IH0gZnJvbSAnLi9wbGFjZS1oaXN0b3J5JztcbmltcG9ydCB7IFVybFNuYXBzaG90IH0gZnJvbSAnLi91cmwtc25hcHNob3QnO1xuaW1wb3J0IHsgVmlzaXQgfSBmcm9tICcuL3Zpc2l0JztcblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbGFjZVJvdXRlciBleHRlbmRzIEdhcmJhZ2VDb2xsZWN0b3Ige1xuXG4gIHByaXZhdGUgZmlyc3RSb3V0ZSA9IHRydWU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbmF2aWdhdGlvblNlc3Npb25Nb2RlbCA9IG5ldyBNdXRhYmxlVmFsdWVNb2RlbDxOYXZpZ2F0aW9uU2Vzc2lvbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aXZlVmlzaXRzID0gbmV3IE11dGFibGVMaXN0TW9kZWw8VmlzaXQ+KCk7XG5cbiAgcmVhZG9ubHkgbmF2aWdhdGlvblNlc3Npb25BY3RpdmU6IFZhbHVlTW9kZWw8Ym9vbGVhbj47XG4gIHJlYWRvbmx5IGFjdGl2ZVZpc2l0SW5kZXg6IEhhc09uZUluZGV4Q2hhaW48J3BsYWNlRGVmaW5pdGlvbicsIFZpc2l0PjtcbiAgcHJpdmF0ZSBfbmF2aWdhdGlvblNlc3Npb25Db250ZXh0OiBOYXZpZ2F0aW9uU2Vzc2lvbi5Db250ZXh0O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdXJsU2VyaWFsaXplcjogVXJsU2VyaWFsaXplcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhbmd1bGFyTG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHBsYWNlSGlzdG9yeTogUGxhY2VIaXN0b3J5LFxuICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsSW50ZXJhY3Rpb25TZXJ2aWNlOiBNb2RhbEludGVyYWN0aW9uU2VydmljZSkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3QgeyBjaGFpbiwgdmFsdWVPZiwgYmVmb3JlLCB3aGVuLCBhZnRlciwgb2JzZXJ2ZSwgc3dpdGNoT24gfSA9IERzbC5kaXNwb3NlV2l0aCh0aGlzKTtcbiAgICB0aGlzLmFjdGl2ZVZpc2l0SW5kZXggPSBjaGFpbih0aGlzLl9hY3RpdmVWaXNpdHMpLmluZGV4QnkoJ3BsYWNlRGVmaW5pdGlvbicpO1xuICAgIHRoaXMubmF2aWdhdGlvblNlc3Npb25BY3RpdmUgPSBjaGFpbih0aGlzLm5hdmlnYXRpb25TZXNzaW9uTW9kZWwpLnBsdWNrKCdhY3RpdmUnKTtcbiAgICB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbkNvbnRleHQgPSBuZXcgTmF2aWdhdGlvblNlc3Npb24uQ29udGV4dCh0aGlzLnJvdXRlciwgdGhpcy5tb2RhbEludGVyYWN0aW9uU2VydmljZSwgdGhpcy5hbmd1bGFyTG9jYXRpb24sIHNlc3Npb24gPT4ge1xuICAgICAgdGhpcy5wcm9jZXNzTmF2aWdhdGlvblN1Y2Nlc3Moc2Vzc2lvbik7XG4gICAgfSk7XG4gICAgdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZSA9IG5ldyBOYXZpZ2F0aW9uU2Vzc2lvbi5JZGxlKHRoaXMuX25hdmlnYXRpb25TZXNzaW9uQ29udGV4dCk7XG5cbiAgICAvLyBUT0RPOiBtYWtlIHNldHVwIHRoZSBjYWxsYmFja3MgaW4gZHVyaW5nIG1vZHVsZSBpbml0aWF0aW9uIHRvIG1ha2UgdGhpcyB0ZXN0YWJsZS5cbiAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIC8vIFJvdXRpbmcgZXZlbnQgc2VxdWVuY2VcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIE5hdmlnYXRpb25TdGFydCAtPiAuLi4uIC0+IE5hdmlnYXRpb25DYW5jZWwgLS0+IHJlZGlyZWN0LCBnbyBhcm91bmQgYWdhaW4gaW4gdGhlIHNhbWUgc2Vzc2lvblxuICAgICAgLy8gTmF2aWdhdGlvblN0YXJ0IC0+IC4uLi4gLT4gTmF2aWdhdGlvbkVuZCAtLT4gbmF2aWdhdGlvbiBjb21wbGV0ZSwgZW5kIHNlc3Npb24uXG4gICAgICAvLyBOYXZpZ2F0aW9uU3RhcnQgLT4gLi4uLiAtPiBOYXZpZ2F0aW9uRXJyb3IgLS0+IG5hdmlnYXRpb24gYWJvcnRlZCwgZW5kIHNlc3Npb24uXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XG4gICAgICAgIHRoaXMucnVuU3RhdGVUcmFuc2l0aW9uKHNlc3Npb24gPT4gc2Vzc2lvbi5vblN0YXJ0KGV2ZW50KSk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgIHRoaXMucnVuU3RhdGVUcmFuc2l0aW9uKHNlc3Npb24gPT4gc2Vzc2lvbi5vbkVuZChldmVudCkpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVycm9yKSB7XG4gICAgICAgIHRoaXMucnVuU3RhdGVUcmFuc2l0aW9uKHNlc3Npb24gPT4gc2Vzc2lvbi5vbkVycm9yKGV2ZW50KSk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uQ2FuY2VsKSB7XG4gICAgICAgIHRoaXMucnVuU3RhdGVUcmFuc2l0aW9uKHNlc3Npb24gPT4gc2Vzc2lvbi5vbkNhbmNlbChldmVudCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gUHVzaCBkaWFsb2cgc3RhdGUgdG8gdGhlIHVybCBzbyB3ZSBjYW4gY2FwdHVyZSB0aGUgYmFjayBidXR0b24uXG4gICAgdGhpcy5tb2RhbEludGVyYWN0aW9uU2VydmljZS5hZGRBY3Rpdml0eUxpc3RlbmVyKG5ldyBQbGFjZVJvdXRlci5JbnRlcmFjdGlvblJvdXRlTWVkaWF0b3IodGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbkFjdGl2ZSwgdGhpcy5yb3V0ZXIpKTtcblxuICAgIC8vIFRoZSBhbmd1bGFyIHJvdXRlciBkb2Vzbid0IGFsd2F5cyBmaXJlIHJvdXRlciBldmVudHMgd2hlbiB0aGUgYmFjayBidXR0b24gaXMgcHVzaGVkIHdoaWxlIGEgbmF2aWdhdGlvblxuICAgIC8vIHNlc3Npb24gaXMgaW4gcHJvZ3Jlc3MuICBTb21ldGltZXMgd2Ugb25seSBrbm93IGFib3V0IGl0IGZyb20gdGhlIHVybCBjaGFuZ2UuXG4gICAgYW5ndWxhckxvY2F0aW9uLm9uVXJsQ2hhbmdlKHVybCA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgIyMjIyB1cmwgY2hhbmdlZCAtPiAke3VybH1gKTtcbiAgICAgIGNvbnN0IGludGVyYWN0aW9uQ29udGV4dCA9IHRoaXMubmF2aWdhdGlvblNlc3Npb25BY3RpdmUudmFsdWUgJiYgdGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbi5pbnRlcmFjdGlvbkNvbnRleHQ7XG4gICAgICBpZiAoaW50ZXJhY3Rpb25Db250ZXh0ICYmIGludGVyYWN0aW9uQ29udGV4dC5pc0FjdGl2ZSgpKSB7XG4gICAgICAgIExvZ2dlci5nZXQodGhpcykuaW5mbyhgYmFjayBidXR0b24gcHJlc3NlZCBkdXJpbmcgbmF2aWdhdGlvbiBzZXNzaW9uIGludGVyYWN0aW9uYCk7XG4gICAgICAgIHRoaXMucnVuU3RhdGVUcmFuc2l0aW9uKG5hdmlnYXRpb25TZXNzaW9uID0+IG5hdmlnYXRpb25TZXNzaW9uLm9uQmFja0NsaWNrZWREdXJpbmdOYXZpZ2F0aW9uSW50ZXJhY3Rpb24odXJsKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NOYXZpZ2F0aW9uU3VjY2VzcyhzZXNzaW9uOiBOYXZpZ2F0aW9uU2Vzc2lvbikge1xuICAgIGNvbnN0IHZpc2l0cyA9IHNlc3Npb24uZ2V0VmlzaXRzKCk7XG4gICAgdmlzaXRzLmZvckVhY2godiA9PiB0aGlzLnBsYWNlSGlzdG9yeS5hZGQodikpO1xuICAgIC8vIFVwZGF0ZSB2aXNpdHMgYmVmb3JlIHdlIGVuZCB0aGUgbmF2aWdhdGlvbiBzZXNzaW9uLiAgVGhpcyBhbGxvd3MgdGhlIHBsYWNlT3V0ZXRzIHRvXG4gICAgLy8gaWdub3JlIHZpc2l0IGNoYW5nZXMgdGhhdCBvY2N1ciB3aGlsZSB0aGUgbmF2aWdhdGlvbiBpcyBpbiBwcm9ncmVzc1xuICAgIHRoaXMuX2FjdGl2ZVZpc2l0cy52YWx1ZSA9IHZpc2l0cztcbiAgfVxuXG4gIGdldCBuYXZpZ2F0aW9uU2Vzc2lvbigpOiBOYXZpZ2F0aW9uU2Vzc2lvbiB7XG4gICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWU7XG4gIH1cblxuICBnZXQgbmF2aWdhdGlvblNlc3Npb25Nb2RlbCgpOiBWYWx1ZU1vZGVsPE5hdmlnYXRpb25TZXNzaW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwucmVhZG9ubHk7XG4gIH1cblxuICBnZXQgYWN0aXZlVmlzaXRzKCk6IExpc3RNb2RlbDxWaXNpdD4ge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVWaXNpdHMucmVhZG9ubHk7XG4gIH1cblxuICAvKipcbiAgICogIHBsYWNlUm91dGVyLm5hdmlnYXRlKHBsYWNlRGVzdGluYXRpb25zLnNvbWVQbGFjZS5jcmVhdGVWaXNpdChyb3V0ZUlkLCAuLi52aXNpdFBhcmFtcykpO1xuICAgKiBAcGFyYW0gdmlzaXRcbiAgICovXG4gIGFzeW5jIG5hdmlnYXRlKHZpc2l0OiBWaXNpdCwgb3B0aW9ucz86IHsgcmVsYXRpdmVUbzogQWN0aXZhdGVkUm91dGUgfSkge1xuICAgIHRoaXMuZG9OYXZpZ2F0aW9uKHZpc2l0LCBhc3luYyByb3V0ZXIgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZHMgPSBbXG4gICAgICAgIHZpc2l0LnBsYWNlRGVmaW5pdGlvbi5wYXRoLFxuICAgICAgICAuLi50aGlzLmNyZWF0ZVJvdXRlUGFyYW1ldGVycyh2aXNpdClcbiAgICAgIF07XG4gICAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShjb21tYW5kcywge1xuICAgICAgICByZWxhdGl2ZVRvOiBvcHRpb25zID8gb3B0aW9ucy5yZWxhdGl2ZVRvIDogbnVsbFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuICBhc3luYyBwdXNoVmlzaXRDaGFuZ2VzVG9Sb3V0ZShhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsIHByZXZpb3VzOiBWaXNpdCwgbmV4dDogVmlzaXQpIHtcbiAgICAvLyB3ZSBoYXZlIHRvIHB1c2ggdG8gaGlzdG9yeSBzbyBvdXIgcmVtZW1iZXIgc2FuaXRpc2VycyBkb24ndCBwaWNrIHVwIHRoZSBwcmV2aW91cyB2YWx1ZVxuICAgIC8vIHdoZW4gaXQncyBiZWVuIGNsZWFyZWQgYnkgdGhlIHVzZXIuXG4gICAgdGhpcy5wbGFjZUhpc3RvcnkuYWRkKG5leHQpO1xuXG4gICAgLy8gRklYTUU6IG5vIHJvdXRlIGlkIC0+IHJvdXRlIGlkIGR1cGxpY2F0ZXMgcm91dGUgcGFyYW1ldGVyc1xuICAgIGlmIChuZXh0Lmhhc1JvdXRpbmdDaGFuZ2VkRnJvbShwcmV2aW91cykpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvTmF2aWdhdGlvbihuZXh0LCByb3V0ZXIgPT4ge1xuICAgICAgICBjb25zdCBjb21tYW5kcyA9IHRoaXMucGFyc2VVcmwodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QpLmNyZWF0ZVJlZGlyZWN0Q29tbWFuZHNGb3IobmV4dCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcjIyMgUHVzaCBDaGFuZ2VzIHRvIHJvdXRlIFJlZGlyZWN0JywgeyBjb21tYW5kcyB9KTtcbiAgICAgICAgcmV0dXJuIHJvdXRlci5uYXZpZ2F0ZShjb21tYW5kcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkb05hdmlnYXRpb24odmlzaXQ6IFZpc2l0LCBydW5OYXZpZ2F0aW9uQ29tbWFuZHM6IChyb3V0ZXI6IFJvdXRlcikgPT4gYW55KSB7XG4gICAgaWYgKHRoaXMubmF2aWdhdGlvblNlc3Npb25BY3RpdmUudmFsdWUpIHtcbiAgICAgIGxhbmcuaWxsZWdhbFN0YXRlKCdOYXZpZ2F0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MnKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1blN0YXRlVHJhbnNpdGlvbihjdXJyZW50ID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgTmF2aWdhdGlvblNlc3Npb24uQWN0aXZlKCB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbkNvbnRleHQsIGZhbHNlLCB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwpO1xuICAgICAgc2Vzc2lvbi5zdG9yZVZpc2l0KHZpc2l0KTtcbiAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBydW5OYXZpZ2F0aW9uQ29tbWFuZHModGhpcy5yb3V0ZXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSb3V0ZXIgaGFzIGZpbmlzaGVkIChzaW5jZSB0aGVyZSB3YXMgbm8gcm91dGVyIGNoYW5nZSByZXF1aXJlZCkgc28gd2VcbiAgICAgIC8vIG5lZWQgdG8gZW5kIHRoZSBuYXZpZ2F0aW9uIHNlc3Npb24uXG4gICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbi5hY3RpdmUgJiYgIXRoaXMucm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uKCkpIHtcbiAgICAgICAgdGhpcy5ydW5TdGF0ZVRyYW5zaXRpb24oc2Vzc2lvbiA9PiBzZXNzaW9uLm9uRW5kKG5ldyBOYXZpZ2F0aW9uRW5kKC0xLCAnJywgJycpKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJ1blN0YXRlVHJhbnNpdGlvbih0cmFuc2l0aW9uOiAobmF2aWdhdGlvblNlc3Npb246IE5hdmlnYXRpb25TZXNzaW9uKSA9PiBOYXZpZ2F0aW9uU2Vzc2lvbikge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZTtcbiAgICBjb25zdCBuZXh0ID0gdHJhbnNpdGlvbih0aGlzLm5hdmlnYXRpb25TZXNzaW9uKTtcbiAgICB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnZhbHVlID0gbmV4dDtcbiAgICBpZiAobmV4dCAhPT0gcHJldmlvdXMpIHtcbiAgICAgIHByZXZpb3VzLmRpc3Bvc2UoKTtcbiAgICAgIExvZ2dlci5nZXQodGhpcykuaW5mbyhgUm91dGVyIFN0YXRlIFRyYW5zaXRpb246ICR7cHJldmlvdXMudG9TdHJpbmcoKX0gLT4gJHtuZXh0LnRvU3RyaW5nKCl9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSb3V0ZVBhcmFtZXRlcnModmlzaXQ6IFZpc2l0KSB7XG4gICAgY29uc3QgZGVmID0gdmlzaXQucGxhY2VEZWZpbml0aW9uO1xuICAgIHJldHVybiB2aXNpdC5oYXNSb3V0ZUlkKCkgP1xuICAgICAgW2RlZi5nZXRGb3JtYXR0ZWRSb3V0ZUlkKHZpc2l0KSwgZGVmLmdldEZvcm1hdHRlZFJvdXRlUGFyYW1ldGVycyh2aXNpdCldIDpcbiAgICAgIFtkZWYuZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKHZpc2l0KV07XG4gIH1cblxuICAvLyBwcml2YXRlIG9uQW5ndWxhclJvdXRlclN0YXJ0ZWQoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCkge1xuICAvLyAgIGlmICghdGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbikge1xuICAvLyAgICAgLy8gV2UgYmVlbiBhY3RpdmF0ZWQgYnkgYW4gZXh0ZXJuYWwgcm91dGUgcmF0aGVyIHRoYW4gcGxhY2VSb3V0ZXIuZ28odmlzaXQpXG4gIC8vICAgICB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnZhbHVlID0gdGhpcy5jcmVhdGVFeHRlcm5hbE5hdmlnYXRpb25TZXNzaW9uKGV2ZW50KTtcbiAgLy8gICB9XG4gIC8vICAgdGhpcy5maXJzdFJvdXRlID0gZmFsc2U7XG4gIC8vIH1cbiAgLy9cbiAgLy8gcHJpdmF0ZSBjcmVhdGVFeHRlcm5hbE5hdmlnYXRpb25TZXNzaW9uKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpIHtcbiAgLy8gICByZXR1cm4gbmV3IE5hdmlnYXRpb25TZXNzaW9uLkFjdGl2ZShcbiAgLy8gICAgIHRoaXMubW9kYWxJbnRlcmFjdGlvblNlcnZpY2UsXG4gIC8vICAgICB0aGlzLmFuZ3VsYXJMb2NhdGlvbixcbiAgLy8gICAgIC8vIGV2ZW50LnVybCxcbiAgLy8gICAgIGV2ZW50Lm5hdmlnYXRpb25UcmlnZ2VyID09PSAncG9wc3RhdGUnXG4gIC8vICAgKTtcbiAgLy8gfVxuICAvLyBwcml2YXRlIG9uQW5ndWxhclJvdXRlckZpbmlzaGVkKGNhbmNlbGxlZDogYm9vbGVhbikge1xuICAvLyAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnZhbHVlO1xuICAvLyAgIGlmIChzZXNzaW9uLmJhY2tDbGlja2VkRHVyaW5nQ2FuRGVhY3RpdmF0ZUludGVyYWN0aW9uKSB7XG4gIC8vICAgICAvLyB3ZSBzd2FsbG93IHRoaXMgZmluaXNoZWQgZXZlbnQgYnV0IGtlZXAgdGhlIHNlc3Npb24gYWxpdmUgYXMgd2UncmUgZ29pbmcgdG9cbiAgLy8gICAgIC8vIGdldCBhbm90aGVyIHJvdXRlIHN0YXJ0ZWQgZXZlbnQsIHdoaWNoIHdpbGwgdHJpZ2dlciBhbm9odGVyIGNhbkRlYWN0aXZhdGUgZGlhbG9nXG4gIC8vICAgICAvLyBpZiB3ZSBzdGFydCBhIG5ldyBzZXNzaW9uLlxuICAvLyAgICAgLy8gc2Vzc2lvbi5yZXNldEludGVyYWN0aW9uU2Vzc2lvbigpXG4gIC8vICAgfSBlbHNlIHtcbiAgLy8gICAgIGlmICghY2FuY2VsbGVkKSB7XG4gIC8vICAgICAgIGNvbnN0IHZpc2l0cyA9IHNlc3Npb24uZ2V0VmlzaXRzKCk7XG4gIC8vICAgICAgIHZpc2l0cy5mb3JFYWNoKHYgPT4gdGhpcy5wbGFjZUhpc3RvcnkuYWRkKHYpKTtcbiAgLy8gICAgICAgLy8gVXBkYXRlIHZpc2l0cyBiZWZvcmUgd2UgZW5kIHRoZSBuYXZpZ2F0aW9uIHNlc3Npb24uICBUaGlzIGFsbG93cyB0aGUgcGxhY2VPdXRldHMgdG9cbiAgLy8gICAgICAgLy8gaWdub3JlIHZpc2l0IGNoYW5nZXMgdGhhdCBvY2N1ciB3aGlsZSB0aGUgbmF2aWdhdGlvbiBpcyBpbiBwcm9ncmVzc1xuICAvLyAgICAgICB0aGlzLl9hY3RpdmVWaXNpdHMudmFsdWUgPSB2aXNpdHM7XG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gdGhlIG5hdmlnYXRpb24gc2Vzc2lvblxuICAvLyAgICAgICAvLyBBbmd1bGFyIGRvZXNuJ3QgcHJlc2VydmUgdGhlIHVybCB3aGVuIGEgZ3VhcmQgY2FuY2VscyB0aGUgYmFjayBidXR0b24uXG4gIC8vICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMzU4NiNpc3N1ZWNvbW1lbnQtNDMyNzk1NzIwXG4gIC8vICAgICAgIC8vIHNlc3Npb24ucmVtZW1iZXJQb3BTdGF0ZVJldHVyblVybCh0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwpO1xuICAvLyAgICAgICBpZiAoc2Vzc2lvbi5pc1BvcFN0YXRlKSB7XG4gIC8vICAgICAgICAgY29uc29sZS5sb2coJ2NhbmNlbGxlZCBkdXJpbmcgcG9wc3RhdGUnKTtcbiAgLy8gICAgICAgICAvLyB0aGlzLmFuZ3VsYXJMb2NhdGlvbi5nbyhzZXNzaW9uLnByZXZpb3VzVXJsKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfVxuICAvLyAgICAgc2Vzc2lvbi5kaXNwb3NlKCk7XG4gIC8vICAgICB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnZhbHVlID0gbnVsbDtcbiAgLy8gICB9XG4gIC8vIH1cblxuICBleHRyYWN0Q2hpbGRQYXRoKGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogYW55W10ge1xuICAgIHJldHVybiBfLmZsYXR0ZW4oYWN0aXZhdGVkUm91dGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IGNoaWxkLnVybCkpO1xuICB9XG5cbiAgcGFyc2VVcmwoc25hcHNob3Q6IFJvdXRlclN0YXRlU25hcHNob3QpOiBVcmxTbmFwc2hvdCB7XG4gICAgcmV0dXJuIG5ldyBVcmxTbmFwc2hvdCh0aGlzLnVybFNlcmlhbGl6ZXIucGFyc2Uoc25hcHNob3QudXJsKSk7XG4gIH1cblxufVxuXG5leHBvcnQgbmFtZXNwYWNlIFBsYWNlUm91dGVyIHtcblxuICBleHBvcnQgY29uc3QgSU5URVJBQ1RJT05fUk9VVEVSX09VVExFVCA9ICdhdXAtaW50ZXJhY3Rpb24nO1xuXG4gIGV4cG9ydCBjbGFzcyBJbnRlcmFjdGlvblJvdXRlTWVkaWF0b3IgaW1wbGVtZW50cyBJbnRlcmFjdGlvbkNvbnRleHQuTGlzdGVuZXIge1xuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IG5hdmlnYXRpb25TZXNzaW9uTW9kZWxBY3RpdmU6IFZhbHVlTW9kZWw8Ym9vbGVhbj4sIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyKSB7XG4gICAgfVxuXG4gICAgZ2V0IGlzTmF2aWdhdGluZygpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXNzaW9uTW9kZWxBY3RpdmUudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UncmUgbm90IGluIGEgbmF2aWdhdGlvbiB3ZSBwdXNoXG4gICAgLy8gQFRyYWNlKClcbiAgICBvbkFjdGl2aXR5U3RhcnRlZCgpOiB2b2lkIHtcbiAgICAgIGlmICghdGhpcy5pc05hdmlnYXRpbmcpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuJywge1xuICAgICAgICAgIG91dGxldHM6IHtcbiAgICAgICAgICAgIFtQbGFjZVJvdXRlci5JTlRFUkFDVElPTl9ST1VURVJfT1VUTEVUXTogWydtb2RhbCddIC8vIFwib3BlblwiIG11c3QgYmUgYSB2YWxpZCByb3V0ZSBmb3IgdGhpcyBvdXRsZXQuXG4gICAgICAgICAgfVxuICAgICAgICB9XSwge1xuICAgICAgICAgIHJlcGxhY2VVcmw6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBAVHJhY2UoKVxuICAgIG9uQWN0aXZpdHlGaW5pc2hlZCgpOiB2b2lkIHtcbiAgICAgIGlmICghdGhpcy5pc05hdmlnYXRpbmcpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuJywge1xuICAgICAgICAgIG91dGxldHM6IHtcbiAgICAgICAgICAgIFtQbGFjZVJvdXRlci5JTlRFUkFDVElPTl9ST1VURVJfT1VUTEVUXTogbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgfV0sIHtcbiAgICAgICAgICByZXBsYWNlVXJsOiB0cnVlIC8vIHJlbW92ZSB0aGUgaW50ZXJhY3Rpb24gZnJvbSB0aGUgaGlzdG9yeS5cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxufVxuIl19