@ngrx/store-devtools 12.5.0

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 (72) hide show
  1. package/README.md +5 -0
  2. package/bundles/ngrx-store-devtools.umd.js +1318 -0
  3. package/bundles/ngrx-store-devtools.umd.js.map +1 -0
  4. package/esm2015/index.js +7 -0
  5. package/esm2015/ngrx-store-devtools.js +9 -0
  6. package/esm2015/public_api.js +2 -0
  7. package/esm2015/src/actions.js +97 -0
  8. package/esm2015/src/config.js +61 -0
  9. package/esm2015/src/devtools-dispatcher.js +9 -0
  10. package/esm2015/src/devtools.js +115 -0
  11. package/esm2015/src/extension.js +160 -0
  12. package/esm2015/src/index.js +5 -0
  13. package/esm2015/src/instrument.js +67 -0
  14. package/esm2015/src/reducer.js +365 -0
  15. package/esm2015/src/utils.js +106 -0
  16. package/fesm2015/ngrx-store-devtools.js +964 -0
  17. package/fesm2015/ngrx-store-devtools.js.map +1 -0
  18. package/index.d.ts +6 -0
  19. package/migrations/6_0_0/index.js +8 -0
  20. package/migrations/6_0_0/index.js.map +1 -0
  21. package/migrations/migration.json +10 -0
  22. package/ngrx-store-devtools.d.ts +8 -0
  23. package/ngrx-store-devtools.metadata.json +1 -0
  24. package/package.json +52 -0
  25. package/public_api.d.ts +1 -0
  26. package/schematics/collection.json +10 -0
  27. package/schematics/ng-add/index.js +110 -0
  28. package/schematics/ng-add/index.js.map +1 -0
  29. package/schematics/ng-add/schema.js +3 -0
  30. package/schematics/ng-add/schema.js.map +1 -0
  31. package/schematics/ng-add/schema.json +42 -0
  32. package/schematics-core/index.js +86 -0
  33. package/schematics-core/index.js.map +1 -0
  34. package/schematics-core/utility/angular-utils.js +33 -0
  35. package/schematics-core/utility/angular-utils.js.map +1 -0
  36. package/schematics-core/utility/ast-utils.js +701 -0
  37. package/schematics-core/utility/ast-utils.js.map +1 -0
  38. package/schematics-core/utility/change.js +162 -0
  39. package/schematics-core/utility/change.js.map +1 -0
  40. package/schematics-core/utility/config.js +21 -0
  41. package/schematics-core/utility/config.js.map +1 -0
  42. package/schematics-core/utility/find-component.js +101 -0
  43. package/schematics-core/utility/find-component.js.map +1 -0
  44. package/schematics-core/utility/find-module.js +102 -0
  45. package/schematics-core/utility/find-module.js.map +1 -0
  46. package/schematics-core/utility/json-utilts.js +37 -0
  47. package/schematics-core/utility/json-utilts.js.map +1 -0
  48. package/schematics-core/utility/libs-version.js +5 -0
  49. package/schematics-core/utility/libs-version.js.map +1 -0
  50. package/schematics-core/utility/ngrx-utils.js +246 -0
  51. package/schematics-core/utility/ngrx-utils.js.map +1 -0
  52. package/schematics-core/utility/package.js +23 -0
  53. package/schematics-core/utility/package.js.map +1 -0
  54. package/schematics-core/utility/parse-name.js +14 -0
  55. package/schematics-core/utility/parse-name.js.map +1 -0
  56. package/schematics-core/utility/project.js +35 -0
  57. package/schematics-core/utility/project.js.map +1 -0
  58. package/schematics-core/utility/strings.js +138 -0
  59. package/schematics-core/utility/strings.js.map +1 -0
  60. package/schematics-core/utility/update.js +34 -0
  61. package/schematics-core/utility/update.js.map +1 -0
  62. package/schematics-core/utility/visitors.js +250 -0
  63. package/schematics-core/utility/visitors.js.map +1 -0
  64. package/src/actions.d.ts +79 -0
  65. package/src/config.d.ts +113 -0
  66. package/src/devtools-dispatcher.d.ts +3 -0
  67. package/src/devtools.d.ts +31 -0
  68. package/src/extension.d.ts +46 -0
  69. package/src/index.d.ts +4 -0
  70. package/src/instrument.d.ts +12 -0
  71. package/src/reducer.d.ts +47 -0
  72. package/src/utils.d.ts +42 -0
