@nlabs/arkhamjs 3.20.4 → 3.22.1

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.
package/lib/Flux/Flux.js CHANGED
@@ -1,1039 +1,382 @@
1
- "use strict";
2
-
3
- require("core-js/modules/es.symbol");
4
-
5
- require("core-js/modules/es.symbol.description");
6
-
7
- require("core-js/modules/es.symbol.iterator");
8
-
9
- require("core-js/modules/es.array.filter");
10
-
11
- require("core-js/modules/es.array.for-each");
12
-
13
- require("core-js/modules/es.array.index-of");
14
-
15
- require("core-js/modules/es.array.iterator");
16
-
17
- require("core-js/modules/es.array.map");
18
-
19
- require("core-js/modules/es.array.reduce");
20
-
21
- require("core-js/modules/es.date.now");
22
-
23
- require("core-js/modules/es.date.to-string");
24
-
25
- require("core-js/modules/es.function.bind");
26
-
27
- require("core-js/modules/es.function.name");
28
-
29
- require("core-js/modules/es.object.create");
30
-
31
- require("core-js/modules/es.object.define-properties");
32
-
33
- require("core-js/modules/es.object.define-property");
34
-
35
- require("core-js/modules/es.object.get-own-property-descriptor");
36
-
37
- require("core-js/modules/es.object.get-own-property-descriptors");
38
-
39
- require("core-js/modules/es.object.get-prototype-of");
40
-
41
- require("core-js/modules/es.object.keys");
42
-
43
- require("core-js/modules/es.object.set-prototype-of");
44
-
45
- require("core-js/modules/es.object.to-string");
46
-
47
- require("core-js/modules/es.promise");
48
-
49
- require("core-js/modules/es.reflect.construct");
50
-
51
- require("core-js/modules/es.regexp.to-string");
52
-
53
- require("core-js/modules/es.string.iterator");
54
-
55
- require("core-js/modules/web.dom-collections.for-each");
56
-
57
- require("core-js/modules/web.dom-collections.iterator");
58
-
59
- Object.defineProperty(exports, "__esModule", {
60
- value: true
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __spreadValues = (a, b) => {
11
+ for (var prop in b || (b = {}))
12
+ if (__hasOwnProp.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ if (__getOwnPropSymbols)
15
+ for (var prop of __getOwnPropSymbols(b)) {
16
+ if (__propIsEnum.call(b, prop))
17
+ __defNormalProp(a, prop, b[prop]);
18
+ }
19
+ return a;
20
+ };
21
+ var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
22
+ var __objRest = (source, exclude) => {
23
+ var target = {};
24
+ for (var prop in source)
25
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
26
+ target[prop] = source[prop];
27
+ if (source != null && __getOwnPropSymbols)
28
+ for (var prop of __getOwnPropSymbols(source)) {
29
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
30
+ target[prop] = source[prop];
31
+ }
32
+ return target;
33
+ };
34
+ var __export = (target, all) => {
35
+ for (var name in all)
36
+ __defProp(target, name, { get: all[name], enumerable: true });
37
+ };
38
+ var __reExport = (target, module2, copyDefault, desc) => {
39
+ if (module2 && typeof module2 === "object" || typeof module2 === "function") {
40
+ for (let key of __getOwnPropNames(module2))
41
+ if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default"))
42
+ __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
43
+ }
44
+ return target;
45
+ };
46
+ var __toESM = (module2, isNodeMode) => {
47
+ return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", !isNodeMode && module2 && module2.__esModule ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
48
+ };
49
+ var __toCommonJS = /* @__PURE__ */ ((cache) => {
50
+ return (module2, temp) => {
51
+ return cache && cache.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache && cache.set(module2, temp), temp);
52
+ };
53
+ })(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0);
54
+ var Flux_exports = {};
55
+ __export(Flux_exports, {
56
+ Flux: () => Flux,
57
+ FluxFramework: () => FluxFramework
61
58
  });
62
- exports.Flux = exports.FluxFramework = void 0;
63
-
64
- require("regenerator-runtime/runtime");
65
-
66
- var _errorStackParser = _interopRequireDefault(require("error-stack-parser"));
67
-
68
- var _events = require("events");
69
-
70
- var _debounce = _interopRequireDefault(require("lodash/debounce"));
71
-
72
- var _cloneDeep = _interopRequireDefault(require("lodash/fp/cloneDeep"));
73
-
74
- var _get = _interopRequireDefault(require("lodash/fp/get"));
75
-
76
- var _isEmpty = _interopRequireDefault(require("lodash/fp/isEmpty"));
77
-
78
- var _merge = _interopRequireDefault(require("lodash/fp/merge"));
79
-
80
- var _set = _interopRequireDefault(require("lodash/fp/set"));
81
-
82
- var _ArkhamConstants = require("../constants/ArkhamConstants");
83
-
84
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
85
-
86
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
87
-
88
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
89
-
90
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
91
-
92
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
93
-
94
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
95
-
96
- function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
97
-
98
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
99
-
100
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
101
-
102
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
103
-
104
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
105
-
106
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
107
-
108
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
109
-
110
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
111
-
112
- function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
113
-
114
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
115
-
116
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
117
-
118
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
119
-
120
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
121
-
122
- /**
123
- * FluxFramework
124
- * @type {EventEmitter}
125
- */
126
- var FluxFramework = /*#__PURE__*/function (_EventEmitter) {
127
- _inherits(FluxFramework, _EventEmitter);
128
-
129
- var _super = _createSuper(FluxFramework);
130
-
131
- // Public properties
132
- // Private properties
133
-
134
- /**
135
- * Create a new instance of Flux. Note that the Flux object
136
- * is a Singleton pattern, so only one should ever exist.
137
- *
138
- * @constructor
139
- * @this {FluxFramework}
140
- */
141
- function FluxFramework() {
142
- var _this;
143
-
144
- _classCallCheck(this, FluxFramework);
145
-
146
- _this = _super.call(this); // Methods
147
-
148
- _defineProperty(_assertThisInitialized(_this), "isInit", false);
149
-
150
- _defineProperty(_assertThisInitialized(_this), "pluginTypes", ['preDispatch', 'postDispatch']);
151
-
152
- _defineProperty(_assertThisInitialized(_this), "state", {});
153
-
154
- _defineProperty(_assertThisInitialized(_this), "storeActions", {});
155
-
156
- _defineProperty(_assertThisInitialized(_this), "defaultOptions", {
157
- name: 'arkhamjs',
158
- routerType: 'browser',
59
+ var import_error_stack_parser = __toESM(require("error-stack-parser"));
60
+ var import_events = require("events");
61
+ var import_debounce = __toESM(require("lodash/debounce"));
62
+ var import_cloneDeep = __toESM(require("lodash/fp/cloneDeep"));
63
+ var import_get = __toESM(require("lodash/fp/get"));
64
+ var import_isEmpty = __toESM(require("lodash/fp/isEmpty"));
65
+ var import_merge = __toESM(require("lodash/fp/merge"));
66
+ var import_set = __toESM(require("lodash/fp/set"));
67
+ var import_ArkhamConstants = require("../constants/ArkhamConstants");
68
+ class FluxFramework extends import_events.EventEmitter {
69
+ constructor() {
70
+ super();
71
+ this.isInit = false;
72
+ this.pluginTypes = ["preDispatch", "postDispatch"];
73
+ this.state = {};
74
+ this.storeActions = {};
75
+ this.defaultOptions = {
76
+ name: "arkhamjs",
77
+ routerType: "browser",
159
78
  scrollToTop: true,
160
79
  state: null,
161
80
  storage: null,
162
81
  storageWait: 300,
163
82
  stores: [],
164
- title: 'ArkhamJS'
83
+ title: "ArkhamJS"
84
+ };
85
+ this.middleware = {};
86
+ this.options = this.defaultOptions;
87
+ this.updateStorage = () => Promise.resolve(false);
88
+ this.addMiddleware = this.addMiddleware.bind(this);
89
+ this.addStores = this.addStores.bind(this);
90
+ this.clearAppData = this.clearAppData.bind(this);
91
+ this.clearMiddleware = this.clearMiddleware.bind(this);
92
+ this.deregister = this.deregister.bind(this);
93
+ this.dispatch = this.dispatch.bind(this);
94
+ this.getOptions = this.getOptions.bind(this);
95
+ this.getState = this.getState.bind(this);
96
+ this.getStore = this.getStore.bind(this);
97
+ this.init = this.init.bind(this);
98
+ this.off = this.off.bind(this);
99
+ this.register = this.register.bind(this);
100
+ this.removeMiddleware = this.removeMiddleware.bind(this);
101
+ this.removeStores = this.removeStores.bind(this);
102
+ this.reset = this.reset.bind(this);
103
+ this.setState = this.setState.bind(this);
104
+ this.pluginTypes.forEach((type) => this.middleware[`${type}List`] = []);
105
+ }
106
+ addMiddleware(middleware) {
107
+ middleware.forEach((middleObj) => {
108
+ if (!!middleObj && (typeof middleObj === "function" || typeof middleObj === "object")) {
109
+ const middleName = middleObj.name || "";
110
+ if (!middleName) {
111
+ throw Error("Unknown middleware is not configured properly. Requires name property. Cannot add to Flux.");
112
+ }
113
+ this.pluginTypes.forEach((type) => {
114
+ const method = middleObj[type];
115
+ const plugin = { method, name: middleName };
116
+ this.middleware[`${type}List`] = this.addPlugin(type, plugin);
117
+ });
118
+ } else {
119
+ throw Error("Unknown middleware is not configured properly. Cannot add to Flux.");
120
+ }
165
121
  });
166
-
167
- _defineProperty(_assertThisInitialized(_this), "middleware", {});
168
-
169
- _defineProperty(_assertThisInitialized(_this), "options", _this.defaultOptions);
170
-
171
- _defineProperty(_assertThisInitialized(_this), "updateStorage", function () {
172
- return Promise.resolve(false);
122
+ }
123
+ clearAppData() {
124
+ Object.keys(this.storeActions).forEach((storeName) => {
125
+ const storeFn = this.storeActions[storeName];
126
+ this.state[storeFn.name] = (0, import_cloneDeep.default)(storeFn.initialState);
173
127
  });
174
-
175
- _this.addMiddleware = _this.addMiddleware.bind(_assertThisInitialized(_this));
176
- _this.addStores = _this.addStores.bind(_assertThisInitialized(_this));
177
- _this.clearAppData = _this.clearAppData.bind(_assertThisInitialized(_this));
178
- _this.clearMiddleware = _this.clearMiddleware.bind(_assertThisInitialized(_this));
179
- _this.deregister = _this.deregister.bind(_assertThisInitialized(_this));
180
- _this.dispatch = _this.dispatch.bind(_assertThisInitialized(_this));
181
- _this.getOptions = _this.getOptions.bind(_assertThisInitialized(_this));
182
- _this.getState = _this.getState.bind(_assertThisInitialized(_this));
183
- _this.getStore = _this.getStore.bind(_assertThisInitialized(_this));
184
- _this.init = _this.init.bind(_assertThisInitialized(_this));
185
- _this.off = _this.off.bind(_assertThisInitialized(_this));
186
- _this.register = _this.register.bind(_assertThisInitialized(_this));
187
- _this.removeMiddleware = _this.removeMiddleware.bind(_assertThisInitialized(_this));
188
- _this.removeStores = _this.removeStores.bind(_assertThisInitialized(_this));
189
- _this.reset = _this.reset.bind(_assertThisInitialized(_this));
190
- _this.setState = _this.setState.bind(_assertThisInitialized(_this)); // Add middleware plugin types
191
-
192
- _this.pluginTypes.forEach(function (type) {
193
- return _this.middleware["".concat(type, "List")] = [];
128
+ const { name, storage } = this.options;
129
+ if (storage) {
130
+ return storage.setStorageData(name, this.state);
131
+ }
132
+ return Promise.resolve(true);
133
+ }
134
+ clearMiddleware() {
135
+ Object.keys(this.middleware).forEach((pluginType) => {
136
+ this.middleware[pluginType] = [];
194
137
  });
195
-
196
- return _this;
138
+ return true;
197
139
  }
198
- /**
199
- * Add middleware to framework.
200
- *
201
- * @param {array} middleware An array of middleware to add to the framework.
202
- */
203
-
204
-
205
- _createClass(FluxFramework, [{
206
- key: "addMiddleware",
207
- value: function addMiddleware(middleware) {
208
- var _this2 = this;
209
-
210
- middleware.forEach(function (middleObj) {
211
- // Make sure middleware is either a class or object.
212
- if (!!middleObj && (typeof middleObj === 'function' || _typeof(middleObj) === 'object')) {
213
- var middleName = middleObj.name || '';
214
-
215
- if (!middleName) {
216
- throw Error('Unknown middleware is not configured properly. Requires name property. Cannot add to Flux.');
217
- } // Sort middleware plugins for efficiency
218
-
219
-
220
- _this2.pluginTypes.forEach(function (type) {
221
- var method = middleObj[type];
222
- var plugin = {
223
- method: method,
224
- name: middleName
225
- };
226
- _this2.middleware["".concat(type, "List")] = _this2.addPlugin(type, plugin);
227
- });
228
- } else {
229
- throw Error('Unknown middleware is not configured properly. Cannot add to Flux.');
230
- }
231
- });
140
+ removeStores(storeNames) {
141
+ storeNames.forEach((name) => this.deregister(name));
142
+ }
143
+ async dispatch(action, silent = false) {
144
+ if (!action) {
145
+ throw new Error("ArkhamJS Error: Flux.dispatch requires an action.");
232
146
  }
233
- /**
234
- * Remove all app data from storage.
235
- *
236
- * @returns {Promise<boolean>} Whether app data was successfully removed.
237
- */
238
-
239
- }, {
240
- key: "clearAppData",
241
- value: function clearAppData() {
242
- var _this3 = this;
243
-
244
- // Set all store data to initial state
245
- Object.keys(this.storeActions).forEach(function (storeName) {
246
- var storeFn = _this3.storeActions[storeName];
247
- _this3.state[storeFn.name] = (0, _cloneDeep["default"])(storeFn.initialState);
147
+ let clonedAction = (0, import_cloneDeep.default)(action);
148
+ const startTime = Date.now();
149
+ let stack = [];
150
+ try {
151
+ const stackProperty = "stackTraceLimit";
152
+ const { stackTraceLimit } = Error;
153
+ Error[stackProperty] = Infinity;
154
+ stack = import_error_stack_parser.default.parse(new Error());
155
+ Error[stackProperty] = stackTraceLimit;
156
+ } catch (error) {
157
+ }
158
+ const options = (0, import_cloneDeep.default)(this.options);
159
+ const appInfo = { duration: 0, options, stack };
160
+ const { postDispatchList = [], preDispatchList = [] } = this.middleware;
161
+ if (preDispatchList.length) {
162
+ clonedAction = await Promise.all(preDispatchList.map((plugin) => plugin.method((0, import_cloneDeep.default)(clonedAction), (0, import_cloneDeep.default)(this.state), appInfo))).then((actions) => actions.reduce((updatedAction, action2) => (0, import_merge.default)(updatedAction, action2), clonedAction)).catch((error) => {
163
+ throw error;
248
164
  });
249
- var _this$options = this.options,
250
- name = _this$options.name,
251
- storage = _this$options.storage;
252
-
253
- if (storage) {
254
- return storage.setStorageData(name, this.state);
165
+ }
166
+ const _a = clonedAction, { type } = _a, data = __objRest(_a, ["type"]);
167
+ if (!type || type === "") {
168
+ console.warn("ArkhamJS Warning: Flux.dispatch is missing an action type for the payload:", data);
169
+ return Promise.resolve(clonedAction);
170
+ }
171
+ Object.keys(this.storeActions).forEach((storeName) => {
172
+ const storeFn = this.storeActions[storeName];
173
+ const state = (0, import_cloneDeep.default)(this.state[storeName]) || (0, import_cloneDeep.default)(storeFn.initialState) || {};
174
+ this.state[storeName] = (0, import_cloneDeep.default)(storeFn.action(type, data, state)) || state;
175
+ });
176
+ const { storage } = this.options;
177
+ if (storage) {
178
+ try {
179
+ await this.updateStorage();
180
+ } catch (error) {
255
181
  }
256
-
257
- return Promise.resolve(true);
258
182
  }
259
- /**
260
- * Remove all middleware.
261
- *
262
- * @returns {boolean} Whether middleware was successfully removed.
263
- */
264
-
265
- }, {
266
- key: "clearMiddleware",
267
- value: function clearMiddleware() {
268
- var _this4 = this;
269
-
270
- // Set all store data to initial state
271
- Object.keys(this.middleware).forEach(function (pluginType) {
272
- _this4.middleware[pluginType] = [];
183
+ const endTime = +new Date();
184
+ const duration = endTime - startTime;
185
+ appInfo.duration = duration;
186
+ if (postDispatchList.length) {
187
+ clonedAction = await Promise.all(postDispatchList.map(async (plugin) => plugin.method((0, import_cloneDeep.default)(clonedAction), (0, import_cloneDeep.default)(this.state), appInfo))).then((actions) => actions.reduce((updatedAction, action2) => (0, import_merge.default)(updatedAction, action2), clonedAction)).catch((error) => {
188
+ throw error;
273
189
  });
274
- return true;
275
190
  }
276
- /**
277
- * De-registers named stores.
278
- *
279
- * @param {array} storeNames An array of store names to remove from the framework.
280
- */
281
-
282
- }, {
283
- key: "removeStores",
284
- value: function removeStores(storeNames) {
285
- var _this5 = this;
286
-
287
- storeNames.forEach(function (name) {
288
- return _this5.deregister(name);
289
- });
191
+ if (!silent) {
192
+ this.emit(type, clonedAction);
193
+ this.emit("arkhamjs", this.state);
290
194
  }
291
- /**
292
- * Dispatches an action to all stores.
293
- *
294
- * @param {object} action to dispatch to all the stores.
295
- * @param {boolean} silent To silence any events.
296
- * @returns {Promise} The promise is resolved when and if the app saves data to storage, returning
297
- * the action.
298
- */
299
-
300
- }, {
301
- key: "dispatch",
302
- value: function () {
303
- var _dispatch = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(action) {
304
- var _this6 = this;
305
-
306
- var silent,
307
- clonedAction,
308
- startTime,
309
- stack,
310
- stackProperty,
311
- stackTraceLimit,
312
- options,
313
- appInfo,
314
- _this$middleware,
315
- _this$middleware$post,
316
- postDispatchList,
317
- _this$middleware$preD,
318
- preDispatchList,
319
- _clonedAction,
320
- type,
321
- data,
322
- storage,
323
- endTime,
324
- duration,
325
- _args2 = arguments;
326
-
327
- return regeneratorRuntime.wrap(function _callee2$(_context2) {
328
- while (1) {
329
- switch (_context2.prev = _context2.next) {
330
- case 0:
331
- silent = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : false;
332
-
333
- if (action) {
334
- _context2.next = 3;
335
- break;
336
- }
337
-
338
- throw new Error('ArkhamJS Error: Flux.dispatch requires an action.');
339
-
340
- case 3:
341
- clonedAction = (0, _cloneDeep["default"])(action); // Log duration of dispatch
342
-
343
- startTime = Date.now(); // Get stack
344
-
345
- stack = [];
346
-
347
- try {
348
- stackProperty = 'stackTraceLimit';
349
- stackTraceLimit = Error.stackTraceLimit;
350
- Error[stackProperty] = Infinity;
351
- stack = _errorStackParser["default"].parse(new Error());
352
- Error[stackProperty] = stackTraceLimit;
353
- } catch (error) {} // Get options
354
-
355
-
356
- options = (0, _cloneDeep["default"])(this.options); // App info
357
-
358
- appInfo = {
359
- duration: 0,
360
- options: options,
361
- stack: stack
362
- }; // Apply middleware before the action is processed
363
-
364
- _this$middleware = this.middleware, _this$middleware$post = _this$middleware.postDispatchList, postDispatchList = _this$middleware$post === void 0 ? [] : _this$middleware$post, _this$middleware$preD = _this$middleware.preDispatchList, preDispatchList = _this$middleware$preD === void 0 ? [] : _this$middleware$preD;
365
-
366
- if (!preDispatchList.length) {
367
- _context2.next = 14;
368
- break;
369
- }
370
-
371
- _context2.next = 13;
372
- return Promise.all(preDispatchList.map(function (plugin) {
373
- return plugin.method((0, _cloneDeep["default"])(clonedAction), (0, _cloneDeep["default"])(_this6.state), appInfo);
374
- })).then(function (actions) {
375
- return actions.reduce(function (updatedAction, action) {
376
- return (0, _merge["default"])(updatedAction, action);
377
- }, clonedAction);
378
- })["catch"](function (error) {
379
- throw error;
380
- });
381
-
382
- case 13:
383
- clonedAction = _context2.sent;
384
-
385
- case 14:
386
- _clonedAction = clonedAction, type = _clonedAction.type, data = _objectWithoutProperties(_clonedAction, ["type"]); // Require a type
387
-
388
- if (!(!type || type === '')) {
389
- _context2.next = 18;
390
- break;
391
- }
392
-
393
- console.warn('ArkhamJS Warning: Flux.dispatch is missing an action type for the payload:', data);
394
- return _context2.abrupt("return", Promise.resolve(clonedAction));
395
-
396
- case 18:
397
- // When an action comes in, it must be completely handled by all stores
398
- Object.keys(this.storeActions).forEach(function (storeName) {
399
- var storeFn = _this6.storeActions[storeName];
400
- var state = (0, _cloneDeep["default"])(_this6.state[storeName]) || (0, _cloneDeep["default"])(storeFn.initialState) || {};
401
- _this6.state[storeName] = (0, _cloneDeep["default"])(storeFn.action(type, data, state)) || state;
402
- }); // Save cache in storage
403
-
404
- storage = this.options.storage;
405
-
406
- if (!storage) {
407
- _context2.next = 28;
408
- break;
409
- }
410
-
411
- _context2.prev = 21;
412
- _context2.next = 24;
413
- return this.updateStorage();
414
-
415
- case 24:
416
- _context2.next = 28;
417
- break;
418
-
419
- case 26:
420
- _context2.prev = 26;
421
- _context2.t0 = _context2["catch"](21);
422
-
423
- case 28:
424
- endTime = +new Date();
425
- duration = endTime - startTime;
426
- appInfo.duration = duration;
427
-
428
- if (!postDispatchList.length) {
429
- _context2.next = 35;
430
- break;
431
- }
432
-
433
- _context2.next = 34;
434
- return Promise.all(postDispatchList.map( /*#__PURE__*/function () {
435
- var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(plugin) {
436
- return regeneratorRuntime.wrap(function _callee$(_context) {
437
- while (1) {
438
- switch (_context.prev = _context.next) {
439
- case 0:
440
- return _context.abrupt("return", plugin.method((0, _cloneDeep["default"])(clonedAction), (0, _cloneDeep["default"])(_this6.state), appInfo));
441
-
442
- case 1:
443
- case "end":
444
- return _context.stop();
445
- }
446
- }
447
- }, _callee);
448
- }));
449
-
450
- return function (_x2) {
451
- return _ref.apply(this, arguments);
452
- };
453
- }())).then(function (actions) {
454
- return actions.reduce(function (updatedAction, action) {
455
- return (0, _merge["default"])(updatedAction, action);
456
- }, clonedAction);
457
- })["catch"](function (error) {
458
- throw error;
459
- });
460
-
461
- case 34:
462
- clonedAction = _context2.sent;
463
-
464
- case 35:
465
- if (!silent) {
466
- this.emit(type, clonedAction);
467
- }
468
-
469
- return _context2.abrupt("return", Promise.resolve(clonedAction));
470
-
471
- case 37:
472
- case "end":
473
- return _context2.stop();
474
- }
475
- }
476
- }, _callee2, this, [[21, 26]]);
477
- }));
478
-
479
- function dispatch(_x) {
480
- return _dispatch.apply(this, arguments);
481
- }
482
-
483
- return dispatch;
484
- }()
485
- /**
486
- * Get the current Flux options.
487
- *
488
- * @returns {FluxOptions} the Flux options object.
489
- */
490
-
491
- }, {
492
- key: "getOptions",
493
- value: function getOptions() {
494
- return this.options;
195
+ return Promise.resolve(clonedAction);
196
+ }
197
+ getOptions() {
198
+ return this.options;
199
+ }
200
+ getState(path = "", defaultValue) {
201
+ let storeValue;
202
+ if (!path) {
203
+ storeValue = this.state || {};
204
+ } else {
205
+ storeValue = (0, import_get.default)(path, this.state);
495
206
  }
496
- /**
497
- * Get the current state object.
498
- *
499
- * @param {string|array} [name] (optional) The name of the store for an object, otherwise it will return all store
500
- * objects. You can also use an array to specify a property path within the object.
501
- * @param {any} [defaultValue] (optional) A default value to return if null.
502
- * @returns {any} the state object or a property value within.
503
- */
504
-
505
- }, {
506
- key: "getState",
507
- value: function getState() {
508
- var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
509
- var defaultValue = arguments.length > 1 ? arguments[1] : undefined;
510
- var storeValue;
511
-
512
- if (!path) {
513
- storeValue = this.state || {};
514
- } else {
515
- storeValue = (0, _get["default"])(path, this.state);
516
- }
517
-
518
- var value = storeValue ? (0, _cloneDeep["default"])(storeValue) : storeValue;
519
- return value === undefined ? defaultValue : value;
207
+ const value = storeValue ? (0, import_cloneDeep.default)(storeValue) : storeValue;
208
+ return value === void 0 ? defaultValue : value;
209
+ }
210
+ getStore(name = "") {
211
+ return this.storeActions[name];
212
+ }
213
+ async init(options = {}, reset = false) {
214
+ if (reset) {
215
+ this.isInit = false;
216
+ this.reset(false);
520
217
  }
521
- /**
522
- * Get a store object registered with Flux.
523
- *
524
- * @param {string} name The name of the store.
525
- * @returns {FluxStore} the store object.
526
- */
527
-
528
- }, {
529
- key: "getStore",
530
- value: function getStore() {
531
- var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
532
- return this.storeActions[name];
218
+ const updatedOptions = __spreadValues({}, options);
219
+ if (this.isInit) {
220
+ updatedOptions.name = this.options.name;
533
221
  }
534
- /**
535
- * Initialize and set configuration options.
536
- *
537
- * @param {object} options Configuration options.
538
- */
539
-
540
- }, {
541
- key: "init",
542
- value: function () {
543
- var _init = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
544
- var options,
545
- reset,
546
- updatedOptions,
547
- _this$options2,
548
- debug,
549
- middleware,
550
- name,
551
- stores,
552
- windowProperty,
553
- _args3 = arguments;
554
-
555
- return regeneratorRuntime.wrap(function _callee3$(_context3) {
556
- while (1) {
557
- switch (_context3.prev = _context3.next) {
558
- case 0:
559
- options = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};
560
- reset = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : false;
561
-
562
- // Should reset previous params
563
- if (reset) {
564
- this.isInit = false;
565
- this.reset(false);
566
- } // Set options
567
-
568
-
569
- updatedOptions = _objectSpread({}, options);
570
-
571
- if (this.isInit) {
572
- // Remove the name from options if already initialized, otherwise the root app will not be able to access
573
- // the state tree
574
- updatedOptions.name = this.options.name;
575
- }
576
-
577
- this.options = _objectSpread(_objectSpread({}, this.defaultOptions), updatedOptions);
578
- _this$options2 = this.options, debug = _this$options2.debug, middleware = _this$options2.middleware, name = _this$options2.name, stores = _this$options2.stores; // Update default store
579
-
580
- _context3.prev = 7;
581
- _context3.next = 10;
582
- return this.useStorage(name);
583
-
584
- case 10:
585
- _context3.next = 16;
586
- break;
587
-
588
- case 12:
589
- _context3.prev = 12;
590
- _context3.t0 = _context3["catch"](7);
591
- console.error('Arkham Error: There was an error while using storage.', name);
592
- throw _context3.t0;
593
-
594
- case 16:
595
- if (!(!!stores && stores.length)) {
596
- _context3.next = 26;
597
- break;
598
- }
599
-
600
- _context3.prev = 17;
601
- _context3.next = 20;
602
- return this.addStores(stores);
603
-
604
- case 20:
605
- _context3.next = 26;
606
- break;
607
-
608
- case 22:
609
- _context3.prev = 22;
610
- _context3.t1 = _context3["catch"](17);
611
- console.error('Arkham Error: There was an error while adding stores.', stores);
612
- throw _context3.t1;
613
-
614
- case 26:
615
- if (!!middleware && middleware.length) {
616
- this.addMiddleware(middleware);
617
- }
618
-
619
- windowProperty = 'arkhamjs';
620
-
621
- if (debug) {
622
- window[windowProperty] = this;
623
- } else {
624
- delete window[windowProperty];
625
- }
626
-
627
- this.isInit = true;
628
- this.emit(_ArkhamConstants.ArkhamConstants.INIT);
629
- return _context3.abrupt("return", this);
630
-
631
- case 32:
632
- case "end":
633
- return _context3.stop();
634
- }
635
- }
636
- }, _callee3, this, [[7, 12], [17, 22]]);
637
- }));
638
-
639
- function init() {
640
- return _init.apply(this, arguments);
641
- }
642
-
643
- return init;
644
- }()
645
- /**
646
- * Adds an initialization listener.
647
- *
648
- * @param {function} [listener] The callback associated with the subscribed event.
649
- */
650
-
651
- }, {
652
- key: "onInit",
653
- value: function onInit(listener) {
654
- this.on(_ArkhamConstants.ArkhamConstants.INIT, listener);
655
-
656
- if (this.isInit) {
657
- listener();
222
+ this.options = __spreadValues(__spreadValues({}, this.defaultOptions), updatedOptions);
223
+ const { debug, middleware, name, stores } = this.options;
224
+ try {
225
+ await this.useStorage(name);
226
+ } catch (error) {
227
+ console.error("Arkham Error: There was an error while using storage.", name);
228
+ throw error;
229
+ }
230
+ if (!!stores && stores.length) {
231
+ try {
232
+ await this.addStores(stores);
233
+ } catch (error) {
234
+ console.error("Arkham Error: There was an error while adding stores.", stores);
235
+ throw error;
658
236
  }
659
237
  }
660
- /**
661
- * Removes the initialization listener.
662
- *
663
- * @param {function} [listener] The callback associated with the subscribed event.
664
- */
665
-
666
- }, {
667
- key: "offInit",
668
- value: function offInit(listener) {
669
- this.off(_ArkhamConstants.ArkhamConstants.INIT, listener);
238
+ if (!!middleware && middleware.length) {
239
+ this.addMiddleware(middleware);
670
240
  }
671
- /**
672
- * Removes an event listener.
673
- *
674
- * @param {string} [eventType] Event to unsubscribe.
675
- * @param {function} [listener] The callback associated with the subscribed event.
676
- */
677
-
678
- }, {
679
- key: "off",
680
- value: function off(eventType, listener) {
681
- return this.removeListener(eventType, listener);
241
+ const windowProperty = "arkhamjs";
242
+ if (debug) {
243
+ window[windowProperty] = this;
244
+ } else {
245
+ delete window[windowProperty];
682
246
  }
683
- /**
684
- * Adds an event listener.
685
- *
686
- * @param {string} [eventType] Event to subscribe.
687
- * @param {function} [listener] The callback associated with the subscribed event.
688
- */
689
-
690
- }, {
691
- key: "on",
692
- value: function on(eventType, listener) {
693
- return this.addListener(eventType, listener);
247
+ this.isInit = true;
248
+ this.emit(import_ArkhamConstants.ArkhamConstants.INIT);
249
+ return this;
250
+ }
251
+ onInit(listener) {
252
+ this.on(import_ArkhamConstants.ArkhamConstants.INIT, listener);
253
+ if (this.isInit) {
254
+ listener();
694
255
  }
695
- /**
696
- * Registers new Stores.
697
- *
698
- * @param {array} stores Store class.
699
- * @returns {Promise<object[]>} the class object(s).
700
- */
701
-
702
- }, {
703
- key: "addStores",
704
- value: function () {
705
- var _addStores = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(stores) {
706
- var _this7 = this;
707
-
708
- var registeredStores, _this$options3, name, storage;
709
-
710
- return regeneratorRuntime.wrap(function _callee4$(_context4) {
711
- while (1) {
712
- switch (_context4.prev = _context4.next) {
713
- case 0:
714
- registeredStores = stores.map(function (store) {
715
- return _this7.register(store);
716
- }); // Save cache in session storage
717
-
718
- _this$options3 = this.options, name = _this$options3.name, storage = _this$options3.storage;
719
-
720
- if (!storage) {
721
- _context4.next = 11;
722
- break;
723
- }
724
-
725
- _context4.prev = 3;
726
- _context4.next = 6;
727
- return storage.setStorageData(name, this.state);
728
-
729
- case 6:
730
- _context4.next = 11;
731
- break;
732
-
733
- case 8:
734
- _context4.prev = 8;
735
- _context4.t0 = _context4["catch"](3);
736
- throw _context4.t0;
737
-
738
- case 11:
739
- return _context4.abrupt("return", registeredStores);
740
-
741
- case 12:
742
- case "end":
743
- return _context4.stop();
744
- }
745
- }
746
- }, _callee4, this, [[3, 8]]);
747
- }));
748
-
749
- function addStores(_x3) {
750
- return _addStores.apply(this, arguments);
256
+ }
257
+ offInit(listener) {
258
+ this.off(import_ArkhamConstants.ArkhamConstants.INIT, listener);
259
+ }
260
+ off(eventType, listener) {
261
+ return this.removeListener(eventType, listener);
262
+ }
263
+ on(eventType, listener) {
264
+ return this.addListener(eventType, listener);
265
+ }
266
+ async addStores(stores) {
267
+ const registeredStores = stores.map((store) => this.register(store));
268
+ const { name, storage } = this.options;
269
+ if (storage) {
270
+ try {
271
+ await storage.setStorageData(name, this.state);
272
+ } catch (error) {
273
+ throw error;
751
274
  }
752
-
753
- return addStores;
754
- }()
755
- /**
756
- * Remove middleware from framework.
757
- *
758
- * @param {array} string middleware names to remove.
759
- * @returns {Promise<object[]>} the class object(s).
760
- */
761
-
762
- }, {
763
- key: "removeMiddleware",
764
- value: function removeMiddleware(names) {
765
- var _this8 = this;
766
-
767
- names.forEach(function (name) {
768
- // Remove middleware plugins
769
- _this8.pluginTypes.forEach(function (type) {
770
- _this8.middleware["".concat(type, "List")] = _this8.removePlugin(type, name);
771
- });
772
- });
773
275
  }
774
- /**
775
- * Reset framework.
776
- *
777
- * @param {array} string middleware names to remove.
778
- * @returns {Promise<object[]>} the class object(s).
779
- */
780
-
781
- }, {
782
- key: "reset",
783
- value: function () {
784
- var _reset = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
785
- var clearStorage,
786
- _this$options4,
787
- name,
788
- storage,
789
- _args5 = arguments;
790
-
791
- return regeneratorRuntime.wrap(function _callee5$(_context5) {
792
- while (1) {
793
- switch (_context5.prev = _context5.next) {
794
- case 0:
795
- clearStorage = _args5.length > 0 && _args5[0] !== undefined ? _args5[0] : true;
796
- _this$options4 = this.options, name = _this$options4.name, storage = _this$options4.storage; // Clear persistent cache
797
-
798
- if (!(storage && clearStorage)) {
799
- _context5.next = 11;
800
- break;
801
- }
802
-
803
- _context5.prev = 3;
804
- _context5.next = 6;
805
- return storage.setStorageData(name, {});
806
-
807
- case 6:
808
- _context5.next = 11;
809
- break;
810
-
811
- case 8:
812
- _context5.prev = 8;
813
- _context5.t0 = _context5["catch"](3);
814
- throw _context5.t0;
815
-
816
- case 11:
817
- // Clear all properties
818
- this.middleware = {};
819
- this.options = _objectSpread({}, this.defaultOptions);
820
- this.state = {};
821
- this.storeActions = {};
822
- this.isInit = false;
823
-
824
- case 16:
825
- case "end":
826
- return _context5.stop();
827
- }
828
- }
829
- }, _callee5, this, [[3, 8]]);
830
- }));
831
-
832
- function reset() {
833
- return _reset.apply(this, arguments);
834
- }
835
-
836
- return reset;
837
- }()
838
- /**
839
- * Sets the current state object.
840
- *
841
- * @param {string|array} [name] The name of the store to set. You can also use an array to specify a property path
842
- * within the object.
843
- * @param {any} [value] The value to set.
844
- */
845
-
846
- }, {
847
- key: "setState",
848
- value: function setState() {
849
- var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
850
- var value = arguments.length > 1 ? arguments[1] : undefined;
851
-
852
- if (!!path) {
853
- this.state = (0, _set["default"])(path, (0, _cloneDeep["default"])(value), this.state);
854
- } // Update persistent cache
855
-
856
-
857
- var storage = this.options.storage;
858
-
859
- if (storage) {
860
- return this.updateStorage();
276
+ return registeredStores;
277
+ }
278
+ removeMiddleware(names) {
279
+ names.forEach((name) => {
280
+ this.pluginTypes.forEach((type) => {
281
+ this.middleware[`${type}List`] = this.removePlugin(type, name);
282
+ });
283
+ });
284
+ }
285
+ async reset(clearStorage = true) {
286
+ const { name, storage } = this.options;
287
+ if (storage && clearStorage) {
288
+ try {
289
+ await storage.setStorageData(name, {});
290
+ } catch (error) {
291
+ throw error;
861
292
  }
862
-
863
- return Promise.resolve(false);
864
293
  }
865
- }, {
866
- key: "addPlugin",
867
- value: function addPlugin(type, plugin) {
868
- var list = this.middleware["".concat(type, "List")] || [];
869
- var method = plugin.method,
870
- name = plugin.name;
871
-
872
- if (method && typeof method === 'function') {
873
- // Check if plugin already exists
874
- var exists = !!list.filter(function (obj) {
875
- return obj.name === name;
876
- }).length; // Do not add duplicate plugins
877
-
878
- if (!exists) {
879
- list.push({
880
- method: method,
881
- name: name
882
- });
883
- }
884
- } else if (method !== undefined) {
885
- throw Error("".concat(plugin.name, " middleware is not configured properly. Method is not a function."));
886
- }
887
-
888
- return list;
294
+ this.middleware = {};
295
+ this.options = __spreadValues({}, this.defaultOptions);
296
+ this.state = {};
297
+ this.storeActions = {};
298
+ this.isInit = false;
299
+ }
300
+ setState(path = "", value) {
301
+ if (!!path) {
302
+ this.state = (0, import_set.default)(path, (0, import_cloneDeep.default)(value), this.state);
889
303
  }
890
- }, {
891
- key: "deregister",
892
- value: function deregister() {
893
- var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
894
- delete this.storeActions[name];
895
- delete this.state[name];
304
+ const { storage } = this.options;
305
+ if (storage) {
306
+ return this.updateStorage();
896
307
  }
897
- }, {
898
- key: "register",
899
- value: function register(storeFn) {
900
- if (!storeFn) {
901
- throw Error('Store is undefined. Cannot register with Flux.');
308
+ return Promise.resolve(false);
309
+ }
310
+ addPlugin(type, plugin) {
311
+ const list = this.middleware[`${type}List`] || [];
312
+ const { method, name } = plugin;
313
+ if (method && typeof method === "function") {
314
+ const exists = !!list.filter((obj) => obj.name === name).length;
315
+ if (!exists) {
316
+ list.push({ method, name });
902
317
  }
903
-
904
- var isFnc = typeof storeFn === 'function';
905
-
906
- if (!isFnc) {
907
- throw Error("".concat(storeFn, " is not a store function. Cannot register with Flux."));
908
- } // Create store object
909
-
910
-
911
- var name = storeFn.name;
912
- var initialState = storeFn();
913
- var storeAction = {
914
- action: storeFn,
915
- initialState: storeFn(),
916
- name: name
917
- };
918
-
919
- if (!(0, _isEmpty["default"])(name) && !this.storeActions[name]) {
920
- // Save store object
921
- this.storeActions[name] = storeAction; // Get default values
922
-
923
- if (!this.state[name]) {
924
- if (initialState) {
925
- this.state[name] = (0, _cloneDeep["default"])(initialState);
926
- } else {
927
- this.state[name] = {};
928
- }
929
- }
930
- } // Return store class
931
-
932
-
933
- return this.storeActions[name];
318
+ } else if (method !== void 0) {
319
+ throw Error(`${plugin.name} middleware is not configured properly. Method is not a function.`);
934
320
  }
935
- }, {
936
- key: "removePlugin",
937
- value: function removePlugin(type, name) {
938
- var list = this.middleware["".concat(type, "List")] || []; // remove all occurrences of the plugin
939
-
940
- return list.filter(function (obj) {
941
- return obj.name !== name;
942
- });
321
+ return list;
322
+ }
323
+ deregister(name = "") {
324
+ delete this.storeActions[name];
325
+ delete this.state[name];
326
+ }
327
+ register(storeFn) {
328
+ if (!storeFn) {
329
+ throw Error("Store is undefined. Cannot register with Flux.");
330
+ }
331
+ const isFnc = typeof storeFn === "function";
332
+ if (!isFnc) {
333
+ throw Error(`${storeFn} is not a store function. Cannot register with Flux.`);
334
+ }
335
+ const { name } = storeFn;
336
+ const initialState = storeFn();
337
+ const storeAction = {
338
+ action: storeFn,
339
+ initialState: storeFn(),
340
+ name
341
+ };
342
+ if (!(0, import_isEmpty.default)(name) && !this.storeActions[name]) {
343
+ this.storeActions[name] = storeAction;
344
+ if (!this.state[name]) {
345
+ if (initialState) {
346
+ this.state[name] = (0, import_cloneDeep.default)(initialState);
347
+ } else {
348
+ this.state[name] = {};
349
+ }
350
+ }
943
351
  }
944
- }, {
945
- key: "useStorage",
946
- value: function () {
947
- var _useStorage = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6(name) {
948
- var _this9 = this;
949
-
950
- var _this$options5, storage, state, storageWait;
951
-
952
- return regeneratorRuntime.wrap(function _callee6$(_context6) {
953
- while (1) {
954
- switch (_context6.prev = _context6.next) {
955
- case 0:
956
- _this$options5 = this.options, storage = _this$options5.storage, state = _this$options5.state, storageWait = _this$options5.storageWait; // Cache
957
-
958
- if (!storage) {
959
- _context6.next = 21;
960
- break;
961
- }
962
-
963
- _context6.prev = 2;
964
- _context6.t1 = state;
965
-
966
- if (_context6.t1) {
967
- _context6.next = 8;
968
- break;
969
- }
970
-
971
- _context6.next = 7;
972
- return storage.getStorageData(name);
973
-
974
- case 7:
975
- _context6.t1 = _context6.sent;
976
-
977
- case 8:
978
- _context6.t0 = _context6.t1;
979
-
980
- if (_context6.t0) {
981
- _context6.next = 11;
982
- break;
983
- }
984
-
985
- _context6.t0 = {};
986
-
987
- case 11:
988
- this.state = _context6.t0;
989
- this.updateStorage = (0, _debounce["default"])(function () {
990
- return storage.setStorageData(name, _this9.state);
991
- }, storageWait, {
992
- leading: true,
993
- trailing: true
994
- });
995
- _context6.next = 19;
996
- break;
997
-
998
- case 15:
999
- _context6.prev = 15;
1000
- _context6.t2 = _context6["catch"](2);
1001
- console.error("ArkhamJS Error: Using storage, \"".concat(name, "\"."));
1002
- throw _context6.t2;
1003
-
1004
- case 19:
1005
- _context6.next = 22;
1006
- break;
1007
-
1008
- case 21:
1009
- this.state = state || {};
1010
-
1011
- case 22:
1012
- return _context6.abrupt("return", null);
1013
-
1014
- case 23:
1015
- case "end":
1016
- return _context6.stop();
1017
- }
1018
- }
1019
- }, _callee6, this, [[2, 15]]);
1020
- }));
1021
-
1022
- function useStorage(_x4) {
1023
- return _useStorage.apply(this, arguments);
352
+ return this.storeActions[name];
353
+ }
354
+ removePlugin(type, name) {
355
+ const list = this.middleware[`${type}List`] || [];
356
+ return list.filter((obj) => obj.name !== name);
357
+ }
358
+ async useStorage(name) {
359
+ const { storage, state, storageWait } = this.options;
360
+ if (storage) {
361
+ try {
362
+ this.state = state || await storage.getStorageData(name) || {};
363
+ this.updateStorage = (0, import_debounce.default)(() => storage.setStorageData(name, this.state), storageWait, { leading: true, trailing: true });
364
+ } catch (error) {
365
+ console.error(`ArkhamJS Error: Using storage, "${name}".`);
366
+ throw error;
1024
367
  }
1025
-
1026
- return useStorage;
1027
- }()
1028
- }]);
1029
-
1030
- return FluxFramework;
1031
- }(_events.EventEmitter);
1032
-
1033
- exports.FluxFramework = FluxFramework;
1034
-
1035
- _defineProperty(FluxFramework, "initFlux", false);
1036
-
1037
- var Flux = new FluxFramework();
1038
- exports.Flux = Flux;
1039
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9GbHV4L0ZsdXgudHMiXSwibmFtZXMiOlsiRmx1eEZyYW1ld29yayIsIm5hbWUiLCJyb3V0ZXJUeXBlIiwic2Nyb2xsVG9Ub3AiLCJzdGF0ZSIsInN0b3JhZ2UiLCJzdG9yYWdlV2FpdCIsInN0b3JlcyIsInRpdGxlIiwiZGVmYXVsdE9wdGlvbnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsImFkZE1pZGRsZXdhcmUiLCJiaW5kIiwiYWRkU3RvcmVzIiwiY2xlYXJBcHBEYXRhIiwiY2xlYXJNaWRkbGV3YXJlIiwiZGVyZWdpc3RlciIsImRpc3BhdGNoIiwiZ2V0T3B0aW9ucyIsImdldFN0YXRlIiwiZ2V0U3RvcmUiLCJpbml0Iiwib2ZmIiwicmVnaXN0ZXIiLCJyZW1vdmVNaWRkbGV3YXJlIiwicmVtb3ZlU3RvcmVzIiwicmVzZXQiLCJzZXRTdGF0ZSIsInBsdWdpblR5cGVzIiwiZm9yRWFjaCIsInR5cGUiLCJtaWRkbGV3YXJlIiwibWlkZGxlT2JqIiwibWlkZGxlTmFtZSIsIkVycm9yIiwibWV0aG9kIiwicGx1Z2luIiwiYWRkUGx1Z2luIiwiT2JqZWN0Iiwia2V5cyIsInN0b3JlQWN0aW9ucyIsInN0b3JlTmFtZSIsInN0b3JlRm4iLCJpbml0aWFsU3RhdGUiLCJvcHRpb25zIiwic2V0U3RvcmFnZURhdGEiLCJwbHVnaW5UeXBlIiwic3RvcmVOYW1lcyIsImFjdGlvbiIsInNpbGVudCIsImNsb25lZEFjdGlvbiIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJzdGFjayIsInN0YWNrUHJvcGVydHkiLCJzdGFja1RyYWNlTGltaXQiLCJJbmZpbml0eSIsIkVycm9yU3RhY2tQYXJzZXIiLCJwYXJzZSIsImVycm9yIiwiYXBwSW5mbyIsImR1cmF0aW9uIiwicG9zdERpc3BhdGNoTGlzdCIsInByZURpc3BhdGNoTGlzdCIsImxlbmd0aCIsImFsbCIsIm1hcCIsInRoZW4iLCJhY3Rpb25zIiwicmVkdWNlIiwidXBkYXRlZEFjdGlvbiIsImRhdGEiLCJjb25zb2xlIiwid2FybiIsInVwZGF0ZVN0b3JhZ2UiLCJlbmRUaW1lIiwiZW1pdCIsInBhdGgiLCJkZWZhdWx0VmFsdWUiLCJzdG9yZVZhbHVlIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJpc0luaXQiLCJ1cGRhdGVkT3B0aW9ucyIsImRlYnVnIiwidXNlU3RvcmFnZSIsIndpbmRvd1Byb3BlcnR5Iiwid2luZG93IiwiQXJraGFtQ29uc3RhbnRzIiwiSU5JVCIsImxpc3RlbmVyIiwib24iLCJldmVudFR5cGUiLCJyZW1vdmVMaXN0ZW5lciIsImFkZExpc3RlbmVyIiwicmVnaXN0ZXJlZFN0b3JlcyIsInN0b3JlIiwibmFtZXMiLCJyZW1vdmVQbHVnaW4iLCJjbGVhclN0b3JhZ2UiLCJsaXN0IiwiZXhpc3RzIiwiZmlsdGVyIiwib2JqIiwicHVzaCIsImlzRm5jIiwic3RvcmVBY3Rpb24iLCJnZXRTdG9yYWdlRGF0YSIsImxlYWRpbmciLCJ0cmFpbGluZyIsIkV2ZW50RW1pdHRlciIsIkZsdXgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtJQUNhQSxhOzs7OztBQUdYO0FBRUE7O0FBZUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRSwyQkFBYztBQUFBOztBQUFBOztBQUNaLDhCQURZLENBR1o7O0FBSFksNkRBekJJLEtBeUJKOztBQUFBLGtFQXZCVSxDQUFDLGFBQUQsRUFBZ0IsY0FBaEIsQ0F1QlY7O0FBQUEsNERBckJPLEVBcUJQOztBQUFBLG1FQXBCYyxFQW9CZDs7QUFBQSxxRUFuQndCO0FBQ3BDQyxNQUFBQSxJQUFJLEVBQUUsVUFEOEI7QUFFcENDLE1BQUFBLFVBQVUsRUFBRSxT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QVksVUFBQ0MsR0FBRDtBQUFBLGVBQXlCQSxHQUFHLENBQUN4RyxJQUFKLEtBQWFBLElBQXRDO0FBQUEsT0FBWixDQUFQO0FBQ0Q7Ozs7a0dBSXdCQSxJOzs7Ozs7Ozs7aUNBQ2UsS0FBSzRDLE8sRUFBcEN4QyxPLGtCQUFBQSxPLEVBQVNELEssa0JBQUFBLEssRUFBT0UsVyxrQkFBQUEsVyxFQUV2Qjs7cUJBQ0dELE87Ozs7OzsrQkFFY0QsSzs7Ozs7Ozs7dUJBQWVDLE9BQU8sQ0FBQ3dHLGNBQVIsQ0FBdUI1RyxJQUF2QixDOzs7Ozs7Ozs7Ozs7OytCQUFnQyxFOzs7QUFBNUQscUJBQUtHLEs7QUFDTCxxQkFBS3dFLGFBQUwsR0FBcUIsMEJBQ25CO0FBQUEseUJBQU12RSxPQUFPLENBQUN5QyxjQUFSLENBQXVCN0MsSUFBdkIsRUFBNkIsTUFBSSxDQUFDRyxLQUFsQyxDQUFOO0FBQUEsaUJBRG1CLEVBRW5CRSxXQUZtQixFQUduQjtBQUFDd0csa0JBQUFBLE9BQU8sRUFBRSxJQUFWO0FBQWdCQyxrQkFBQUEsUUFBUSxFQUFFO0FBQTFCLGlCQUhtQixDQUFyQjs7Ozs7OztBQU1BckMsZ0JBQUFBLE9BQU8sQ0FBQ2IsS0FBUiw0Q0FBaUQ1RCxJQUFqRDs7Ozs7Ozs7QUFJRixxQkFBS0csS0FBTCxHQUFhQSxLQUFLLElBQUksRUFBdEI7OztrREFHSyxJOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBemlCd0I0RyxvQjs7OztnQkFBdEJoSCxhLGNBQ2dCLEs7O0FBNGlCdEIsSUFBTWlILElBQW1CLEdBQUcsSUFBSWpILGFBQUosRUFBNUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IEVycm9yU3RhY2tQYXJzZXIgZnJvbSAnZXJyb3Itc3RhY2stcGFyc2VyJztcbmltcG9ydCB7RXZlbnRFbWl0dGVyfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC9kZWJvdW5jZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC9mcC9jbG9uZURlZXAnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2gvZnAvZ2V0JztcbmltcG9ydCBpc0VtcHR5IGZyb20gJ2xvZGFzaC9mcC9pc0VtcHR5JztcbmltcG9ydCBtZXJnZSBmcm9tICdsb2Rhc2gvZnAvbWVyZ2UnO1xuaW1wb3J0IHNldCBmcm9tICdsb2Rhc2gvZnAvc2V0JztcblxuaW1wb3J0IHtBcmtoYW1Db25zdGFudHN9IGZyb20gJy4uL2NvbnN0YW50cy9BcmtoYW1Db25zdGFudHMnO1xuaW1wb3J0IHtGbHV4QWN0aW9uLCBGbHV4TWlkZGxld2FyZVR5cGUsIEZsdXhPcHRpb25zLCBGbHV4UGx1Z2luVHlwZSwgRmx1eFN0b3JlfSBmcm9tICcuL0ZsdXgudHlwZXMnO1xuXG4vKipcbiAqIEZsdXhGcmFtZXdvcmtcbiAqIEB0eXBlIHtFdmVudEVtaXR0ZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBGbHV4RnJhbWV3b3JrIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc3RhdGljIGluaXRGbHV4OiBib29sZWFuID0gZmFsc2U7XG4gIGlzSW5pdDogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBQdWJsaWMgcHJvcGVydGllc1xuICBwbHVnaW5UeXBlczogc3RyaW5nW10gPSBbJ3ByZURpc3BhdGNoJywgJ3Bvc3REaXNwYXRjaCddO1xuICAvLyBQcml2YXRlIHByb3BlcnRpZXNcbiAgcHJpdmF0ZSBzdGF0ZTogYW55ID0ge307XG4gIHByaXZhdGUgc3RvcmVBY3Rpb25zOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBkZWZhdWx0T3B0aW9uczogRmx1eE9wdGlvbnMgPSB7XG4gICAgbmFtZTogJ2Fya2hhbWpzJyxcbiAgICByb3V0ZXJUeXBlOiAnYnJvd3NlcicsXG4gICAgc2Nyb2xsVG9Ub3A6IHRydWUsXG4gICAgc3RhdGU6IG51bGwsXG4gICAgc3RvcmFnZTogbnVsbCxcbiAgICBzdG9yYWdlV2FpdDogMzAwLFxuICAgIHN0b3JlczogW10sXG4gICAgdGl0bGU6ICdBcmtoYW1KUydcbiAgfTtcbiAgcHJpdmF0ZSBtaWRkbGV3YXJlOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBvcHRpb25zOiBGbHV4T3B0aW9ucyA9IHRoaXMuZGVmYXVsdE9wdGlvbnM7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgRmx1eC4gIE5vdGUgdGhhdCB0aGUgRmx1eCBvYmplY3RcbiAgICogaXMgYSBTaW5nbGV0b24gcGF0dGVybiwgc28gb25seSBvbmUgc2hvdWxkIGV2ZXIgZXhpc3QuXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAdGhpcyB7Rmx1eEZyYW1ld29ya31cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBNZXRob2RzXG4gICAgdGhpcy5hZGRNaWRkbGV3YXJlID0gdGhpcy5hZGRNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hZGRTdG9yZXMgPSB0aGlzLmFkZFN0b3Jlcy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY2xlYXJBcHBEYXRhID0gdGhpcy5jbGVhckFwcERhdGEuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsZWFyTWlkZGxld2FyZSA9IHRoaXMuY2xlYXJNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kZXJlZ2lzdGVyID0gdGhpcy5kZXJlZ2lzdGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuZGlzcGF0Y2guYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldE9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldFN0YXRlID0gdGhpcy5nZXRTdGF0ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZ2V0U3RvcmUgPSB0aGlzLmdldFN0b3JlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5pbml0ID0gdGhpcy5pbml0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5vZmYgPSB0aGlzLm9mZi5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXIgPSB0aGlzLnJlZ2lzdGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZW1vdmVNaWRkbGV3YXJlID0gdGhpcy5yZW1vdmVNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZW1vdmVTdG9yZXMgPSB0aGlzLnJlbW92ZVN0b3Jlcy5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVzZXQgPSB0aGlzLnJlc2V0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5zZXRTdGF0ZSA9IHRoaXMuc2V0U3RhdGUuYmluZCh0aGlzKTtcblxuICAgIC8vIEFkZCBtaWRkbGV3YXJlIHBsdWdpbiB0eXBlc1xuICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gPSBbXSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG1pZGRsZXdhcmUgdG8gZnJhbWV3b3JrLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBtaWRkbGV3YXJlIEFuIGFycmF5IG9mIG1pZGRsZXdhcmUgdG8gYWRkIHRvIHRoZSBmcmFtZXdvcmsuXG4gICAqL1xuICBhZGRNaWRkbGV3YXJlKG1pZGRsZXdhcmU6IEZsdXhNaWRkbGV3YXJlVHlwZVtdKTogdm9pZCB7XG4gICAgbWlkZGxld2FyZS5mb3JFYWNoKChtaWRkbGVPYmo6IEZsdXhNaWRkbGV3YXJlVHlwZSkgPT4ge1xuICAgICAgLy8gTWFrZSBzdXJlIG1pZGRsZXdhcmUgaXMgZWl0aGVyIGEgY2xhc3Mgb3Igb2JqZWN0LlxuICAgICAgaWYoISFtaWRkbGVPYmogJiYgKCh0eXBlb2YgbWlkZGxlT2JqID09PSAnZnVuY3Rpb24nKSB8fCAodHlwZW9mIG1pZGRsZU9iaiA9PT0gJ29iamVjdCcpKSkge1xuICAgICAgICBjb25zdCBtaWRkbGVOYW1lOiBzdHJpbmcgPSBtaWRkbGVPYmoubmFtZSB8fCAnJztcblxuICAgICAgICBpZighbWlkZGxlTmFtZSkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIG1pZGRsZXdhcmUgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuIFJlcXVpcmVzIG5hbWUgcHJvcGVydHkuIENhbm5vdCBhZGQgdG8gRmx1eC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgbWlkZGxld2FyZSBwbHVnaW5zIGZvciBlZmZpY2llbmN5XG4gICAgICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWV0aG9kID0gbWlkZGxlT2JqW3R5cGVdO1xuICAgICAgICAgIGNvbnN0IHBsdWdpbjogRmx1eFBsdWdpblR5cGUgPSB7bWV0aG9kLCBuYW1lOiBtaWRkbGVOYW1lfTtcbiAgICAgICAgICB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gPSB0aGlzLmFkZFBsdWdpbih0eXBlLCBwbHVnaW4pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIG1pZGRsZXdhcmUgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuIENhbm5vdCBhZGQgdG8gRmx1eC4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGFwcCBkYXRhIGZyb20gc3RvcmFnZS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgYXBwIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgKi9cbiAgY2xlYXJBcHBEYXRhKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFNldCBhbGwgc3RvcmUgZGF0YSB0byBpbml0aWFsIHN0YXRlXG4gICAgT2JqZWN0XG4gICAgICAua2V5cyh0aGlzLnN0b3JlQWN0aW9ucylcbiAgICAgIC5mb3JFYWNoKChzdG9yZU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgICAgdGhpcy5zdGF0ZVtzdG9yZUZuLm5hbWVdID0gY2xvbmVEZWVwKHN0b3JlRm4uaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3Qge25hbWUsIHN0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwgdGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIG1pZGRsZXdhcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIG1pZGRsZXdhcmUgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgKi9cbiAgY2xlYXJNaWRkbGV3YXJlKCk6IGJvb2xlYW4ge1xuICAgIC8vIFNldCBhbGwgc3RvcmUgZGF0YSB0byBpbml0aWFsIHN0YXRlXG4gICAgT2JqZWN0XG4gICAgICAua2V5cyh0aGlzLm1pZGRsZXdhcmUpXG4gICAgICAuZm9yRWFjaCgocGx1Z2luVHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubWlkZGxld2FyZVtwbHVnaW5UeXBlXSA9IFtdO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZS1yZWdpc3RlcnMgbmFtZWQgc3RvcmVzLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBzdG9yZU5hbWVzIEFuIGFycmF5IG9mIHN0b3JlIG5hbWVzIHRvIHJlbW92ZSBmcm9tIHRoZSBmcmFtZXdvcmsuXG4gICAqL1xuICByZW1vdmVTdG9yZXMoc3RvcmVOYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBzdG9yZU5hbWVzLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4gdGhpcy5kZXJlZ2lzdGVyKG5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbiB0byBhbGwgc3RvcmVzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYWN0aW9uIHRvIGRpc3BhdGNoIHRvIGFsbCB0aGUgc3RvcmVzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNpbGVudCBUbyBzaWxlbmNlIGFueSBldmVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgcHJvbWlzZSBpcyByZXNvbHZlZCB3aGVuIGFuZCBpZiB0aGUgYXBwIHNhdmVzIGRhdGEgdG8gc3RvcmFnZSwgcmV0dXJuaW5nXG4gICAqIHRoZSBhY3Rpb24uXG4gICAqL1xuICBhc3luYyBkaXNwYXRjaChhY3Rpb246IEZsdXhBY3Rpb24sIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxGbHV4QWN0aW9uPiB7XG4gICAgaWYoIWFjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmtoYW1KUyBFcnJvcjogRmx1eC5kaXNwYXRjaCByZXF1aXJlcyBhbiBhY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgbGV0IGNsb25lZEFjdGlvbjogRmx1eEFjdGlvbiA9IGNsb25lRGVlcChhY3Rpb24pO1xuXG4gICAgLy8gTG9nIGR1cmF0aW9uIG9mIGRpc3BhdGNoXG4gICAgY29uc3Qgc3RhcnRUaW1lOiBudW1iZXIgPSBEYXRlLm5vdygpO1xuXG4gICAgLy8gR2V0IHN0YWNrXG4gICAgbGV0IHN0YWNrID0gW107XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhY2tQcm9wZXJ0eTogc3RyaW5nID0gJ3N0YWNrVHJhY2VMaW1pdCc7XG4gICAgICBjb25zdCB7c3RhY2tUcmFjZUxpbWl0fTogYW55ID0gRXJyb3I7XG4gICAgICBFcnJvcltzdGFja1Byb3BlcnR5XSA9IEluZmluaXR5O1xuICAgICAgc3RhY2sgPSBFcnJvclN0YWNrUGFyc2VyLnBhcnNlKG5ldyBFcnJvcigpKTtcbiAgICAgIEVycm9yW3N0YWNrUHJvcGVydHldID0gc3RhY2tUcmFjZUxpbWl0O1xuICAgIH0gY2F0Y2goZXJyb3IpIHt9XG5cbiAgICAvLyBHZXQgb3B0aW9uc1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjbG9uZURlZXAodGhpcy5vcHRpb25zKTtcblxuICAgIC8vIEFwcCBpbmZvXG4gICAgY29uc3QgYXBwSW5mbyA9IHtkdXJhdGlvbjogMCwgb3B0aW9ucywgc3RhY2t9O1xuXG4gICAgLy8gQXBwbHkgbWlkZGxld2FyZSBiZWZvcmUgdGhlIGFjdGlvbiBpcyBwcm9jZXNzZWRcbiAgICBjb25zdCB7cG9zdERpc3BhdGNoTGlzdCA9IFtdLCBwcmVEaXNwYXRjaExpc3QgPSBbXX0gPSB0aGlzLm1pZGRsZXdhcmU7XG5cbiAgICBpZihwcmVEaXNwYXRjaExpc3QubGVuZ3RoKSB7XG4gICAgICBjbG9uZWRBY3Rpb24gPSBhd2FpdCBQcm9taXNlXG4gICAgICAgIC5hbGwoXG4gICAgICAgICAgcHJlRGlzcGF0Y2hMaXN0Lm1hcCgocGx1Z2luOiBGbHV4UGx1Z2luVHlwZSkgPT4gcGx1Z2luLm1ldGhvZChcbiAgICAgICAgICAgIGNsb25lRGVlcChjbG9uZWRBY3Rpb24pLCBjbG9uZURlZXAodGhpcy5zdGF0ZSksIGFwcEluZm8pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIChhY3Rpb25zKSA9PiBhY3Rpb25zLnJlZHVjZSgodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSA9PlxuICAgICAgICAgICAgbWVyZ2UodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSwgY2xvbmVkQWN0aW9uKSBhcyBGbHV4QWN0aW9uXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB7dHlwZSwgLi4uZGF0YX0gPSBjbG9uZWRBY3Rpb247XG5cbiAgICAvLyBSZXF1aXJlIGEgdHlwZVxuICAgIGlmKCF0eXBlIHx8IHR5cGUgPT09ICcnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Fya2hhbUpTIFdhcm5pbmc6IEZsdXguZGlzcGF0Y2ggaXMgbWlzc2luZyBhbiBhY3Rpb24gdHlwZSBmb3IgdGhlIHBheWxvYWQ6JywgZGF0YSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNsb25lZEFjdGlvbik7XG4gICAgfVxuXG4gICAgLy8gV2hlbiBhbiBhY3Rpb24gY29tZXMgaW4sIGl0IG11c3QgYmUgY29tcGxldGVseSBoYW5kbGVkIGJ5IGFsbCBzdG9yZXNcbiAgICBPYmplY3RcbiAgICAgIC5rZXlzKHRoaXMuc3RvcmVBY3Rpb25zKVxuICAgICAgLmZvckVhY2goKHN0b3JlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0b3JlRm4gPSB0aGlzLnN0b3JlQWN0aW9uc1tzdG9yZU5hbWVdO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGNsb25lRGVlcCh0aGlzLnN0YXRlW3N0b3JlTmFtZV0pIHx8IGNsb25lRGVlcChzdG9yZUZuLmluaXRpYWxTdGF0ZSkgfHwge307XG4gICAgICAgIHRoaXMuc3RhdGVbc3RvcmVOYW1lXSA9IGNsb25lRGVlcChzdG9yZUZuLmFjdGlvbih0eXBlLCBkYXRhLCBzdGF0ZSkpIHx8IHN0YXRlO1xuICAgICAgfSk7XG5cbiAgICAvLyBTYXZlIGNhY2hlIGluIHN0b3JhZ2VcbiAgICBjb25zdCB7c3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpZihzdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0b3JhZ2UoKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHt9XG4gICAgfVxuXG4gICAgY29uc3QgZW5kVGltZTogbnVtYmVyID0gKyhuZXcgRGF0ZSgpKTtcbiAgICBjb25zdCBkdXJhdGlvbjogbnVtYmVyID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgICBhcHBJbmZvLmR1cmF0aW9uID0gZHVyYXRpb247XG5cbiAgICBpZihwb3N0RGlzcGF0Y2hMaXN0Lmxlbmd0aCkge1xuICAgICAgY2xvbmVkQWN0aW9uID0gYXdhaXQgUHJvbWlzZVxuICAgICAgICAuYWxsKFxuICAgICAgICAgIHBvc3REaXNwYXRjaExpc3QubWFwKFxuICAgICAgICAgICAgYXN5bmMgKHBsdWdpbjogRmx1eFBsdWdpblR5cGUpID0+IHBsdWdpbi5tZXRob2QoY2xvbmVEZWVwKGNsb25lZEFjdGlvbiksIGNsb25lRGVlcCh0aGlzLnN0YXRlKSwgYXBwSW5mbylcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgKGFjdGlvbnMpID0+IGFjdGlvbnMucmVkdWNlKCh1cGRhdGVkQWN0aW9uLCBhY3Rpb24pID0+XG4gICAgICAgICAgICBtZXJnZSh1cGRhdGVkQWN0aW9uLCBhY3Rpb24pLCBjbG9uZWRBY3Rpb24pIGFzIEZsdXhBY3Rpb25cbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmKCFzaWxlbnQpIHtcbiAgICAgIHRoaXMuZW1pdCh0eXBlLCBjbG9uZWRBY3Rpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2xvbmVkQWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgRmx1eCBvcHRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Rmx1eE9wdGlvbnN9IHRoZSBGbHV4IG9wdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgZ2V0T3B0aW9ucygpOiBGbHV4T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gW25hbWVdIChvcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlIGZvciBhbiBvYmplY3QsIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBhbGwgc3RvcmVcbiAgICogICBvYmplY3RzLiBZb3UgY2FuIGFsc28gdXNlIGFuIGFycmF5IHRvIHNwZWNpZnkgYSBwcm9wZXJ0eSBwYXRoIHdpdGhpbiB0aGUgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2FueX0gW2RlZmF1bHRWYWx1ZV0gKG9wdGlvbmFsKSBBIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIG51bGwuXG4gICAqIEByZXR1cm5zIHthbnl9IHRoZSBzdGF0ZSBvYmplY3Qgb3IgYSBwcm9wZXJ0eSB2YWx1ZSB3aXRoaW4uXG4gICAqL1xuICBnZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCBkZWZhdWx0VmFsdWU/KTogYW55IHtcbiAgICBsZXQgc3RvcmVWYWx1ZTtcblxuICAgIGlmKCFwYXRoKSB7XG4gICAgICBzdG9yZVZhbHVlID0gdGhpcy5zdGF0ZSB8fCB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcmVWYWx1ZSA9IGdldChwYXRoLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHN0b3JlVmFsdWUgPyBjbG9uZURlZXAoc3RvcmVWYWx1ZSkgOiBzdG9yZVZhbHVlO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RvcmUgb2JqZWN0IHJlZ2lzdGVyZWQgd2l0aCBGbHV4LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3RvcmUuXG4gICAqIEByZXR1cm5zIHtGbHV4U3RvcmV9IHRoZSBzdG9yZSBvYmplY3QuXG4gICAqL1xuICBnZXRTdG9yZShuYW1lOiBzdHJpbmcgPSAnJyk6IEZsdXhTdG9yZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYW5kIHNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICovXG4gIGFzeW5jIGluaXQob3B0aW9uczogRmx1eE9wdGlvbnMgPSB7fSwgcmVzZXQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Rmx1eEZyYW1ld29yaz4ge1xuICAgIC8vIFNob3VsZCByZXNldCBwcmV2aW91cyBwYXJhbXNcbiAgICBpZihyZXNldCkge1xuICAgICAgdGhpcy5pc0luaXQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFNldCBvcHRpb25zXG4gICAgY29uc3QgdXBkYXRlZE9wdGlvbnMgPSB7Li4ub3B0aW9uc307XG5cbiAgICBpZih0aGlzLmlzSW5pdCkge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBuYW1lIGZyb20gb3B0aW9ucyBpZiBhbHJlYWR5IGluaXRpYWxpemVkLCBvdGhlcndpc2UgdGhlIHJvb3QgYXBwIHdpbGwgbm90IGJlIGFibGUgdG8gYWNjZXNzXG4gICAgICAvLyB0aGUgc3RhdGUgdHJlZVxuICAgICAgdXBkYXRlZE9wdGlvbnMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLmRlZmF1bHRPcHRpb25zLCAuLi51cGRhdGVkT3B0aW9uc307XG4gICAgY29uc3Qge2RlYnVnLCBtaWRkbGV3YXJlLCBuYW1lLCBzdG9yZXN9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgLy8gVXBkYXRlIGRlZmF1bHQgc3RvcmVcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy51c2VTdG9yYWdlKG5hbWUpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Fya2hhbSBFcnJvcjogVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHVzaW5nIHN0b3JhZ2UuJywgbmFtZSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZighIXN0b3JlcyAmJiBzdG9yZXMubGVuZ3RoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkZFN0b3JlcyhzdG9yZXMpO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBcmtoYW0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBhZGRpbmcgc3RvcmVzLicsIHN0b3Jlcyk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKCEhbWlkZGxld2FyZSAmJiBtaWRkbGV3YXJlLmxlbmd0aCkge1xuICAgICAgdGhpcy5hZGRNaWRkbGV3YXJlKG1pZGRsZXdhcmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHdpbmRvd1Byb3BlcnR5OiBzdHJpbmcgPSAnYXJraGFtanMnO1xuXG4gICAgaWYoZGVidWcpIHtcbiAgICAgIHdpbmRvd1t3aW5kb3dQcm9wZXJ0eV0gPSB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgd2luZG93W3dpbmRvd1Byb3BlcnR5XTtcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KEFya2hhbUNvbnN0YW50cy5JTklUKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gaW5pdGlhbGl6YXRpb24gbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9uSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbihBcmtoYW1Db25zdGFudHMuSU5JVCwgbGlzdGVuZXIpO1xuXG4gICAgaWYodGhpcy5pc0luaXQpIHtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGluaXRpYWxpemF0aW9uIGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbGlzdGVuZXJdIFRoZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhlIHN1YnNjcmliZWQgZXZlbnQuXG4gICAqL1xuICBvZmZJbml0KGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9mZihBcmtoYW1Db25zdGFudHMuSU5JVCwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRUeXBlXSBFdmVudCB0byB1bnN1YnNjcmliZS5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb2ZmKGV2ZW50VHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtldmVudFR5cGVdIEV2ZW50IHRvIHN1YnNjcmliZS5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb24oZXZlbnRUeXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgbmV3IFN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gc3RvcmVzIFN0b3JlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3RbXT59IHRoZSBjbGFzcyBvYmplY3QocykuXG4gICAqL1xuICBhc3luYyBhZGRTdG9yZXMoc3RvcmVzOiBhbnlbXSk6IFByb21pc2U8b2JqZWN0W10+IHtcbiAgICBjb25zdCByZWdpc3RlcmVkU3RvcmVzOiBGbHV4U3RvcmVbXSA9IHN0b3Jlcy5tYXAoKHN0b3JlOiBGbHV4U3RvcmUpID0+IHRoaXMucmVnaXN0ZXIoc3RvcmUpKTtcblxuICAgIC8vIFNhdmUgY2FjaGUgaW4gc2Vzc2lvbiBzdG9yYWdlXG4gICAgY29uc3Qge25hbWUsIHN0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB0aGlzLnN0YXRlKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGNsYXNzZXNcbiAgICByZXR1cm4gcmVnaXN0ZXJlZFN0b3JlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgbWlkZGxld2FyZSBmcm9tIGZyYW1ld29yay5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gc3RyaW5nIG1pZGRsZXdhcmUgbmFtZXMgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3RbXT59IHRoZSBjbGFzcyBvYmplY3QocykuXG4gICAqL1xuICByZW1vdmVNaWRkbGV3YXJlKG5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIG5hbWVzLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgLy8gUmVtb3ZlIG1pZGRsZXdhcmUgcGx1Z2luc1xuICAgICAgdGhpcy5wbHVnaW5UeXBlcy5mb3JFYWNoKCh0eXBlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gdGhpcy5yZW1vdmVQbHVnaW4odHlwZSwgbmFtZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBmcmFtZXdvcmsuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0cmluZyBtaWRkbGV3YXJlIG5hbWVzIHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgYXN5bmMgcmVzZXQoY2xlYXJTdG9yYWdlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIC8vIENsZWFyIHBlcnNpc3RlbnQgY2FjaGVcbiAgICBpZihzdG9yYWdlICYmIGNsZWFyU3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB7fSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFyIGFsbCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5taWRkbGV3YXJlID0ge307XG4gICAgdGhpcy5vcHRpb25zID0gey4uLnRoaXMuZGVmYXVsdE9wdGlvbnN9O1xuICAgIHRoaXMuc3RhdGUgPSB7fTtcbiAgICB0aGlzLnN0b3JlQWN0aW9ucyA9IHt9O1xuICAgIHRoaXMuaXNJbml0ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfGFycmF5fSBbbmFtZV0gVGhlIG5hbWUgb2YgdGhlIHN0b3JlIHRvIHNldC4gWW91IGNhbiBhbHNvIHVzZSBhbiBhcnJheSB0byBzcGVjaWZ5IGEgcHJvcGVydHkgcGF0aFxuICAgKiB3aXRoaW4gdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IFt2YWx1ZV0gVGhlIHZhbHVlIHRvIHNldC5cbiAgICovXG4gIHNldFN0YXRlKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdID0gJycsIHZhbHVlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYoISFwYXRoKSB7XG4gICAgICB0aGlzLnN0YXRlID0gc2V0KHBhdGgsIGNsb25lRGVlcCh2YWx1ZSksIHRoaXMuc3RhdGUpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBwZXJzaXN0ZW50IGNhY2hlXG4gICAgY29uc3Qge3N0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU3RvcmFnZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQbHVnaW4odHlwZTogc3RyaW5nLCBwbHVnaW46IEZsdXhQbHVnaW5UeXBlKTogRmx1eFBsdWdpblR5cGVbXSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSB8fCBbXTtcbiAgICBjb25zdCB7bWV0aG9kLCBuYW1lfSA9IHBsdWdpbjtcblxuICAgIGlmKG1ldGhvZCAmJiB0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBDaGVjayBpZiBwbHVnaW4gYWxyZWFkeSBleGlzdHNcbiAgICAgIGNvbnN0IGV4aXN0czogYm9vbGVhbiA9ICEhbGlzdC5maWx0ZXIoKG9iajogRmx1eFBsdWdpblR5cGUpID0+IG9iai5uYW1lID09PSBuYW1lKS5sZW5ndGg7XG5cbiAgICAgIC8vIERvIG5vdCBhZGQgZHVwbGljYXRlIHBsdWdpbnNcbiAgICAgIGlmKCFleGlzdHMpIHtcbiAgICAgICAgbGlzdC5wdXNoKHttZXRob2QsIG5hbWV9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKGAke3BsdWdpbi5uYW1lfSBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBNZXRob2QgaXMgbm90IGEgZnVuY3Rpb24uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICBwcml2YXRlIGRlcmVnaXN0ZXIobmFtZTogc3RyaW5nID0gJycpOiB2b2lkIHtcbiAgICBkZWxldGUgdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV07XG4gICAgZGVsZXRlIHRoaXMuc3RhdGVbbmFtZV07XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyKHN0b3JlRm4pOiBGbHV4U3RvcmUge1xuICAgIGlmKCFzdG9yZUZuKSB7XG4gICAgICB0aHJvdyBFcnJvcignU3RvcmUgaXMgdW5kZWZpbmVkLiBDYW5ub3QgcmVnaXN0ZXIgd2l0aCBGbHV4LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRm5jOiBib29sZWFuID0gdHlwZW9mIHN0b3JlRm4gPT09ICdmdW5jdGlvbic7XG5cbiAgICBpZighaXNGbmMpIHtcbiAgICAgIHRocm93IEVycm9yKGAke3N0b3JlRm59IGlzIG5vdCBhIHN0b3JlIGZ1bmN0aW9uLiBDYW5ub3QgcmVnaXN0ZXIgd2l0aCBGbHV4LmApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBzdG9yZSBvYmplY3RcbiAgICBjb25zdCB7bmFtZX0gPSBzdG9yZUZuO1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZTogYW55ID0gc3RvcmVGbigpO1xuICAgIGNvbnN0IHN0b3JlQWN0aW9uID0ge1xuICAgICAgYWN0aW9uOiBzdG9yZUZuLFxuICAgICAgaW5pdGlhbFN0YXRlOiBzdG9yZUZuKCksXG4gICAgICBuYW1lXG4gICAgfTtcblxuICAgIGlmKCFpc0VtcHR5KG5hbWUpICYmICF0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXSkge1xuICAgICAgLy8gU2F2ZSBzdG9yZSBvYmplY3RcbiAgICAgIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdID0gc3RvcmVBY3Rpb247XG5cbiAgICAgIC8vIEdldCBkZWZhdWx0IHZhbHVlc1xuICAgICAgaWYoIXRoaXMuc3RhdGVbbmFtZV0pIHtcbiAgICAgICAgaWYoaW5pdGlhbFN0YXRlKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVtuYW1lXSA9IGNsb25lRGVlcChpbml0aWFsU3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RhdGVbbmFtZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBzdG9yZSBjbGFzc1xuICAgIHJldHVybiB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUGx1Z2luKHR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogRmx1eFBsdWdpblR5cGVbXSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSB8fCBbXTtcblxuICAgIC8vIHJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHBsdWdpblxuICAgIHJldHVybiBsaXN0LmZpbHRlcigob2JqOiBGbHV4UGx1Z2luVHlwZSkgPT4gb2JqLm5hbWUgIT09IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdG9yYWdlID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblxuICBwcml2YXRlIGFzeW5jIHVzZVN0b3JhZ2UobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge3N0b3JhZ2UsIHN0YXRlLCBzdG9yYWdlV2FpdH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBDYWNoZVxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCBhd2FpdCBzdG9yYWdlLmdldFN0b3JhZ2VEYXRhKG5hbWUpIHx8IHt9O1xuICAgICAgICB0aGlzLnVwZGF0ZVN0b3JhZ2UgPSBkZWJvdW5jZShcbiAgICAgICAgICAoKSA9PiBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUsIHRoaXMuc3RhdGUpLFxuICAgICAgICAgIHN0b3JhZ2VXYWl0LFxuICAgICAgICAgIHtsZWFkaW5nOiB0cnVlLCB0cmFpbGluZzogdHJ1ZX1cbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQXJraGFtSlMgRXJyb3I6IFVzaW5nIHN0b3JhZ2UsIFwiJHtuYW1lfVwiLmApO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlIHx8IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBGbHV4OiBGbHV4RnJhbWV3b3JrID0gbmV3IEZsdXhGcmFtZXdvcmsoKTtcbiJdfQ==
368
+ } else {
369
+ this.state = state || {};
370
+ }
371
+ return null;
372
+ }
373
+ }
374
+ FluxFramework.initFlux = false;
375
+ const Flux = new FluxFramework();
376
+ module.exports = __toCommonJS(Flux_exports);
377
+ // Annotate the CommonJS export names for ESM import in node:
378
+ 0 && (module.exports = {
379
+ Flux,
380
+ FluxFramework
381
+ });
382
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBFcnJvclN0YWNrUGFyc2VyIGZyb20gJ2Vycm9yLXN0YWNrLXBhcnNlcic7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2gvZGVib3VuY2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvZnAvY2xvbmVEZWVwJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoL2ZwL2dldCc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvZnAvaXNFbXB0eSc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnbG9kYXNoL2ZwL21lcmdlJztcbmltcG9ydCBzZXQgZnJvbSAnbG9kYXNoL2ZwL3NldCc7XG5cbmltcG9ydCB7QXJraGFtQ29uc3RhbnRzfSBmcm9tICcuLi9jb25zdGFudHMvQXJraGFtQ29uc3RhbnRzJztcbmltcG9ydCB7Rmx1eEFjdGlvbiwgRmx1eE1pZGRsZXdhcmVUeXBlLCBGbHV4T3B0aW9ucywgRmx1eFBsdWdpblR5cGUsIEZsdXhTdG9yZX0gZnJvbSAnLi9GbHV4LnR5cGVzJztcblxuLyoqXG4gKiBGbHV4RnJhbWV3b3JrXG4gKiBAdHlwZSB7RXZlbnRFbWl0dGVyfVxuICovXG5leHBvcnQgY2xhc3MgRmx1eEZyYW1ld29yayBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBpbml0Rmx1eDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0luaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gUHVibGljIHByb3BlcnRpZXNcbiAgcGx1Z2luVHlwZXM6IHN0cmluZ1tdID0gWydwcmVEaXNwYXRjaCcsICdwb3N0RGlzcGF0Y2gnXTtcbiAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzXG4gIHByaXZhdGUgc3RhdGU6IGFueSA9IHt9O1xuICBwcml2YXRlIHN0b3JlQWN0aW9uczogYW55ID0ge307XG4gIHByaXZhdGUgZGVmYXVsdE9wdGlvbnM6IEZsdXhPcHRpb25zID0ge1xuICAgIG5hbWU6ICdhcmtoYW1qcycsXG4gICAgcm91dGVyVHlwZTogJ2Jyb3dzZXInLFxuICAgIHNjcm9sbFRvVG9wOiB0cnVlLFxuICAgIHN0YXRlOiBudWxsLFxuICAgIHN0b3JhZ2U6IG51bGwsXG4gICAgc3RvcmFnZVdhaXQ6IDMwMCxcbiAgICBzdG9yZXM6IFtdLFxuICAgIHRpdGxlOiAnQXJraGFtSlMnXG4gIH07XG4gIHByaXZhdGUgbWlkZGxld2FyZTogYW55ID0ge307XG4gIHByaXZhdGUgb3B0aW9uczogRmx1eE9wdGlvbnMgPSB0aGlzLmRlZmF1bHRPcHRpb25zO1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEZsdXguICBOb3RlIHRoYXQgdGhlIEZsdXggb2JqZWN0XG4gICAqIGlzIGEgU2luZ2xldG9uIHBhdHRlcm4sIHNvIG9ubHkgb25lIHNob3VsZCBldmVyIGV4aXN0LlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHRoaXMge0ZsdXhGcmFtZXdvcmt9XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gTWV0aG9kc1xuICAgIHRoaXMuYWRkTWlkZGxld2FyZSA9IHRoaXMuYWRkTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYWRkU3RvcmVzID0gdGhpcy5hZGRTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsZWFyQXBwRGF0YSA9IHRoaXMuY2xlYXJBcHBEYXRhLmJpbmQodGhpcyk7XG4gICAgdGhpcy5jbGVhck1pZGRsZXdhcmUgPSB0aGlzLmNsZWFyTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGVyZWdpc3RlciA9IHRoaXMuZGVyZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLmRpc3BhdGNoLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRPcHRpb25zID0gdGhpcy5nZXRPcHRpb25zLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRTdGF0ZSA9IHRoaXMuZ2V0U3RhdGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldFN0b3JlID0gdGhpcy5nZXRTdG9yZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaW5pdCA9IHRoaXMuaW5pdC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub2ZmID0gdGhpcy5vZmYuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyID0gdGhpcy5yZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlTWlkZGxld2FyZSA9IHRoaXMucmVtb3ZlTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlU3RvcmVzID0gdGhpcy5yZW1vdmVTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlc2V0ID0gdGhpcy5yZXNldC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc2V0U3RhdGUgPSB0aGlzLnNldFN0YXRlLmJpbmQodGhpcyk7XG5cbiAgICAvLyBBZGQgbWlkZGxld2FyZSBwbHVnaW4gdHlwZXNcbiAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBtaWRkbGV3YXJlIHRvIGZyYW1ld29yay5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gbWlkZGxld2FyZSBBbiBhcnJheSBvZiBtaWRkbGV3YXJlIHRvIGFkZCB0byB0aGUgZnJhbWV3b3JrLlxuICAgKi9cbiAgYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlOiBGbHV4TWlkZGxld2FyZVR5cGVbXSk6IHZvaWQge1xuICAgIG1pZGRsZXdhcmUuZm9yRWFjaCgobWlkZGxlT2JqOiBGbHV4TWlkZGxld2FyZVR5cGUpID0+IHtcbiAgICAgIC8vIE1ha2Ugc3VyZSBtaWRkbGV3YXJlIGlzIGVpdGhlciBhIGNsYXNzIG9yIG9iamVjdC5cbiAgICAgIGlmKCEhbWlkZGxlT2JqICYmICgodHlwZW9mIG1pZGRsZU9iaiA9PT0gJ2Z1bmN0aW9uJykgfHwgKHR5cGVvZiBtaWRkbGVPYmogPT09ICdvYmplY3QnKSkpIHtcbiAgICAgICAgY29uc3QgbWlkZGxlTmFtZTogc3RyaW5nID0gbWlkZGxlT2JqLm5hbWUgfHwgJyc7XG5cbiAgICAgICAgaWYoIW1pZGRsZU5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBSZXF1aXJlcyBuYW1lIHByb3BlcnR5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IG1pZGRsZXdhcmUgcGx1Z2lucyBmb3IgZWZmaWNpZW5jeVxuICAgICAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IG1pZGRsZU9ialt0eXBlXTtcbiAgICAgICAgICBjb25zdCBwbHVnaW46IEZsdXhQbHVnaW5UeXBlID0ge21ldGhvZCwgbmFtZTogbWlkZGxlTmFtZX07XG4gICAgICAgICAgdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gdGhpcy5hZGRQbHVnaW4odHlwZSwgcGx1Z2luKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBhcHAgZGF0YSBmcm9tIHN0b3JhZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIGFwcCBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIGNsZWFyQXBwRGF0YSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBTZXQgYWxsIHN0b3JlIGRhdGEgdG8gaW5pdGlhbCBzdGF0ZVxuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5zdG9yZUFjdGlvbnMpXG4gICAgICAuZm9yRWFjaCgoc3RvcmVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmVGbiA9IHRoaXMuc3RvcmVBY3Rpb25zW3N0b3JlTmFtZV07XG4gICAgICAgIHRoaXMuc3RhdGVbc3RvcmVGbi5uYW1lXSA9IGNsb25lRGVlcChzdG9yZUZuLmluaXRpYWxTdGF0ZSk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUsIHRoaXMuc3RhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBtaWRkbGV3YXJlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtaWRkbGV3YXJlIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIGNsZWFyTWlkZGxld2FyZSgpOiBib29sZWFuIHtcbiAgICAvLyBTZXQgYWxsIHN0b3JlIGRhdGEgdG8gaW5pdGlhbCBzdGF0ZVxuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5taWRkbGV3YXJlKVxuICAgICAgLmZvckVhY2goKHBsdWdpblR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm1pZGRsZXdhcmVbcGx1Z2luVHlwZV0gPSBbXTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGUtcmVnaXN0ZXJzIG5hbWVkIHN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gc3RvcmVOYW1lcyBBbiBhcnJheSBvZiBzdG9yZSBuYW1lcyB0byByZW1vdmUgZnJvbSB0aGUgZnJhbWV3b3JrLlxuICAgKi9cbiAgcmVtb3ZlU3RvcmVzKHN0b3JlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgc3RvcmVOYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHRoaXMuZGVyZWdpc3RlcihuYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24gdG8gYWxsIHN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFjdGlvbiB0byBkaXNwYXRjaCB0byBhbGwgdGhlIHN0b3Jlcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBzaWxlbnQgVG8gc2lsZW5jZSBhbnkgZXZlbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgd2hlbiBhbmQgaWYgdGhlIGFwcCBzYXZlcyBkYXRhIHRvIHN0b3JhZ2UsIHJldHVybmluZ1xuICAgKiB0aGUgYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZGlzcGF0Y2goYWN0aW9uOiBGbHV4QWN0aW9uLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4ge1xuICAgIGlmKCFhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJraGFtSlMgRXJyb3I6IEZsdXguZGlzcGF0Y2ggcmVxdWlyZXMgYW4gYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCBjbG9uZWRBY3Rpb246IEZsdXhBY3Rpb24gPSBjbG9uZURlZXAoYWN0aW9uKTtcblxuICAgIC8vIExvZyBkdXJhdGlvbiBvZiBkaXNwYXRjaFxuICAgIGNvbnN0IHN0YXJ0VGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIEdldCBzdGFja1xuICAgIGxldCBzdGFjayA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YWNrUHJvcGVydHk6IHN0cmluZyA9ICdzdGFja1RyYWNlTGltaXQnO1xuICAgICAgY29uc3Qge3N0YWNrVHJhY2VMaW1pdH06IGFueSA9IEVycm9yO1xuICAgICAgRXJyb3Jbc3RhY2tQcm9wZXJ0eV0gPSBJbmZpbml0eTtcbiAgICAgIHN0YWNrID0gRXJyb3JTdGFja1BhcnNlci5wYXJzZShuZXcgRXJyb3IoKSk7XG4gICAgICBFcnJvcltzdGFja1Byb3BlcnR5XSA9IHN0YWNrVHJhY2VMaW1pdDtcbiAgICB9IGNhdGNoKGVycm9yKSB7fVxuXG4gICAgLy8gR2V0IG9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zID0gY2xvbmVEZWVwKHRoaXMub3B0aW9ucyk7XG5cbiAgICAvLyBBcHAgaW5mb1xuICAgIGNvbnN0IGFwcEluZm8gPSB7ZHVyYXRpb246IDAsIG9wdGlvbnMsIHN0YWNrfTtcblxuICAgIC8vIEFwcGx5IG1pZGRsZXdhcmUgYmVmb3JlIHRoZSBhY3Rpb24gaXMgcHJvY2Vzc2VkXG4gICAgY29uc3Qge3Bvc3REaXNwYXRjaExpc3QgPSBbXSwgcHJlRGlzcGF0Y2hMaXN0ID0gW119ID0gdGhpcy5taWRkbGV3YXJlO1xuXG4gICAgaWYocHJlRGlzcGF0Y2hMaXN0Lmxlbmd0aCkge1xuICAgICAgY2xvbmVkQWN0aW9uID0gYXdhaXQgUHJvbWlzZVxuICAgICAgICAuYWxsKFxuICAgICAgICAgIHByZURpc3BhdGNoTGlzdC5tYXAoKHBsdWdpbjogRmx1eFBsdWdpblR5cGUpID0+IHBsdWdpbi5tZXRob2QoXG4gICAgICAgICAgICBjbG9uZURlZXAoY2xvbmVkQWN0aW9uKSwgY2xvbmVEZWVwKHRoaXMuc3RhdGUpLCBhcHBJbmZvKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAudGhlbihcbiAgICAgICAgICAoYWN0aW9ucykgPT4gYWN0aW9ucy5yZWR1Y2UoKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbikgPT5cbiAgICAgICAgICAgIG1lcmdlKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbiksIGNsb25lZEFjdGlvbikgYXMgRmx1eEFjdGlvblxuICAgICAgICApXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qge3R5cGUsIC4uLmRhdGF9ID0gY2xvbmVkQWN0aW9uO1xuXG4gICAgLy8gUmVxdWlyZSBhIHR5cGVcbiAgICBpZighdHlwZSB8fCB0eXBlID09PSAnJykge1xuICAgICAgY29uc29sZS53YXJuKCdBcmtoYW1KUyBXYXJuaW5nOiBGbHV4LmRpc3BhdGNoIGlzIG1pc3NpbmcgYW4gYWN0aW9uIHR5cGUgZm9yIHRoZSBwYXlsb2FkOicsIGRhdGEpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjbG9uZWRBY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIFdoZW4gYW4gYWN0aW9uIGNvbWVzIGluLCBpdCBtdXN0IGJlIGNvbXBsZXRlbHkgaGFuZGxlZCBieSBhbGwgc3RvcmVzXG4gICAgT2JqZWN0XG4gICAgICAua2V5cyh0aGlzLnN0b3JlQWN0aW9ucylcbiAgICAgIC5mb3JFYWNoKChzdG9yZU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjbG9uZURlZXAodGhpcy5zdGF0ZVtzdG9yZU5hbWVdKSB8fCBjbG9uZURlZXAoc3RvcmVGbi5pbml0aWFsU3RhdGUpIHx8IHt9O1xuICAgICAgICB0aGlzLnN0YXRlW3N0b3JlTmFtZV0gPSBjbG9uZURlZXAoc3RvcmVGbi5hY3Rpb24odHlwZSwgZGF0YSwgc3RhdGUpKSB8fCBzdGF0ZTtcbiAgICAgIH0pO1xuXG4gICAgLy8gU2F2ZSBjYWNoZSBpbiBzdG9yYWdlXG4gICAgY29uc3Qge3N0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdG9yYWdlKCk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7fVxuICAgIH1cblxuICAgIGNvbnN0IGVuZFRpbWU6IG51bWJlciA9ICsobmV3IERhdGUoKSk7XG4gICAgY29uc3QgZHVyYXRpb246IG51bWJlciA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgYXBwSW5mby5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG4gICAgaWYocG9zdERpc3BhdGNoTGlzdC5sZW5ndGgpIHtcbiAgICAgIGNsb25lZEFjdGlvbiA9IGF3YWl0IFByb21pc2VcbiAgICAgICAgLmFsbChcbiAgICAgICAgICBwb3N0RGlzcGF0Y2hMaXN0Lm1hcChcbiAgICAgICAgICAgIGFzeW5jIChwbHVnaW46IEZsdXhQbHVnaW5UeXBlKSA9PiBwbHVnaW4ubWV0aG9kKGNsb25lRGVlcChjbG9uZWRBY3Rpb24pLCBjbG9uZURlZXAodGhpcy5zdGF0ZSksIGFwcEluZm8pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIChhY3Rpb25zKSA9PiBhY3Rpb25zLnJlZHVjZSgodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSA9PlxuICAgICAgICAgICAgbWVyZ2UodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSwgY2xvbmVkQWN0aW9uKSBhcyBGbHV4QWN0aW9uXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZighc2lsZW50KSB7XG4gICAgICB0aGlzLmVtaXQodHlwZSwgY2xvbmVkQWN0aW9uKTtcbiAgICAgIHRoaXMuZW1pdCgnYXJraGFtanMnLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNsb25lZEFjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IEZsdXggb3B0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMge0ZsdXhPcHRpb25zfSB0aGUgRmx1eCBvcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGdldE9wdGlvbnMoKTogRmx1eE9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8YXJyYXl9IFtuYW1lXSAob3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSBmb3IgYW4gb2JqZWN0LCBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gYWxsIHN0b3JlXG4gICAqICAgb2JqZWN0cy4gWW91IGNhbiBhbHNvIHVzZSBhbiBhcnJheSB0byBzcGVjaWZ5IGEgcHJvcGVydHkgcGF0aCB3aXRoaW4gdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IFtkZWZhdWx0VmFsdWVdIChvcHRpb25hbCkgQSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiBudWxsLlxuICAgKiBAcmV0dXJucyB7YW55fSB0aGUgc3RhdGUgb2JqZWN0IG9yIGEgcHJvcGVydHkgdmFsdWUgd2l0aGluLlxuICAgKi9cbiAgZ2V0U3RhdGUocGF0aDogc3RyaW5nIHwgc3RyaW5nW10gPSAnJywgZGVmYXVsdFZhbHVlPyk6IGFueSB7XG4gICAgbGV0IHN0b3JlVmFsdWU7XG5cbiAgICBpZighcGF0aCkge1xuICAgICAgc3RvcmVWYWx1ZSA9IHRoaXMuc3RhdGUgfHwge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3JlVmFsdWUgPSBnZXQocGF0aCwgdGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBzdG9yZVZhbHVlID8gY2xvbmVEZWVwKHN0b3JlVmFsdWUpIDogc3RvcmVWYWx1ZTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0b3JlIG9iamVjdCByZWdpc3RlcmVkIHdpdGggRmx1eC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN0b3JlLlxuICAgKiBAcmV0dXJucyB7Rmx1eFN0b3JlfSB0aGUgc3RvcmUgb2JqZWN0LlxuICAgKi9cbiAgZ2V0U3RvcmUobmFtZTogc3RyaW5nID0gJycpOiBGbHV4U3RvcmUge1xuICAgIHJldHVybiB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFuZCBzZXQgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqL1xuICBhc3luYyBpbml0KG9wdGlvbnM6IEZsdXhPcHRpb25zID0ge30sIHJlc2V0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEZsdXhGcmFtZXdvcms+IHtcbiAgICAvLyBTaG91bGQgcmVzZXQgcHJldmlvdXMgcGFyYW1zXG4gICAgaWYocmVzZXQpIHtcbiAgICAgIHRoaXMuaXNJbml0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgb3B0aW9uc1xuICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0gey4uLm9wdGlvbnN9O1xuXG4gICAgaWYodGhpcy5pc0luaXQpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgbmFtZSBmcm9tIG9wdGlvbnMgaWYgYWxyZWFkeSBpbml0aWFsaXplZCwgb3RoZXJ3aXNlIHRoZSByb290IGFwcCB3aWxsIG5vdCBiZSBhYmxlIHRvIGFjY2Vzc1xuICAgICAgLy8gdGhlIHN0YXRlIHRyZWVcbiAgICAgIHVwZGF0ZWRPcHRpb25zLm5hbWUgPSB0aGlzLm9wdGlvbnMubmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5kZWZhdWx0T3B0aW9ucywgLi4udXBkYXRlZE9wdGlvbnN9O1xuICAgIGNvbnN0IHtkZWJ1ZywgbWlkZGxld2FyZSwgbmFtZSwgc3RvcmVzfSA9IHRoaXMub3B0aW9ucztcblxuICAgIC8vIFVwZGF0ZSBkZWZhdWx0IHN0b3JlXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudXNlU3RvcmFnZShuYW1lKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdBcmtoYW0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSB1c2luZyBzdG9yYWdlLicsIG5hbWUpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYoISFzdG9yZXMgJiYgc3RvcmVzLmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRTdG9yZXMoc3RvcmVzKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQXJraGFtIEVycm9yOiBUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgYWRkaW5nIHN0b3Jlcy4nLCBzdG9yZXMpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZighIW1pZGRsZXdhcmUgJiYgbWlkZGxld2FyZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCB3aW5kb3dQcm9wZXJ0eTogc3RyaW5nID0gJ2Fya2hhbWpzJztcblxuICAgIGlmKGRlYnVnKSB7XG4gICAgICB3aW5kb3dbd2luZG93UHJvcGVydHldID0gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHdpbmRvd1t3aW5kb3dQcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgdGhpcy5pc0luaXQgPSB0cnVlO1xuICAgIHRoaXMuZW1pdChBcmtoYW1Db25zdGFudHMuSU5JVCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGluaXRpYWxpemF0aW9uIGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbGlzdGVuZXJdIFRoZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhlIHN1YnNjcmliZWQgZXZlbnQuXG4gICAqL1xuICBvbkluaXQobGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub24oQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcblxuICAgIGlmKHRoaXMuaXNJbml0KSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBpbml0aWFsaXphdGlvbiBsaXN0ZW5lci5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb2ZmSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vZmYoQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V2ZW50VHlwZV0gRXZlbnQgdG8gdW5zdWJzY3JpYmUuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9mZihldmVudFR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRUeXBlXSBFdmVudCB0byBzdWJzY3JpYmUuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9uKGV2ZW50VHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIG5ldyBTdG9yZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0b3JlcyBTdG9yZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgYXN5bmMgYWRkU3RvcmVzKHN0b3JlczogYW55W10pOiBQcm9taXNlPG9iamVjdFtdPiB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZFN0b3JlczogRmx1eFN0b3JlW10gPSBzdG9yZXMubWFwKChzdG9yZTogRmx1eFN0b3JlKSA9PiB0aGlzLnJlZ2lzdGVyKHN0b3JlKSk7XG5cbiAgICAvLyBTYXZlIGNhY2hlIGluIHNlc3Npb24gc3RvcmFnZVxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwgdGhpcy5zdGF0ZSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBjbGFzc2VzXG4gICAgcmV0dXJuIHJlZ2lzdGVyZWRTdG9yZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIG1pZGRsZXdhcmUgZnJvbSBmcmFtZXdvcmsuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0cmluZyBtaWRkbGV3YXJlIG5hbWVzIHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgcmVtb3ZlTWlkZGxld2FyZShuYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBuYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlbW92ZSBtaWRkbGV3YXJlIHBsdWdpbnNcbiAgICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSA9IHRoaXMucmVtb3ZlUGx1Z2luKHR5cGUsIG5hbWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgZnJhbWV3b3JrLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBzdHJpbmcgbWlkZGxld2FyZSBuYW1lcyB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdFtdPn0gdGhlIGNsYXNzIG9iamVjdChzKS5cbiAgICovXG4gIGFzeW5jIHJlc2V0KGNsZWFyU3RvcmFnZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7bmFtZSwgc3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBDbGVhciBwZXJzaXN0ZW50IGNhY2hlXG4gICAgaWYoc3RvcmFnZSAmJiBjbGVhclN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwge30pO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhciBhbGwgcHJvcGVydGllc1xuICAgIHRoaXMubWlkZGxld2FyZSA9IHt9O1xuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLmRlZmF1bHRPcHRpb25zfTtcbiAgICB0aGlzLnN0YXRlID0ge307XG4gICAgdGhpcy5zdG9yZUFjdGlvbnMgPSB7fTtcbiAgICB0aGlzLmlzSW5pdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gW25hbWVdIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSB0byBzZXQuIFlvdSBjYW4gYWxzbyB1c2UgYW4gYXJyYXkgdG8gc3BlY2lmeSBhIHByb3BlcnR5IHBhdGhcbiAgICogd2l0aGluIHRoZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7YW55fSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICBzZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCB2YWx1ZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmKCEhcGF0aCkge1xuICAgICAgdGhpcy5zdGF0ZSA9IHNldChwYXRoLCBjbG9uZURlZXAodmFsdWUpLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcGVyc2lzdGVudCBjYWNoZVxuICAgIGNvbnN0IHtzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVN0b3JhZ2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUGx1Z2luKHR5cGU6IHN0cmluZywgcGx1Z2luOiBGbHV4UGx1Z2luVHlwZSk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG4gICAgY29uc3Qge21ldGhvZCwgbmFtZX0gPSBwbHVnaW47XG5cbiAgICBpZihtZXRob2QgJiYgdHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQ2hlY2sgaWYgcGx1Z2luIGFscmVhZHkgZXhpc3RzXG4gICAgICBjb25zdCBleGlzdHM6IGJvb2xlYW4gPSAhIWxpc3QuZmlsdGVyKChvYmo6IEZsdXhQbHVnaW5UeXBlKSA9PiBvYmoubmFtZSA9PT0gbmFtZSkubGVuZ3RoO1xuXG4gICAgICAvLyBEbyBub3QgYWRkIGR1cGxpY2F0ZSBwbHVnaW5zXG4gICAgICBpZighZXhpc3RzKSB7XG4gICAgICAgIGxpc3QucHVzaCh7bWV0aG9kLCBuYW1lfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHtwbHVnaW4ubmFtZX0gbWlkZGxld2FyZSBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4gTWV0aG9kIGlzIG5vdCBhIGZ1bmN0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXJlZ2lzdGVyKG5hbWU6IHN0cmluZyA9ICcnKTogdm9pZCB7XG4gICAgZGVsZXRlIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICAgIGRlbGV0ZSB0aGlzLnN0YXRlW25hbWVdO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlcihzdG9yZUZuKTogRmx1eFN0b3JlIHtcbiAgICBpZighc3RvcmVGbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ1N0b3JlIGlzIHVuZGVmaW5lZC4gQ2Fubm90IHJlZ2lzdGVyIHdpdGggRmx1eC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0ZuYzogYm9vbGVhbiA9IHR5cGVvZiBzdG9yZUZuID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYoIWlzRm5jKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHtzdG9yZUZufSBpcyBub3QgYSBzdG9yZSBmdW5jdGlvbi4gQ2Fubm90IHJlZ2lzdGVyIHdpdGggRmx1eC5gKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3RvcmUgb2JqZWN0XG4gICAgY29uc3Qge25hbWV9ID0gc3RvcmVGbjtcbiAgICBjb25zdCBpbml0aWFsU3RhdGU6IGFueSA9IHN0b3JlRm4oKTtcbiAgICBjb25zdCBzdG9yZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogc3RvcmVGbixcbiAgICAgIGluaXRpYWxTdGF0ZTogc3RvcmVGbigpLFxuICAgICAgbmFtZVxuICAgIH07XG5cbiAgICBpZighaXNFbXB0eShuYW1lKSAmJiAhdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV0pIHtcbiAgICAgIC8vIFNhdmUgc3RvcmUgb2JqZWN0XG4gICAgICB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXSA9IHN0b3JlQWN0aW9uO1xuXG4gICAgICAvLyBHZXQgZGVmYXVsdCB2YWx1ZXNcbiAgICAgIGlmKCF0aGlzLnN0YXRlW25hbWVdKSB7XG4gICAgICAgIGlmKGluaXRpYWxTdGF0ZSkge1xuICAgICAgICAgIHRoaXMuc3RhdGVbbmFtZV0gPSBjbG9uZURlZXAoaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlW25hbWVdID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gc3RvcmUgY2xhc3NcbiAgICByZXR1cm4gdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV07XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBsdWdpbih0eXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG5cbiAgICAvLyByZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBwbHVnaW5cbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoKG9iajogRmx1eFBsdWdpblR5cGUpID0+IG9iai5uYW1lICE9PSBuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RvcmFnZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG5cbiAgcHJpdmF0ZSBhc3luYyB1c2VTdG9yYWdlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtzdG9yYWdlLCBzdGF0ZSwgc3RvcmFnZVdhaXR9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgLy8gQ2FjaGVcbiAgICBpZihzdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGUgfHwgYXdhaXQgc3RvcmFnZS5nZXRTdG9yYWdlRGF0YShuYW1lKSB8fCB7fTtcbiAgICAgICAgdGhpcy51cGRhdGVTdG9yYWdlID0gZGVib3VuY2UoXG4gICAgICAgICAgKCkgPT4gc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICBzdG9yYWdlV2FpdCxcbiAgICAgICAgICB7bGVhZGluZzogdHJ1ZSwgdHJhaWxpbmc6IHRydWV9XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEFya2hhbUpTIEVycm9yOiBVc2luZyBzdG9yYWdlLCBcIiR7bmFtZX1cIi5gKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRmx1eDogRmx1eEZyYW1ld29yayA9IG5ldyBGbHV4RnJhbWV3b3JrKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7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