@ngxs/store 18.1.1-dev.master-e935e57 → 18.1.1-dev.master-d6b076c

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.
@@ -0,0 +1,34 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class NgxsActionRegistry {
4
+ constructor() {
5
+ // Instead of going over the states list every time an action is dispatched,
6
+ // we are constructing a map of action types to lists of action metadata.
7
+ // If the `@@Init` action is handled in two different states, the action
8
+ // metadata list will contain two objects that have the state `instance` and
9
+ // method names to be used as action handlers (decorated with `@Action(InitState)`).
10
+ this._actionTypeToHandlersMap = new Map();
11
+ }
12
+ ngOnDestroy() {
13
+ this._actionTypeToHandlersMap.clear();
14
+ }
15
+ get(type) {
16
+ return this._actionTypeToHandlersMap.get(type);
17
+ }
18
+ register(type, handler) {
19
+ const handlers = this._actionTypeToHandlersMap.get(type) ?? new Set();
20
+ handlers.add(handler);
21
+ this._actionTypeToHandlersMap.set(type, handlers);
22
+ return () => {
23
+ const handlers = this._actionTypeToHandlersMap.get(type);
24
+ handlers.delete(handler);
25
+ };
26
+ }
27
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgxsActionRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
28
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgxsActionRegistry, providedIn: 'root' }); }
29
+ }
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: NgxsActionRegistry, decorators: [{
31
+ type: Injectable,
32
+ args: [{ providedIn: 'root' }]
33
+ }] });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3RvcmUvc3JjL2FjdGlvbnMvYWN0aW9uLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWtCLE1BQU0sZUFBZSxDQUFDOztBQU8zRCxNQUFNLE9BQU8sa0JBQWtCO0lBRC9CO1FBRUUsNEVBQTRFO1FBQzVFLHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUsNEVBQTRFO1FBQzVFLG9GQUFvRjtRQUNuRSw2QkFBd0IsR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztLQW9CckY7SUFsQkMsV0FBVztRQUNULElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsR0FBRyxDQUFDLElBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFZLEVBQUUsT0FBd0I7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3RFLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFbEQsT0FBTyxHQUFHLEVBQUU7WUFDVixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBRSxDQUFDO1lBQzFELFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDO0lBQ0osQ0FBQztpSUF6QlUsa0JBQWtCO3FJQUFsQixrQkFBa0IsY0FETCxNQUFNOzsyRkFDbkIsa0JBQWtCO2tCQUQ5QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIHR5cGUgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuLy8gYWN0aW9uOiBJbnN0YW5jZTxBY3Rpb25UeXBlPi5cbmV4cG9ydCB0eXBlIEFjdGlvbkhhbmRsZXJGbiA9IChhY3Rpb246IGFueSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4gfCBPYnNlcnZhYmxlPHVua25vd24+O1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIE5neHNBY3Rpb25SZWdpc3RyeSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8vIEluc3RlYWQgb2YgZ29pbmcgb3ZlciB0aGUgc3RhdGVzIGxpc3QgZXZlcnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgLy8gd2UgYXJlIGNvbnN0cnVjdGluZyBhIG1hcCBvZiBhY3Rpb24gdHlwZXMgdG8gbGlzdHMgb2YgYWN0aW9uIG1ldGFkYXRhLlxuICAvLyBJZiB0aGUgYEBASW5pdGAgYWN0aW9uIGlzIGhhbmRsZWQgaW4gdHdvIGRpZmZlcmVudCBzdGF0ZXMsIHRoZSBhY3Rpb25cbiAgLy8gbWV0YWRhdGEgbGlzdCB3aWxsIGNvbnRhaW4gdHdvIG9iamVjdHMgdGhhdCBoYXZlIHRoZSBzdGF0ZSBgaW5zdGFuY2VgIGFuZFxuICAvLyBtZXRob2QgbmFtZXMgdG8gYmUgdXNlZCBhcyBhY3Rpb24gaGFuZGxlcnMgKGRlY29yYXRlZCB3aXRoIGBAQWN0aW9uKEluaXRTdGF0ZSlgKS5cbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aW9uVHlwZVRvSGFuZGxlcnNNYXAgPSBuZXcgTWFwPHN0cmluZywgU2V0PEFjdGlvbkhhbmRsZXJGbj4+KCk7XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aW9uVHlwZVRvSGFuZGxlcnNNYXAuY2xlYXIoKTtcbiAgfVxuXG4gIGdldCh0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9uVHlwZVRvSGFuZGxlcnNNYXAuZ2V0KHR5cGUpO1xuICB9XG5cbiAgcmVnaXN0ZXIodHlwZTogc3RyaW5nLCBoYW5kbGVyOiBBY3Rpb25IYW5kbGVyRm4pIHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuX2FjdGlvblR5cGVUb0hhbmRsZXJzTWFwLmdldCh0eXBlKSA/PyBuZXcgU2V0KCk7XG4gICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpO1xuICAgIHRoaXMuX2FjdGlvblR5cGVUb0hhbmRsZXJzTWFwLnNldCh0eXBlLCBoYW5kbGVycyk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLl9hY3Rpb25UeXBlVG9IYW5kbGVyc01hcC5nZXQodHlwZSkhO1xuICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -1,7 +1,6 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import { ɵOrderedSubject } from '@ngxs/store/internals';
3
- import { Observable } from 'rxjs';
4
- import { share } from 'rxjs/operators';
3
+ import { Observable, Subject, filter, share } from 'rxjs';
5
4
  import { leaveNgxs } from './operators/leave-ngxs';
6
5
  import { InternalNgxsExecutionStrategy } from './execution/internal-ngxs-execution-strategy';
7
6
  import * as i0 from "@angular/core";
@@ -10,16 +9,25 @@ import * as i1 from "./execution/internal-ngxs-execution-strategy";
10
9
  * Internal Action stream that is emitted anytime an action is dispatched.
11
10
  */
12
11
  export class InternalActions extends ɵOrderedSubject {
12
+ constructor() {
13
+ super();
14
+ // This subject will be the first to know about the dispatched action, its purpose is for
15
+ // any logic that must be executed before action handlers are invoked (i.e., cancelation).
16
+ this.dispatched$ = new Subject();
17
+ this.pipe(filter(ctx => ctx.status === "DISPATCHED" /* ActionStatus.Dispatched */)).subscribe(ctx => {
18
+ this.dispatched$.next(ctx);
19
+ });
20
+ }
13
21
  ngOnDestroy() {
14
22
  this.complete();
15
23
  }
16
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: InternalActions, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
24
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: InternalActions, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
17
25
  /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: InternalActions, providedIn: 'root' }); }
18
26
  }
19
27
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: InternalActions, decorators: [{
20
28
  type: Injectable,
21
29
  args: [{ providedIn: 'root' }]
22
- }] });
30
+ }], ctorParameters: () => [] });
23
31
  /**
24
32
  * Action stream that is emitted anytime an action is dispatched.
25
33
  *
@@ -49,4 +57,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
49
57
  type: Injectable,
50
58
  args: [{ providedIn: 'root' }]
51
59
  }], ctorParameters: () => [{ type: InternalActions }, { type: i1.InternalNgxsExecutionStrategy }] });
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9ucy1zdHJlYW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9zdG9yZS9zcmMvYWN0aW9ucy1zdHJlYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7QUFrQjdGOztHQUVHO0FBRUgsTUFBTSxPQUFPLGVBQWdCLFNBQVEsZUFBOEI7SUFDakUsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO2lJQUhVLGVBQWU7cUlBQWYsZUFBZSxjQURGLE1BQU07OzJGQUNuQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7QUFPbEM7Ozs7R0FJRztBQUVILE1BQU0sT0FBTyxPQUFRLFNBQVEsVUFBeUI7SUFDcEQsWUFDRSxnQkFBaUMsRUFDakMseUJBQXdEO1FBRXhELE1BQU0sc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUNsRCxTQUFTLENBQUMseUJBQXlCLENBQUM7UUFDcEMsbUVBQW1FO1FBQ25FLGtFQUFrRTtRQUNsRSxrRUFBa0U7UUFDbEUseUZBQXlGO1FBQ3pGLEtBQUssRUFBRSxDQUNSLENBQUM7UUFFRixLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDZixNQUFNLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDLFNBQVMsQ0FBQztnQkFDekQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQy9CLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUNyQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTthQUNwQyxDQUFDLENBQUM7WUFFSCxRQUFRLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO2lJQXZCVSxPQUFPO3FJQUFQLE9BQU8sY0FETSxNQUFNOzsyRkFDbkIsT0FBTztrQkFEbkIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IMm1T3JkZXJlZFN1YmplY3QgfSBmcm9tICdAbmd4cy9zdG9yZS9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2hhcmUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IGxlYXZlTmd4cyB9IGZyb20gJy4vb3BlcmF0b3JzL2xlYXZlLW5neHMnO1xuaW1wb3J0IHsgSW50ZXJuYWxOZ3hzRXhlY3V0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL2V4ZWN1dGlvbi9pbnRlcm5hbC1uZ3hzLWV4ZWN1dGlvbi1zdHJhdGVneSc7XG5cbi8qKlxuICogU3RhdHVzIG9mIGEgZGlzcGF0Y2hlZCBhY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gQWN0aW9uU3RhdHVzIHtcbiAgRGlzcGF0Y2hlZCA9ICdESVNQQVRDSEVEJyxcbiAgU3VjY2Vzc2Z1bCA9ICdTVUNDRVNTRlVMJyxcbiAgQ2FuY2VsZWQgPSAnQ0FOQ0VMRUQnLFxuICBFcnJvcmVkID0gJ0VSUk9SRUQnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uQ29udGV4dDxUID0gYW55PiB7XG4gIHN0YXR1czogQWN0aW9uU3RhdHVzO1xuICBhY3Rpb246IFQ7XG4gIGVycm9yPzogRXJyb3I7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgQWN0aW9uIHN0cmVhbSB0aGF0IGlzIGVtaXR0ZWQgYW55dGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEFjdGlvbnMgZXh0ZW5kcyDJtU9yZGVyZWRTdWJqZWN0PEFjdGlvbkNvbnRleHQ+IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jb21wbGV0ZSgpO1xuICB9XG59XG5cbi8qKlxuICogQWN0aW9uIHN0cmVhbSB0aGF0IGlzIGVtaXR0ZWQgYW55dGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZC5cbiAqXG4gKiBZb3UgY2FuIGxpc3RlbiB0byB0aGlzIGluIHNlcnZpY2VzIHRvIHJlYWN0IHdpdGhvdXQgc3RvcmVzLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEFjdGlvbnMgZXh0ZW5kcyBPYnNlcnZhYmxlPEFjdGlvbkNvbnRleHQ+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgaW50ZXJuYWxBY3Rpb25zJDogSW50ZXJuYWxBY3Rpb25zLFxuICAgIGludGVybmFsRXhlY3V0aW9uU3RyYXRlZ3k6IEludGVybmFsTmd4c0V4ZWN1dGlvblN0cmF0ZWd5XG4gICkge1xuICAgIGNvbnN0IHNoYXJlZEludGVybmFsQWN0aW9ucyQgPSBpbnRlcm5hbEFjdGlvbnMkLnBpcGUoXG4gICAgICBsZWF2ZU5neHMoaW50ZXJuYWxFeGVjdXRpb25TdHJhdGVneSksXG4gICAgICAvLyBUaGUgYEludGVybmFsQWN0aW9uc2Agc3ViamVjdCBlbWl0cyBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUuXG4gICAgICAvLyBXZSBoYXZlIHRvIHJlLWVudGVyIHRoZSBBbmd1bGFyIHpvbmUgZm9yIGFueSBpbmNvbWluZyBjb25zdW1lci5cbiAgICAgIC8vIFRoZSBgc2hhcmUoKWAgb3BlcmF0b3IgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNoYW5nZSBkZXRlY3Rpb25zLlxuICAgICAgLy8gVGhpcyB3b3VsZCBjYWxsIGxlYXZlIG9ubHkgb25jZSBmb3IgYW55IHN0cmVhbSBlbWlzc2lvbiBhY3Jvc3MgYWxsIGFjdGl2ZSBzdWJzY3JpYmVycy5cbiAgICAgIHNoYXJlKClcbiAgICApO1xuXG4gICAgc3VwZXIob2JzZXJ2ZXIgPT4ge1xuICAgICAgY29uc3QgY2hpbGRTdWJzY3JpcHRpb24gPSBzaGFyZWRJbnRlcm5hbEFjdGlvbnMkLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IGN0eCA9PiBvYnNlcnZlci5uZXh0KGN0eCksXG4gICAgICAgIGVycm9yOiBlcnJvciA9PiBvYnNlcnZlci5lcnJvcihlcnJvciksXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiBvYnNlcnZlci5jb21wbGV0ZSgpXG4gICAgICB9KTtcblxuICAgICAgb2JzZXJ2ZXIuYWRkKGNoaWxkU3Vic2NyaXB0aW9uKTtcbiAgICB9KTtcbiAgfVxufVxuIl19
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9ucy1zdHJlYW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9zdG9yZS9zcmMvYWN0aW9ucy1zdHJlYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sOENBQThDLENBQUM7OztBQWtCN0Y7O0dBRUc7QUFFSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxlQUE4QjtJQUtqRTtRQUNFLEtBQUssRUFBRSxDQUFDO1FBTFYseUZBQXlGO1FBQ3pGLDBGQUEwRjtRQUNqRixnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFpQixDQUFDO1FBS2xELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sK0NBQTRCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMvRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7aUlBZlUsZUFBZTtxSUFBZixlQUFlLGNBREYsTUFBTTs7MkZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOztBQW1CbEM7Ozs7R0FJRztBQUVILE1BQU0sT0FBTyxPQUFRLFNBQVEsVUFBeUI7SUFDcEQsWUFDRSxnQkFBaUMsRUFDakMseUJBQXdEO1FBRXhELE1BQU0sc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUNsRCxTQUFTLENBQUMseUJBQXlCLENBQUM7UUFDcEMsbUVBQW1FO1FBQ25FLGtFQUFrRTtRQUNsRSxrRUFBa0U7UUFDbEUseUZBQXlGO1FBQ3pGLEtBQUssRUFBRSxDQUNSLENBQUM7UUFFRixLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDZixNQUFNLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDLFNBQVMsQ0FBQztnQkFDekQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQy9CLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUNyQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTthQUNwQyxDQUFDLENBQUM7WUFFSCxRQUFRLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO2lJQXZCVSxPQUFPO3FJQUFQLE9BQU8sY0FETSxNQUFNOzsyRkFDbkIsT0FBTztrQkFEbkIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IMm1T3JkZXJlZFN1YmplY3QgfSBmcm9tICdAbmd4cy9zdG9yZS9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZmlsdGVyLCBzaGFyZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBsZWF2ZU5neHMgfSBmcm9tICcuL29wZXJhdG9ycy9sZWF2ZS1uZ3hzJztcbmltcG9ydCB7IEludGVybmFsTmd4c0V4ZWN1dGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9leGVjdXRpb24vaW50ZXJuYWwtbmd4cy1leGVjdXRpb24tc3RyYXRlZ3knO1xuXG4vKipcbiAqIFN0YXR1cyBvZiBhIGRpc3BhdGNoZWQgYWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIEFjdGlvblN0YXR1cyB7XG4gIERpc3BhdGNoZWQgPSAnRElTUEFUQ0hFRCcsXG4gIFN1Y2Nlc3NmdWwgPSAnU1VDQ0VTU0ZVTCcsXG4gIENhbmNlbGVkID0gJ0NBTkNFTEVEJyxcbiAgRXJyb3JlZCA9ICdFUlJPUkVEJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbkNvbnRleHQ8VCA9IGFueT4ge1xuICBzdGF0dXM6IEFjdGlvblN0YXR1cztcbiAgYWN0aW9uOiBUO1xuICBlcnJvcj86IEVycm9yO1xufVxuXG4vKipcbiAqIEludGVybmFsIEFjdGlvbiBzdHJlYW0gdGhhdCBpcyBlbWl0dGVkIGFueXRpbWUgYW4gYWN0aW9uIGlzIGRpc3BhdGNoZWQuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxBY3Rpb25zIGV4dGVuZHMgybVPcmRlcmVkU3ViamVjdDxBY3Rpb25Db250ZXh0PiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8vIFRoaXMgc3ViamVjdCB3aWxsIGJlIHRoZSBmaXJzdCB0byBrbm93IGFib3V0IHRoZSBkaXNwYXRjaGVkIGFjdGlvbiwgaXRzIHB1cnBvc2UgaXMgZm9yXG4gIC8vIGFueSBsb2dpYyB0aGF0IG11c3QgYmUgZXhlY3V0ZWQgYmVmb3JlIGFjdGlvbiBoYW5kbGVycyBhcmUgaW52b2tlZCAoaS5lLiwgY2FuY2VsYXRpb24pLlxuICByZWFkb25seSBkaXNwYXRjaGVkJCA9IG5ldyBTdWJqZWN0PEFjdGlvbkNvbnRleHQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMucGlwZShmaWx0ZXIoY3R4ID0+IGN0eC5zdGF0dXMgPT09IEFjdGlvblN0YXR1cy5EaXNwYXRjaGVkKSkuc3Vic2NyaWJlKGN0eCA9PiB7XG4gICAgICB0aGlzLmRpc3BhdGNoZWQkLm5leHQoY3R4KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcGxldGUoKTtcbiAgfVxufVxuXG4vKipcbiAqIEFjdGlvbiBzdHJlYW0gdGhhdCBpcyBlbWl0dGVkIGFueXRpbWUgYW4gYWN0aW9uIGlzIGRpc3BhdGNoZWQuXG4gKlxuICogWW91IGNhbiBsaXN0ZW4gdG8gdGhpcyBpbiBzZXJ2aWNlcyB0byByZWFjdCB3aXRob3V0IHN0b3Jlcy5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBY3Rpb25zIGV4dGVuZHMgT2JzZXJ2YWJsZTxBY3Rpb25Db250ZXh0PiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGludGVybmFsQWN0aW9ucyQ6IEludGVybmFsQWN0aW9ucyxcbiAgICBpbnRlcm5hbEV4ZWN1dGlvblN0cmF0ZWd5OiBJbnRlcm5hbE5neHNFeGVjdXRpb25TdHJhdGVneVxuICApIHtcbiAgICBjb25zdCBzaGFyZWRJbnRlcm5hbEFjdGlvbnMkID0gaW50ZXJuYWxBY3Rpb25zJC5waXBlKFxuICAgICAgbGVhdmVOZ3hzKGludGVybmFsRXhlY3V0aW9uU3RyYXRlZ3kpLFxuICAgICAgLy8gVGhlIGBJbnRlcm5hbEFjdGlvbnNgIHN1YmplY3QgZW1pdHMgb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lLlxuICAgICAgLy8gV2UgaGF2ZSB0byByZS1lbnRlciB0aGUgQW5ndWxhciB6b25lIGZvciBhbnkgaW5jb21pbmcgY29uc3VtZXIuXG4gICAgICAvLyBUaGUgYHNoYXJlKClgIG9wZXJhdG9yIHJlZHVjZXMgdGhlIG51bWJlciBvZiBjaGFuZ2UgZGV0ZWN0aW9ucy5cbiAgICAgIC8vIFRoaXMgd291bGQgY2FsbCBsZWF2ZSBvbmx5IG9uY2UgZm9yIGFueSBzdHJlYW0gZW1pc3Npb24gYWNyb3NzIGFsbCBhY3RpdmUgc3Vic2NyaWJlcnMuXG4gICAgICBzaGFyZSgpXG4gICAgKTtcblxuICAgIHN1cGVyKG9ic2VydmVyID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkU3Vic2NyaXB0aW9uID0gc2hhcmVkSW50ZXJuYWxBY3Rpb25zJC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiBjdHggPT4gb2JzZXJ2ZXIubmV4dChjdHgpLFxuICAgICAgICBlcnJvcjogZXJyb3IgPT4gb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpLFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4gb2JzZXJ2ZXIuY29tcGxldGUoKVxuICAgICAgfSk7XG5cbiAgICAgIG9ic2VydmVyLmFkZChjaGlsZFN1YnNjcmlwdGlvbik7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,24 +1,20 @@
1
- import { Injectable, Injector, Optional, SkipSelf, Inject, ɵisPromise, inject } from '@angular/core';
1
+ import { Injectable, Injector, inject, ɵisPromise } from '@angular/core';
2
2
  import { ɵmemoize, ɵMETA_KEY, ɵgetStoreMetadata, ɵINITIAL_STATE_TOKEN } from '@ngxs/store/internals';
3
3
  import { getActionTypeFromInstance, getValue, setValue } from '@ngxs/store/plugins';
4
- import { forkJoin, from, of, throwError, Subject, isObservable } from 'rxjs';
5
- import { catchError, defaultIfEmpty, filter, map, mergeMap, shareReplay, takeUntil } from 'rxjs/operators';
4
+ import { forkJoin, from, isObservable, of, throwError, catchError, defaultIfEmpty, filter, map, mergeMap, shareReplay, takeUntil } from 'rxjs';
6
5
  import { NgxsConfig } from '../symbols';
7
6
  import { buildGraph, findFullParentPath, nameToState, ɵPROP_GETTER, topologicalSort } from './internals';
8
- import { ofActionDispatched } from '../operators/of-action';
7
+ import { NgxsActionRegistry } from '../actions/action-registry';
9
8
  import { InternalActions } from '../actions-stream';
10
9
  import { InternalDispatchedActionResults } from '../internal/dispatcher';
11
- import { StateContextFactory } from '../internal/state-context-factory';
12
10
  import { ensureStateNameIsUnique, ensureStatesAreDecorated } from '../utils/store-validators';
13
11
  import { ensureStateClassIsInjectable } from '../ivy/ivy-enabled-in-dev-mode';
14
12
  import { NgxsUnhandledActionsLogger } from '../dev-features/ngxs-unhandled-actions-logger';
15
13
  import { NgxsUnhandledErrorHandler } from '../ngxs-unhandled-error-handler';
16
14
  import { assignUnhandledCallback } from './unhandled-rxjs-error-callback';
15
+ import { StateContextFactory } from './state-context-factory';
16
+ import { ofActionDispatched } from '../operators/of-action';
17
17
  import * as i0 from "@angular/core";
18
- import * as i1 from "../symbols";
19
- import * as i2 from "../actions-stream";
20
- import * as i3 from "../internal/dispatcher";
21
- import * as i4 from "../internal/state-context-factory";
22
18
  const NG_DEV_MODE = typeof ngDevMode !== 'undefined' && ngDevMode;
23
19
  function cloneDefaults(defaults) {
24
20
  let value = defaults === undefined ? {} : defaults;
@@ -46,23 +42,18 @@ function cloneDefaults(defaults) {
46
42
  * @ignore
47
43
  */
48
44
  export class StateFactory {
49
- constructor(_injector, _config, _parentFactory, _actions, _actionResults, _stateContextFactory, _initialState) {
50
- this._injector = _injector;
51
- this._config = _config;
52
- this._parentFactory = _parentFactory;
53
- this._actions = _actions;
54
- this._actionResults = _actionResults;
55
- this._stateContextFactory = _stateContextFactory;
56
- this._initialState = _initialState;
57
- this._actionsSubscription = null;
45
+ constructor() {
46
+ this._injector = inject(Injector);
47
+ this._config = inject(NgxsConfig);
48
+ this._parentFactory = inject(StateFactory, { optional: true, skipSelf: true });
49
+ this._stateContextFactory = inject(StateContextFactory);
50
+ this._actions = inject(InternalActions);
51
+ this._actionResults = inject(InternalDispatchedActionResults);
52
+ this._initialState = inject(ɵINITIAL_STATE_TOKEN, { optional: true });
53
+ this._actionRegistry = inject(NgxsActionRegistry);
58
54
  this._propGetter = inject(ɵPROP_GETTER);
55
+ this._actionsSubscription = null;
59
56
  this._ngxsUnhandledErrorHandler = null;
60
- // Instead of going over the states list every time an action is dispatched,
61
- // we are constructing a map of action types to lists of action metadata.
62
- // If the `@@Init` action is handled in two different states, the action
63
- // metadata list will contain two objects that have the state `instance` and
64
- // method names to be used as action handlers (decorated with `@Action(InitState)`).
65
- this._actionTypeToMetasMap = new Map();
66
57
  this._states = [];
67
58
  this._statesByName = {};
68
59
  this._statePaths = {};
@@ -103,11 +94,6 @@ export class StateFactory {
103
94
  return context;
104
95
  });
105
96
  }
106
- get actionTypeToMetasMap() {
107
- return this._parentFactory
108
- ? this._parentFactory.actionTypeToMetasMap
109
- : this._actionTypeToMetasMap;
110
- }
111
97
  get states() {
112
98
  return this._parentFactory ? this._parentFactory.states : this._states;
113
99
  }
@@ -182,12 +168,10 @@ export class StateFactory {
182
168
  if (this._parentFactory || this._actionsSubscription !== null) {
183
169
  return;
184
170
  }
185
- const dispatched$ = new Subject();
186
171
  this._actionsSubscription = this._actions
187
172
  .pipe(filter((ctx) => ctx.status === "DISPATCHED" /* ActionStatus.Dispatched */), mergeMap(ctx => {
188
- dispatched$.next(ctx);
189
173
  const action = ctx.action;
190
- return this.invokeActions(dispatched$, action).pipe(map(() => ({ action, status: "SUCCESSFUL" /* ActionStatus.Successful */ })), defaultIfEmpty({ action, status: "CANCELED" /* ActionStatus.Canceled */ }), catchError(error => {
174
+ return this.invokeActions(action).pipe(map(() => ({ action, status: "SUCCESSFUL" /* ActionStatus.Successful */ })), defaultIfEmpty({ action, status: "CANCELED" /* ActionStatus.Canceled */ }), catchError(error => {
191
175
  const ngxsUnhandledErrorHandler = (this._ngxsUnhandledErrorHandler ||=
192
176
  this._injector.get(NgxsUnhandledErrorHandler));
193
177
  const handleableError = assignUnhandledCallback(error, () => ngxsUnhandledErrorHandler.handleError(error, { action }));
@@ -203,53 +187,18 @@ export class StateFactory {
203
187
  /**
204
188
  * Invoke actions on the states.
205
189
  */
206
- invokeActions(dispatched$, action) {
190
+ invokeActions(action) {
207
191
  const type = getActionTypeFromInstance(action);
208
192
  const results = [];
209
193
  // Determines whether the dispatched action has been handled, this is assigned
210
194
  // to `true` within the below `for` loop if any `actionMetas` has been found.
211
195
  let actionHasBeenHandled = false;
212
- const actionMetas = this.actionTypeToMetasMap.get(type);
213
- if (actionMetas) {
214
- for (const actionMeta of actionMetas) {
215
- const stateContext = this._stateContextFactory.createStateContext(actionMeta.path);
196
+ const actionHandlers = this._actionRegistry.get(type);
197
+ if (actionHandlers) {
198
+ for (const actionHandler of actionHandlers) {
216
199
  let result;
217
200
  try {
218
- result = actionMeta.instance[actionMeta.fn](stateContext, action);
219
- // We need to use `isPromise` instead of checking whether
220
- // `result instanceof Promise`. In zone.js patched environments, `global.Promise`
221
- // is the `ZoneAwarePromise`. Some APIs, which are likely not patched by zone.js
222
- // for certain reasons, might not work with `instanceof`. For instance, the dynamic
223
- // import returns a native promise (not a `ZoneAwarePromise`), causing this check to
224
- // be falsy.
225
- if (ɵisPromise(result)) {
226
- result = from(result);
227
- }
228
- if (isObservable(result)) {
229
- result = result.pipe(mergeMap((value) => {
230
- if (ɵisPromise(value)) {
231
- return from(value);
232
- }
233
- if (isObservable(value)) {
234
- return value;
235
- }
236
- return of(value);
237
- }),
238
- // If this observable has completed without emitting any values,
239
- // we wouldn't want to complete the entire chain of actions.
240
- // If any observable completes, then the action will be canceled.
241
- // For instance, if any action handler had a statement like
242
- // `handler(ctx) { return EMPTY; }`, then the action would be canceled.
243
- // See https://github.com/ngxs/store/issues/1568
244
- defaultIfEmpty({}));
245
- if (actionMeta.options.cancelUncompleted) {
246
- // todo: ofActionDispatched should be used with action class
247
- result = result.pipe(takeUntil(dispatched$.pipe(ofActionDispatched(action))));
248
- }
249
- }
250
- else {
251
- result = of({}).pipe(shareReplay());
252
- }
201
+ result = actionHandler(action);
253
202
  }
254
203
  catch (e) {
255
204
  result = throwError(e);
@@ -302,40 +251,58 @@ export class StateFactory {
302
251
  return this.statesByName[name] && valueIsBootstrappedInInitialState;
303
252
  }
304
253
  hydrateActionMetasMap({ path, actions, instance }) {
305
- const actionTypeToMetasMap = this.actionTypeToMetasMap;
254
+ const { dispatched$ } = this._actions;
306
255
  for (const actionType of Object.keys(actions)) {
307
- // Initialize the map entry if it does not already exist for that
308
- // action type. Note that action types may overlap between states,
309
- // as the same action can be handled by different states.
310
- if (!actionTypeToMetasMap.has(actionType)) {
311
- actionTypeToMetasMap.set(actionType, []);
256
+ const actionHandlers = actions[actionType].map(actionMeta => {
257
+ // action: Instance<ActionType>
258
+ return (action) => {
259
+ const stateContext = this._stateContextFactory.createStateContext(path);
260
+ let result = instance[actionMeta.fn](stateContext, action);
261
+ // We need to use `isPromise` instead of checking whether
262
+ // `result instanceof Promise`. In zone.js patched environments, `global.Promise`
263
+ // is the `ZoneAwarePromise`. Some APIs, which are likely not patched by zone.js
264
+ // for certain reasons, might not work with `instanceof`. For instance, the dynamic
265
+ // import returns a native promise (not a `ZoneAwarePromise`), causing this check to
266
+ // be falsy.
267
+ if (ɵisPromise(result)) {
268
+ result = from(result);
269
+ }
270
+ if (isObservable(result)) {
271
+ result = result.pipe(mergeMap((value) => {
272
+ if (ɵisPromise(value)) {
273
+ return from(value);
274
+ }
275
+ if (isObservable(value)) {
276
+ return value;
277
+ }
278
+ return of(value);
279
+ }),
280
+ // If this observable has completed without emitting any values,
281
+ // we wouldn't want to complete the entire chain of actions.
282
+ // If any observable completes, then the action will be canceled.
283
+ // For instance, if any action handler had a statement like
284
+ // `handler(ctx) { return EMPTY; }`, then the action would be canceled.
285
+ // See https://github.com/ngxs/store/issues/1568
286
+ defaultIfEmpty({}));
287
+ if (actionMeta.options.cancelUncompleted) {
288
+ result = result.pipe(takeUntil(dispatched$.pipe(ofActionDispatched(action))));
289
+ }
290
+ }
291
+ else {
292
+ result = of({}).pipe(shareReplay());
293
+ }
294
+ return result;
295
+ };
296
+ });
297
+ for (const actionHandler of actionHandlers) {
298
+ this._actionRegistry.register(actionType, actionHandler);
312
299
  }
313
- const extendedActionMetas = actionTypeToMetasMap.get(actionType);
314
- extendedActionMetas.push(
315
- // This involves combining each individual action metadata with
316
- // the state instance and the path—essentially everything needed
317
- // to invoke an action. This eliminates the need to loop over states
318
- // every time an action is dispatched.
319
- ...actions[actionType].map(actionMeta => ({
320
- ...actionMeta,
321
- path,
322
- instance
323
- })));
324
300
  }
325
301
  }
326
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: StateFactory, deps: [{ token: i0.Injector }, { token: i1.NgxsConfig }, { token: StateFactory, optional: true, skipSelf: true }, { token: i2.InternalActions }, { token: i3.InternalDispatchedActionResults }, { token: i4.StateContextFactory }, { token: ɵINITIAL_STATE_TOKEN, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
302
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: StateFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
327
303
  /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: StateFactory }); }
328
304
  }
329
305
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: StateFactory, decorators: [{
330
306
  type: Injectable
331
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.NgxsConfig }, { type: StateFactory, decorators: [{
332
- type: Optional
333
- }, {
334
- type: SkipSelf
335
- }] }, { type: i2.InternalActions }, { type: i3.InternalDispatchedActionResults }, { type: i4.StateContextFactory }, { type: undefined, decorators: [{
336
- type: Optional
337
- }, {
338
- type: Inject,
339
- args: [ɵINITIAL_STATE_TOKEN]
340
- }] }] });
341
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUtZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3N0b3JlL3NyYy9pbnRlcm5hbC9zdGF0ZS1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLEVBQ1IsTUFBTSxFQUVOLFVBQVUsRUFDVixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLFFBQVEsRUFDUixTQUFTLEVBR1QsaUJBQWlCLEVBRWpCLG9CQUFvQixFQUlyQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEYsT0FBTyxFQUNMLFFBQVEsRUFDUixJQUFJLEVBRUosRUFBRSxFQUNGLFVBQVUsRUFFVixPQUFPLEVBQ1AsWUFBWSxFQUNiLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLFVBQVUsRUFDVixjQUFjLEVBQ2QsTUFBTSxFQUNOLEdBQUcsRUFDSCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFNBQVMsRUFDVixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDeEMsT0FBTyxFQUNMLFVBQVUsRUFDVixrQkFBa0IsRUFFbEIsV0FBVyxFQUNYLFlBQVksRUFJWixlQUFlLEVBQ2hCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBK0IsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakYsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUs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QUErRDtZQUMvRCxnRUFBZ0U7WUFDaEUsb0VBQW9FO1lBQ3BFLHNDQUFzQztZQUN0QyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxHQUFHLFVBQVU7Z0JBQ2IsSUFBSTtnQkFDSixRQUFRO2FBQ1QsQ0FBQyxDQUFDLENBQ0osQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO2lJQTlWVSxZQUFZLDhPQWlCYixvQkFBb0I7cUlBakJuQixZQUFZOzsyRkFBWixZQUFZO2tCQUR4QixVQUFVOzswQkFXTixRQUFROzswQkFDUixRQUFROzswQkFLUixRQUFROzswQkFDUixNQUFNOzJCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIEluamVjdG9yLFxuICBPcHRpb25hbCxcbiAgU2tpcFNlbGYsXG4gIEluamVjdCxcbiAgT25EZXN0cm95LFxuICDJtWlzUHJvbWlzZSxcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgybVtZW1vaXplLFxuICDJtU1FVEFfS0VZLFxuICDJtVBsYWluT2JqZWN0T2YsXG4gIMm1TWV0YURhdGFNb2RlbCxcbiAgybVnZXRTdG9yZU1ldGFkYXRhLFxuICDJtVN0YXRlQ2xhc3NJbnRlcm5hbCxcbiAgybVJTklUSUFMX1NUQVRFX1RPS0VOLFxuICDJtVNoYXJlZFNlbGVjdG9yT3B0aW9ucyxcbiAgybVSdW50aW1lU2VsZWN0b3JDb250ZXh0LFxuICDJtUFjdGlvbkhhbmRsZXJNZXRhRGF0YVxufSBmcm9tICdAbmd4cy9zdG9yZS9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgZ2V0QWN0aW9uVHlwZUZyb21JbnN0YW5jZSwgZ2V0VmFsdWUsIHNldFZhbHVlIH0gZnJvbSAnQG5neHMvc3RvcmUvcGx1Z2lucyc7XG5pbXBvcnQge1xuICBmb3JrSm9pbixcbiAgZnJvbSxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHRocm93RXJyb3IsXG4gIFN1YnNjcmlwdGlvbixcbiAgU3ViamVjdCxcbiAgaXNPYnNlcnZhYmxlXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgY2F0Y2hFcnJvcixcbiAgZGVmYXVsdElmRW1wdHksXG4gIGZpbHRlcixcbiAgbWFwLFxuICBtZXJnZU1hcCxcbiAgc2hhcmVSZXBsYXksXG4gIHRha2VVbnRpbFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE5neHNDb25maWcgfSBmcm9tICcuLi9zeW1ib2xzJztcbmltcG9ydCB7XG4gIGJ1aWxkR3JhcGgsXG4gIGZpbmRGdWxsUGFyZW50UGF0aCxcbiAgTWFwcGVkU3RvcmUsXG4gIG5hbWVUb1N0YXRlLFxuICDJtVBST1BfR0VUVEVSLFxuICBTdGF0ZUtleUdyYXBoLFxuICBTdGF0ZXNBbmREZWZhdWx0cyxcbiAgU3RhdGVzQnlOYW1lLFxuICB0b3BvbG9naWNhbFNvcnRcbn0gZnJvbSAnLi9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgb2ZBY3Rpb25EaXNwYXRjaGVkIH0gZnJvbSAnLi4vb3BlcmF0b3JzL29mLWFjdGlvbic7XG5pbXBvcnQgeyBBY3Rpb25Db250ZXh0LCBBY3Rpb25TdGF0dXMsIEludGVybmFsQWN0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMtc3RyZWFtJztcbmltcG9ydCB7IEludGVybmFsRGlzcGF0Y2hlZEFjdGlvblJlc3VsdHMgfSBmcm9tICcuLi9pbnRlcm5hbC9kaXNwYXRjaGVyJztcbmltcG9ydCB7IFN0YXRlQ29udGV4dEZhY3RvcnkgfSBmcm9tICcuLi9pbnRlcm5hbC9zdGF0ZS1jb250ZXh0LWZhY3RvcnknO1xuaW1wb3J0IHsgZW5zdXJlU3RhdGVOYW1lSXNVbmlxdWUsIGVuc3VyZVN0YXRlc0FyZURlY29yYXRlZCB9IGZyb20gJy4uL3V0aWxzL3N0b3JlLXZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgZW5zdXJlU3RhdGVDbGFzc0lzSW5qZWN0YWJsZSB9IGZyb20gJy4uL2l2eS9pdnktZW5hYmxlZC1pbi1kZXYtbW9kZSc7XG5pbXBvcnQgeyBOZ3hzVW5oYW5kbGVkQWN0aW9uc0xvZ2dlciB9IGZyb20gJy4uL2Rldi1mZWF0dXJlcy9uZ3hzLXVuaGFuZGxlZC1hY3Rpb25zLWxvZ2dlcic7XG5pbXBvcnQgeyBOZ3hzVW5oYW5kbGVkRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi4vbmd4cy11bmhhbmRsZWQtZXJyb3ItaGFuZGxlcic7XG5pbXBvcnQgeyBhc3NpZ25VbmhhbmRsZWRDYWxsYmFjayB9IGZyb20gJy4vdW5oYW5kbGVkLXJ4anMtZXJyb3ItY2FsbGJhY2snO1xuXG5jb25zdCBOR19ERVZfTU9ERSA9IHR5cGVvZiBuZ0Rldk1vZGUgIT09ICd1bmRlZmluZWQnICYmIG5nRGV2TW9kZTtcblxuZnVuY3Rpb24gY2xvbmVEZWZhdWx0cyhkZWZhdWx0czogYW55KTogYW55IHtcbiAgbGV0IHZhbHVlID0gZGVmYXVsdHMgPT09IHVuZGVmaW5lZCA/IHt9IDogZGVmYXVsdHM7XG5cbiAgaWYgKGRlZmF1bHRzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVmYXVsdHMpKSB7XG4gICAgICB2YWx1ZSA9IGRlZmF1bHRzLnNsaWNlKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGVmYXVsdHMgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YWx1ZSA9IHsgLi4uZGVmYXVsdHMgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmludGVyZmFjZSBJbnZva2FibGVBY3Rpb25IYW5kbGVyTWV0YURhdGEgZXh0ZW5kcyDJtUFjdGlvbkhhbmRsZXJNZXRhRGF0YSB7XG4gIHBhdGg6IHN0cmluZztcbiAgaW5zdGFuY2U6IGFueTtcbn1cblxuLyoqXG4gKiBUaGUgYFN0YXRlRmFjdG9yeWAgY2xhc3MgYWRkcyByb290IGFuZCBmZWF0dXJlIHN0YXRlcyB0byB0aGUgZ3JhcGguXG4gKiBUaGlzIGV4dHJhY3RzIHN0YXRlIG5hbWVzIGZyb20gc3RhdGUgY2xhc3NlcywgY2hlY2tzIGlmIHRoZXkgYWxyZWFkeVxuICogZXhpc3QgaW4gdGhlIGdsb2JhbCBncmFwaCwgdGhyb3dzIGVycm9ycyBpZiB0aGVpciBuYW1lcyBhcmUgaW52YWxpZCwgZXRjLlxuICogU2VlIGl0cyBjb25zdHJ1Y3Rvciwgc3RhdGUgZmFjdG9yaWVzIGluamVjdCBzdGF0ZSBmYWN0b3JpZXMgdGhhdCBhcmVcbiAqIHBhcmVudC1sZXZlbCBwcm92aWRlcnMuIFRoaXMgaXMgcmVxdWlyZWQgdG8gZ2V0IGZlYXR1cmUgc3RhdGVzIGZyb20gdGhlXG4gKiBpbmplY3RvciBvbiB0aGUgc2FtZSBsZXZlbC5cbiAqXG4gKiBUaGUgYE5neHNNb2R1bGUuZm9yRmVhdHVyZSguLi4pYCByZXR1cm5zIGBwcm92aWRlcnM6IFtTdGF0ZUZhY3RvcnksIC4uLnN0YXRlc11gLlxuICogVGhlIGBTdGF0ZUZhY3RvcnlgIGlzIGluaXRpYWxpemVkIG9uIHRoZSBmZWF0dXJlIGxldmVsIGFuZCBnb2VzIHRocm91Z2ggYC4uLnN0YXRlc2BcbiAqIHRvIGdldCB0aGVtIGZyb20gdGhlIGluamVjdG9yIHRocm91Z2ggYGluamVjdG9yLmdldChzdGF0ZSlgLlxuICogQGlnbm9yZVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU3RhdGVGYWN0b3J5IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfYWN0aW9uc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfcHJvcEdldHRlciA9IGluamVjdCjJtVBST1BfR0VUVEVSKTtcblxuICBwcml2YXRlIF9uZ3hzVW5oYW5kbGVkRXJyb3JIYW5kbGVyOiBOZ3hzVW5oYW5kbGVkRXJyb3JIYW5kbGVyID0gbnVsbCE7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgX2NvbmZpZzogTmd4c0NvbmZpZyxcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBTa2lwU2VsZigpXG4gICAgcHJpdmF0ZSBfcGFyZW50RmFjdG9yeTogU3RhdGVGYWN0b3J5LFxuICAgIHByaXZhdGUgX2FjdGlvbnM6IEludGVybmFsQWN0aW9ucyxcbiAgICBwcml2YXRlIF9hY3Rpb25SZXN1bHRzOiBJbnRlcm5hbERpc3BhdGNoZWRBY3Rpb25SZXN1bHRzLFxuICAgIHByaXZhdGUgX3N0YXRlQ29udGV4dEZhY3Rvcnk6IFN0YXRlQ29udGV4dEZhY3RvcnksXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KMm1SU5JVElBTF9TVEFURV9UT0tFTilcbiAgICBwcml2YXRlIF9pbml0aWFsU3RhdGU6IGFueVxuICApIHt9XG5cbiAgLy8gSW5zdGVhZCBvZiBnb2luZyBvdmVyIHRoZSBzdGF0ZXMgbGlzdCBldmVyeSB0aW1lIGFuIGFjdGlvbiBpcyBkaXNwYXRjaGVkLFxuICAvLyB3ZSBhcmUgY29uc3RydWN0aW5nIGEgbWFwIG9mIGFjdGlvbiB0eXBlcyB0byBsaXN0cyBvZiBhY3Rpb24gbWV0YWRhdGEuXG4gIC8vIElmIHRoZSBgQEBJbml0YCBhY3Rpb24gaXMgaGFuZGxlZCBpbiB0d28gZGlmZmVyZW50IHN0YXRlcywgdGhlIGFjdGlvblxuICAvLyBtZXRhZGF0YSBsaXN0IHdpbGwgY29udGFpbiB0d28gb2JqZWN0cyB0aGF0IGhhdmUgdGhlIHN0YXRlIGBpbnN0YW5jZWAgYW5kXG4gIC8vIG1ldGhvZCBuYW1lcyB0byBiZSB1c2VkIGFzIGFjdGlvbiBoYW5kbGVycyAoZGVjb3JhdGVkIHdpdGggYEBBY3Rpb24oSW5pdFN0YXRlKWApLlxuICBwcml2YXRlIF9hY3Rpb25UeXBlVG9NZXRhc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBJbnZva2FibGVBY3Rpb25IYW5kbGVyTWV0YURhdGFbXT4oKTtcblxuICBnZXQgYWN0aW9uVHlwZVRvTWV0YXNNYXAoKTogTWFwPHN0cmluZywgSW52b2thYmxlQWN0aW9uSGFuZGxlck1ldGFEYXRhW10+IHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RmFjdG9yeVxuICAgICAgPyB0aGlzLl9wYXJlbnRGYWN0b3J5LmFjdGlvblR5cGVUb01ldGFzTWFwXG4gICAgICA6IHRoaXMuX2FjdGlvblR5cGVUb01ldGFzTWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhdGVzOiBNYXBwZWRTdG9yZVtdID0gW107XG5cbiAgZ2V0IHN0YXRlcygpOiBNYXBwZWRTdG9yZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RmFjdG9yeSA/IHRoaXMuX3BhcmVudEZhY3Rvcnkuc3RhdGVzIDogdGhpcy5fc3RhdGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhdGVzQnlOYW1lOiBTdGF0ZXNCeU5hbWUgPSB7fTtcblxuICBnZXQgc3RhdGVzQnlOYW1lKCk6IFN0YXRlc0J5TmFtZSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudEZhY3RvcnkgPyB0aGlzLl9wYXJlbnRGYWN0b3J5LnN0YXRlc0J5TmFtZSA6IHRoaXMuX3N0YXRlc0J5TmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgX3N0YXRlUGF0aHM6IMm1UGxhaW5PYmplY3RPZjxzdHJpbmc+ID0ge307XG5cbiAgcHJpdmF0ZSBnZXQgc3RhdGVQYXRocygpOiDJtVBsYWluT2JqZWN0T2Y8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudEZhY3RvcnkgPyB0aGlzLl9wYXJlbnRGYWN0b3J5LnN0YXRlUGF0aHMgOiB0aGlzLl9zdGF0ZVBhdGhzO1xuICB9XG5cbiAgZ2V0UnVudGltZVNlbGVjdG9yQ29udGV4dCA9IMm1bWVtb2l6ZSgoKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgY29uc3Qgc3RhdGVGYWN0b3J5ID0gdGhpcztcbiAgICBjb25zdCBwcm9wR2V0dGVyID0gc3RhdGVGYWN0b3J5Ll9wcm9wR2V0dGVyO1xuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZUdldHRlcihrZXk6IHN0cmluZykge1xuICAgICAgY29uc3QgcGF0aCA9IHN0YXRlRmFjdG9yeS5zdGF0ZVBhdGhzW2tleV07XG4gICAgICByZXR1cm4gcGF0aCA/IHByb3BHZXR0ZXIocGF0aC5zcGxpdCgnLicpKSA6IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dDogybVSdW50aW1lU2VsZWN0b3JDb250ZXh0ID0gdGhpcy5fcGFyZW50RmFjdG9yeVxuICAgICAgPyB0aGlzLl9wYXJlbnRGYWN0b3J5LmdldFJ1bnRpbWVTZWxlY3RvckNvbnRleHQoKVxuICAgICAgOiB7XG4gICAgICAgICAgZ2V0U3RhdGVHZXR0ZXIoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIC8vIFVzZSBgQF9fSU5MSU5FX19gIGFubm90YXRpb24gdG8gZm9yY2VseSBpbmxpbmUgYHJlc29sdmVHZXR0ZXJgLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIFRlcnNlciBhbm5vdGF0aW9uLCB3aGljaCB3aWxsIGZ1bmN0aW9uIG9ubHkgaW4gdGhlIHByb2R1Y3Rpb24gbW9kZS5cbiAgICAgICAgICAgIGxldCBnZXR0ZXIgPSAvKkBfX0lOTElORV9fKi8gcmVzb2x2ZUdldHRlcihrZXkpO1xuICAgICAgICAgICAgaWYgKGdldHRlcikge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgIC8vIExhdGUgbG9hZGVkIGdldHRlclxuICAgICAgICAgICAgICBpZiAoIWdldHRlcikge1xuICAgICAgICAgICAgICAgIGdldHRlciA9IC8qQF9fSU5MSU5FX18qLyByZXNvbHZlR2V0dGVyKGtleSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGdldHRlciA/IGdldHRlciguLi5hcmdzKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgICBnZXRTZWxlY3Rvck9wdGlvbnMobG9jYWxPcHRpb25zPzogybVTaGFyZWRTZWxlY3Rvck9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGdsb2JhbFNlbGVjdG9yT3B0aW9ucyA9IHN0YXRlRmFjdG9yeS5fY29uZmlnLnNlbGVjdG9yT3B0aW9ucztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmdsb2JhbFNlbGVjdG9yT3B0aW9ucyxcbiAgICAgICAgICAgICAgLi4uKGxvY2FsT3B0aW9ucyB8fCB7fSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIHJldHVybiBjb250ZXh0O1xuICB9KTtcblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3Rpb25zU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBzdGF0ZSB0byB0aGUgZ2xvYmFsIGRlZnMuXG4gICAqL1xuICBhZGQoc3RhdGVDbGFzc2VzOiDJtVN0YXRlQ2xhc3NJbnRlcm5hbFtdKTogTWFwcGVkU3RvcmVbXSB7XG4gICAgaWYgKE5HX0RFVl9NT0RFKSB7XG4gICAgICBlbnN1cmVTdGF0ZXNBcmVEZWNvcmF0ZWQoc3RhdGVDbGFzc2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG5ld1N0YXRlcyB9ID0gdGhpcy5hZGRUb1N0YXRlc01hcChzdGF0ZUNsYXNzZXMpO1xuICAgIGlmICghbmV3U3RhdGVzLmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgc3RhdGVHcmFwaDogU3RhdGVLZXlHcmFwaCA9IGJ1aWxkR3JhcGgobmV3U3RhdGVzKTtcbiAgICBjb25zdCBzb3J0ZWRTdGF0ZXM6IHN0cmluZ1tdID0gdG9wb2xvZ2ljYWxTb3J0KHN0YXRlR3JhcGgpO1xuICAgIGNvbnN0IHBhdGhzOiDJtVBsYWluT2JqZWN0T2Y8c3RyaW5nPiA9IGZpbmRGdWxsUGFyZW50UGF0aChzdGF0ZUdyYXBoKTtcbiAgICBjb25zdCBuYW1lR3JhcGg6IMm1UGxhaW5PYmplY3RPZjzJtVN0YXRlQ2xhc3NJbnRlcm5hbD4gPSBuYW1lVG9TdGF0ZShuZXdTdGF0ZXMpO1xuICAgIGNvbnN0IGJvb3RzdHJhcHBlZFN0b3JlczogTWFwcGVkU3RvcmVbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHNvcnRlZFN0YXRlcykge1xuICAgICAgY29uc3Qgc3RhdGVDbGFzczogybVTdGF0ZUNsYXNzSW50ZXJuYWwgPSBuYW1lR3JhcGhbbmFtZV07XG4gICAgICBjb25zdCBwYXRoOiBzdHJpbmcgPSBwYXRoc1tuYW1lXTtcbiAgICAgIGNvbnN0IG1ldGE6IMm1TWV0YURhdGFNb2RlbCA9IHN0YXRlQ2xhc3NbybVNRVRBX0tFWV0hO1xuXG4gICAgICB0aGlzLmFkZFJ1bnRpbWVJbmZvVG9NZXRhKG1ldGEsIHBhdGgpO1xuXG4gICAgICAvLyBOb3RlOiBwcmV2aW91c2x5IHdlIGNhbGxlZCBgZW5zdXJlU3RhdGVDbGFzc0lzSW5qZWN0YWJsZWAgd2l0aGluIHRoZVxuICAgICAgLy8gYFN0YXRlYCBkZWNvcmF0b3IuIFRoaXMgY2hlY2sgaXMgbW92ZWQgaGVyZSBiZWNhdXNlIHRoZSBgybVwcm92YCBwcm9wZXJ0eVxuICAgICAgLy8gd2lsbCBub3QgZXhpc3Qgb24gdGhlIGNsYXNzIGluIEpJVCBtb2RlIChiZWNhdXNlIGl0J3Mgc2V0IGFzeW5jaHJvbm91c2x5XG4gICAgICAvLyBkdXJpbmcgSklUIGNvbXBpbGF0aW9uIHRocm91Z2ggYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWApLlxuICAgICAgaWYgKE5HX0RFVl9NT0RFKSB7XG4gICAgICAgIGVuc3VyZVN0YXRlQ2xhc3NJc0luamVjdGFibGUoc3RhdGVDbGFzcyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXRlTWFwOiBNYXBwZWRTdG9yZSA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgaXNJbml0aWFsaXNlZDogZmFsc2UsXG4gICAgICAgIGFjdGlvbnM6IG1ldGEuYWN0aW9ucyxcbiAgICAgICAgaW5zdGFuY2U6IHRoaXMuX2luamVjdG9yLmdldChzdGF0ZUNsYXNzKSxcbiAgICAgICAgZGVmYXVsdHM6IGNsb25lRGVmYXVsdHMobWV0YS5kZWZhdWx0cylcbiAgICAgIH07XG5cbiAgICAgIC8vIGVuc3VyZSBvdXIgc3RvcmUgaGFzbid0IGFscmVhZHkgYmVlbiBhZGRlZFxuICAgICAgLy8gYnV0IGRvbid0IHRocm93IHNpbmNlIGl0IGNvdWxkIGJlIGxhenlcbiAgICAgIC8vIGxvYWRlZCBmcm9tIGRpZmZlcmVudCBwYXRoc1xuICAgICAgaWYgKCF0aGlzLmhhc0JlZW5Nb3VudGVkQW5kQm9vdHN0cmFwcGVkKG5hbWUsIHBhdGgpKSB7XG4gICAgICAgIGJvb3RzdHJhcHBlZFN0b3Jlcy5wdXNoKHN0YXRlTWFwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGF0ZXMucHVzaChzdGF0ZU1hcCk7XG4gICAgICB0aGlzLmh5ZHJhdGVBY3Rpb25NZXRhc01hcChzdGF0ZU1hcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvb3RzdHJhcHBlZFN0b3JlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBzZXQgb2Ygc3RhdGVzIHRvIHRoZSBzdG9yZSBhbmQgcmV0dXJuIHRoZSBkZWZhdWx0c1xuICAgKi9cbiAgYWRkQW5kUmV0dXJuRGVmYXVsdHMoc3RhdGVDbGFzc2VzOiDJtVN0YXRlQ2xhc3NJbnRlcm5hbFtdKTogU3RhdGVzQW5kRGVmYXVsdHMge1xuICAgIGNvbnN0IGNsYXNzZXM6IMm1U3RhdGVDbGFzc0ludGVybmFsW10gPSBzdGF0ZUNsYXNzZXMgfHwgW107XG5cbiAgICBjb25zdCBtYXBwZWRTdG9yZXM6IE1hcHBlZFN0b3JlW10gPSB0aGlzLmFkZChjbGFzc2VzKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IG1hcHBlZFN0b3Jlcy5yZWR1Y2UoXG4gICAgICAocmVzdWx0OiBhbnksIG1hcHBlZFN0b3JlOiBNYXBwZWRTdG9yZSkgPT5cbiAgICAgICAgc2V0VmFsdWUocmVzdWx0LCBtYXBwZWRTdG9yZS5wYXRoLCBtYXBwZWRTdG9yZS5kZWZhdWx0cyksXG4gICAgICB7fVxuICAgICk7XG4gICAgcmV0dXJuIHsgZGVmYXVsdHMsIHN0YXRlczogbWFwcGVkU3RvcmVzIH07XG4gIH1cblxuICBjb25uZWN0QWN0aW9uSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgLy8gTm90ZTogV2UgaGF2ZSB0byBjb25uZWN0IGFjdGlvbnMgb25seSBvbmNlIHdoZW4gdGhlIGBTdGF0ZUZhY3RvcnlgXG4gICAgLy8gICAgICAgaXMgYmVpbmcgY3JlYXRlZCBmb3IgdGhlIGZpcnN0IHRpbWUuIFRoaXMgY2hlY2tzIGlmIHdlJ3JlIGluXG4gICAgLy8gICAgICAgYSBjaGlsZCBzdGF0ZSBmYWN0b3J5IGFuZCB0aGUgcGFyZW50IHN0YXRlIGZhY3RvcnkgYWxyZWFkeSBleGlzdHMuXG4gICAgaWYgKHRoaXMuX3BhcmVudEZhY3RvcnkgfHwgdGhpcy5fYWN0aW9uc1N1YnNjcmlwdGlvbiAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3BhdGNoZWQkID0gbmV3IFN1YmplY3Q8QWN0aW9uQ29udGV4dD4oKTtcbiAgICB0aGlzLl9hY3Rpb25zU3Vic2NyaXB0aW9uID0gdGhpcy5fYWN0aW9uc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoY3R4OiBBY3Rpb25Db250ZXh0KSA9PiBjdHguc3RhdHVzID09PSBBY3Rpb25TdGF0dXMuRGlzcGF0Y2hlZCksXG4gICAgICAgIG1lcmdlTWFwKGN0eCA9PiB7XG4gICAgICAgICAgZGlzcGF0Y2hlZCQubmV4dChjdHgpO1xuICAgICAgICAgIGNvbnN0IGFjdGlvbjogYW55ID0gY3R4LmFjdGlvbjtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnZva2VBY3Rpb25zKGRpc3BhdGNoZWQkLCBhY3Rpb24hKS5waXBlKFxuICAgICAgICAgICAgbWFwKCgpID0+IDxBY3Rpb25Db250ZXh0PnsgYWN0aW9uLCBzdGF0dXM6IEFjdGlvblN0YXR1cy5TdWNjZXNzZnVsIH0pLFxuICAgICAgICAgICAgZGVmYXVsdElmRW1wdHkoPEFjdGlvbkNvbnRleHQ+eyBhY3Rpb24sIHN0YXR1czogQWN0aW9uU3RhdHVzLkNhbmNlbGVkIH0pLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5neHNVbmhhbmRsZWRFcnJvckhhbmRsZXIgPSAodGhpcy5fbmd4c1VuaGFuZGxlZEVycm9ySGFuZGxlciB8fD1cbiAgICAgICAgICAgICAgICB0aGlzLl9pbmplY3Rvci5nZXQoTmd4c1VuaGFuZGxlZEVycm9ySGFuZGxlcikpO1xuICAgICAgICAgICAgICBjb25zdCBoYW5kbGVhYmxlRXJyb3IgPSBhc3NpZ25VbmhhbmRsZWRDYWxsYmFjayhlcnJvciwgKCkgPT5cbiAgICAgICAgICAgICAgICBuZ3hzVW5oYW5kbGVkRXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGVycm9yLCB7IGFjdGlvbiB9KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gb2YoPEFjdGlvbkNvbnRleHQ+e1xuICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICBzdGF0dXM6IEFjdGlvblN0YXR1cy5FcnJvcmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBoYW5kbGVhYmxlRXJyb3JcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGN0eCA9PiB0aGlzLl9hY3Rpb25SZXN1bHRzLm5leHQoY3R4KSk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIGFjdGlvbnMgb24gdGhlIHN0YXRlcy5cbiAgICovXG4gIGludm9rZUFjdGlvbnMoZGlzcGF0Y2hlZCQ6IE9ic2VydmFibGU8QWN0aW9uQ29udGV4dD4sIGFjdGlvbjogYW55KSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEFjdGlvblR5cGVGcm9tSW5zdGFuY2UoYWN0aW9uKSE7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuXG4gICAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkaXNwYXRjaGVkIGFjdGlvbiBoYXMgYmVlbiBoYW5kbGVkLCB0aGlzIGlzIGFzc2lnbmVkXG4gICAgLy8gdG8gYHRydWVgIHdpdGhpbiB0aGUgYmVsb3cgYGZvcmAgbG9vcCBpZiBhbnkgYGFjdGlvbk1ldGFzYCBoYXMgYmVlbiBmb3VuZC5cbiAgICBsZXQgYWN0aW9uSGFzQmVlbkhhbmRsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGFjdGlvbk1ldGFzID0gdGhpcy5hY3Rpb25UeXBlVG9NZXRhc01hcC5nZXQodHlwZSk7XG5cbiAgICBpZiAoYWN0aW9uTWV0YXMpIHtcbiAgICAgIGZvciAoY29uc3QgYWN0aW9uTWV0YSBvZiBhY3Rpb25NZXRhcykge1xuICAgICAgICBjb25zdCBzdGF0ZUNvbnRleHQgPSB0aGlzLl9zdGF0ZUNvbnRleHRGYWN0b3J5LmNyZWF0ZVN0YXRlQ29udGV4dChhY3Rpb25NZXRhLnBhdGgpO1xuXG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gYWN0aW9uTWV0YS5pbnN0YW5jZVthY3Rpb25NZXRhLmZuXShzdGF0ZUNvbnRleHQsIGFjdGlvbik7XG5cbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVzZSBgaXNQcm9taXNlYCBpbnN0ZWFkIG9mIGNoZWNraW5nIHdoZXRoZXJcbiAgICAgICAgICAvLyBgcmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZWAuIEluIHpvbmUuanMgcGF0Y2hlZCBlbnZpcm9ubWVudHMsIGBnbG9iYWwuUHJvbWlzZWBcbiAgICAgICAgICAvLyBpcyB0aGUgYFpvbmVBd2FyZVByb21pc2VgLiBTb21lIEFQSXMsIHdoaWNoIGFyZSBsaWtlbHkgbm90IHBhdGNoZWQgYnkgem9uZS5qc1xuICAgICAgICAgIC8vIGZvciBjZXJ0YWluIHJlYXNvbnMsIG1pZ2h0IG5vdCB3b3JrIHdpdGggYGluc3RhbmNlb2ZgLiBGb3IgaW5zdGFuY2UsIHRoZSBkeW5hbWljXG4gICAgICAgICAgLy8gaW1wb3J0IHJldHVybnMgYSBuYXRpdmUgcHJvbWlzZSAobm90IGEgYFpvbmVBd2FyZVByb21pc2VgKSwgY2F1c2luZyB0aGlzIGNoZWNrIHRvXG4gICAgICAgICAgLy8gYmUgZmFsc3kuXG4gICAgICAgICAgaWYgKMm1aXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZyb20ocmVzdWx0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5waXBlKFxuICAgICAgICAgICAgICBtZXJnZU1hcCgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICjJtWlzUHJvbWlzZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmcm9tKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHZhbHVlKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC8vIElmIHRoaXMgb2JzZXJ2YWJsZSBoYXMgY29tcGxldGVkIHdpdGhvdXQgZW1pdHRpbmcgYW55IHZhbHVlcyxcbiAgICAgICAgICAgICAgLy8gd2Ugd291bGRuJ3Qgd2FudCB0byBjb21wbGV0ZSB0aGUgZW50aXJlIGNoYWluIG9mIGFjdGlvbnMuXG4gICAgICAgICAgICAgIC8vIElmIGFueSBvYnNlcnZhYmxlIGNvbXBsZXRlcywgdGhlbiB0aGUgYWN0aW9uIHdpbGwgYmUgY2FuY2VsZWQuXG4gICAgICAgICAgICAgIC8vIEZvciBpbnN0YW5jZSwgaWYgYW55IGFjdGlvbiBoYW5kbGVyIGhhZCBhIHN0YXRlbWVudCBsaWtlXG4gICAgICAgICAgICAgIC8vIGBoYW5kbGVyKGN0eCkgeyByZXR1cm4gRU1QVFk7IH1gLCB0aGVuIHRoZSBhY3Rpb24gd291bGQgYmUgY2FuY2VsZWQuXG4gICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbmd4cy9zdG9yZS9pc3N1ZXMvMTU2OFxuICAgICAgICAgICAgICBkZWZhdWx0SWZFbXB0eSh7fSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChhY3Rpb25NZXRhLm9wdGlvbnMuY2FuY2VsVW5jb21wbGV0ZWQpIHtcbiAgICAgICAgICAgICAgLy8gdG9kbzogb2ZBY3Rpb25EaXNwYXRjaGVkIHNob3VsZCBiZSB1c2VkIHdpdGggYWN0aW9uIGNsYXNzXG4gICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbChkaXNwYXRjaGVkJC5waXBlKG9mQWN0aW9uRGlzcGF0Y2hlZChhY3Rpb24gYXMgYW55KSkpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG9mKHt9KS5waXBlKHNoYXJlUmVwbGF5KCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlc3VsdCA9IHRocm93RXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcblxuICAgICAgICBhY3Rpb25IYXNCZWVuSGFuZGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGBOZ3hzVW5oYW5kbGVkQWN0aW9uc0xvZ2dlcmAgaXMgYSB0cmVlLXNoYWthYmxlIGNsYXNzIHdoaWNoIGZ1bmN0aW9uc1xuICAgIC8vIG9ubHkgZHVyaW5nIGRldmVsb3BtZW50LlxuICAgIGlmIChOR19ERVZfTU9ERSAmJiAhYWN0aW9uSGFzQmVlbkhhbmRsZWQpIHtcbiAgICAgIGNvbnN0IHVuaGFuZGxlZEFjdGlvbnNMb2dnZXIgPSB0aGlzLl9pbmplY3Rvci5nZXQoTmd4c1VuaGFuZGxlZEFjdGlvbnNMb2dnZXIsIG51bGwpO1xuICAgICAgLy8gVGhlIGBOZ3hzVW5oYW5kbGVkQWN0aW9uc0xvZ2dlcmAgd2lsbCBub3QgYmUgcmVzb2x2ZWQgYnkgdGhlIGluamVjdG9yIGlmIHRoZVxuICAgICAgLy8gYE5neHNEZXZlbG9wbWVudE1vZHVsZWAgaXMgbm90IHByb3ZpZGVkLiBJdCdzIGVub3VnaCB0byBjaGVjayB3aGV0aGVyIHRoZSBgaW5qZWN0b3IuZ2V0YFxuICAgICAgLy8gZGlkbid0IHJldHVybiBgbnVsbGAgc28gd2UgbWF5IGVuc3VyZSB0aGUgbW9kdWxlIGhhcyBiZWVuIGltcG9ydGVkLlxuICAgICAgdW5oYW5kbGVkQWN0aW9uc0xvZ2dlcj8ud2FybihhY3Rpb24pO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdHMucHVzaChvZih7fSkpO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JrSm9pbihyZXN1bHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVG9TdGF0ZXNNYXAoc3RhdGVDbGFzc2VzOiDJtVN0YXRlQ2xhc3NJbnRlcm5hbFtdKToge1xuICAgIG5ld1N0YXRlczogybVTdGF0ZUNsYXNzSW50ZXJuYWxbXTtcbiAgfSB7XG4gICAgY29uc3QgbmV3U3RhdGVzOiDJtVN0YXRlQ2xhc3NJbnRlcm5hbFtdID0gW107XG4gICAgY29uc3Qgc3RhdGVzTWFwOiBTdGF0ZXNCeU5hbWUgPSB0aGlzLnN0YXRlc0J5TmFtZTtcblxuICAgIGZvciAoY29uc3Qgc3RhdGVDbGFzcyBvZiBzdGF0ZUNsYXNzZXMpIHtcbiAgICAgIGNvbnN0IHN0YXRlTmFtZSA9IMm1Z2V0U3RvcmVNZXRhZGF0YShzdGF0ZUNsYXNzKS5uYW1lITtcbiAgICAgIGlmIChOR19ERVZfTU9ERSkge1xuICAgICAgICBlbnN1cmVTdGF0ZU5hbWVJc1VuaXF1ZShzdGF0ZU5hbWUsIHN0YXRlQ2xhc3MsIHN0YXRlc01hcCk7XG4gICAgICB9XG4gICAgICBjb25zdCB1bm1vdW50ZWRTdGF0ZSA9ICFzdGF0ZXNNYXBbc3RhdGVOYW1lXTtcbiAgICAgIGlmICh1bm1vdW50ZWRTdGF0ZSkge1xuICAgICAgICBuZXdTdGF0ZXMucHVzaChzdGF0ZUNsYXNzKTtcbiAgICAgICAgc3RhdGVzTWFwW3N0YXRlTmFtZV0gPSBzdGF0ZUNsYXNzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IG5ld1N0YXRlcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSdW50aW1lSW5mb1RvTWV0YShtZXRhOiDJtU1ldGFEYXRhTW9kZWwsIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGVQYXRoc1ttZXRhLm5hbWUhXSA9IHBhdGg7XG4gICAgLy8gVE9ETzogdmVyc2lvbnMgYWZ0ZXIgdjMgLSB3ZSBwbGFuIHRvIGdldCByaWQgb2YgdGhlIGBwYXRoYCBwcm9wZXJ0eSBiZWNhdXNlIGl0IGlzIG5vbi1kZXRlcm1pbmlzdGljXG4gICAgLy8gd2UgY2FuIGRvIHRoaXMgd2hlbiB3ZSBnZXQgcmlkIG9mIHRoZSBpbmNvcnJlY3RseSBleHBvc2VkIGdldFN0b3JlTWV0YWRhdGFcbiAgICAvLyBXZSB3aWxsIG5lZWQgdG8gY29tZSB1cCB3aXRoIGFuIGFsdGVybmF0aXZlIHRvIHdoYXQgd2FzIGV4cG9zZWQgaW4gdjMgYmVjYXVzZSB0aGlzIGlzIHVzZWQgYnkgbWFueSBwbHVnaW5zXG4gICAgbWV0YS5wYXRoID0gcGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQmVlbk1vdW50ZWRBbmRCb290c3RyYXBwZWQobmFtZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWx1ZUlzQm9vdHN0cmFwcGVkSW5Jbml0aWFsU3RhdGU6IGJvb2xlYW4gPVxuICAgICAgZ2V0VmFsdWUodGhpcy5faW5pdGlhbFN0YXRlLCBwYXRoKSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIFRoaXMgY2hlY2tzIHdoZXRoZXIgYSBzdGF0ZSBoYXMgYmVlbiBhbHJlYWR5IGFkZGVkIHRvIHRoZSBnbG9iYWwgZ3JhcGggYW5kXG4gICAgLy8gaXRzIGxpZmVjeWNsZSBpcyBpbiAnYm9vdHN0cmFwcGVkJyBzdGF0ZS5cbiAgICByZXR1cm4gdGhpcy5zdGF0ZXNCeU5hbWVbbmFtZV0gJiYgdmFsdWVJc0Jvb3RzdHJhcHBlZEluSW5pdGlhbFN0YXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBoeWRyYXRlQWN0aW9uTWV0YXNNYXAoeyBwYXRoLCBhY3Rpb25zLCBpbnN0YW5jZSB9OiBNYXBwZWRTdG9yZSk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGlvblR5cGVUb01ldGFzTWFwID0gdGhpcy5hY3Rpb25UeXBlVG9NZXRhc01hcDtcblxuICAgIGZvciAoY29uc3QgYWN0aW9uVHlwZSBvZiBPYmplY3Qua2V5cyhhY3Rpb25zKSkge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgbWFwIGVudHJ5IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoYXRcbiAgICAgIC8vIGFjdGlvbiB0eXBlLiBOb3RlIHRoYXQgYWN0aW9uIHR5cGVzIG1heSBvdmVybGFwIGJldHdlZW4gc3RhdGVzLFxuICAgICAgLy8gYXMgdGhlIHNhbWUgYWN0aW9uIGNhbiBiZSBoYW5kbGVkIGJ5IGRpZmZlcmVudCBzdGF0ZXMuXG4gICAgICBpZiAoIWFjdGlvblR5cGVUb01ldGFzTWFwLmhhcyhhY3Rpb25UeXBlKSkge1xuICAgICAgICBhY3Rpb25UeXBlVG9NZXRhc01hcC5zZXQoYWN0aW9uVHlwZSwgW10pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRlbmRlZEFjdGlvbk1ldGFzID0gYWN0aW9uVHlwZVRvTWV0YXNNYXAuZ2V0KGFjdGlvblR5cGUpITtcblxuICAgICAgZXh0ZW5kZWRBY3Rpb25NZXRhcy5wdXNoKFxuICAgICAgICAvLyBUaGlzIGludm9sdmVzIGNvbWJpbmluZyBlYWNoIGluZGl2aWR1YWwgYWN0aW9uIG1ldGFkYXRhIHdpdGhcbiAgICAgICAgLy8gdGhlIHN0YXRlIGluc3RhbmNlIGFuZCB0aGUgcGF0aOKAlGVzc2VudGlhbGx5IGV2ZXJ5dGhpbmcgbmVlZGVkXG4gICAgICAgIC8vIHRvIGludm9rZSBhbiBhY3Rpb24uIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCB0byBsb29wIG92ZXIgc3RhdGVzXG4gICAgICAgIC8vIGV2ZXJ5IHRpbWUgYW4gYWN0aW9uIGlzIGRpc3BhdGNoZWQuXG4gICAgICAgIC4uLmFjdGlvbnNbYWN0aW9uVHlwZV0ubWFwKGFjdGlvbk1ldGEgPT4gKHtcbiAgICAgICAgICAuLi5hY3Rpb25NZXRhLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgfSkpXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
307
+ }] });
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUtZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3N0b3JlL3NyYy9pbnRlcm5hbC9zdGF0ZS1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFhLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEYsT0FBTyxFQUNMLFFBQVEsRUFDUixTQUFTLEVBR1QsaUJBQWlCLEVBRWpCLG9CQUFvQixFQUdyQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEYsT0FBTyxFQUNMLFFBQVEsRUFDUixJQUFJLEVBQ0osWUFBWSxFQUNaLEVBQUUsRUFFRixVQUFVLEVBQ1YsVUFBVSxFQUNWLGNBQWMsRUFDZCxNQUFNLEVBQ04sR0FBRyxFQUNILFFBQVEsRUFDUixXQUFXLEVBQ1gsU0FBUyxFQUNWLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQ0wsVUFBVSxFQUNWLGtCQUFrQixFQUVsQixXQUFXLEVBQ1gsWUFBWSxFQUlaLGVBQWUsRUFDaEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUErQixlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsMEJBQTBC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SyxDQUFDLENBQUM7NEJBQ3JCLENBQUM7NEJBQ0QsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQ0FDeEIsT0FBTyxLQUFLLENBQUM7NEJBQ2YsQ0FBQzs0QkFDRCxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDbkIsQ0FBQyxDQUFDO3dCQUNGLGdFQUFnRTt3QkFDaEUsNERBQTREO3dCQUM1RCxpRUFBaUU7d0JBQ2pFLDJEQUEyRDt3QkFDM0QsdUVBQXVFO3dCQUN2RSxnREFBZ0Q7d0JBQ2hELGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FDbkIsQ0FBQzt3QkFFRixJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs0QkFDekMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2hGLENBQUM7b0JBQ0gsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7b0JBQ3RDLENBQUM7b0JBQ0QsT0FBTyxNQUFNLENBQUM7Z0JBQ2hCLENBQUMsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsS0FBSyxNQUFNLGFBQWEsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztpSUExVFUsWUFBWTtxSUFBWixZQUFZOzsyRkFBWixZQUFZO2tCQUR4QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE9uRGVzdHJveSwgaW5qZWN0LCDJtWlzUHJvbWlzZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgybVtZW1vaXplLFxuICDJtU1FVEFfS0VZLFxuICDJtVBsYWluT2JqZWN0T2YsXG4gIMm1TWV0YURhdGFNb2RlbCxcbiAgybVnZXRTdG9yZU1ldGFkYXRhLFxuICDJtVN0YXRlQ2xhc3NJbnRlcm5hbCxcbiAgybVJTklUSUFMX1NUQVRFX1RPS0VOLFxuICDJtVNoYXJlZFNlbGVjdG9yT3B0aW9ucyxcbiAgybVSdW50aW1lU2VsZWN0b3JDb250ZXh0XG59IGZyb20gJ0BuZ3hzL3N0b3JlL2ludGVybmFscyc7XG5pbXBvcnQgeyBnZXRBY3Rpb25UeXBlRnJvbUluc3RhbmNlLCBnZXRWYWx1ZSwgc2V0VmFsdWUgfSBmcm9tICdAbmd4cy9zdG9yZS9wbHVnaW5zJztcbmltcG9ydCB7XG4gIGZvcmtKb2luLFxuICBmcm9tLFxuICBpc09ic2VydmFibGUsXG4gIG9mLFxuICBTdWJzY3JpcHRpb24sXG4gIHRocm93RXJyb3IsXG4gIGNhdGNoRXJyb3IsXG4gIGRlZmF1bHRJZkVtcHR5LFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgbWVyZ2VNYXAsXG4gIHNoYXJlUmVwbGF5LFxuICB0YWtlVW50aWxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE5neHNDb25maWcgfSBmcm9tICcuLi9zeW1ib2xzJztcbmltcG9ydCB7XG4gIGJ1aWxkR3JhcGgsXG4gIGZpbmRGdWxsUGFyZW50UGF0aCxcbiAgTWFwcGVkU3RvcmUsXG4gIG5hbWVUb1N0YXRlLFxuICDJtVBST1BfR0VUVEVSLFxuICBTdGF0ZUtleUdyYXBoLFxuICBTdGF0ZXNBbmREZWZhdWx0cyxcbiAgU3RhdGVzQnlOYW1lLFxuICB0b3BvbG9naWNhbFNvcnRcbn0gZnJvbSAnLi9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgTmd4c0FjdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vYWN0aW9ucy9hY3Rpb24tcmVnaXN0cnknO1xuaW1wb3J0IHsgQWN0aW9uQ29udGV4dCwgQWN0aW9uU3RhdHVzLCBJbnRlcm5hbEFjdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zLXN0cmVhbSc7XG5pbXBvcnQgeyBJbnRlcm5hbERpc3BhdGNoZWRBY3Rpb25SZXN1bHRzIH0gZnJvbSAnLi4vaW50ZXJuYWwvZGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBlbnN1cmVTdGF0ZU5hbWVJc1VuaXF1ZSwgZW5zdXJlU3RhdGVzQXJlRGVjb3JhdGVkIH0gZnJvbSAnLi4vdXRpbHMvc3RvcmUtdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBlbnN1cmVTdGF0ZUNsYXNzSXNJbmplY3RhYmxlIH0gZnJvbSAnLi4vaXZ5L2l2eS1lbmFibGVkLWluLWRldi1tb2RlJztcbmltcG9ydCB7IE5neHNVbmhhbmRsZWRBY3Rpb25zTG9nZ2VyIH0gZnJvbSAnLi4vZGV2LWZlYXR1cmVzL25neHMtdW5oYW5kbGVkLWFjdGlvbnMtbG9nZ2VyJztcbmltcG9ydCB7IE5neHNVbmhhbmRsZWRFcnJvckhhbmRsZXIgfSBmcm9tICcuLi9uZ3hzLXVuaGFuZGxlZC1lcnJvci1oYW5kbGVyJztcbmltcG9ydCB7IGFzc2lnblVuaGFuZGxlZENhbGxiYWNrIH0gZnJvbSAnLi91bmhhbmRsZWQtcnhqcy1lcnJvci1jYWxsYmFjayc7XG5pbXBvcnQgeyBTdGF0ZUNvbnRleHRGYWN0b3J5IH0gZnJvbSAnLi9zdGF0ZS1jb250ZXh0LWZhY3RvcnknO1xuaW1wb3J0IHsgb2ZBY3Rpb25EaXNwYXRjaGVkIH0gZnJvbSAnLi4vb3BlcmF0b3JzL29mLWFjdGlvbic7XG5cbmNvbnN0IE5HX0RFVl9NT0RFID0gdHlwZW9mIG5nRGV2TW9kZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbmdEZXZNb2RlO1xuXG5mdW5jdGlvbiBjbG9uZURlZmF1bHRzKGRlZmF1bHRzOiBhbnkpOiBhbnkge1xuICBsZXQgdmFsdWUgPSBkZWZhdWx0cyA9PT0gdW5kZWZpbmVkID8ge30gOiBkZWZhdWx0cztcblxuICBpZiAoZGVmYXVsdHMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkZWZhdWx0cykpIHtcbiAgICAgIHZhbHVlID0gZGVmYXVsdHMuc2xpY2UoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZhdWx0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhbHVlID0geyAuLi5kZWZhdWx0cyB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBUaGUgYFN0YXRlRmFjdG9yeWAgY2xhc3MgYWRkcyByb290IGFuZCBmZWF0dXJlIHN0YXRlcyB0byB0aGUgZ3JhcGguXG4gKiBUaGlzIGV4dHJhY3RzIHN0YXRlIG5hbWVzIGZyb20gc3RhdGUgY2xhc3NlcywgY2hlY2tzIGlmIHRoZXkgYWxyZWFkeVxuICogZXhpc3QgaW4gdGhlIGdsb2JhbCBncmFwaCwgdGhyb3dzIGVycm9ycyBpZiB0aGVpciBuYW1lcyBhcmUgaW52YWxpZCwgZXRjLlxuICogU2VlIGl0cyBjb25zdHJ1Y3Rvciwgc3RhdGUgZmFjdG9yaWVzIGluamVjdCBzdGF0ZSBmYWN0b3JpZXMgdGhhdCBhcmVcbiAqIHBhcmVudC1sZXZlbCBwcm92aWRlcnMuIFRoaXMgaXMgcmVxdWlyZWQgdG8gZ2V0IGZlYXR1cmUgc3RhdGVzIGZyb20gdGhlXG4gKiBpbmplY3RvciBvbiB0aGUgc2FtZSBsZXZlbC5cbiAqXG4gKiBUaGUgYE5neHNNb2R1bGUuZm9yRmVhdHVyZSguLi4pYCByZXR1cm5zIGBwcm92aWRlcnM6IFtTdGF0ZUZhY3RvcnksIC4uLnN0YXRlc11gLlxuICogVGhlIGBTdGF0ZUZhY3RvcnlgIGlzIGluaXRpYWxpemVkIG9uIHRoZSBmZWF0dXJlIGxldmVsIGFuZCBnb2VzIHRocm91Z2ggYC4uLnN0YXRlc2BcbiAqIHRvIGdldCB0aGVtIGZyb20gdGhlIGluamVjdG9yIHRocm91Z2ggYGluamVjdG9yLmdldChzdGF0ZSlgLlxuICogQGlnbm9yZVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU3RhdGVGYWN0b3J5IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWcgPSBpbmplY3QoTmd4c0NvbmZpZyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhcmVudEZhY3RvcnkgPSBpbmplY3QoU3RhdGVGYWN0b3J5LCB7IG9wdGlvbmFsOiB0cnVlLCBza2lwU2VsZjogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3RhdGVDb250ZXh0RmFjdG9yeSA9IGluamVjdChTdGF0ZUNvbnRleHRGYWN0b3J5KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aW9ucyA9IGluamVjdChJbnRlcm5hbEFjdGlvbnMpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hY3Rpb25SZXN1bHRzID0gaW5qZWN0KEludGVybmFsRGlzcGF0Y2hlZEFjdGlvblJlc3VsdHMpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbml0aWFsU3RhdGUgPSBpbmplY3QoybVJTklUSUFMX1NUQVRFX1RPS0VOLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hY3Rpb25SZWdpc3RyeSA9IGluamVjdChOZ3hzQWN0aW9uUmVnaXN0cnkpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcm9wR2V0dGVyID0gaW5qZWN0KMm1UFJPUF9HRVRURVIpO1xuXG4gIHByaXZhdGUgX2FjdGlvbnNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX25neHNVbmhhbmRsZWRFcnJvckhhbmRsZXI6IE5neHNVbmhhbmRsZWRFcnJvckhhbmRsZXIgPSBudWxsITtcblxuICBwcml2YXRlIF9zdGF0ZXM6IE1hcHBlZFN0b3JlW10gPSBbXTtcbiAgZ2V0IHN0YXRlcygpOiBNYXBwZWRTdG9yZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RmFjdG9yeSA/IHRoaXMuX3BhcmVudEZhY3Rvcnkuc3RhdGVzIDogdGhpcy5fc3RhdGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhdGVzQnlOYW1lOiBTdGF0ZXNCeU5hbWUgPSB7fTtcbiAgZ2V0IHN0YXRlc0J5TmFtZSgpOiBTdGF0ZXNCeU5hbWUge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRGYWN0b3J5ID8gdGhpcy5fcGFyZW50RmFjdG9yeS5zdGF0ZXNCeU5hbWUgOiB0aGlzLl9zdGF0ZXNCeU5hbWU7XG4gIH1cblxuICBwcml2YXRlIF9zdGF0ZVBhdGhzOiDJtVBsYWluT2JqZWN0T2Y8c3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIGdldCBzdGF0ZVBhdGhzKCk6IMm1UGxhaW5PYmplY3RPZjxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RmFjdG9yeSA/IHRoaXMuX3BhcmVudEZhY3Rvcnkuc3RhdGVQYXRocyA6IHRoaXMuX3N0YXRlUGF0aHM7XG4gIH1cblxuICBnZXRSdW50aW1lU2VsZWN0b3JDb250ZXh0ID0gybVtZW1vaXplKCgpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBjb25zdCBzdGF0ZUZhY3RvcnkgPSB0aGlzO1xuICAgIGNvbnN0IHByb3BHZXR0ZXIgPSBzdGF0ZUZhY3RvcnkuX3Byb3BHZXR0ZXI7XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlR2V0dGVyKGtleTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBwYXRoID0gc3RhdGVGYWN0b3J5LnN0YXRlUGF0aHNba2V5XTtcbiAgICAgIHJldHVybiBwYXRoID8gcHJvcEdldHRlcihwYXRoLnNwbGl0KCcuJykpIDogbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZXh0OiDJtVJ1bnRpbWVTZWxlY3RvckNvbnRleHQgPSB0aGlzLl9wYXJlbnRGYWN0b3J5XG4gICAgICA/IHRoaXMuX3BhcmVudEZhY3RvcnkuZ2V0UnVudGltZVNlbGVjdG9yQ29udGV4dCgpXG4gICAgICA6IHtcbiAgICAgICAgICBnZXRTdGF0ZUdldHRlcihrZXk6IHN0cmluZykge1xuICAgICAgICAgICAgLy8gVXNlIGBAX19JTkxJTkVfX2AgYW5ub3RhdGlvbiB0byBmb3JjZWx5IGlubGluZSBgcmVzb2x2ZUdldHRlcmAuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgVGVyc2VyIGFubm90YXRpb24sIHdoaWNoIHdpbGwgZnVuY3Rpb24gb25seSBpbiB0aGUgcHJvZHVjdGlvbiBtb2RlLlxuICAgICAgICAgICAgbGV0IGdldHRlciA9IC8qQF9fSU5MSU5FX18qLyByZXNvbHZlR2V0dGVyKGtleSk7XG4gICAgICAgICAgICBpZiAoZ2V0dGVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXR0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgLy8gTGF0ZSBsb2FkZWQgZ2V0dGVyXG4gICAgICAgICAgICAgIGlmICghZ2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgZ2V0dGVyID0gLypAX19JTkxJTkVfXyovIHJlc29sdmVHZXR0ZXIoa2V5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZ2V0dGVyID8gZ2V0dGVyKC4uLmFyZ3MpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdldFNlbGVjdG9yT3B0aW9ucyhsb2NhbE9wdGlvbnM/OiDJtVNoYXJlZFNlbGVjdG9yT3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgZ2xvYmFsU2VsZWN0b3JPcHRpb25zID0gc3RhdGVGYWN0b3J5Ll9jb25maWcuc2VsZWN0b3JPcHRpb25zO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uZ2xvYmFsU2VsZWN0b3JPcHRpb25zLFxuICAgICAgICAgICAgICAuLi4obG9jYWxPcHRpb25zIHx8IHt9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH0pO1xuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGlvbnNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IHN0YXRlIHRvIHRoZSBnbG9iYWwgZGVmcy5cbiAgICovXG4gIGFkZChzdGF0ZUNsYXNzZXM6IMm1U3RhdGVDbGFzc0ludGVybmFsW10pOiBNYXBwZWRTdG9yZVtdIHtcbiAgICBpZiAoTkdfREVWX01PREUpIHtcbiAgICAgIGVuc3VyZVN0YXRlc0FyZURlY29yYXRlZChzdGF0ZUNsYXNzZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbmV3U3RhdGVzIH0gPSB0aGlzLmFkZFRvU3RhdGVzTWFwKHN0YXRlQ2xhc3Nlcyk7XG4gICAgaWYgKCFuZXdTdGF0ZXMubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBzdGF0ZUdyYXBoOiBTdGF0ZUtleUdyYXBoID0gYnVpbGRHcmFwaChuZXdTdGF0ZXMpO1xuICAgIGNvbnN0IHNvcnRlZFN0YXRlczogc3RyaW5nW10gPSB0b3BvbG9naWNhbFNvcnQoc3RhdGVHcmFwaCk7XG4gICAgY29uc3QgcGF0aHM6IMm1UGxhaW5PYmplY3RPZjxzdHJpbmc+ID0gZmluZEZ1bGxQYXJlbnRQYXRoKHN0YXRlR3JhcGgpO1xuICAgIGNvbnN0IG5hbWVHcmFwaDogybVQbGFpbk9iamVjdE9mPMm1U3RhdGVDbGFzc0ludGVybmFsPiA9IG5hbWVUb1N0YXRlKG5ld1N0YXRlcyk7XG4gICAgY29uc3QgYm9vdHN0cmFwcGVkU3RvcmVzOiBNYXBwZWRTdG9yZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygc29ydGVkU3RhdGVzKSB7XG4gICAgICBjb25zdCBzdGF0ZUNsYXNzOiDJtVN0YXRlQ2xhc3NJbnRlcm5hbCA9IG5hbWVHcmFwaFtuYW1lXTtcbiAgICAgIGNvbnN0IHBhdGg6IHN0cmluZyA9IHBhdGhzW25hbWVdO1xuICAgICAgY29uc3QgbWV0YTogybVNZXRhRGF0YU1vZGVsID0gc3RhdGVDbGFzc1vJtU1FVEFfS0VZXSE7XG5cbiAgICAgIHRoaXMuYWRkUnVudGltZUluZm9Ub01ldGEobWV0YSwgcGF0aCk7XG5cbiAgICAgIC8vIE5vdGU6IHByZXZpb3VzbHkgd2UgY2FsbGVkIGBlbnN1cmVTdGF0ZUNsYXNzSXNJbmplY3RhYmxlYCB3aXRoaW4gdGhlXG4gICAgICAvLyBgU3RhdGVgIGRlY29yYXRvci4gVGhpcyBjaGVjayBpcyBtb3ZlZCBoZXJlIGJlY2F1c2UgdGhlIGDJtXByb3ZgIHByb3BlcnR5XG4gICAgICAvLyB3aWxsIG5vdCBleGlzdCBvbiB0aGUgY2xhc3MgaW4gSklUIG1vZGUgKGJlY2F1c2UgaXQncyBzZXQgYXN5bmNocm9ub3VzbHlcbiAgICAgIC8vIGR1cmluZyBKSVQgY29tcGlsYXRpb24gdGhyb3VnaCBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCkuXG4gICAgICBpZiAoTkdfREVWX01PREUpIHtcbiAgICAgICAgZW5zdXJlU3RhdGVDbGFzc0lzSW5qZWN0YWJsZShzdGF0ZUNsYXNzKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhdGVNYXA6IE1hcHBlZFN0b3JlID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBpc0luaXRpYWxpc2VkOiBmYWxzZSxcbiAgICAgICAgYWN0aW9uczogbWV0YS5hY3Rpb25zLFxuICAgICAgICBpbnN0YW5jZTogdGhpcy5faW5qZWN0b3IuZ2V0KHN0YXRlQ2xhc3MpLFxuICAgICAgICBkZWZhdWx0czogY2xvbmVEZWZhdWx0cyhtZXRhLmRlZmF1bHRzKVxuICAgICAgfTtcblxuICAgICAgLy8gZW5zdXJlIG91ciBzdG9yZSBoYXNuJ3QgYWxyZWFkeSBiZWVuIGFkZGVkXG4gICAgICAvLyBidXQgZG9uJ3QgdGhyb3cgc2luY2UgaXQgY291bGQgYmUgbGF6eVxuICAgICAgLy8gbG9hZGVkIGZyb20gZGlmZmVyZW50IHBhdGhzXG4gICAgICBpZiAoIXRoaXMuaGFzQmVlbk1vdW50ZWRBbmRCb290c3RyYXBwZWQobmFtZSwgcGF0aCkpIHtcbiAgICAgICAgYm9vdHN0cmFwcGVkU3RvcmVzLnB1c2goc3RhdGVNYXApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YXRlcy5wdXNoKHN0YXRlTWFwKTtcbiAgICAgIHRoaXMuaHlkcmF0ZUFjdGlvbk1ldGFzTWFwKHN0YXRlTWFwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm9vdHN0cmFwcGVkU3RvcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNldCBvZiBzdGF0ZXMgdG8gdGhlIHN0b3JlIGFuZCByZXR1cm4gdGhlIGRlZmF1bHRzXG4gICAqL1xuICBhZGRBbmRSZXR1cm5EZWZhdWx0cyhzdGF0ZUNsYXNzZXM6IMm1U3RhdGVDbGFzc0ludGVybmFsW10pOiBTdGF0ZXNBbmREZWZhdWx0cyB7XG4gICAgY29uc3QgY2xhc3NlczogybVTdGF0ZUNsYXNzSW50ZXJuYWxbXSA9IHN0YXRlQ2xhc3NlcyB8fCBbXTtcblxuICAgIGNvbnN0IG1hcHBlZFN0b3JlczogTWFwcGVkU3RvcmVbXSA9IHRoaXMuYWRkKGNsYXNzZXMpO1xuICAgIGNvbnN0IGRlZmF1bHRzID0gbWFwcGVkU3RvcmVzLnJlZHVjZShcbiAgICAgIChyZXN1bHQ6IGFueSwgbWFwcGVkU3RvcmU6IE1hcHBlZFN0b3JlKSA9PlxuICAgICAgICBzZXRWYWx1ZShyZXN1bHQsIG1hcHBlZFN0b3JlLnBhdGgsIG1hcHBlZFN0b3JlLmRlZmF1bHRzKSxcbiAgICAgIHt9XG4gICAgKTtcbiAgICByZXR1cm4geyBkZWZhdWx0cywgc3RhdGVzOiBtYXBwZWRTdG9yZXMgfTtcbiAgfVxuXG4gIGNvbm5lY3RBY3Rpb25IYW5kbGVycygpOiB2b2lkIHtcbiAgICAvLyBOb3RlOiBXZSBoYXZlIHRvIGNvbm5lY3QgYWN0aW9ucyBvbmx5IG9uY2Ugd2hlbiB0aGUgYFN0YXRlRmFjdG9yeWBcbiAgICAvLyAgICAgICBpcyBiZWluZyBjcmVhdGVkIGZvciB0aGUgZmlyc3QgdGltZS4gVGhpcyBjaGVja3MgaWYgd2UncmUgaW5cbiAgICAvLyAgICAgICBhIGNoaWxkIHN0YXRlIGZhY3RvcnkgYW5kIHRoZSBwYXJlbnQgc3RhdGUgZmFjdG9yeSBhbHJlYWR5IGV4aXN0cy5cbiAgICBpZiAodGhpcy5fcGFyZW50RmFjdG9yeSB8fCB0aGlzLl9hY3Rpb25zU3Vic2NyaXB0aW9uICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aW9uc1N1YnNjcmlwdGlvbiA9IHRoaXMuX2FjdGlvbnNcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGN0eDogQWN0aW9uQ29udGV4dCkgPT4gY3R4LnN0YXR1cyA9PT0gQWN0aW9uU3RhdHVzLkRpc3BhdGNoZWQpLFxuICAgICAgICBtZXJnZU1hcChjdHggPT4ge1xuICAgICAgICAgIGNvbnN0IGFjdGlvbjogYW55ID0gY3R4LmFjdGlvbjtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnZva2VBY3Rpb25zKGFjdGlvbikucGlwZShcbiAgICAgICAgICAgIG1hcCgoKSA9PiA8QWN0aW9uQ29udGV4dD57IGFjdGlvbiwgc3RhdHVzOiBBY3Rpb25TdGF0dXMuU3VjY2Vzc2Z1bCB9KSxcbiAgICAgICAgICAgIGRlZmF1bHRJZkVtcHR5KDxBY3Rpb25Db250ZXh0PnsgYWN0aW9uLCBzdGF0dXM6IEFjdGlvblN0YXR1cy5DYW5jZWxlZCB9KSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBuZ3hzVW5oYW5kbGVkRXJyb3JIYW5kbGVyID0gKHRoaXMuX25neHNVbmhhbmRsZWRFcnJvckhhbmRsZXIgfHw9XG4gICAgICAgICAgICAgICAgdGhpcy5faW5qZWN0b3IuZ2V0KE5neHNVbmhhbmRsZWRFcnJvckhhbmRsZXIpKTtcbiAgICAgICAgICAgICAgY29uc3QgaGFuZGxlYWJsZUVycm9yID0gYXNzaWduVW5oYW5kbGVkQ2FsbGJhY2soZXJyb3IsICgpID0+XG4gICAgICAgICAgICAgICAgbmd4c1VuaGFuZGxlZEVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihlcnJvciwgeyBhY3Rpb24gfSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKDxBY3Rpb25Db250ZXh0PntcbiAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBBY3Rpb25TdGF0dXMuRXJyb3JlZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogaGFuZGxlYWJsZUVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShjdHggPT4gdGhpcy5fYWN0aW9uUmVzdWx0cy5uZXh0KGN0eCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSBhY3Rpb25zIG9uIHRoZSBzdGF0ZXMuXG4gICAqL1xuICBpbnZva2VBY3Rpb25zKGFjdGlvbjogYW55KSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEFjdGlvblR5cGVGcm9tSW5zdGFuY2UoYWN0aW9uKSE7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuXG4gICAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkaXNwYXRjaGVkIGFjdGlvbiBoYXMgYmVlbiBoYW5kbGVkLCB0aGlzIGlzIGFzc2lnbmVkXG4gICAgLy8gdG8gYHRydWVgIHdpdGhpbiB0aGUgYmVsb3cgYGZvcmAgbG9vcCBpZiBhbnkgYGFjdGlvbk1ldGFzYCBoYXMgYmVlbiBmb3VuZC5cbiAgICBsZXQgYWN0aW9uSGFzQmVlbkhhbmRsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGFjdGlvbkhhbmRsZXJzID0gdGhpcy5fYWN0aW9uUmVnaXN0cnkuZ2V0KHR5cGUpO1xuXG4gICAgaWYgKGFjdGlvbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGFjdGlvbkhhbmRsZXIgb2YgYWN0aW9uSGFuZGxlcnMpIHtcbiAgICAgICAgbGV0IHJlc3VsdDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGFjdGlvbkhhbmRsZXIoYWN0aW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlc3VsdCA9IHRocm93RXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcblxuICAgICAgICBhY3Rpb25IYXNCZWVuSGFuZGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGBOZ3hzVW5oYW5kbGVkQWN0aW9uc0xvZ2dlcmAgaXMgYSB0cmVlLXNoYWthYmxlIGNsYXNzIHdoaWNoIGZ1bmN0aW9uc1xuICAgIC8vIG9ubHkgZHVyaW5nIGRldmVsb3BtZW50LlxuICAgIGlmIChOR19ERVZfTU9ERSAmJiAhYWN0aW9uSGFzQmVlbkhhbmRsZWQpIHtcbiAgICAgIGNvbnN0IHVuaGFuZGxlZEFjdGlvbnNMb2dnZXIgPSB0aGlzLl9pbmplY3Rvci5nZXQoTmd4c1VuaGFuZGxlZEFjdGlvbnNMb2dnZXIsIG51bGwpO1xuICAgICAgLy8gVGhlIGBOZ3hzVW5oYW5kbGVkQWN0aW9uc0xvZ2dlcmAgd2lsbCBub3QgYmUgcmVzb2x2ZWQgYnkgdGhlIGluamVjdG9yIGlmIHRoZVxuICAgICAgLy8gYE5neHNEZXZlbG9wbWVudE1vZHVsZWAgaXMgbm90IHByb3ZpZGVkLiBJdCdzIGVub3VnaCB0byBjaGVjayB3aGV0aGVyIHRoZSBgaW5qZWN0b3IuZ2V0YFxuICAgICAgLy8gZGlkbid0IHJldHVybiBgbnVsbGAgc28gd2UgbWF5IGVuc3VyZSB0aGUgbW9kdWxlIGhhcyBiZWVuIGltcG9ydGVkLlxuICAgICAgdW5oYW5kbGVkQWN0aW9uc0xvZ2dlcj8ud2FybihhY3Rpb24pO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdHMucHVzaChvZih7fSkpO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JrSm9pbihyZXN1bHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVG9TdGF0ZXNNYXAoc3RhdGVDbGFzc2VzOiDJtVN0YXRlQ2xhc3NJbnRlcm5hbFtdKToge1xuICAgIG5ld1N0YXRlczogybVTdGF0ZUNsYXNzSW50ZXJuYWxbXTtcbiAgfSB7XG4gICAgY29uc3QgbmV3U3RhdGVzOiDJtVN0YXRlQ2xhc3NJbnRlcm5hbFtdID0gW107XG4gICAgY29uc3Qgc3RhdGVzTWFwOiBTdGF0ZXNCeU5hbWUgPSB0aGlzLnN0YXRlc0J5TmFtZTtcblxuICAgIGZvciAoY29uc3Qgc3RhdGVDbGFzcyBvZiBzdGF0ZUNsYXNzZXMpIHtcbiAgICAgIGNvbnN0IHN0YXRlTmFtZSA9IMm1Z2V0U3RvcmVNZXRhZGF0YShzdGF0ZUNsYXNzKS5uYW1lITtcbiAgICAgIGlmIChOR19ERVZfTU9ERSkge1xuICAgICAgICBlbnN1cmVTdGF0ZU5hbWVJc1VuaXF1ZShzdGF0ZU5hbWUsIHN0YXRlQ2xhc3MsIHN0YXRlc01hcCk7XG4gICAgICB9XG4gICAgICBjb25zdCB1bm1vdW50ZWRTdGF0ZSA9ICFzdGF0ZXNNYXBbc3RhdGVOYW1lXTtcbiAgICAgIGlmICh1bm1vdW50ZWRTdGF0ZSkge1xuICAgICAgICBuZXdTdGF0ZXMucHVzaChzdGF0ZUNsYXNzKTtcbiAgICAgICAgc3RhdGVzTWFwW3N0YXRlTmFtZV0gPSBzdGF0ZUNsYXNzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IG5ld1N0YXRlcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSdW50aW1lSW5mb1RvTWV0YShtZXRhOiDJtU1ldGFEYXRhTW9kZWwsIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGVQYXRoc1ttZXRhLm5hbWUhXSA9IHBhdGg7XG4gICAgLy8gVE9ETzogdmVyc2lvbnMgYWZ0ZXIgdjMgLSB3ZSBwbGFuIHRvIGdldCByaWQgb2YgdGhlIGBwYXRoYCBwcm9wZXJ0eSBiZWNhdXNlIGl0IGlzIG5vbi1kZXRlcm1pbmlzdGljXG4gICAgLy8gd2UgY2FuIGRvIHRoaXMgd2hlbiB3ZSBnZXQgcmlkIG9mIHRoZSBpbmNvcnJlY3RseSBleHBvc2VkIGdldFN0b3JlTWV0YWRhdGFcbiAgICAvLyBXZSB3aWxsIG5lZWQgdG8gY29tZSB1cCB3aXRoIGFuIGFsdGVybmF0aXZlIHRvIHdoYXQgd2FzIGV4cG9zZWQgaW4gdjMgYmVjYXVzZSB0aGlzIGlzIHVzZWQgYnkgbWFueSBwbHVnaW5zXG4gICAgbWV0YS5wYXRoID0gcGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQmVlbk1vdW50ZWRBbmRCb290c3RyYXBwZWQobmFtZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWx1ZUlzQm9vdHN0cmFwcGVkSW5Jbml0aWFsU3RhdGU6IGJvb2xlYW4gPVxuICAgICAgZ2V0VmFsdWUodGhpcy5faW5pdGlhbFN0YXRlLCBwYXRoKSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIFRoaXMgY2hlY2tzIHdoZXRoZXIgYSBzdGF0ZSBoYXMgYmVlbiBhbHJlYWR5IGFkZGVkIHRvIHRoZSBnbG9iYWwgZ3JhcGggYW5kXG4gICAgLy8gaXRzIGxpZmVjeWNsZSBpcyBpbiAnYm9vdHN0cmFwcGVkJyBzdGF0ZS5cbiAgICByZXR1cm4gdGhpcy5zdGF0ZXNCeU5hbWVbbmFtZV0gJiYgdmFsdWVJc0Jvb3RzdHJhcHBlZEluSW5pdGlhbFN0YXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBoeWRyYXRlQWN0aW9uTWV0YXNNYXAoeyBwYXRoLCBhY3Rpb25zLCBpbnN0YW5jZSB9OiBNYXBwZWRTdG9yZSk6IHZvaWQge1xuICAgIGNvbnN0IHsgZGlzcGF0Y2hlZCQgfSA9IHRoaXMuX2FjdGlvbnM7XG4gICAgZm9yIChjb25zdCBhY3Rpb25UeXBlIG9mIE9iamVjdC5rZXlzKGFjdGlvbnMpKSB7XG4gICAgICBjb25zdCBhY3Rpb25IYW5kbGVycyA9IGFjdGlvbnNbYWN0aW9uVHlwZV0ubWFwKGFjdGlvbk1ldGEgPT4ge1xuICAgICAgICAvLyBhY3Rpb246IEluc3RhbmNlPEFjdGlvblR5cGU+XG4gICAgICAgIHJldHVybiAoYWN0aW9uOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGF0ZUNvbnRleHQgPSB0aGlzLl9zdGF0ZUNvbnRleHRGYWN0b3J5LmNyZWF0ZVN0YXRlQ29udGV4dChwYXRoKTtcblxuICAgICAgICAgIGxldCByZXN1bHQgPSBpbnN0YW5jZVthY3Rpb25NZXRhLmZuXShzdGF0ZUNvbnRleHQsIGFjdGlvbik7XG5cbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVzZSBgaXNQcm9taXNlYCBpbnN0ZWFkIG9mIGNoZWNraW5nIHdoZXRoZXJcbiAgICAgICAgICAvLyBgcmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZWAuIEluIHpvbmUuanMgcGF0Y2hlZCBlbnZpcm9ubWVudHMsIGBnbG9iYWwuUHJvbWlzZWBcbiAgICAgICAgICAvLyBpcyB0aGUgYFpvbmVBd2FyZVByb21pc2VgLiBTb21lIEFQSXMsIHdoaWNoIGFyZSBsaWtlbHkgbm90IHBhdGNoZWQgYnkgem9uZS5qc1xuICAgICAgICAgIC8vIGZvciBjZXJ0YWluIHJlYXNvbnMsIG1pZ2h0IG5vdCB3b3JrIHdpdGggYGluc3RhbmNlb2ZgLiBGb3IgaW5zdGFuY2UsIHRoZSBkeW5hbWljXG4gICAgICAgICAgLy8gaW1wb3J0IHJldHVybnMgYSBuYXRpdmUgcHJvbWlzZSAobm90IGEgYFpvbmVBd2FyZVByb21pc2VgKSwgY2F1c2luZyB0aGlzIGNoZWNrIHRvXG4gICAgICAgICAgLy8gYmUgZmFsc3kuXG4gICAgICAgICAgaWYgKMm1aXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZyb20ocmVzdWx0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5waXBlKFxuICAgICAgICAgICAgICBtZXJnZU1hcCgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICjJtWlzUHJvbWlzZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmcm9tKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHZhbHVlKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC8vIElmIHRoaXMgb2JzZXJ2YWJsZSBoYXMgY29tcGxldGVkIHdpdGhvdXQgZW1pdHRpbmcgYW55IHZhbHVlcyxcbiAgICAgICAgICAgICAgLy8gd2Ugd291bGRuJ3Qgd2FudCB0byBjb21wbGV0ZSB0aGUgZW50aXJlIGNoYWluIG9mIGFjdGlvbnMuXG4gICAgICAgICAgICAgIC8vIElmIGFueSBvYnNlcnZhYmxlIGNvbXBsZXRlcywgdGhlbiB0aGUgYWN0aW9uIHdpbGwgYmUgY2FuY2VsZWQuXG4gICAgICAgICAgICAgIC8vIEZvciBpbnN0YW5jZSwgaWYgYW55IGFjdGlvbiBoYW5kbGVyIGhhZCBhIHN0YXRlbWVudCBsaWtlXG4gICAgICAgICAgICAgIC8vIGBoYW5kbGVyKGN0eCkgeyByZXR1cm4gRU1QVFk7IH1gLCB0aGVuIHRoZSBhY3Rpb24gd291bGQgYmUgY2FuY2VsZWQuXG4gICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbmd4cy9zdG9yZS9pc3N1ZXMvMTU2OFxuICAgICAgICAgICAgICBkZWZhdWx0SWZFbXB0eSh7fSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChhY3Rpb25NZXRhLm9wdGlvbnMuY2FuY2VsVW5jb21wbGV0ZWQpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUodGFrZVVudGlsKGRpc3BhdGNoZWQkLnBpcGUob2ZBY3Rpb25EaXNwYXRjaGVkKGFjdGlvbikpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG9mKHt9KS5waXBlKHNoYXJlUmVwbGF5KCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3QgYWN0aW9uSGFuZGxlciBvZiBhY3Rpb25IYW5kbGVycykge1xuICAgICAgICB0aGlzLl9hY3Rpb25SZWdpc3RyeS5yZWdpc3RlcihhY3Rpb25UeXBlLCBhY3Rpb25IYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,37 +1,33 @@
1
- import { Inject, Injectable, Optional, SkipSelf } from '@angular/core';
1
+ import { inject, Injectable } from '@angular/core';
2
2
  import { NGXS_PLUGINS } from '@ngxs/store/plugins';
3
3
  import * as i0 from "@angular/core";
4
4
  export class PluginManager {
5
- constructor(_parentManager, _pluginHandlers) {
6
- this._parentManager = _parentManager;
7
- this._pluginHandlers = _pluginHandlers;
5
+ constructor() {
8
6
  this.plugins = [];
7
+ this._parentManager = inject(PluginManager, {
8
+ optional: true,
9
+ skipSelf: true
10
+ });
11
+ this._pluginHandlers = inject(NGXS_PLUGINS, {
12
+ optional: true
13
+ });
9
14
  this.registerHandlers();
10
15
  }
11
- get rootPlugins() {
12
- return (this._parentManager && this._parentManager.plugins) || this.plugins;
16
+ get _rootPlugins() {
17
+ return this._parentManager?.plugins || this.plugins;
13
18
  }
14
19
  registerHandlers() {
15
20
  const pluginHandlers = this.getPluginHandlers();
16
- this.rootPlugins.push(...pluginHandlers);
21
+ this._rootPlugins.push(...pluginHandlers);
17
22
  }
18
23
  getPluginHandlers() {
19
24
  const handlers = this._pluginHandlers || [];
20
25
  return handlers.map((plugin) => (plugin.handle ? plugin.handle.bind(plugin) : plugin));
21
26
  }
22
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: PluginManager, deps: [{ token: PluginManager, optional: true, skipSelf: true }, { token: NGXS_PLUGINS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
27
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: PluginManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
23
28
  /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: PluginManager }); }
24
29
  }
25
30
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: PluginManager, decorators: [{
26
31
  type: Injectable
27
- }], ctorParameters: () => [{ type: PluginManager, decorators: [{
28
- type: Optional
29
- }, {
30
- type: SkipSelf
31
- }] }, { type: undefined, decorators: [{
32
- type: Inject,
33
- args: [NGXS_PLUGINS]
34
- }, {
35
- type: Optional
36
- }] }] });
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9zdG9yZS9zcmMvcGx1Z2luLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUE0QixNQUFNLHFCQUFxQixDQUFDOztBQUc3RSxNQUFNLE9BQU8sYUFBYTtJQUd4QixZQUdVLGNBQTZCLEVBRzdCLGVBQTZCO1FBSDdCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBRzdCLG9CQUFlLEdBQWYsZUFBZSxDQUFjO1FBUmhDLFlBQU8sR0FBbUIsRUFBRSxDQUFDO1FBVWxDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFZLFdBQVc7UUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQzlFLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsTUFBTSxjQUFjLEdBQW1CLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLFFBQVEsR0FBaUIsSUFBSSxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUM7UUFDMUQsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUNqQixDQUFDLE1BQWtCLEVBQUUsRUFBRSxDQUNyQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQWlCLENBQ3hFLENBQUM7SUFDSixDQUFDO2lJQTdCVSxhQUFhLDRFQU9kLFlBQVk7cUlBUFgsYUFBYTs7MkZBQWIsYUFBYTtrQkFEekIsVUFBVTs7MEJBS04sUUFBUTs7MEJBQ1IsUUFBUTs7MEJBRVIsTUFBTTsyQkFBQyxZQUFZOzswQkFDbkIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIFNraXBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR1hTX1BMVUdJTlMsIE5neHNQbHVnaW4sIE5neHNQbHVnaW5GbiB9IGZyb20gJ0BuZ3hzL3N0b3JlL3BsdWdpbnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUGx1Z2luTWFuYWdlciB7XG4gIHB1YmxpYyBwbHVnaW5zOiBOZ3hzUGx1Z2luRm5bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQFNraXBTZWxmKClcbiAgICBwcml2YXRlIF9wYXJlbnRNYW5hZ2VyOiBQbHVnaW5NYW5hZ2VyLFxuICAgIEBJbmplY3QoTkdYU19QTFVHSU5TKVxuICAgIEBPcHRpb25hbCgpXG4gICAgcHJpdmF0ZSBfcGx1Z2luSGFuZGxlcnM6IE5neHNQbHVnaW5bXVxuICApIHtcbiAgICB0aGlzLnJlZ2lzdGVySGFuZGxlcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHJvb3RQbHVnaW5zKCk6IE5neHNQbHVnaW5GbltdIHtcbiAgICByZXR1cm4gKHRoaXMuX3BhcmVudE1hbmFnZXIgJiYgdGhpcy5fcGFyZW50TWFuYWdlci5wbHVnaW5zKSB8fCB0aGlzLnBsdWdpbnM7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVySGFuZGxlcnMoKTogdm9pZCB7XG4gICAgY29uc3QgcGx1Z2luSGFuZGxlcnM6IE5neHNQbHVnaW5GbltdID0gdGhpcy5nZXRQbHVnaW5IYW5kbGVycygpO1xuICAgIHRoaXMucm9vdFBsdWdpbnMucHVzaCguLi5wbHVnaW5IYW5kbGVycyk7XG4gIH1cblxuICBwcml2YXRlIGdldFBsdWdpbkhhbmRsZXJzKCk6IE5neHNQbHVnaW5GbltdIHtcbiAgICBjb25zdCBoYW5kbGVyczogTmd4c1BsdWdpbltdID0gdGhpcy5fcGx1Z2luSGFuZGxlcnMgfHwgW107XG4gICAgcmV0dXJuIGhhbmRsZXJzLm1hcChcbiAgICAgIChwbHVnaW46IE5neHNQbHVnaW4pID0+XG4gICAgICAgIChwbHVnaW4uaGFuZGxlID8gcGx1Z2luLmhhbmRsZS5iaW5kKHBsdWdpbikgOiBwbHVnaW4pIGFzIE5neHNQbHVnaW5GblxuICAgICk7XG4gIH1cbn1cbiJdfQ==
32
+ }], ctorParameters: () => [] });
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9zdG9yZS9zcmMvcGx1Z2luLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBNEIsTUFBTSxxQkFBcUIsQ0FBQzs7QUFHN0UsTUFBTSxPQUFPLGFBQWE7SUFZeEI7UUFYUyxZQUFPLEdBQW1CLEVBQUUsQ0FBQztRQUVyQixtQkFBYyxHQUFHLE1BQU0sQ0FBQyxhQUFhLEVBQUU7WUFDdEQsUUFBUSxFQUFFLElBQUk7WUFDZCxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztRQUVjLG9CQUFlLEdBQUcsTUFBTSxDQUFlLFlBQVksRUFBRTtZQUNwRSxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztRQUdELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFZLFlBQVk7UUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RELENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsTUFBTSxjQUFjLEdBQW1CLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLFFBQVEsR0FBaUIsSUFBSSxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUM7UUFDMUQsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUNqQixDQUFDLE1BQWtCLEVBQUUsRUFBRSxDQUNyQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQWlCLENBQ3hFLENBQUM7SUFDSixDQUFDO2lJQS9CVSxhQUFhO3FJQUFiLGFBQWE7OzJGQUFiLGFBQWE7a0JBRHpCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HWFNfUExVR0lOUywgTmd4c1BsdWdpbiwgTmd4c1BsdWdpbkZuIH0gZnJvbSAnQG5neHMvc3RvcmUvcGx1Z2lucyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQbHVnaW5NYW5hZ2VyIHtcbiAgcmVhZG9ubHkgcGx1Z2luczogTmd4c1BsdWdpbkZuW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9wYXJlbnRNYW5hZ2VyID0gaW5qZWN0KFBsdWdpbk1hbmFnZXIsIHtcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICBza2lwU2VsZjogdHJ1ZVxuICB9KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9wbHVnaW5IYW5kbGVycyA9IGluamVjdDxOZ3hzUGx1Z2luW10+KE5HWFNfUExVR0lOUywge1xuICAgIG9wdGlvbmFsOiB0cnVlXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucmVnaXN0ZXJIYW5kbGVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX3Jvb3RQbHVnaW5zKCk6IE5neHNQbHVnaW5GbltdIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50TWFuYWdlcj8ucGx1Z2lucyB8fCB0aGlzLnBsdWdpbnM7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVySGFuZGxlcnMoKTogdm9pZCB7XG4gICAgY29uc3QgcGx1Z2luSGFuZGxlcnM6IE5neHNQbHVnaW5GbltdID0gdGhpcy5nZXRQbHVnaW5IYW5kbGVycygpO1xuICAgIHRoaXMuX3Jvb3RQbHVnaW5zLnB1c2goLi4ucGx1Z2luSGFuZGxlcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQbHVnaW5IYW5kbGVycygpOiBOZ3hzUGx1Z2luRm5bXSB7XG4gICAgY29uc3QgaGFuZGxlcnM6IE5neHNQbHVnaW5bXSA9IHRoaXMuX3BsdWdpbkhhbmRsZXJzIHx8IFtdO1xuICAgIHJldHVybiBoYW5kbGVycy5tYXAoXG4gICAgICAocGx1Z2luOiBOZ3hzUGx1Z2luKSA9PlxuICAgICAgICAocGx1Z2luLmhhbmRsZSA/IHBsdWdpbi5oYW5kbGUuYmluZChwbHVnaW4pIDogcGx1Z2luKSBhcyBOZ3hzUGx1Z2luRm5cbiAgICApO1xuICB9XG59XG4iXX0=
@@ -1,5 +1,6 @@
1
- import { makeEnvironmentProviders } from '@angular/core';
1
+ import { ENVIRONMENT_INITIALIZER, inject, makeEnvironmentProviders } from '@angular/core';
2
2
  import { NGXS_PLUGINS } from '@ngxs/store/plugins';
3
+ import { PluginManager } from '../plugin-manager';
3
4
  /**
4
5
  * This function registers a custom global plugin for the state.
5
6
  *
@@ -15,6 +16,12 @@ import { NGXS_PLUGINS } from '@ngxs/store/plugins';
15
16
  * ```
16
17
  */
17
18
  export function withNgxsPlugin(plugin) {
18
- return makeEnvironmentProviders([{ provide: NGXS_PLUGINS, useClass: plugin, multi: true }]);
19
+ return makeEnvironmentProviders([
20
+ { provide: NGXS_PLUGINS, useClass: plugin, multi: true },
21
+ // We should inject the `PluginManager` to retrieve `NGXS_PLUGINS` and
22
+ // register those plugins. The plugin can be added from inside the child
23
+ // route, so the plugin manager should be re-injected.
24
+ { provide: ENVIRONMENT_INITIALIZER, useValue: () => inject(PluginManager), multi: true }
25
+ ]);
19
26
  }
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3RvcmUvc3JjL3N0YW5kYWxvbmUtZmVhdHVyZXMvcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBOEIsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckYsT0FBTyxFQUFFLFlBQVksRUFBYyxNQUFNLHFCQUFxQixDQUFDO0FBRS9EOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQXdCO0lBQ3JELE9BQU8sd0JBQXdCLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzlGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudFByb3ZpZGVycywgVHlwZSwgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR1hTX1BMVUdJTlMsIE5neHNQbHVnaW4gfSBmcm9tICdAbmd4cy9zdG9yZS9wbHVnaW5zJztcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBhIGN1c3RvbSBnbG9iYWwgcGx1Z2luIGZvciB0aGUgc3RhdGUuXG4gKlxuICogYGBgdHNcbiAqIGJvb3RzdHJhcEFwcGxpY2F0aW9uKEFwcENvbXBvbmVudCwge1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBwcm92aWRlU3RvcmUoXG4gKiAgICAgICBbQ291bnRyaWVzU3RhdGVdLFxuICogICAgICAgd2l0aE5neHNQbHVnaW4oTG9nb3V0UGx1Z2luKVxuICogICAgIClcbiAqICAgXVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhOZ3hzUGx1Z2luKHBsdWdpbjogVHlwZTxOZ3hzUGx1Z2luPik6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbeyBwcm92aWRlOiBOR1hTX1BMVUdJTlMsIHVzZUNsYXNzOiBwbHVnaW4sIG11bHRpOiB0cnVlIH1dKTtcbn1cbiJdfQ==
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3RvcmUvc3JjL3N0YW5kYWxvbmUtZmVhdHVyZXMvcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFHdkIsTUFBTSxFQUNOLHdCQUF3QixFQUN6QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFjLE1BQU0scUJBQXFCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQXdCO0lBQ3JELE9BQU8sd0JBQXdCLENBQUM7UUFDOUIsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtRQUN4RCxzRUFBc0U7UUFDdEUsd0VBQXdFO1FBQ3hFLHNEQUFzRDtRQUN0RCxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7S0FDekYsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVOVklST05NRU5UX0lOSVRJQUxJWkVSLFxuICBFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgVHlwZSxcbiAgaW5qZWN0LFxuICBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR1hTX1BMVUdJTlMsIE5neHNQbHVnaW4gfSBmcm9tICdAbmd4cy9zdG9yZS9wbHVnaW5zJztcblxuaW1wb3J0IHsgUGx1Z2luTWFuYWdlciB9IGZyb20gJy4uL3BsdWdpbi1tYW5hZ2VyJztcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBhIGN1c3RvbSBnbG9iYWwgcGx1Z2luIGZvciB0aGUgc3RhdGUuXG4gKlxuICogYGBgdHNcbiAqIGJvb3RzdHJhcEFwcGxpY2F0aW9uKEFwcENvbXBvbmVudCwge1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBwcm92aWRlU3RvcmUoXG4gKiAgICAgICBbQ291bnRyaWVzU3RhdGVdLFxuICogICAgICAgd2l0aE5neHNQbHVnaW4oTG9nb3V0UGx1Z2luKVxuICogICAgIClcbiAqICAgXVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhOZ3hzUGx1Z2luKHBsdWdpbjogVHlwZTxOZ3hzUGx1Z2luPik6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAgeyBwcm92aWRlOiBOR1hTX1BMVUdJTlMsIHVzZUNsYXNzOiBwbHVnaW4sIG11bHRpOiB0cnVlIH0sXG4gICAgLy8gV2Ugc2hvdWxkIGluamVjdCB0aGUgYFBsdWdpbk1hbmFnZXJgIHRvIHJldHJpZXZlIGBOR1hTX1BMVUdJTlNgIGFuZFxuICAgIC8vIHJlZ2lzdGVyIHRob3NlIHBsdWdpbnMuIFRoZSBwbHVnaW4gY2FuIGJlIGFkZGVkIGZyb20gaW5zaWRlIHRoZSBjaGlsZFxuICAgIC8vIHJvdXRlLCBzbyB0aGUgcGx1Z2luIG1hbmFnZXIgc2hvdWxkIGJlIHJlLWluamVjdGVkLlxuICAgIHsgcHJvdmlkZTogRU5WSVJPTk1FTlRfSU5JVElBTElaRVIsIHVzZVZhbHVlOiAoKSA9PiBpbmplY3QoUGx1Z2luTWFuYWdlciksIG11bHRpOiB0cnVlIH1cbiAgXSk7XG59XG4iXX0=