@@ -0,0 +1,160 @@
1
+ import { Inject, Injectable, InjectionToken } from '@angular/core';
2
+ import { UPDATE } from '@ngrx/store';
3
+ import { EMPTY, Observable, of } from 'rxjs';
4
+ import { catchError, concatMap, debounceTime, filter, map, share, switchMap, take, takeUntil, timeout, } from 'rxjs/operators';
5
+ import { IMPORT_STATE, PERFORM_ACTION } from './actions';
6
+ import { STORE_DEVTOOLS_CONFIG, StoreDevtoolsConfig, } from './config';
7
+ import { DevtoolsDispatcher } from './devtools-dispatcher';
8
+ import { isActionFiltered, sanitizeAction, sanitizeActions, sanitizeState, sanitizeStates, shouldFilterActions, unliftState, } from './utils';
9
+ export const ExtensionActionTypes = {
10
+ START: 'START',
11
+ DISPATCH: 'DISPATCH',
12
+ STOP: 'STOP',
13
+ ACTION: 'ACTION',
14
+ };
15
+ export const REDUX_DEVTOOLS_EXTENSION = new InjectionToken('@ngrx/store-devtools Redux Devtools Extension');
16
+ export class DevtoolsExtension {
17
+ constructor(devtoolsExtension, config, dispatcher) {
18
+ this.config = config;
19
+ this.dispatcher = dispatcher;
20
+ this.devtoolsExtension = devtoolsExtension;
21
+ this.createActionStreams();
22
+ }
23
+ notify(action, state) {
24
+ if (!this.devtoolsExtension) {
25
+ return;
26
+ }
27
+ // Check to see if the action requires a full update of the liftedState.
28
+ // If it is a simple action generated by the user's app and the recording
29
+ // is not locked/paused, only send the action and the current state (fast).
30
+ //
31
+ // A full liftedState update (slow: serializes the entire liftedState) is
32
+ // only required when:
33
+ // a) redux-devtools-extension fires the @@Init action (ignored by
34
+ // @ngrx/store-devtools)
35
+ // b) an action is generated by an @ngrx module (e.g. @ngrx/effects/init
36
+ // or @ngrx/store/update-reducers)
37
+ // c) the state has been recomputed due to time-traveling
38
+ // d) any action that is not a PerformAction to err on the side of
39
+ // caution.
40
+ if (action.type === PERFORM_ACTION) {
41
+ if (state.isLocked || state.isPaused) {
42
+ return;
43
+ }
44
+ const currentState = unliftState(state);
45
+ if (shouldFilterActions(this.config) &&
46
+ isActionFiltered(currentState, action, this.config.predicate, this.config.actionsSafelist, this.config.actionsBlocklist)) {
47
+ return;
48
+ }
49
+ const sanitizedState = this.config.stateSanitizer
50
+ ? sanitizeState(this.config.stateSanitizer, currentState, state.currentStateIndex)
51
+ : currentState;
52
+ const sanitizedAction = this.config.actionSanitizer
53
+ ? sanitizeAction(this.config.actionSanitizer, action, state.nextActionId)
54
+ : action;
55
+ this.sendToReduxDevtools(() => this.extensionConnection.send(sanitizedAction, sanitizedState));
56
+ }
57
+ else {
58
+ // Requires full state update
59
+ const sanitizedLiftedState = Object.assign(Object.assign({}, state), { stagedActionIds: state.stagedActionIds, actionsById: this.config.actionSanitizer
60
+ ? sanitizeActions(this.config.actionSanitizer, state.actionsById)
61
+ : state.actionsById, computedStates: this.config.stateSanitizer
62
+ ? sanitizeStates(this.config.stateSanitizer, state.computedStates)
63
+ : state.computedStates });
64
+ this.sendToReduxDevtools(() => this.devtoolsExtension.send(null, sanitizedLiftedState, this.getExtensionConfig(this.config)));
65
+ }
66
+ }
67
+ createChangesObservable() {
68
+ if (!this.devtoolsExtension) {
69
+ return EMPTY;
70
+ }
71
+ return new Observable((subscriber) => {
72
+ const connection = this.devtoolsExtension.connect(this.getExtensionConfig(this.config));
73
+ this.extensionConnection = connection;
74
+ connection.init();
75
+ connection.subscribe((change) => subscriber.next(change));
76
+ return connection.unsubscribe;
77
+ });
78
+ }
79
+ createActionStreams() {
80
+ // Listens to all changes
81
+ const changes$ = this.createChangesObservable().pipe(share());
82
+ // Listen for the start action
83
+ const start$ = changes$.pipe(filter((change) => change.type === ExtensionActionTypes.START));
84
+ // Listen for the stop action
85
+ const stop$ = changes$.pipe(filter((change) => change.type === ExtensionActionTypes.STOP));
86
+ // Listen for lifted actions
87
+ const liftedActions$ = changes$.pipe(filter((change) => change.type === ExtensionActionTypes.DISPATCH), map((change) => this.unwrapAction(change.payload)), concatMap((action) => {
88
+ if (action.type === IMPORT_STATE) {
89
+ // State imports may happen in two situations:
90
+ // 1. Explicitly by user
91
+ // 2. User activated the "persist state accross reloads" option
92
+ // and now the state is imported during reload.
93
+ // Because of option 2, we need to give possible
94
+ // lazy loaded reducers time to instantiate.
95
+ // As soon as there is no UPDATE action within 1 second,
96
+ // it is assumed that all reducers are loaded.
97
+ return this.dispatcher.pipe(filter((action) => action.type === UPDATE), timeout(1000), debounceTime(1000), map(() => action), catchError(() => of(action)), take(1));
98
+ }
99
+ else {
100
+ return of(action);
101
+ }
102
+ }));
103
+ // Listen for unlifted actions
104
+ const actions$ = changes$.pipe(filter((change) => change.type === ExtensionActionTypes.ACTION), map((change) => this.unwrapAction(change.payload)));
105
+ const actionsUntilStop$ = actions$.pipe(takeUntil(stop$));
106
+ const liftedUntilStop$ = liftedActions$.pipe(takeUntil(stop$));
107
+ this.start$ = start$.pipe(takeUntil(stop$));
108
+ // Only take the action sources between the start/stop events
109
+ this.actions$ = this.start$.pipe(switchMap(() => actionsUntilStop$));
110
+ this.liftedActions$ = this.start$.pipe(switchMap(() => liftedUntilStop$));
111
+ }
112
+ unwrapAction(action) {
113
+ return typeof action === 'string' ? eval(`(${action})`) : action;
114
+ }
115
+ getExtensionConfig(config) {
116
+ var _a;
117
+ const extensionOptions = {
118
+ name: config.name,
119
+ features: config.features,
120
+ serialize: config.serialize,
121
+ autoPause: (_a = config.autoPause) !== null && _a !== void 0 ? _a : false,
122
+ // The action/state sanitizers are not added to the config
123
+ // because sanitation is done in this class already.
124
+ // It is done before sending it to the devtools extension for consistency:
125
+ // - If we call extensionConnection.send(...),
126
+ // the extension would call the sanitizers.
127
+ // - If we call devtoolsExtension.send(...) (aka full state update),
128
+ // the extension would NOT call the sanitizers, so we have to do it ourselves.
129
+ };
130
+ if (config.maxAge !== false /* support === 0 */) {
131
+ extensionOptions.maxAge = config.maxAge;
132
+ }
133
+ return extensionOptions;
134
+ }
135
+ sendToReduxDevtools(send) {
136
+ try {
137
+ send();
138
+ }
139
+ catch (err) {
140
+ console.warn('@ngrx/store-devtools: something went wrong inside the redux devtools', err);
141
+ }
142
+ }
143
+ }
144
+ /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
145
+ DevtoolsExtension.decorators = [
146
+ { type: Injectable }
147
+ ];
148
+ /**
149
+ * @type {function(): !Array<(null|{
150
+ * type: ?,
151
+ * decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>),
152
+ * })>}
153
+ * @nocollapse
154
+ */
155
+ DevtoolsExtension.ctorParameters = () => [
156
+ { type: undefined, decorators: [{ type: Inject, args: [REDUX_DEVTOOLS_EXTENSION,] }] },
157
+ { type: StoreDevtoolsConfig, decorators: [{ type: Inject, args: [STORE_DEVTOOLS_CONFIG,] }] },
158
+ { type: DevtoolsDispatcher }
159
+ ];
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zdG9yZS1kZXZ0b29scy9zcmMvZXh0ZW5zaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQVUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEdBQUcsRUFDSCxLQUFLLEVBQ0wsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsT0FBTyxHQUNSLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekQsT0FBTyxFQUVMLHFCQUFxQixFQUNyQixtQkFBbUIsR0FDcEIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFM0QsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsZUFBZSxFQUNmLGFBQWEsRUFDYixjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLFdBQVcsR0FDWixNQUFNLFNBQVMsQ0FBQztBQUVqQixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRztJQUNsQyxLQUFLLEVBQUUsT0FBTztJQUNkLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLElBQUksRUFBRSxNQUFNO0lBQ1osTUFBTSxFQUFFLFFBQVE7Q0FDakIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLElBQUksY0FBYyxDQUN4RCwrQ0FBK0MsQ0FDaEQsQ0FBQztBQXlCRixNQUFN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QUFDO1FBQ0YsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxtQkFBbUIsRUFBRTtZQUMvQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUN6QztRQUNELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVPLG1CQUFtQixDQUFDLElBQWM7UUFDeEMsSUFBSTtZQUNGLElBQUksRUFBRSxDQUFDO1NBQ1I7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLE9BQU8sQ0FBQyxJQUFJLENBQ1Ysc0VBQXNFLEVBQ3RFLEdBQUcsQ0FDSixDQUFDO1NBQ0g7SUFDSCxDQUFDOzs7O1lBek1GLFVBQVU7Ozs7Ozs7Ozs7NENBVU4sTUFBTSxTQUFDLHdCQUF3QjtZQXpEbEMsbUJBQW1CLHVCQTBEaEIsTUFBTSxTQUFDLHFCQUFxQjtZQXhEeEIsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aW9uLCBVUERBVEUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGNvbmNhdE1hcCxcbiAgZGVib3VuY2VUaW1lLFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgc2hhcmUsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0aW1lb3V0LFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IElNUE9SVF9TVEFURSwgUEVSRk9STV9BQ1RJT04gfSBmcm9tICcuL2FjdGlvbnMnO1xuaW1wb3J0IHtcbiAgU2VyaWFsaXphdGlvbk9wdGlvbnMsXG4gIFNUT1JFX0RFVlRPT0xTX0NPTkZJRyxcbiAgU3RvcmVEZXZ0b29sc0NvbmZpZyxcbn0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgRGV2dG9vbHNEaXNwYXRjaGVyIH0gZnJvbSAnLi9kZXZ0b29scy1kaXNwYXRjaGVyJztcbmltcG9ydCB7IExpZnRlZEFjdGlvbiwgTGlmdGVkU3RhdGUgfSBmcm9tICcuL3JlZHVjZXInO1xuaW1wb3J0IHtcbiAgaXNBY3Rpb25GaWx0ZXJlZCxcbiAgc2FuaXRpemVBY3Rpb24sXG4gIHNhbml0aXplQWN0aW9ucyxcbiAgc2FuaXRpemVTdGF0ZSxcbiAgc2FuaXRpemVTdGF0ZXMsXG4gIHNob3VsZEZpbHRlckFjdGlvbnMsXG4gIHVubGlmdFN0YXRlLFxufSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IEV4dGVuc2lvbkFjdGlvblR5cGVzID0ge1xuICBTVEFSVDogJ1NUQVJUJyxcbiAgRElTUEFUQ0g6ICdESVNQQVRDSCcsXG4gIFNUT1A6ICdTVE9QJyxcbiAgQUNUSU9OOiAnQUNUSU9OJyxcbn07XG5cbmV4cG9ydCBjb25zdCBSRURVWF9ERVZUT09MU19FWFRFTlNJT04gPSBuZXcgSW5qZWN0aW9uVG9rZW48UmVkdXhEZXZ0b29sc0V4dGVuc2lvbj4oXG4gICdAbmdyeC9zdG9yZS1kZXZ0b29scyBSZWR1eCBEZXZ0b29scyBFeHRlbnNpb24nXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlZHV4RGV2dG9vbHNFeHRlbnNpb25Db25uZWN0aW9uIHtcbiAgc3Vic2NyaWJlKGxpc3RlbmVyOiAoY2hhbmdlOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICB1bnN1YnNjcmliZSgpOiB2b2lkO1xuICBzZW5kKGFjdGlvbjogYW55LCBzdGF0ZTogYW55KTogdm9pZDtcbiAgaW5pdChzdGF0ZT86IGFueSk6IHZvaWQ7XG4gIGVycm9yKGFueUVycjogYW55KTogdm9pZDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUmVkdXhEZXZ0b29sc0V4dGVuc2lvbkNvbmZpZyB7XG4gIGZlYXR1cmVzPzogb2JqZWN0IHwgYm9vbGVhbjtcbiAgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBtYXhBZ2U/OiBudW1iZXI7XG4gIGF1dG9QYXVzZT86IGJvb2xlYW47XG4gIHNlcmlhbGl6ZT86IGJvb2xlYW4gfCBTZXJpYWxpemF0aW9uT3B0aW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWR1eERldnRvb2xzRXh0ZW5zaW9uIHtcbiAgY29ubmVjdChcbiAgICBvcHRpb25zOiBSZWR1eERldnRvb2xzRXh0ZW5zaW9uQ29uZmlnXG4gICk6IFJlZHV4RGV2dG9vbHNFeHRlbnNpb25Db25uZWN0aW9uO1xuICBzZW5kKGFjdGlvbjogYW55LCBzdGF0ZTogYW55LCBvcHRpb25zOiBSZWR1eERldnRvb2xzRXh0ZW5zaW9uQ29uZmlnKTogdm9pZDtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERldnRvb2xzRXh0ZW5zaW9uIHtcbiAgcHJpdmF0ZSBkZXZ0b29sc0V4dGVuc2lvbjogUmVkdXhEZXZ0b29sc0V4dGVuc2lvbjtcbiAgcHJpdmF0ZSBleHRlbnNpb25Db25uZWN0aW9uITogUmVkdXhEZXZ0b29sc0V4dGVuc2lvbkNvbm5lY3Rpb247XG5cbiAgbGlmdGVkQWN0aW9ucyQhOiBPYnNlcnZhYmxlPGFueT47XG4gIGFjdGlvbnMkITogT2JzZXJ2YWJsZTxhbnk+O1xuICBzdGFydCQhOiBPYnNlcnZhYmxlPGFueT47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChSRURVWF9ERVZUT09MU19FWFRFTlNJT04pIGRldnRvb2xzRXh0ZW5zaW9uOiBSZWR1eERldnRvb2xzRXh0ZW5zaW9uLFxuICAgIEBJbmplY3QoU1RPUkVfREVWVE9PTFNfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogU3RvcmVEZXZ0b29sc0NvbmZpZyxcbiAgICBwcml2YXRlIGRpc3BhdGNoZXI6IERldnRvb2xzRGlzcGF0Y2hlclxuICApIHtcbiAgICB0aGlzLmRldnRvb2xzRXh0ZW5zaW9uID0gZGV2dG9vbHNFeHRlbnNpb247XG4gICAgdGhpcy5jcmVhdGVBY3Rpb25TdHJlYW1zKCk7XG4gIH1cblxuICBub3RpZnkoYWN0aW9uOiBMaWZ0ZWRBY3Rpb24sIHN0YXRlOiBMaWZ0ZWRTdGF0ZSkge1xuICAgIGlmICghdGhpcy5kZXZ0b29sc0V4dGVuc2lvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGFjdGlvbiByZXF1aXJlcyBhIGZ1bGwgdXBkYXRlIG9mIHRoZSBsaWZ0ZWRTdGF0ZS5cbiAgICAvLyBJZiBpdCBpcyBhIHNpbXBsZSBhY3Rpb24gZ2VuZXJhdGVkIGJ5IHRoZSB1c2VyJ3MgYXBwIGFuZCB0aGUgcmVjb3JkaW5nXG4gICAgLy8gaXMgbm90IGxvY2tlZC9wYXVzZWQsIG9ubHkgc2VuZCB0aGUgYWN0aW9uIGFuZCB0aGUgY3VycmVudCBzdGF0ZSAoZmFzdCkuXG4gICAgLy9cbiAgICAvLyBBIGZ1bGwgbGlmdGVkU3RhdGUgdXBkYXRlIChzbG93OiBzZXJpYWxpemVzIHRoZSBlbnRpcmUgbGlmdGVkU3RhdGUpIGlzXG4gICAgLy8gb25seSByZXF1aXJlZCB3aGVuOlxuICAgIC8vICAgYSkgcmVkdXgtZGV2dG9vbHMtZXh0ZW5zaW9uIGZpcmVzIHRoZSBAQEluaXQgYWN0aW9uIChpZ25vcmVkIGJ5XG4gICAgLy8gICAgICBAbmdyeC9zdG9yZS1kZXZ0b29scylcbiAgICAvLyAgIGIpIGFuIGFjdGlvbiBpcyBnZW5lcmF0ZWQgYnkgYW4gQG5ncnggbW9kdWxlIChlLmcuIEBuZ3J4L2VmZmVjdHMvaW5pdFxuICAgIC8vICAgICAgb3IgQG5ncngvc3RvcmUvdXBkYXRlLXJlZHVjZXJzKVxuICAgIC8vICAgYykgdGhlIHN0YXRlIGhhcyBiZWVuIHJlY29tcHV0ZWQgZHVlIHRvIHRpbWUtdHJhdmVsaW5nXG4gICAgLy8gICBkKSBhbnkgYWN0aW9uIHRoYXQgaXMgbm90IGEgUGVyZm9ybUFjdGlvbiB0byBlcnIgb24gdGhlIHNpZGUgb2ZcbiAgICAvLyAgICAgIGNhdXRpb24uXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBQRVJGT1JNX0FDVElPTikge1xuICAgICAgaWYgKHN0YXRlLmlzTG9ja2VkIHx8IHN0YXRlLmlzUGF1c2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gdW5saWZ0U3RhdGUoc3RhdGUpO1xuICAgICAgaWYgKFxuICAgICAgICBzaG91bGRGaWx0ZXJBY3Rpb25zKHRoaXMuY29uZmlnKSAmJlxuICAgICAgICBpc0FjdGlvbkZpbHRlcmVkKFxuICAgICAgICAgIGN1cnJlbnRTdGF0ZSxcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgdGhpcy5jb25maWcucHJlZGljYXRlLFxuICAgICAgICAgIHRoaXMuY29uZmlnLmFjdGlvbnNTYWZlbGlzdCxcbiAgICAgICAgICB0aGlzLmNvbmZpZy5hY3Rpb25zQmxvY2tsaXN0XG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzYW5pdGl6ZWRTdGF0ZSA9IHRoaXMuY29uZmlnLnN0YXRlU2FuaXRpemVyXG4gICAgICAgID8gc2FuaXRpemVTdGF0ZShcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnN0YXRlU2FuaXRpemVyLFxuICAgICAgICAgICAgY3VycmVudFN0YXRlLFxuICAgICAgICAgICAgc3RhdGUuY3VycmVudFN0YXRlSW5kZXhcbiAgICAgICAgICApXG4gICAgICAgIDogY3VycmVudFN0YXRlO1xuICAgICAgY29uc3Qgc2FuaXRpemVkQWN0aW9uID0gdGhpcy5jb25maWcuYWN0aW9uU2FuaXRpemVyXG4gICAgICAgID8gc2FuaXRpemVBY3Rpb24oXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5hY3Rpb25TYW5pdGl6ZXIsXG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBzdGF0ZS5uZXh0QWN0aW9uSWRcbiAgICAgICAgICApXG4gICAgICAgIDogYWN0aW9uO1xuXG4gICAgICB0aGlzLnNlbmRUb1JlZHV4RGV2dG9vbHMoKCkgPT5cbiAgICAgICAgdGhpcy5leHRlbnNpb25Db25uZWN0aW9uLnNlbmQoc2FuaXRpemVkQWN0aW9uLCBzYW5pdGl6ZWRTdGF0ZSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlcXVpcmVzIGZ1bGwgc3RhdGUgdXBkYXRlXG4gICAgICBjb25zdCBzYW5pdGl6ZWRMaWZ0ZWRTdGF0ZSA9IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHN0YWdlZEFjdGlvbklkczogc3RhdGUuc3RhZ2VkQWN0aW9uSWRzLFxuICAgICAgICBhY3Rpb25zQnlJZDogdGhpcy5jb25maWcuYWN0aW9uU2FuaXRpemVyXG4gICAgICAgICAgPyBzYW5pdGl6ZUFjdGlvbnModGhpcy5jb25maWcuYWN0aW9uU2FuaXRpemVyLCBzdGF0ZS5hY3Rpb25zQnlJZClcbiAgICAgICAgICA6IHN0YXRlLmFjdGlvbnNCeUlkLFxuICAgICAgICBjb21wdXRlZFN0YXRlczogdGhpcy5jb25maWcuc3RhdGVTYW5pdGl6ZXJcbiAgICAgICAgICA/IHNhbml0aXplU3RhdGVzKHRoaXMuY29uZmlnLnN0YXRlU2FuaXRpemVyLCBzdGF0ZS5jb21wdXRlZFN0YXRlcylcbiAgICAgICAgICA6IHN0YXRlLmNvbXB1dGVkU3RhdGVzLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5zZW5kVG9SZWR1eERldnRvb2xzKCgpID0+XG4gICAgICAgIHRoaXMuZGV2dG9vbHNFeHRlbnNpb24uc2VuZChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHNhbml0aXplZExpZnRlZFN0YXRlLFxuICAgICAgICAgIHRoaXMuZ2V0RXh0ZW5zaW9uQ29uZmlnKHRoaXMuY29uZmlnKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2hhbmdlc09ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuZGV2dG9vbHNFeHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmRldnRvb2xzRXh0ZW5zaW9uLmNvbm5lY3QoXG4gICAgICAgIHRoaXMuZ2V0RXh0ZW5zaW9uQ29uZmlnKHRoaXMuY29uZmlnKVxuICAgICAgKTtcbiAgICAgIHRoaXMuZXh0ZW5zaW9uQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICBjb25uZWN0aW9uLmluaXQoKTtcblxuICAgICAgY29ubmVjdGlvbi5zdWJzY3JpYmUoKGNoYW5nZTogYW55KSA9PiBzdWJzY3JpYmVyLm5leHQoY2hhbmdlKSk7XG4gICAgICByZXR1cm4gY29ubmVjdGlvbi51bnN1YnNjcmliZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQWN0aW9uU3RyZWFtcygpIHtcbiAgICAvLyBMaXN0ZW5zIHRvIGFsbCBjaGFuZ2VzXG4gICAgY29uc3QgY2hhbmdlcyQgPSB0aGlzLmNyZWF0ZUNoYW5nZXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZSgpKTtcblxuICAgIC8vIExpc3RlbiBmb3IgdGhlIHN0YXJ0IGFjdGlvblxuICAgIGNvbnN0IHN0YXJ0JCA9IGNoYW5nZXMkLnBpcGUoXG4gICAgICBmaWx0ZXIoKGNoYW5nZTogYW55KSA9PiBjaGFuZ2UudHlwZSA9PT0gRXh0ZW5zaW9uQWN0aW9uVHlwZXMuU1RBUlQpXG4gICAgKTtcblxuICAgIC8vIExpc3RlbiBmb3IgdGhlIHN0b3AgYWN0aW9uXG4gICAgY29uc3Qgc3RvcCQgPSBjaGFuZ2VzJC5waXBlKFxuICAgICAgZmlsdGVyKChjaGFuZ2U6IGFueSkgPT4gY2hhbmdlLnR5cGUgPT09IEV4dGVuc2lvbkFjdGlvblR5cGVzLlNUT1ApXG4gICAgKTtcblxuICAgIC8vIExpc3RlbiBmb3IgbGlmdGVkIGFjdGlvbnNcbiAgICBjb25zdCBsaWZ0ZWRBY3Rpb25zJCA9IGNoYW5nZXMkLnBpcGUoXG4gICAgICBmaWx0ZXIoKGNoYW5nZSkgPT4gY2hhbmdlLnR5cGUgPT09IEV4dGVuc2lvbkFjdGlvblR5cGVzLkRJU1BBVENIKSxcbiAgICAgIG1hcCgoY2hhbmdlKSA9PiB0aGlzLnVud3JhcEFjdGlvbihjaGFuZ2UucGF5bG9hZCkpLFxuICAgICAgY29uY2F0TWFwKChhY3Rpb246IGFueSkgPT4ge1xuICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09IElNUE9SVF9TVEFURSkge1xuICAgICAgICAgIC8vIFN0YXRlIGltcG9ydHMgbWF5IGhhcHBlbiBpbiB0d28gc2l0dWF0aW9uczpcbiAgICAgICAgICAvLyAxLiBFeHBsaWNpdGx5IGJ5IHVzZXJcbiAgICAgICAgICAvLyAyLiBVc2VyIGFjdGl2YXRlZCB0aGUgXCJwZXJzaXN0IHN0YXRlIGFjY3Jvc3MgcmVsb2Fkc1wiIG9wdGlvblxuICAgICAgICAgIC8vICAgIGFuZCBub3cgdGhlIHN0YXRlIGlzIGltcG9ydGVkIGR1cmluZyByZWxvYWQuXG4gICAgICAgICAgLy8gQmVjYXVzZSBvZiBvcHRpb24gMiwgd2UgbmVlZCB0byBnaXZlIHBvc3NpYmxlXG4gICAgICAgICAgLy8gbGF6eSBsb2FkZWQgcmVkdWNlcnMgdGltZSB0byBpbnN0YW50aWF0ZS5cbiAgICAgICAgICAvLyBBcyBzb29uIGFzIHRoZXJlIGlzIG5vIFVQREFURSBhY3Rpb24gd2l0aGluIDEgc2Vjb25kLFxuICAgICAgICAgIC8vIGl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgcmVkdWNlcnMgYXJlIGxvYWRlZC5cbiAgICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLnR5cGUgPT09IFVQREFURSksXG4gICAgICAgICAgICB0aW1lb3V0KDEwMDApLFxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDEwMDApLFxuICAgICAgICAgICAgbWFwKCgpID0+IGFjdGlvbiksXG4gICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKGFjdGlvbikpLFxuICAgICAgICAgICAgdGFrZSgxKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG9mKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIExpc3RlbiBmb3IgdW5saWZ0ZWQgYWN0aW9uc1xuICAgIGNvbnN0IGFjdGlvbnMkID0gY2hhbmdlcyQucGlwZShcbiAgICAgIGZpbHRlcigoY2hhbmdlKSA9PiBjaGFuZ2UudHlwZSA9PT0gRXh0ZW5zaW9uQWN0aW9uVHlwZXMuQUNUSU9OKSxcbiAgICAgIG1hcCgoY2hhbmdlKSA9PiB0aGlzLnVud3JhcEFjdGlvbihjaGFuZ2UucGF5bG9hZCkpXG4gICAgKTtcblxuICAgIGNvbnN0IGFjdGlvbnNVbnRpbFN0b3AkID0gYWN0aW9ucyQucGlwZSh0YWtlVW50aWwoc3RvcCQpKTtcbiAgICBjb25zdCBsaWZ0ZWRVbnRpbFN0b3AkID0gbGlmdGVkQWN0aW9ucyQucGlwZSh0YWtlVW50aWwoc3RvcCQpKTtcbiAgICB0aGlzLnN0YXJ0JCA9IHN0YXJ0JC5waXBlKHRha2VVbnRpbChzdG9wJCkpO1xuXG4gICAgLy8gT25seSB0YWtlIHRoZSBhY3Rpb24gc291cmNlcyBiZXR3ZWVuIHRoZSBzdGFydC9zdG9wIGV2ZW50c1xuICAgIHRoaXMuYWN0aW9ucyQgPSB0aGlzLnN0YXJ0JC5waXBlKHN3aXRjaE1hcCgoKSA9PiBhY3Rpb25zVW50aWxTdG9wJCkpO1xuICAgIHRoaXMubGlmdGVkQWN0aW9ucyQgPSB0aGlzLnN0YXJ0JC5waXBlKHN3aXRjaE1hcCgoKSA9PiBsaWZ0ZWRVbnRpbFN0b3AkKSk7XG4gIH1cblxuICBwcml2YXRlIHVud3JhcEFjdGlvbihhY3Rpb246IEFjdGlvbikge1xuICAgIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSAnc3RyaW5nJyA/IGV2YWwoYCgke2FjdGlvbn0pYCkgOiBhY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGdldEV4dGVuc2lvbkNvbmZpZyhjb25maWc6IFN0b3JlRGV2dG9vbHNDb25maWcpIHtcbiAgICBjb25zdCBleHRlbnNpb25PcHRpb25zOiBSZWR1eERldnRvb2xzRXh0ZW5zaW9uQ29uZmlnID0ge1xuICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICBmZWF0dXJlczogY29uZmlnLmZlYXR1cmVzLFxuICAgICAgc2VyaWFsaXplOiBjb25maWcuc2VyaWFsaXplLFxuICAgICAgYXV0b1BhdXNlOiBjb25maWcuYXV0b1BhdXNlID8/IGZhbHNlLFxuICAgICAgLy8gVGhlIGFjdGlvbi9zdGF0ZSBzYW5pdGl6ZXJzIGFyZSBub3QgYWRkZWQgdG8gdGhlIGNvbmZpZ1xuICAgICAgLy8gYmVjYXVzZSBzYW5pdGF0aW9uIGlzIGRvbmUgaW4gdGhpcyBjbGFzcyBhbHJlYWR5LlxuICAgICAgLy8gSXQgaXMgZG9uZSBiZWZvcmUgc2VuZGluZyBpdCB0byB0aGUgZGV2dG9vbHMgZXh0ZW5zaW9uIGZvciBjb25zaXN0ZW5jeTpcbiAgICAgIC8vIC0gSWYgd2UgY2FsbCBleHRlbnNpb25Db25uZWN0aW9uLnNlbmQoLi4uKSxcbiAgICAgIC8vICAgdGhlIGV4dGVuc2lvbiB3b3VsZCBjYWxsIHRoZSBzYW5pdGl6ZXJzLlxuICAgICAgLy8gLSBJZiB3ZSBjYWxsIGRldnRvb2xzRXh0ZW5zaW9uLnNlbmQoLi4uKSAoYWthIGZ1bGwgc3RhdGUgdXBkYXRlKSxcbiAgICAgIC8vICAgdGhlIGV4dGVuc2lvbiB3b3VsZCBOT1QgY2FsbCB0aGUgc2FuaXRpemVycywgc28gd2UgaGF2ZSB0byBkbyBpdCBvdXJzZWx2ZXMuXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLm1heEFnZSAhPT0gZmFsc2UgLyogc3VwcG9ydCA9PT0gMCAqLykge1xuICAgICAgZXh0ZW5zaW9uT3B0aW9ucy5tYXhBZ2UgPSBjb25maWcubWF4QWdlO1xuICAgIH1cbiAgICByZXR1cm4gZXh0ZW5zaW9uT3B0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgc2VuZFRvUmVkdXhEZXZ0b29scyhzZW5kOiBGdW5jdGlvbikge1xuICAgIHRyeSB7XG4gICAgICBzZW5kKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdAbmdyeC9zdG9yZS1kZXZ0b29sczogc29tZXRoaW5nIHdlbnQgd3JvbmcgaW5zaWRlIHRoZSByZWR1eCBkZXZ0b29scycsXG4gICAgICAgIGVyclxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export { StoreDevtoolsModule } from './instrument';
2
+ export { RECOMPUTE } from './reducer';
3
+ export { StoreDevtools } from './devtools';
4
+ export { StoreDevtoolsConfig, INITIAL_OPTIONS, } from './config';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N0b3JlLWRldnRvb2xzL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkQsT0FBTyxFQUFlLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxtQkFBbUIsRUFHbkIsZUFBZSxHQUNoQixNQUFNLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFN0b3JlRGV2dG9vbHNNb2R1bGUgfSBmcm9tICcuL2luc3RydW1lbnQnO1xuZXhwb3J0IHsgTGlmdGVkU3RhdGUsIFJFQ09NUFVURSB9IGZyb20gJy4vcmVkdWNlcic7XG5leHBvcnQgeyBTdG9yZURldnRvb2xzIH0gZnJvbSAnLi9kZXZ0b29scyc7XG5leHBvcnQge1xuICBTdG9yZURldnRvb2xzQ29uZmlnLFxuICBTdG9yZURldnRvb2xzT3B0aW9ucyxcbiAgRGV2VG9vbHNGZWF0dXJlT3B0aW9ucyxcbiAgSU5JVElBTF9PUFRJT05TLFxufSBmcm9tICcuL2NvbmZpZyc7XG4iXX0=
@@ -0,0 +1,67 @@
1
+ import { InjectionToken, NgModule } from '@angular/core';
2
+ import { ReducerManagerDispatcher, StateObservable } from '@ngrx/store';
3
+ import { INITIAL_OPTIONS, STORE_DEVTOOLS_CONFIG, noMonitor, createConfig, } from './config';
4
+ import { StoreDevtools } from './devtools';
5
+ import { DevtoolsExtension, REDUX_DEVTOOLS_EXTENSION, } from './extension';
6
+ import { DevtoolsDispatcher } from './devtools-dispatcher';
7
+ export const IS_EXTENSION_OR_MONITOR_PRESENT = new InjectionToken('@ngrx/store-devtools Is Devtools Extension or Monitor Present');
8
+ export function createIsExtensionOrMonitorPresent(extension, config) {
9
+ return Boolean(extension) || config.monitor !== noMonitor;
10
+ }
11
+ export function createReduxDevtoolsExtension() {
12
+ const extensionKey = '__REDUX_DEVTOOLS_EXTENSION__';
13
+ if (typeof window === 'object' &&
14
+ typeof window[extensionKey] !== 'undefined') {
15
+ return window[extensionKey];
16
+ }
17
+ else {
18
+ return null;
19
+ }
20
+ }
21
+ export function createStateObservable(devtools) {
22
+ return devtools.state;
23
+ }
24
+ export class StoreDevtoolsModule {
25
+ static instrument(options = {}) {
26
+ return {
27
+ ngModule: StoreDevtoolsModule,
28
+ providers: [
29
+ DevtoolsExtension,
30
+ DevtoolsDispatcher,
31
+ StoreDevtools,
32
+ {
33
+ provide: INITIAL_OPTIONS,
34
+ useValue: options,
35
+ },
36
+ {
37
+ provide: IS_EXTENSION_OR_MONITOR_PRESENT,
38
+ deps: [REDUX_DEVTOOLS_EXTENSION, STORE_DEVTOOLS_CONFIG],
39
+ useFactory: createIsExtensionOrMonitorPresent,
40
+ },
41
+ {
42
+ provide: REDUX_DEVTOOLS_EXTENSION,
43
+ useFactory: createReduxDevtoolsExtension,
44
+ },
45
+ {
46
+ provide: STORE_DEVTOOLS_CONFIG,
47
+ deps: [INITIAL_OPTIONS],
48
+ useFactory: createConfig,
49
+ },
50
+ {
51
+ provide: StateObservable,
52
+ deps: [StoreDevtools],
53
+ useFactory: createStateObservable,
54
+ },
55
+ {
56
+ provide: ReducerManagerDispatcher,
57
+ useExisting: DevtoolsDispatcher,
58
+ },
59
+ ],
60
+ };
61
+ }
62
+ }
63
+ /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
64
+ StoreDevtoolsModule.decorators = [
65
+ { type: NgModule, args: [{},] }
66
+ ];
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21vZHVsZXMvc3RvcmUtZGV2dG9vbHMvc3JjL2luc3RydW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBdUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHeEUsT0FBTyxFQUNMLGVBQWUsRUFDZixxQkFBcUIsRUFHckIsU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEdBRXpCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTNELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLElBQUksY0FBYyxDQUMvRCwrREFBK0QsQ0FDaEUsQ0FBQztBQUVGLE1BQU0sVUFBVSxpQ0FBaUMsQ0FDL0MsU0FBd0MsRUFDeEMsTUFBMkI7SUFFM0IsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUM7QUFDNUQsQ0FBQztBQUVELE1BQU0sVUFBVSw0QkFBNEI7SUFDMUMsTUFBTSxZQUFZLEdBQUcsOEJBQThCLENBQUM7SUFFcEQsSUFDRSxPQUFPLE1BQU0sS0FBSyxRQUFRO1FBQzFCLE9BQVEsTUFBYyxDQUFDLFlBQVksQ0FBQyxLQUFLLFdBQVcsRUFDcEQ7UUFDQSxPQUFRLE1BQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUN0QztTQUFNO1FBQ0wsT0FBTyxJQUFJLENBQUM7S0FDYjtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLFFBQXVCO0lBRXZCLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQztBQUN4QixDQUFDO0FBR0QsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixNQUFNLENBQUMsVUFBVSxDQUNmLFVBQWdDLEVBQUU7UUFFbEMsT0FBTztZQUNMLFFBQVEsRUFBRSxtQkFBbUI7WUFDN0IsU0FBUyxFQUFFO2dCQUNULGlCQUFpQjtnQkFDakIsa0JBQWtCO2dCQUNsQixhQUFhO2dCQUNiO29CQUNFLE9BQU8sRUFBRSxlQUFlO29CQUN4QixRQUFRLEVBQUUsT0FBTztpQkFDbEI7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLCtCQUErQjtvQkFDeEMsSUFBSSxFQUFFLENBQUMsd0JBQXdCLEVBQUUscUJBQXFCLENBQUM7b0JBQ3ZELFVBQVUsRUFBRSxpQ0FBaUM7aUJBQzlDO2dCQUNEO29CQUNFLE9BQU8sRUFBRSx3QkFBd0I7b0JBQ2pDLFVBQVUsRUFBRSw0QkFBNEI7aUJBQ3pDO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxxQkFBcUI7b0JBQzlCLElBQUksRUFBRSxDQUFDLGVBQWUsQ0FBQztvQkFDdkIsVUFBVSxFQUFFLFlBQVk7aUJBQ3pCO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxlQUFlO29CQUN4QixJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQUM7b0JBQ3JCLFVBQVUsRUFBRSxxQkFBcUI7aUJBQ2xDO2dCQUNEO29CQUNFLE9BQU8sRUFBRSx3QkFBd0I7b0JBQ2pDLFdBQVcsRUFBRSxrQkFBa0I7aUJBQ2hDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzs7OztZQXhDRixRQUFRLFNBQUMsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuLCBNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVkdWNlck1hbmFnZXJEaXNwYXRjaGVyLCBTdGF0ZU9ic2VydmFibGUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIElOSVRJQUxfT1BUSU9OUyxcbiAgU1RPUkVfREVWVE9PTFNfQ09ORklHLFxuICBTdG9yZURldnRvb2xzQ29uZmlnLFxuICBTdG9yZURldnRvb2xzT3B0aW9ucyxcbiAgbm9Nb25pdG9yLFxuICBjcmVhdGVDb25maWcsXG59IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IFN0b3JlRGV2dG9vbHMgfSBmcm9tICcuL2RldnRvb2xzJztcbmltcG9ydCB7XG4gIERldnRvb2xzRXh0ZW5zaW9uLFxuICBSRURVWF9ERVZUT09MU19FWFRFTlNJT04sXG4gIFJlZHV4RGV2dG9vbHNFeHRlbnNpb24sXG59IGZyb20gJy4vZXh0ZW5zaW9uJztcbmltcG9ydCB7IERldnRvb2xzRGlzcGF0Y2hlciB9IGZyb20gJy4vZGV2dG9vbHMtZGlzcGF0Y2hlcic7XG5cbmV4cG9ydCBjb25zdCBJU19FWFRFTlNJT05fT1JfTU9OSVRPUl9QUkVTRU5UID0gbmV3IEluamVjdGlvblRva2VuPGJvb2xlYW4+KFxuICAnQG5ncngvc3RvcmUtZGV2dG9vbHMgSXMgRGV2dG9vbHMgRXh0ZW5zaW9uIG9yIE1vbml0b3IgUHJlc2VudCdcbik7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJc0V4dGVuc2lvbk9yTW9uaXRvclByZXNlbnQoXG4gIGV4dGVuc2lvbjogUmVkdXhEZXZ0b29sc0V4dGVuc2lvbiB8IG51bGwsXG4gIGNvbmZpZzogU3RvcmVEZXZ0b29sc0NvbmZpZ1xuKSB7XG4gIHJldHVybiBCb29sZWFuKGV4dGVuc2lvbikgfHwgY29uZmlnLm1vbml0b3IgIT09IG5vTW9uaXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZHV4RGV2dG9vbHNFeHRlbnNpb24oKSB7XG4gIGNvbnN0IGV4dGVuc2lvbktleSA9ICdfX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fJztcblxuICBpZiAoXG4gICAgdHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgKHdpbmRvdyBhcyBhbnkpW2V4dGVuc2lvbktleV0gIT09ICd1bmRlZmluZWQnXG4gICkge1xuICAgIHJldHVybiAod2luZG93IGFzIGFueSlbZXh0ZW5zaW9uS2V5XTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RhdGVPYnNlcnZhYmxlKFxuICBkZXZ0b29sczogU3RvcmVEZXZ0b29sc1xuKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmV0dXJuIGRldnRvb2xzLnN0YXRlO1xufVxuXG5ATmdNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgU3RvcmVEZXZ0b29sc01vZHVsZSB7XG4gIHN0YXRpYyBpbnN0cnVtZW50KFxuICAgIG9wdGlvbnM6IFN0b3JlRGV2dG9vbHNPcHRpb25zID0ge31cbiAgKTogTW9kdWxlV2l0aFByb3ZpZGVyczxTdG9yZURldnRvb2xzTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBTdG9yZURldnRvb2xzTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIERldnRvb2xzRXh0ZW5zaW9uLFxuICAgICAgICBEZXZ0b29sc0Rpc3BhdGNoZXIsXG4gICAgICAgIFN0b3JlRGV2dG9vbHMsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBJTklUSUFMX09QVElPTlMsXG4gICAgICAgICAgdXNlVmFsdWU6IG9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBJU19FWFRFTlNJT05fT1JfTU9OSVRPUl9QUkVTRU5ULFxuICAgICAgICAgIGRlcHM6IFtSRURVWF9ERVZUT09MU19FWFRFTlNJT04sIFNUT1JFX0RFVlRPT0xTX0NPTkZJR10sXG4gICAgICAgICAgdXNlRmFjdG9yeTogY3JlYXRlSXNFeHRlbnNpb25Pck1vbml0b3JQcmVzZW50LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6IGNyZWF0ZVJlZHV4RGV2dG9vbHNFeHRlbnNpb24sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBTVE9SRV9ERVZUT09MU19DT05GSUcsXG4gICAgICAgICAgZGVwczogW0lOSVRJQUxfT1BUSU9OU10sXG4gICAgICAgICAgdXNlRmFjdG9yeTogY3JlYXRlQ29uZmlnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogU3RhdGVPYnNlcnZhYmxlLFxuICAgICAgICAgIGRlcHM6IFtTdG9yZURldnRvb2xzXSxcbiAgICAgICAgICB1c2VGYWN0b3J5OiBjcmVhdGVTdGF0ZU9ic2VydmFibGUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBSZWR1Y2VyTWFuYWdlckRpc3BhdGNoZXIsXG4gICAgICAgICAgdXNlRXhpc3Rpbmc6IERldnRvb2xzRGlzcGF0Y2hlcixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIl19