@decohere/flux 0.0.1-dev.79 → 0.0.1-dev.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/commonjs/src/ember.command.js +27 -0
  2. package/commonjs/src/ember.module.js +37 -0
  3. package/commonjs/src/hot-module-hooks.js +47 -0
  4. package/commonjs/src/hot-reload-server.js +160 -293
  5. package/commonjs/src/index.js +32 -33
  6. package/commonjs/src/serve.action.js +10 -94
  7. package/commonjs/src/serve.command.js +4 -36
  8. package/commonjs/src/serve.js +36 -0
  9. package/commonjs/src/workspace-serve.action.js +59 -0
  10. package/es6/src/ember.command.js +17 -0
  11. package/es6/src/ember.module.js +19 -0
  12. package/es6/src/hot-module-hooks.js +26 -0
  13. package/es6/src/hot-reload-server.js +117 -280
  14. package/es6/src/index.js +7 -6
  15. package/es6/src/serve.action.js +10 -92
  16. package/es6/src/serve.command.js +5 -37
  17. package/es6/src/serve.js +32 -0
  18. package/es6/src/workspace-serve.action.js +45 -0
  19. package/package.json +12 -8
  20. package/types/src/{flux.command.d.ts → ember.command.d.ts} +1 -1
  21. package/types/src/ember.module.d.ts +22 -0
  22. package/types/src/hot-module-hooks.d.ts +5 -0
  23. package/types/src/hot-reload-server.d.ts +22 -62
  24. package/types/src/index.d.ts +8 -8
  25. package/types/src/serve.action.d.ts +2 -17
  26. package/types/src/serve.command.d.ts +2 -7
  27. package/types/src/serve.d.ts +1 -0
  28. package/types/src/workspace-serve.action.d.ts +11 -0
  29. package/commonjs/src/deferred-script-runner.js +0 -58
  30. package/commonjs/src/flux.command.js +0 -29
  31. package/commonjs/src/flux.module.js +0 -38
  32. package/commonjs/src/rewrite-serve-specifier.js +0 -46
  33. package/commonjs/src/run.action.js +0 -71
  34. package/commonjs/src/run.command.js +0 -67
  35. package/commonjs/src/slice-serve.js +0 -132
  36. package/commonjs/src/source-module-loader.js +0 -216
  37. package/es6/src/deferred-script-runner.js +0 -48
  38. package/es6/src/flux.command.js +0 -19
  39. package/es6/src/flux.module.js +0 -28
  40. package/es6/src/rewrite-serve-specifier.js +0 -40
  41. package/es6/src/run.action.js +0 -58
  42. package/es6/src/run.command.js +0 -57
  43. package/es6/src/slice-serve.js +0 -107
  44. package/es6/src/source-module-loader.js +0 -160
  45. package/types/src/deferred-script-runner.d.ts +0 -18
  46. package/types/src/flux.module.d.ts +0 -16
  47. package/types/src/rewrite-serve-specifier.d.ts +0 -13
  48. package/types/src/run.action.d.ts +0 -17
  49. package/types/src/run.command.d.ts +0 -11
  50. package/types/src/slice-serve.d.ts +0 -52
  51. package/types/src/source-module-loader.d.ts +0 -49
@@ -2,316 +2,137 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: Object.getOwnPropertyDescriptor(all, name).get
9
- });
10
- }
11
- _export(exports, {
12
- get DEFAULT_REBOOT_DEBOUNCE_MS () {
13
- return DEFAULT_REBOOT_DEBOUNCE_MS;
14
- },
15
- get HotReloadServer () {
5
+ Object.defineProperty(exports, "HotReloadServer", {
6
+ enumerable: true,
7
+ get: function() {
16
8
  return HotReloadServer;
17
- },
18
- get resolveRebootDebounceMs () {
19
- return resolveRebootDebounceMs;
20
9
  }
21
10
  });
22
11
  const _nodeevents = require("node:events");
23
12
  const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
24
13
  const _io = require("@decohere/nexus/io");
25
14
  const _system = require("@decohere/nexus/system");
26
- const _scribe = require("@decohere/scribe");
27
- const _sourcemoduleloader = require("./source-module-loader.js");
15
+ const _hotmodulehooks = require("./hot-module-hooks.js");
28
16
  function _interop_require_default(obj) {
29
17
  return obj && obj.__esModule ? obj : {
30
18
  default: obj
31
19
  };
32
20
  }
33
- const currentFilePath = _io.io.fileUrlToPath(require("url").pathToFileURL(__filename).toString());
34
- const VERSION_URL_PARAM = "version";
35
- const DEFAULT_REBOOT_DEBOUNCE_MS = 250;
36
- function resolveRebootDebounceMs(value) {
37
- const delay = value ?? DEFAULT_REBOOT_DEBOUNCE_MS;
38
- if (!Number.isFinite(delay) || delay < 0) {
39
- throw new Error(`rebootDebounceMs must be a non-negative number, got ${String(value)}`);
21
+ function _getRequireWildcardCache(nodeInterop) {
22
+ if (typeof WeakMap !== "function") return null;
23
+ var cacheBabelInterop = new WeakMap();
24
+ var cacheNodeInterop = new WeakMap();
25
+ return (_getRequireWildcardCache = function(nodeInterop) {
26
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
27
+ })(nodeInterop);
28
+ }
29
+ function _interop_require_wildcard(obj, nodeInterop) {
30
+ if (!nodeInterop && obj && obj.__esModule) {
31
+ return obj;
32
+ }
33
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
34
+ return {
35
+ default: obj
36
+ };
37
+ }
38
+ var cache = _getRequireWildcardCache(nodeInterop);
39
+ if (cache && cache.has(obj)) {
40
+ return cache.get(obj);
41
+ }
42
+ var newObj = {
43
+ __proto__: null
44
+ };
45
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
46
+ for(var key in obj){
47
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
48
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
49
+ if (desc && (desc.get || desc.set)) {
50
+ Object.defineProperty(newObj, key, desc);
51
+ } else {
52
+ newObj[key] = obj[key];
53
+ }
54
+ }
40
55
  }
41
- return delay;
56
+ newObj.default = obj;
57
+ if (cache) {
58
+ cache.set(obj, newObj);
59
+ }
60
+ return newObj;
42
61
  }
43
- /** Process-wide: Node's ESM cache is process-global, including across HotReloadServer instances. */ let moduleVersionSeq = 0;
62
+ const currentFilePath = _io.io.fileUrlToPath(require("url").pathToFileURL(__filename).toString());
44
63
  class HotReloadServer extends _nodeevents.EventEmitter {
45
- // ── State ────────────────────────────────────────────────────────────────
46
- logger = _scribe.scribe.logger(HotReloadServer.name);
47
- loader = new _sourcemoduleloader.SourceModuleLoader();
64
+ logger;
48
65
  disposed = false;
49
- /** Absolute entry paths currently served (one or more Flux apps). */ entries = new Map();
50
- pendingEntryReboots = new Set();
51
- watchSubscription;
66
+ entryModule;
67
+ entry;
68
+ sourceFiles = [];
52
69
  moduleCache = new Map();
53
70
  dependencies = new Map();
54
- rebootTail = Promise.resolve();
55
- rebootDebounceGen = 0;
56
- rebootInFlight = false;
57
- rebootFollowUp = false;
58
- rebootQueued = false;
59
- /** Modules whose reverse-graph edges are pruned at reboot, not on schedule. */ pendingGraphPrune = new Set();
60
- scheduleReboot = ()=>{};
61
- // ── Public API ───────────────────────────────────────────────────────────
62
- async start(options) {
63
- this.disposed = false;
64
- this.dependencies.clear();
65
- this.moduleCache.clear();
66
- this.entries.clear();
67
- this.pendingEntryReboots.clear();
68
- this.pendingGraphPrune.clear();
69
- this.rebootTail = Promise.resolve();
70
- this.rebootInFlight = false;
71
- this.rebootFollowUp = false;
72
- this.rebootQueued = false;
73
- this.bindScheduleReboot(resolveRebootDebounceMs(options.rebootDebounceMs));
74
- const { buildConfig } = options;
75
- await this.loader.configure({
76
- buildConfig,
77
- workspace: options.workspace,
78
- versionFileUrl: (fileUrl)=>this.getCachedOrNew(fileUrl),
79
- onResolved: this.onPostResolve
80
- });
81
- const workspace = this.requireWorkspace();
82
- const selected = this.resolveProjects(buildConfig, options);
83
- for (const project of selected){
84
- const entryPath = _nodepath.default.resolve(project.getSourceEntryPath());
85
- this.entries.set(entryPath, {
86
- path: entryPath
87
- });
88
- }
89
- this.loader.registerHooks();
71
+ watchers = [];
72
+ constructor(logger){
73
+ super();
74
+ this.logger = logger;
75
+ }
76
+ async start(entry, ...watchDirs) {
77
+ this.entryModule = entry;
78
+ this.sourceFiles = await this.getSourceFiles(watchDirs);
79
+ this.configureModuleHooks();
90
80
  this.invalidateAllSourceFiles();
91
- await workspace.watch(buildConfig);
92
- this.watchSubscription = workspace.projectFileChanged$.subscribe(this.onFileChange);
93
- for (const entry of this.entries.values()){
94
- this.logger.trace(`Serving ${entry.path}`);
95
- }
96
- await this.bootEntries([
97
- ...this.entries.keys()
98
- ]);
99
- this.emit("start");
81
+ await this.watch(watchDirs);
82
+ this.logger.trace("Serving", entry);
83
+ this.logger.trace("Hot reload watching", watchDirs);
84
+ await this.bootEntry();
100
85
  }
101
86
  async dispose() {
102
87
  if (this.disposed) return;
103
88
  this.disposed = true;
104
- this.rebootDebounceGen += 1;
105
- this.watchSubscription?.unsubscribe();
106
- await this.rebootTail;
107
- await this.disposeEntries([
108
- ...this.entries.keys()
109
- ]);
110
- this.loader.dispose();
111
- }
112
- async [Symbol.asyncDispose]() {
113
- await this.dispose();
114
- }
115
- // ── Lifecycle ────────────────────────────────────────────────────────────
116
- async bootEntries(entryPaths) {
117
- await Promise.all(entryPaths.map((entryPath)=>this.bootEntry(entryPath)));
118
- }
119
- async bootEntry(entryPath) {
120
- const state = this.entries.get(entryPath);
121
- if (state == null) return;
122
- try {
123
- const mod = await this.loader.importEntry(entryPath);
124
- state.module = mod?.default;
125
- } catch (error) {
126
- state.module = undefined;
127
- this.logger.error("There was an error booting the entry point. Your application may not function as expected", error);
89
+ (0, _hotmodulehooks.removeResolverHook)(this.onResolve);
90
+ for (const watcher of this.watchers){
91
+ watcher.close();
128
92
  }
93
+ await this.disposeEntry();
129
94
  }
130
- bindScheduleReboot(delayMs) {
131
- const gen = ++this.rebootDebounceGen;
132
- this.scheduleReboot = (0, _system.debounce)(async ()=>{
133
- if (this.disposed || gen !== this.rebootDebounceGen) return;
134
- this.requestReboot();
135
- }, delayMs);
95
+ removeSourceFiles(...sourceFiles) {
96
+ this.sourceFiles = this.sourceFiles.filter((sourceFile)=>!sourceFiles.includes(sourceFile));
136
97
  }
137
- requestReboot() {
138
- if (this.disposed) return;
139
- if (this.rebootInFlight) {
140
- this.rebootFollowUp = true;
141
- return;
142
- }
143
- if (this.rebootQueued) return;
144
- this.rebootQueued = true;
145
- this.rebootTail = this.rebootTail.then(()=>this.runReboot(), ()=>this.runReboot());
146
- }
147
- async runReboot() {
148
- this.rebootQueued = false;
149
- if (this.disposed) return;
150
- this.rebootInFlight = true;
151
- try {
152
- do {
153
- this.rebootFollowUp = false;
154
- if (this.disposed) return;
155
- const toReboot = this.pendingEntryReboots.size > 0 ? [
156
- ...this.pendingEntryReboots
157
- ] : [
158
- ...this.entries.keys()
159
- ];
160
- this.pendingEntryReboots.clear();
161
- // Drop reverse edges only when rebooting so later saves in the debounce
162
- // window can still walk the graph and reset the quiet timer.
163
- this.prunePendingDependencyEdges();
164
- this.logger.trace(`Rebooting ${toReboot.length} entry module(s)`);
165
- await this.disposeEntries(toReboot);
166
- await this.bootEntries(toReboot);
167
- this.emit("reboot");
168
- }while (this.rebootFollowUp && !this.disposed)
169
- } finally{
170
- const needsFollowUp = this.rebootFollowUp && !this.disposed;
171
- this.rebootFollowUp = false;
172
- this.rebootInFlight = false;
173
- if (needsFollowUp) this.requestReboot();
174
- }
175
- }
176
- async disposeEntries(entryPaths) {
177
- await Promise.all(entryPaths.map((entryPath)=>this.disposeEntry(entryPath)));
98
+ async getSourceFiles(dirs) {
99
+ const patterns = dirs.map((dir)=>`${dir}/**/*.js`);
100
+ const files = await _io.io.findFiles(patterns);
101
+ return files.map((f)=>f.fullPath);
178
102
  }
179
- async disposeEntry(entryPath) {
180
- const paths = entryPath != null ? [
181
- entryPath
182
- ] : [
183
- ...this.entries.keys()
184
- ];
185
- for (const p of paths){
186
- const state = this.entries.get(p);
187
- if (state == null) continue;
188
- const entry = state.module;
189
- state.module = undefined;
190
- try {
191
- await entry?.[Symbol.asyncDispose]();
192
- } catch (error) {
193
- this.logger.error("Entry asyncDispose failed", error);
194
- }
195
- }
103
+ configureModuleHooks() {
104
+ (0, _hotmodulehooks.initModuleHooks)();
105
+ (0, _hotmodulehooks.addResolverHook)(this.onResolve);
196
106
  }
197
- // ── Setup ────────────────────────────────────────────────────────────────
198
- requireWorkspace() {
199
- const workspace = this.loader.getWorkspace();
200
- if (workspace == null) {
201
- throw new Error("SourceModuleLoader has no workspace after configure");
202
- }
203
- return workspace;
204
- }
205
- resolveProjects(buildConfig, options) {
206
- const projects = this.loader.getWorkspace()?.getProjects(buildConfig) ?? [];
207
- const names = options.projects != null && options.projects.length > 0 ? options.projects : options.project != null ? [
208
- options.project
209
- ] : undefined;
210
- if (names == null) {
211
- const first = projects.at(0);
212
- if (first == null) {
213
- throw new Error(`No projects found for configuration: ${buildConfig}`);
214
- }
215
- return [
216
- first
217
- ];
218
- }
219
- const selected = [];
220
- for (const name of names){
221
- const found = projects.find((p)=>p.name === name);
222
- if (found == null) {
223
- throw new Error(`Project "${name}" not found in workspace`);
224
- }
225
- selected.push(found);
226
- }
227
- return selected;
228
- }
229
- /**
230
- * Post-next dependency tracker: records which source files import which
231
- * other source files so that reloadIfAffected can traverse the graph.
232
- */ onPostResolve = (result, parentUrl)=>{
107
+ onResolve = (result, parentUrl)=>{
233
108
  const { url } = result;
234
109
  const parentUrlClean = parentUrl.split("?")[0];
235
- let filePath;
236
- let parentPath;
237
- try {
238
- const urlObj = new URL(url);
239
- urlObj.search = "";
240
- filePath = _io.io.fileUrlToPath(urlObj.toString());
241
- } catch {
242
- return;
243
- }
244
- try {
245
- parentPath = _io.io.fileUrlToPath(parentUrlClean);
246
- } catch {
247
- parentPath = "";
248
- }
249
- const isSource = this.loader.hasSourceFile(filePath);
250
- const parentIsSource = this.loader.hasSourceFile(parentPath);
110
+ const isSource = this.isSourceModule(url);
111
+ const parentIsSource = this.isSourceModule(parentUrlClean);
251
112
  if (isSource || parentIsSource) {
252
- this.trackDependency(filePath, parentPath);
113
+ this.trackDependency(url, parentUrl);
253
114
  }
254
- };
255
- // ── File watching ────────────────────────────────────────────────────────
256
- onFileChange = (evt)=>{
257
- const { file, eventName, project } = evt;
258
- const fullPath = file.fullPath;
259
- this.logger.trace(`File ${eventName}: ${fullPath}`);
260
- if (eventName === _io.io.WatchEvents.unlink) {
261
- this.loader.invalidateTranspile(fullPath);
262
- this.moduleCache.set(fullPath, null);
115
+ if (!isSource) {
263
116
  return;
264
117
  }
265
- if (eventName === _io.io.WatchEvents.add) {
266
- if (project.isSourceFile(file)) {
267
- this.loader.setSourceFile(fullPath, project);
268
- this.moduleCache.set(fullPath, null);
269
- this.reloadIfAffected(fullPath);
270
- }
271
- return;
272
- }
273
- // change
274
- if (!project.isSourceFile(file)) return;
275
- this.loader.invalidateTranspile(fullPath);
276
- this.reloadIfAffected(fullPath);
118
+ result.url = this.getCachedOrNew(url);
277
119
  };
278
- reloadIfAffected(fullPath) {
279
- const deps = this.getDependencyGraph(fullPath);
280
- const modules = [
281
- ...new Set([
282
- ...deps,
283
- fullPath
284
- ])
285
- ];
286
- const affectedEntries = [
287
- ...this.entries.keys()
288
- ].filter((entryPath)=>modules.includes(entryPath));
289
- if (affectedEntries.length === 0) {
290
- this.logger.trace(`Change in ${fullPath} does not affect entry — skipping reload`);
291
- return false;
292
- }
293
- this.logger.trace(`Change in ${fullPath} affects ${modules.length} module(s) — scheduling reload`);
294
- this.invalidateModuleCaches(...modules);
295
- for (const module of modules){
296
- this.pendingGraphPrune.add(module);
297
- }
298
- for (const entryPath of affectedEntries){
299
- this.pendingEntryReboots.add(entryPath);
300
- }
301
- this.scheduleReboot();
302
- return true;
120
+ isSourceModule(url) {
121
+ const path = _io.io.fileUrlToPath(url);
122
+ return this.sourceFiles.includes(path);
303
123
  }
304
- // ── Dependency graph ─────────────────────────────────────────────────────
305
124
  getDependencyGraph(moduleId, parentModules = []) {
306
- if (this.isSelf(moduleId)) return [];
125
+ if (this.isSelf(moduleId)) {
126
+ return [];
127
+ }
307
128
  const moduleDeps = this.dependencies.get(moduleId) ?? [];
308
129
  if (parentModules.includes(moduleId)) {
309
130
  this.logger.error(`Circular reference detected: ${moduleId}`);
310
131
  return [];
311
132
  }
312
- let subDeps = [];
133
+ let subDeps = Array.of();
313
134
  for (const dep of moduleDeps){
314
- if (!this.loader.hasSourceFile(dep)) continue;
135
+ if (!this.sourceFiles.includes(dep)) continue;
315
136
  const subs = this.getDependencyGraph(dep, [
316
137
  moduleId,
317
138
  ...parentModules
@@ -328,8 +149,9 @@ class HotReloadServer extends _nodeevents.EventEmitter {
328
149
  ])
329
150
  ];
330
151
  }
331
- trackDependency(filePath, parentPath) {
332
- if (!parentPath) return;
152
+ trackDependency(url, parentUrl) {
153
+ const filePath = _io.io.fileUrlToPath(url);
154
+ const parentPath = _io.io.fileUrlToPath(parentUrl.split("?")[0]);
333
155
  const deps = this.dependencies.get(filePath) ?? [];
334
156
  const updatedDeps = new Set([
335
157
  ...deps,
@@ -339,7 +161,6 @@ class HotReloadServer extends _nodeevents.EventEmitter {
339
161
  ...updatedDeps
340
162
  ]);
341
163
  }
342
- // ── Module cache ─────────────────────────────────────────────────────────
343
164
  getCachedOrNew(moduleUrl) {
344
165
  const filePath = _io.io.fileUrlToPath(moduleUrl);
345
166
  const cached = this.moduleCache.get(filePath);
@@ -349,42 +170,88 @@ class HotReloadServer extends _nodeevents.EventEmitter {
349
170
  }
350
171
  versionModule(moduleUrl) {
351
172
  const versionedUrl = new URL(moduleUrl);
352
- versionedUrl.searchParams.set(VERSION_URL_PARAM, String(++moduleVersionSeq));
173
+ versionedUrl.searchParams.set("version", Date.now().toString());
353
174
  return versionedUrl.toString();
354
175
  }
355
- invalidateModuleCaches(...modules) {
356
- for (const module of modules){
357
- this.moduleCache.set(module, null);
358
- this.loader.invalidateTranspile(module);
176
+ watch = async (dirs)=>{
177
+ for (const dir of dirs){
178
+ const watcher = _io.io.watch(dir, {
179
+ include: [
180
+ "**/*.js"
181
+ ],
182
+ ignoreInitial: true
183
+ });
184
+ watcher.on("add", this.onFileAdded).on("change", this.onSourceFileChanged).on("unlink", this.onFileDeleted);
185
+ this.watchers.push(watcher);
359
186
  }
360
- }
361
- prunePendingDependencyEdges() {
187
+ };
188
+ onFileAdded = async ({ fullPath })=>{
189
+ this.sourceFiles.push(fullPath);
190
+ this.moduleCache.set(fullPath, null);
191
+ this.reloadIfAffected(fullPath);
192
+ };
193
+ onSourceFileChanged = async ({ fullPath })=>{
194
+ if (!this.reloadIfAffected(fullPath)) {
195
+ this.logger.trace(`${fullPath} is not part of the current dependency graph. Not reloading entry.`);
196
+ }
197
+ };
198
+ onFileDeleted = async ({ fullPath })=>{
199
+ this.removeSourceFiles(fullPath);
200
+ };
201
+ reloadIfAffected(fullPath) {
202
+ const deps = this.getDependencyGraph(fullPath);
362
203
  const modules = [
363
- ...this.pendingGraphPrune
204
+ ...new Set([
205
+ ...deps,
206
+ fullPath
207
+ ])
364
208
  ];
365
- this.pendingGraphPrune.clear();
366
- this.pruneDependencyParents(...modules);
209
+ if (!modules.includes(this.entryModule)) {
210
+ return false;
211
+ }
212
+ this.invlidateModule(...modules);
213
+ this.disposeAndBoot();
214
+ return true;
215
+ }
216
+ isSelf(urlLike) {
217
+ return currentFilePath === _nodepath.default.resolve(_io.io.fileUrlToPath(urlLike));
367
218
  }
368
- /** Remove these modules as parents so boot can rebuild edges without stale importers. */ pruneDependencyParents(...modules) {
219
+ invlidateModule(...modules) {
369
220
  for (const module of modules){
370
- for (const [key, parents] of this.dependencies){
371
- const filtered = parents.filter((p)=>p !== module);
372
- if (filtered.length === 0) {
373
- this.dependencies.delete(key);
374
- } else {
375
- this.dependencies.set(key, filtered);
376
- }
221
+ this.moduleCache.set(module, null);
222
+ }
223
+ // Prune invalidated modules from all parent lists so stale relationships
224
+ // are cleared. The fresh boot rebuilds only what is actually imported.
225
+ for (const [child, parents] of this.dependencies){
226
+ const pruned = parents.filter((p)=>!modules.includes(p));
227
+ if (pruned.length === 0) {
228
+ this.dependencies.delete(child);
229
+ } else {
230
+ this.dependencies.set(child, pruned);
377
231
  }
378
232
  }
379
233
  }
380
234
  invalidateAllSourceFiles() {
381
- for (const filePath of this.loader.sourceFilePaths()){
382
- this.moduleCache.set(filePath, null);
235
+ for (const file of this.sourceFiles){
236
+ this.moduleCache.set(file, null);
383
237
  }
384
238
  }
385
- isSelf(filePath) {
386
- return currentFilePath === _nodepath.default.resolve(filePath);
239
+ disposeAndBoot = (0, _system.debounce)(async ()=>{
240
+ await this.disposeEntry();
241
+ await this.bootEntry();
242
+ }, 250);
243
+ async disposeEntry() {
244
+ await this.entry?.[Symbol.asyncDispose]();
245
+ }
246
+ async bootEntry() {
247
+ try {
248
+ const version = this.versionModule(_io.io.pathToFileUrl(this.entryModule));
249
+ this.entry = (await Promise.resolve(version).then((p)=>/*#__PURE__*/ _interop_require_wildcard(require(p))))?.default;
250
+ this.emit("reboot");
251
+ } catch (error) {
252
+ this.logger.error(`There was an error booting the entry point. Your application may not function as expected`, error);
253
+ }
387
254
  }
388
255
  }
389
256
 
390
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU291cmNlTW9kdWxlTG9hZGVyIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcblxuY29uc3QgY3VycmVudEZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgVkVSU0lPTl9VUkxfUEFSQU0gPSBcInZlcnNpb25cIjtcbi8qKiBEZWZhdWx0IHF1aWV0IHdpbmRvdyBiZWZvcmUgYSBmaWxlLWNoYW5nZSByZWJvb3QuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVib290RGVib3VuY2VNcyh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcblx0Y29uc3QgZGVsYXkgPSB2YWx1ZSA/PyBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUztcblx0aWYgKCFOdW1iZXIuaXNGaW5pdGUoZGVsYXkpIHx8IGRlbGF5IDwgMCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgcmVib290RGVib3VuY2VNcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwgZ290ICR7U3RyaW5nKHZhbHVlKX1gKTtcblx0fVxuXHRyZXR1cm4gZGVsYXk7XG59XG5cbi8qKiBQcm9jZXNzLXdpZGU6IE5vZGUncyBFU00gY2FjaGUgaXMgcHJvY2Vzcy1nbG9iYWwsIGluY2x1ZGluZyBhY3Jvc3MgSG90UmVsb2FkU2VydmVyIGluc3RhbmNlcy4gKi9cbmxldCBtb2R1bGVWZXJzaW9uU2VxID0gMDtcblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJFdmVudHMge1xuXHRzdGFydDogW107XG5cdHJlYm9vdDogW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyT3B0aW9ucyB7XG5cdC8qKiBCdWlsZCBjb25maWd1cmF0aW9uIG5hbWUuICovXG5cdGJ1aWxkQ29uZmlnOiBzdHJpbmc7XG5cdC8qKiBOYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHNlcnZlLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlLiAqL1xuXHRwcm9qZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogTXVsdGlwbGUgRmx1eCBhcHAgcGFja2FnZSBuYW1lcyB0byBib290IGluIG9uZSBwcm9jZXNzIChkaXJlY3Rvcnkgc2xpY2UpLlxuXHQgKiBXaGVuIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHtAbGluayBwcm9qZWN0fS5cblx0ICovXG5cdHByb2plY3RzPzogcmVhZG9ubHkgc3RyaW5nW107XG5cdC8qKlxuXHQgKiBQcmUtYnVpbHQgV29ya3NwYWNlIGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgV29ya3NwYWNlRmFjdG9yeS5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIGJ5cGFzcyBmaWxlc3lzdGVtLWJhc2VkIHdvcmtzcGFjZSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG5cdC8qKlxuXHQgKiBRdWlldCB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBsYXN0IGFmZmVjdGluZyBzYXZlIGJlZm9yZSBhIHJlYm9vdC5cblx0ICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TfS4gUmFpc2UgdGhpcyBmb3IgYWdlbnQgc2F2ZSB0cmFpbnMuXG5cdCAqL1xuXHRyZWJvb3REZWJvdW5jZU1zPzogbnVtYmVyO1xufVxuXG50eXBlIEVudHJ5U3RhdGUgPSB7IHBhdGg6IHN0cmluZzsgbW9kdWxlPzogQXN5bmNEaXNwb3NhYmxlIH07XG5cbmV4cG9ydCBjbGFzcyBIb3RSZWxvYWRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8SG90UmVsb2FkU2VydmVyRXZlbnRzPiB7XG5cdC8vIOKUgOKUgCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoSG90UmVsb2FkU2VydmVyLm5hbWUpO1xuXHRwcml2YXRlIHJlYWRvbmx5IGxvYWRlciA9IG5ldyBTb3VyY2VNb2R1bGVMb2FkZXIoKTtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHQvKiogQWJzb2x1dGUgZW50cnkgcGF0aHMgY3VycmVudGx5IHNlcnZlZCAob25lIG9yIG1vcmUgRmx1eCBhcHBzKS4gKi9cblx0cHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEVudHJ5U3RhdGU+KCk7XG5cdHByaXZhdGUgcGVuZGluZ0VudHJ5UmVib290cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHQvKiogTW9kdWxlcyB3aG9zZSByZXZlcnNlLWdyYXBoIGVkZ2VzIGFyZSBwcnVuZWQgYXQgcmVib290LCBub3Qgb24gc2NoZWR1bGUuICovXG5cdHByaXZhdGUgcGVuZGluZ0dyYXBoUHJ1bmUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cHJpdmF0ZSBzY2hlZHVsZVJlYm9vdDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuY2xlYXIoKTtcblx0XHR0aGlzLnJlYm9vdFRhaWwgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0dGhpcy5iaW5kU2NoZWR1bGVSZWJvb3QocmVzb2x2ZVJlYm9vdERlYm91bmNlTXMob3B0aW9ucy5yZWJvb3REZWJvdW5jZU1zKSk7XG5cblx0XHRjb25zdCB7IGJ1aWxkQ29uZmlnIH0gPSBvcHRpb25zO1xuXG5cdFx0YXdhaXQgdGhpcy5sb2FkZXIuY29uZmlndXJlKHtcblx0XHRcdGJ1aWxkQ29uZmlnLFxuXHRcdFx0d29ya3NwYWNlOiBvcHRpb25zLndvcmtzcGFjZSxcblx0XHRcdHZlcnNpb25GaWxlVXJsOiAoZmlsZVVybCkgPT4gdGhpcy5nZXRDYWNoZWRPck5ldyhmaWxlVXJsKSxcblx0XHRcdG9uUmVzb2x2ZWQ6IHRoaXMub25Qb3N0UmVzb2x2ZSxcblx0XHR9KTtcblxuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMucmVxdWlyZVdvcmtzcGFjZSgpO1xuXHRcdGNvbnN0IHNlbGVjdGVkID0gdGhpcy5yZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWcsIG9wdGlvbnMpO1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiBzZWxlY3RlZCkge1xuXHRcdFx0Y29uc3QgZW50cnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZ2V0U291cmNlRW50cnlQYXRoKCkpO1xuXHRcdFx0dGhpcy5lbnRyaWVzLnNldChlbnRyeVBhdGgsIHsgcGF0aDogZW50cnlQYXRoIH0pO1xuXHRcdH1cblxuXHRcdHRoaXMubG9hZGVyLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgd29ya3NwYWNlLndhdGNoKGJ1aWxkQ29uZmlnKTtcblx0XHR0aGlzLndhdGNoU3Vic2NyaXB0aW9uID0gd29ya3NwYWNlLnByb2plY3RGaWxlQ2hhbmdlZCQuc3Vic2NyaWJlKHRoaXMub25GaWxlQ2hhbmdlKTtcblxuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzLnZhbHVlcygpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShgU2VydmluZyAke2VudHJ5LnBhdGh9YCk7XG5cdFx0fVxuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0XHR0aGlzLmVtaXQoXCJzdGFydFwiKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBkaXNwb3NlKCkge1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0dGhpcy5kaXNwb3NlZCA9IHRydWU7XG5cdFx0dGhpcy5yZWJvb3REZWJvdW5jZUdlbiArPSAxO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cdFx0YXdhaXQgdGhpcy5yZWJvb3RUYWlsO1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0XHR0aGlzLmxvYWRlci5kaXNwb3NlKCk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZSgpO1xuXHR9XG5cblx0Ly8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyaWVzKGVudHJ5UGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKSB7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoZW50cnlQYXRocy5tYXAoKGVudHJ5UGF0aCkgPT4gdGhpcy5ib290RW50cnkoZW50cnlQYXRoKSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQoZW50cnlQYXRoKTtcblx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtb2QgPSAoYXdhaXQgdGhpcy5sb2FkZXIuaW1wb3J0RW50cnkoZW50cnlQYXRoKSkgYXMge1xuXHRcdFx0XHRkZWZhdWx0PzogQXN5bmNEaXNwb3NhYmxlO1xuXHRcdFx0fTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IG1vZD8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFwiVGhlcmUgd2FzIGFuIGVycm9yIGJvb3RpbmcgdGhlIGVudHJ5IHBvaW50LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWRcIixcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYmluZFNjaGVkdWxlUmVib290KGRlbGF5TXM6IG51bWJlcikge1xuXHRcdGNvbnN0IGdlbiA9ICsrdGhpcy5yZWJvb3REZWJvdW5jZUdlbjtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290ID0gZGVib3VuY2UoYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQgfHwgZ2VuICE9PSB0aGlzLnJlYm9vdERlYm91bmNlR2VuKSByZXR1cm47XG5cdFx0XHR0aGlzLnJlcXVlc3RSZWJvb3QoKTtcblx0XHR9LCBkZWxheU1zKTtcblx0fVxuXG5cdHByaXZhdGUgcmVxdWVzdFJlYm9vdCgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdGlmICh0aGlzLnJlYm9vdEluRmxpZ2h0KSB7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHRoaXMucmVib290UXVldWVkKSByZXR1cm47XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSB0cnVlO1xuXHRcdHRoaXMucmVib290VGFpbCA9IHRoaXMucmVib290VGFpbC50aGVuKFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuUmVib290KCkge1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gdHJ1ZTtcblx0XHR0cnkge1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0XHRcdGNvbnN0IHRvUmVib290ID1cblx0XHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuc2l6ZSA+IDBcblx0XHRcdFx0XHRcdD8gWy4uLnRoaXMucGVuZGluZ0VudHJ5UmVib290c11cblx0XHRcdFx0XHRcdDogWy4uLnRoaXMuZW50cmllcy5rZXlzKCldO1xuXHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuY2xlYXIoKTtcblx0XHRcdFx0Ly8gRHJvcCByZXZlcnNlIGVkZ2VzIG9ubHkgd2hlbiByZWJvb3Rpbmcgc28gbGF0ZXIgc2F2ZXMgaW4gdGhlIGRlYm91bmNlXG5cdFx0XHRcdC8vIHdpbmRvdyBjYW4gc3RpbGwgd2FsayB0aGUgZ3JhcGggYW5kIHJlc2V0IHRoZSBxdWlldCB0aW1lci5cblx0XHRcdFx0dGhpcy5wcnVuZVBlbmRpbmdEZXBlbmRlbmN5RWRnZXMoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJlYm9vdGluZyAke3RvUmVib290Lmxlbmd0aH0gZW50cnkgbW9kdWxlKHMpYCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXModG9SZWJvb3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0dGhpcy5lbWl0KFwicmVib290XCIpO1xuXHRcdFx0fSB3aGlsZSAodGhpcy5yZWJvb3RGb2xsb3dVcCAmJiAhdGhpcy5kaXNwb3NlZCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGNvbnN0IG5lZWRzRm9sbG93VXAgPSB0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkO1xuXHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRcdFx0aWYgKG5lZWRzRm9sbG93VXApIHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmRpc3Bvc2VFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyeShlbnRyeVBhdGg/OiBzdHJpbmcpIHtcblx0XHRjb25zdCBwYXRocyA9IGVudHJ5UGF0aCAhPSBudWxsID8gW2VudHJ5UGF0aF0gOiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0Zm9yIChjb25zdCBwIG9mIHBhdGhzKSB7XG5cdFx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQocCk7XG5cdFx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgY29udGludWU7XG5cdFx0XHRjb25zdCBlbnRyeSA9IHN0YXRlLm1vZHVsZTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGVudHJ5Py5bU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFwiRW50cnkgYXN5bmNEaXNwb3NlIGZhaWxlZFwiLCBlcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8g4pSA4pSAIFNldHVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgcmVxdWlyZVdvcmtzcGFjZSgpOiBXb3Jrc3BhY2Uge1xuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMubG9hZGVyLmdldFdvcmtzcGFjZSgpO1xuXHRcdGlmICh3b3Jrc3BhY2UgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU291cmNlTW9kdWxlTG9hZGVyIGhhcyBubyB3b3Jrc3BhY2UgYWZ0ZXIgY29uZmlndXJlXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gd29ya3NwYWNlO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWc6IHN0cmluZywgb3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucyk6IFByb2plY3RbXSB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLmxvYWRlci5nZXRXb3Jrc3BhY2UoKT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IG5hbWVzID1cblx0XHRcdG9wdGlvbnMucHJvamVjdHMgIT0gbnVsbCAmJiBvcHRpb25zLnByb2plY3RzLmxlbmd0aCA+IDBcblx0XHRcdFx0PyBvcHRpb25zLnByb2plY3RzXG5cdFx0XHRcdDogb3B0aW9ucy5wcm9qZWN0ICE9IG51bGxcblx0XHRcdFx0XHQ/IFtvcHRpb25zLnByb2plY3RdXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHRpZiAobmFtZXMgPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgZmlyc3QgPSBwcm9qZWN0cy5hdCgwKTtcblx0XHRcdGlmIChmaXJzdCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7YnVpbGRDb25maWd9YCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gW2ZpcnN0XTtcblx0XHR9XG5cblx0XHRjb25zdCBzZWxlY3RlZDogUHJvamVjdFtdID0gW107XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG5cdFx0XHRjb25zdCBmb3VuZCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0XHRpZiAoZm91bmQgPT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFByb2plY3QgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIHdvcmtzcGFjZWApO1xuXHRcdFx0fVxuXHRcdFx0c2VsZWN0ZWQucHVzaChmb3VuZCk7XG5cdFx0fVxuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBQb3N0LW5leHQgZGVwZW5kZW5jeSB0cmFja2VyOiByZWNvcmRzIHdoaWNoIHNvdXJjZSBmaWxlcyBpbXBvcnQgd2hpY2hcblx0ICogb3RoZXIgc291cmNlIGZpbGVzIHNvIHRoYXQgcmVsb2FkSWZBZmZlY3RlZCBjYW4gdHJhdmVyc2UgdGhlIGdyYXBoLlxuXHQgKi9cblx0cHJpdmF0ZSBvblBvc3RSZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0bGV0IGZpbGVQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IHBhcmVudFBhdGg6IHN0cmluZztcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cdFx0XHR1cmxPYmouc2VhcmNoID0gXCJcIjtcblx0XHRcdGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aCh1cmxPYmoudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHBhcmVudFBhdGggPSBpby5maWxlVXJsVG9QYXRoKHBhcmVudFVybENsZWFuKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHBhcmVudFBhdGggPSBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5sb2FkZXIuaGFzU291cmNlRmlsZShmaWxlUGF0aCk7XG5cdFx0Y29uc3QgcGFyZW50SXNTb3VyY2UgPSB0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKHBhcmVudFBhdGgpO1xuXG5cdFx0aWYgKGlzU291cmNlIHx8IHBhcmVudElzU291cmNlKSB7XG5cdFx0XHR0aGlzLnRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aCwgcGFyZW50UGF0aCk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIOKUgOKUgCBGaWxlIHdhdGNoaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgb25GaWxlQ2hhbmdlID0gKGV2dDogUHJvamVjdEZpbGVFdmVudCkgPT4ge1xuXHRcdGNvbnN0IHsgZmlsZSwgZXZlbnROYW1lLCBwcm9qZWN0IH0gPSBldnQ7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBmaWxlLmZ1bGxQYXRoO1xuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYEZpbGUgJHtldmVudE5hbWV9OiAke2Z1bGxQYXRofWApO1xuXG5cdFx0aWYgKGV2ZW50TmFtZSA9PT0gaW8uV2F0Y2hFdmVudHMudW5saW5rKSB7XG5cdFx0XHR0aGlzLmxvYWRlci5pbnZhbGlkYXRlVHJhbnNwaWxlKGZ1bGxQYXRoKTtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy5hZGQpIHtcblx0XHRcdGlmIChwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkge1xuXHRcdFx0XHR0aGlzLmxvYWRlci5zZXRTb3VyY2VGaWxlKGZ1bGxQYXRoLCBwcm9qZWN0KTtcblx0XHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZnVsbFBhdGgsIG51bGwpO1xuXHRcdFx0XHR0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGNoYW5nZVxuXHRcdGlmICghcHJvamVjdC5pc1NvdXJjZUZpbGUoZmlsZSkpIHJldHVybjtcblx0XHR0aGlzLmxvYWRlci5pbnZhbGlkYXRlVHJhbnNwaWxlKGZ1bGxQYXRoKTtcblx0XHR0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpO1xuXHR9O1xuXG5cdHByaXZhdGUgcmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZGVwcyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGZ1bGxQYXRoKTtcblx0XHRjb25zdCBtb2R1bGVzID0gWy4uLm5ldyBTZXQoWy4uLmRlcHMsIGZ1bGxQYXRoXSldO1xuXHRcdGNvbnN0IGFmZmVjdGVkRW50cmllcyA9IFsuLi50aGlzLmVudHJpZXMua2V5cygpXS5maWx0ZXIoKGVudHJ5UGF0aCkgPT5cblx0XHRcdG1vZHVsZXMuaW5jbHVkZXMoZW50cnlQYXRoKSxcblx0XHQpO1xuXG5cdFx0aWYgKGFmZmVjdGVkRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gZG9lcyBub3QgYWZmZWN0IGVudHJ5IOKAlCBza2lwcGluZyByZWxvYWRgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gYWZmZWN0cyAke21vZHVsZXMubGVuZ3RofSBtb2R1bGUocykg4oCUIHNjaGVkdWxpbmcgcmVsb2FkYCxcblx0XHQpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZU1vZHVsZUNhY2hlcyguLi5tb2R1bGVzKTtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLnBlbmRpbmdHcmFwaFBydW5lLmFkZChtb2R1bGUpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGVudHJ5UGF0aCBvZiBhZmZlY3RlZEVudHJpZXMpIHtcblx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5hZGQoZW50cnlQYXRoKTtcblx0XHR9XG5cdFx0dGhpcy5zY2hlZHVsZVJlYm9vdCgpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8g4pSA4pSAIERlcGVuZGVuY3kgZ3JhcGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBnZXREZXBlbmRlbmN5R3JhcGgobW9kdWxlSWQ6IHN0cmluZywgcGFyZW50TW9kdWxlczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSByZXR1cm4gW107XG5cblx0XHRjb25zdCBtb2R1bGVEZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KG1vZHVsZUlkKSA/PyBbXTtcblx0XHRpZiAocGFyZW50TW9kdWxlcy5pbmNsdWRlcyhtb2R1bGVJZCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQ6ICR7bW9kdWxlSWR9YCk7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0bGV0IHN1YkRlcHM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBkZXAgb2YgbW9kdWxlRGVwcykge1xuXHRcdFx0aWYgKCF0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIFN0cmluZygrK21vZHVsZVZlcnNpb25TZXEpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVNb2R1bGVDYWNoZXMoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChtb2R1bGUsIG51bGwpO1xuXHRcdFx0dGhpcy5sb2FkZXIuaW52YWxpZGF0ZVRyYW5zcGlsZShtb2R1bGUpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcHJ1bmVQZW5kaW5nRGVwZW5kZW5jeUVkZ2VzKCkge1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4udGhpcy5wZW5kaW5nR3JhcGhQcnVuZV07XG5cdFx0dGhpcy5wZW5kaW5nR3JhcGhQcnVuZS5jbGVhcigpO1xuXHRcdHRoaXMucHJ1bmVEZXBlbmRlbmN5UGFyZW50cyguLi5tb2R1bGVzKTtcblx0fVxuXG5cdC8qKiBSZW1vdmUgdGhlc2UgbW9kdWxlcyBhcyBwYXJlbnRzIHNvIGJvb3QgY2FuIHJlYnVpbGQgZWRnZXMgd2l0aG91dCBzdGFsZSBpbXBvcnRlcnMuICovXG5cdHByaXZhdGUgcHJ1bmVEZXBlbmRlbmN5UGFyZW50cyguLi5tb2R1bGVzOiBzdHJpbmdbXSkge1xuXHRcdGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5sb2FkZXIuc291cmNlRmlsZVBhdGhzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGlzU2VsZihmaWxlUGF0aDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGN1cnJlbnRGaWxlUGF0aCA9PT0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkRFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TIiwiSG90UmVsb2FkU2VydmVyIiwicmVzb2x2ZVJlYm9vdERlYm91bmNlTXMiLCJjdXJyZW50RmlsZVBhdGgiLCJpbyIsImZpbGVVcmxUb1BhdGgiLCJWRVJTSU9OX1VSTF9QQVJBTSIsInZhbHVlIiwiZGVsYXkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsIkVycm9yIiwiU3RyaW5nIiwibW9kdWxlVmVyc2lvblNlcSIsIkV2ZW50RW1pdHRlciIsImxvZ2dlciIsInNjcmliZSIsIm5hbWUiLCJsb2FkZXIiLCJTb3VyY2VNb2R1bGVMb2FkZXIiLCJkaXNwb3NlZCIsImVudHJpZXMiLCJNYXAiLCJwZW5kaW5nRW50cnlSZWJvb3RzIiwiU2V0Iiwid2F0Y2hTdWJzY3JpcHRpb24iLCJtb2R1bGVDYWNoZSIsImRlcGVuZGVuY2llcyIsInJlYm9vdFRhaWwiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlYm9vdERlYm91bmNlR2VuIiwicmVib290SW5GbGlnaHQiLCJyZWJvb3RGb2xsb3dVcCIsInJlYm9vdFF1ZXVlZCIsInBlbmRpbmdHcmFwaFBydW5lIiwic2NoZWR1bGVSZWJvb3QiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsImJpbmRTY2hlZHVsZVJlYm9vdCIsInJlYm9vdERlYm91bmNlTXMiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyZSIsIndvcmtzcGFjZSIsInZlcnNpb25GaWxlVXJsIiwiZmlsZVVybCIsImdldENhY2hlZE9yTmV3Iiwib25SZXNvbHZlZCIsIm9uUG9zdFJlc29sdmUiLCJyZXF1aXJlV29ya3NwYWNlIiwic2VsZWN0ZWQiLCJyZXNvbHZlUHJvamVjdHMiLCJwcm9qZWN0IiwiZW50cnlQYXRoIiwicGF0aCIsImdldFNvdXJjZUVudHJ5UGF0aCIsInNldCIsInJlZ2lzdGVySG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJvbkZpbGVDaGFuZ2UiLCJlbnRyeSIsInZhbHVlcyIsInRyYWNlIiwiYm9vdEVudHJpZXMiLCJrZXlzIiwiZW1pdCIsImRpc3Bvc2UiLCJ1bnN1YnNjcmliZSIsImRpc3Bvc2VFbnRyaWVzIiwiU3ltYm9sIiwiYXN5bmNEaXNwb3NlIiwiZW50cnlQYXRocyIsImFsbCIsIm1hcCIsImJvb3RFbnRyeSIsInN0YXRlIiwiZ2V0IiwibW9kIiwiaW1wb3J0RW50cnkiLCJtb2R1bGUiLCJkZWZhdWx0IiwiZXJyb3IiLCJ1bmRlZmluZWQiLCJkZWxheU1zIiwiZ2VuIiwiZGVib3VuY2UiLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsInRvUmVib290Iiwic2l6ZSIsInBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcyIsImxlbmd0aCIsIm5lZWRzRm9sbG93VXAiLCJkaXNwb3NlRW50cnkiLCJwYXRocyIsInAiLCJnZXRXb3Jrc3BhY2UiLCJwcm9qZWN0cyIsImdldFByb2plY3RzIiwibmFtZXMiLCJmaXJzdCIsImF0IiwiZm91bmQiLCJmaW5kIiwicHVzaCIsInJlc3VsdCIsInBhcmVudFVybCIsInVybCIsInBhcmVudFVybENsZWFuIiwic3BsaXQiLCJmaWxlUGF0aCIsInBhcmVudFBhdGgiLCJ1cmxPYmoiLCJVUkwiLCJzZWFyY2giLCJ0b1N0cmluZyIsImlzU291cmNlIiwiaGFzU291cmNlRmlsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZXZ0IiwiZmlsZSIsImV2ZW50TmFtZSIsImZ1bGxQYXRoIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJpbnZhbGlkYXRlVHJhbnNwaWxlIiwiYWRkIiwiaXNTb3VyY2VGaWxlIiwic2V0U291cmNlRmlsZSIsInJlbG9hZElmQWZmZWN0ZWQiLCJkZXBzIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlcyIsImFmZmVjdGVkRW50cmllcyIsImZpbHRlciIsImluY2x1ZGVzIiwiaW52YWxpZGF0ZU1vZHVsZUNhY2hlcyIsIm1vZHVsZUlkIiwicGFyZW50TW9kdWxlcyIsImlzU2VsZiIsIm1vZHVsZURlcHMiLCJzdWJEZXBzIiwiZGVwIiwic3VicyIsInVwZGF0ZWREZXBzIiwibW9kdWxlVXJsIiwiY2FjaGVkIiwidmVyc2lvbmVkIiwidmVyc2lvbk1vZHVsZSIsInZlcnNpb25lZFVybCIsInNlYXJjaFBhcmFtcyIsInBydW5lRGVwZW5kZW5jeVBhcmVudHMiLCJrZXkiLCJwYXJlbnRzIiwiZmlsdGVyZWQiLCJkZWxldGUiLCJzb3VyY2VGaWxlUGF0aHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBYWFBO2VBQUFBOztRQTBDQUM7ZUFBQUE7O1FBeENHQztlQUFBQTs7OzRCQWZhO2lFQUVaO29CQUVFO3dCQUNNO3dCQUNXO29DQUVEOzs7Ozs7QUFFbkMsTUFBTUMsa0JBQWtCQyxNQUFFLENBQUNDLGFBQWEsQ0FBQztBQUN6QyxNQUFNQyxvQkFBb0I7QUFFbkIsTUFBTU4sNkJBQTZCO0FBRW5DLFNBQVNFLHdCQUF3QkssS0FBeUI7SUFDaEUsTUFBTUMsUUFBUUQsU0FBU1A7SUFDdkIsSUFBSSxDQUFDUyxPQUFPQyxRQUFRLENBQUNGLFVBQVVBLFFBQVEsR0FBRztRQUN6QyxNQUFNLElBQUlHLE1BQU0sQ0FBQyxvREFBb0QsRUFBRUMsT0FBT0wsUUFBUTtJQUN2RjtJQUNBLE9BQU9DO0FB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
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHR5cGUgRmlsZSwgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvc3lzdGVtXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgeyBhZGRSZXNvbHZlckhvb2ssIGluaXRNb2R1bGVIb29rcywgcmVtb3ZlUmVzb2x2ZXJIb29rIH0gZnJvbSBcIi4vaG90LW1vZHVsZS1ob29rcy5qc1wiO1xuXG5jb25zdCBjdXJyZW50RmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0cmVib290OiBbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGVudHJ5TW9kdWxlOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnk6IEFzeW5jRGlzcG9zYWJsZTtcblx0cHJpdmF0ZSBzb3VyY2VGaWxlczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSBtb2R1bGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPigpO1xuXHRwcml2YXRlIGRlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcblx0cHJpdmF0ZSB3YXRjaGVyczogUmV0dXJuVHlwZTx0eXBlb2YgaW8ud2F0Y2g+W10gPSBbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IobG9nZ2VyOiBMb2dnZXIpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIHN0YXJ0KGVudHJ5OiBzdHJpbmcsIC4uLndhdGNoRGlyczogc3RyaW5nW10pIHtcblx0XHR0aGlzLmVudHJ5TW9kdWxlID0gZW50cnk7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0U291cmNlRmlsZXMod2F0Y2hEaXJzKTtcblx0XHR0aGlzLmNvbmZpZ3VyZU1vZHVsZUhvb2tzKCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKTtcblx0XHRhd2FpdCB0aGlzLndhdGNoKHdhdGNoRGlycyk7XG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoXCJTZXJ2aW5nXCIsIGVudHJ5KTtcblx0XHR0aGlzLmxvZ2dlci50cmFjZShcIkhvdCByZWxvYWQgd2F0Y2hpbmdcIiwgd2F0Y2hEaXJzKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHRyZW1vdmVSZXNvbHZlckhvb2sodGhpcy5vblJlc29sdmUpO1xuXHRcdGZvciAoY29uc3Qgd2F0Y2hlciBvZiB0aGlzLndhdGNoZXJzKSB7XG5cdFx0XHR3YXRjaGVyLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJ5KCk7XG5cdH1cblxuXHRwcml2YXRlIHJlbW92ZVNvdXJjZUZpbGVzKC4uLnNvdXJjZUZpbGVzOiBzdHJpbmdbXSkge1xuXHRcdHRoaXMuc291cmNlRmlsZXMgPSB0aGlzLnNvdXJjZUZpbGVzLmZpbHRlcihcblx0XHRcdChzb3VyY2VGaWxlKSA9PiAhc291cmNlRmlsZXMuaW5jbHVkZXMoc291cmNlRmlsZSksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0U291cmNlRmlsZXMoZGlyczogc3RyaW5nW10pIHtcblx0XHRjb25zdCBwYXR0ZXJucyA9IGRpcnMubWFwKChkaXIpID0+IGAke2Rpcn0vKiovKi5qc2ApO1xuXHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgaW8uZmluZEZpbGVzKHBhdHRlcm5zKTtcblx0XHRyZXR1cm4gZmlsZXMubWFwKChmKSA9PiBmLmZ1bGxQYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgY29uZmlndXJlTW9kdWxlSG9va3MoKSB7XG5cdFx0aW5pdE1vZHVsZUhvb2tzKCk7XG5cdFx0YWRkUmVzb2x2ZXJIb29rKHRoaXMub25SZXNvbHZlKTtcblx0fVxuXG5cdHByaXZhdGUgb25SZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZSh1cmwpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZShwYXJlbnRVcmxDbGVhbik7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KHVybCwgcGFyZW50VXJsKTtcblx0XHR9XG5cblx0XHRpZiAoIWlzU291cmNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmVzdWx0LnVybCA9IHRoaXMuZ2V0Q2FjaGVkT3JOZXcodXJsKTtcblx0fTtcblxuXHRwcml2YXRlIGlzU291cmNlTW9kdWxlKHVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRyZXR1cm4gdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhwYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUdyYXBoKG1vZHVsZUlkOiBzdHJpbmcsIHBhcmVudE1vZHVsZXM6IHN0cmluZ1tdID0gW10pIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kdWxlRGVwcyA9IHRoaXMuZGVwZW5kZW5jaWVzLmdldChtb2R1bGVJZCkgPz8gW107XG5cdFx0aWYgKHBhcmVudE1vZHVsZXMuaW5jbHVkZXMobW9kdWxlSWQpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAke21vZHVsZUlkfWApO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGxldCBzdWJEZXBzID0gQXJyYXkub2Y8c3RyaW5nPigpO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIG1vZHVsZURlcHMpIHtcblx0XHRcdGlmICghdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeSh1cmw6IHN0cmluZywgcGFyZW50VXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRjb25zdCBwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdKTtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRDYWNoZWRPck5ldyhtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChtb2R1bGVVcmwpO1xuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMubW9kdWxlQ2FjaGUuZ2V0KGZpbGVQYXRoKTtcblx0XHRjb25zdCB2ZXJzaW9uZWQgPSBjYWNoZWQgPz8gdGhpcy52ZXJzaW9uTW9kdWxlKG1vZHVsZVVybCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZVBhdGgsIHZlcnNpb25lZCk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZDtcblx0fVxuXG5cdHByaXZhdGUgdmVyc2lvbk1vZHVsZShtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IHZlcnNpb25lZFVybCA9IG5ldyBVUkwobW9kdWxlVXJsKTtcblx0XHR2ZXJzaW9uZWRVcmwuc2VhcmNoUGFyYW1zLnNldChcInZlcnNpb25cIiwgRGF0ZS5ub3coKS50b1N0cmluZygpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIHdhdGNoID0gYXN5bmMgKGRpcnM6IHN0cmluZ1tdKSA9PiB7XG5cdFx0Zm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuXHRcdFx0Y29uc3Qgd2F0Y2hlciA9IGlvLndhdGNoKGRpciwgeyBpbmNsdWRlOiBbXCIqKi8qLmpzXCJdLCBpZ25vcmVJbml0aWFsOiB0cnVlIH0pO1xuXHRcdFx0d2F0Y2hlclxuXHRcdFx0XHQub24oXCJhZGRcIiwgdGhpcy5vbkZpbGVBZGRlZClcblx0XHRcdFx0Lm9uKFwiY2hhbmdlXCIsIHRoaXMub25Tb3VyY2VGaWxlQ2hhbmdlZClcblx0XHRcdFx0Lm9uKFwidW5saW5rXCIsIHRoaXMub25GaWxlRGVsZXRlZCk7XG5cdFx0XHR0aGlzLndhdGNoZXJzLnB1c2god2F0Y2hlcik7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlQWRkZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIG9uU291cmNlRmlsZUNoYW5nZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0aWYgKCF0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdFx0YCR7ZnVsbFBhdGh9IGlzIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IGRlcGVuZGVuY3kgZ3JhcGguIE5vdCByZWxvYWRpbmcgZW50cnkuYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlRGVsZXRlZCA9IGFzeW5jICh7IGZ1bGxQYXRoIH06IEZpbGUpID0+IHtcblx0XHR0aGlzLnJlbW92ZVNvdXJjZUZpbGVzKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXMpO1xuXHRcdHRoaXMuZGlzcG9zZUFuZEJvb3QoKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHByaXZhdGUgaXNTZWxmKHVybExpa2U6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShpby5maWxlVXJsVG9QYXRoKHVybExpa2UpKTtcblx0fVxuXG5cdHByaXZhdGUgaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHR9XG5cdFx0Ly8gUHJ1bmUgaW52YWxpZGF0ZWQgbW9kdWxlcyBmcm9tIGFsbCBwYXJlbnQgbGlzdHMgc28gc3RhbGUgcmVsYXRpb25zaGlwc1xuXHRcdC8vIGFyZSBjbGVhcmVkLiBUaGUgZnJlc2ggYm9vdCByZWJ1aWxkcyBvbmx5IHdoYXQgaXMgYWN0dWFsbHkgaW1wb3J0ZWQuXG5cdFx0Zm9yIChjb25zdCBbY2hpbGQsIHBhcmVudHNdIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG5cdFx0XHRjb25zdCBwcnVuZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gIW1vZHVsZXMuaW5jbHVkZXMocCkpO1xuXHRcdFx0aWYgKHBydW5lZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZGVsZXRlKGNoaWxkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChjaGlsZCwgcHJ1bmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpIHtcblx0XHRmb3IgKGNvbnN0IGZpbGUgb2YgdGhpcy5zb3VyY2VGaWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZSwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBkaXNwb3NlQW5kQm9vdCA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdH0sIDI1MCk7XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cnkoKSB7XG5cdFx0YXdhaXQgdGhpcy5lbnRyeT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeSgpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdmVyc2lvbiA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGUpKTtcblx0XHRcdHRoaXMuZW50cnkgPSAoYXdhaXQgaW1wb3J0KHZlcnNpb24pKT8uZGVmYXVsdDtcblx0XHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdGBUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZGAsXG5cdFx0XHRcdGVycm9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJIb3RSZWxvYWRTZXJ2ZXIiLCJjdXJyZW50RmlsZVBhdGgiLCJpbyIsImZpbGVVcmxUb1BhdGgiLCJFdmVudEVtaXR0ZXIiLCJsb2dnZXIiLCJkaXNwb3NlZCIsImVudHJ5TW9kdWxlIiwiZW50cnkiLCJzb3VyY2VGaWxlcyIsIm1vZHVsZUNhY2hlIiwiTWFwIiwiZGVwZW5kZW5jaWVzIiwid2F0Y2hlcnMiLCJzdGFydCIsIndhdGNoRGlycyIsImdldFNvdXJjZUZpbGVzIiwiY29uZmlndXJlTW9kdWxlSG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInRyYWNlIiwiYm9vdEVudHJ5IiwiZGlzcG9zZSIsInJlbW92ZVJlc29sdmVySG9vayIsIm9uUmVzb2x2ZSIsIndhdGNoZXIiLCJjbG9zZSIsImRpc3Bvc2VFbnRyeSIsInJlbW92ZVNvdXJjZUZpbGVzIiwiZmlsdGVyIiwic291cmNlRmlsZSIsImluY2x1ZGVzIiwiZGlycyIsInBhdHRlcm5zIiwibWFwIiwiZGlyIiwiZmlsZXMiLCJmaW5kRmlsZXMiLCJmIiwiZnVsbFBhdGgiLCJpbml0TW9kdWxlSG9va3MiLCJhZGRSZXNvbHZlckhvb2siLCJyZXN1bHQiLCJwYXJlbnRVcmwiLCJ1cmwiLCJwYXJlbnRVcmxDbGVhbiIsInNwbGl0IiwiaXNTb3VyY2UiLCJpc1NvdXJjZU1vZHVsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZ2V0Q2FjaGVkT3JOZXciLCJwYXRoIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsImdldCIsImVycm9yIiwic3ViRGVwcyIsIkFycmF5Iiwib2YiLCJkZXAiLCJzdWJzIiwiU2V0IiwiZmlsZVBhdGgiLCJwYXJlbnRQYXRoIiwiZGVwcyIsInVwZGF0ZWREZXBzIiwic2V0IiwibW9kdWxlVXJsIiwiY2FjaGVkIiwidmVyc2lvbmVkIiwidmVyc2lvbk1vZHVsZSIsInZlcnNpb25lZFVybCIsIlVSTCIsInNlYXJjaFBhcmFtcyIsIkRhdGUiLCJub3ciLCJ0b1N0cmluZyIsImluY2x1ZGUiLCJpZ25vcmVJbml0aWFsIiwib24iLCJvbkZpbGVBZGRlZCIsIm9uU291cmNlRmlsZUNoYW5nZWQiLCJvbkZpbGVEZWxldGVkIiwicHVzaCIsInJlbG9hZElmQWZmZWN0ZWQiLCJtb2R1bGVzIiwiaW52bGlkYXRlTW9kdWxlIiwiZGlzcG9zZUFuZEJvb3QiLCJ1cmxMaWtlIiwicmVzb2x2ZSIsIm1vZHVsZSIsImNoaWxkIiwicGFyZW50cyIsInBydW5lZCIsInAiLCJsZW5ndGgiLCJkZWxldGUiLCJmaWxlIiwiZGVib3VuY2UiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiLCJ2ZXJzaW9uIiwicGF0aFRvRmlsZVVybCIsImRlZmF1bHQiLCJlbWl0Il0sIm1hcHBpbmdzIjoiOzs7OytCQWNhQTs7O2VBQUFBOzs7NEJBZGdCO2lFQUVaO29CQUNhO3dCQUNMO2dDQUU0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFckUsTUFBTUMsa0JBQWtCQyxNQUFFLENBQUNDLGFBQWEsQ0FBQztBQU1sQyxNQUFNSCx3QkFBd0JJLHdCQUFZO0lBQy9CQyxPQUFlO0lBQ3hCQyxXQUFXLE1BQU07SUFDakJDLFlBQW9CO0lBQ3BCQyxNQUF1QjtJQUN2QkMsY0FBd0IsRUFBRSxDQUFDO0lBQzNCQyxjQUFjLElBQUlDLE1BQTZCO0lBQy9DQyxlQUFlLElBQUlELE1BQXdCO0lBQzNDRSxXQUEwQyxFQUFFLENBQUM7SUFFckQsWUFBbUJSLE1BQWMsQ0FBRTtRQUNsQyxLQUFLO1FBQ0wsSUFBSSxDQUFDQSxNQUFNLEdBQUdBO0lBQ2Y7SUFFQSxNQUFhUyxNQUFNTixLQUFhLEVBQUUsR0FBR08sU0FBbUIsRUFBRTtRQUN6RCxJQUFJLENBQUNSLFdBQVcsR0FBR0M7UUFDbkIsSUFBSSxDQUFDQyxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUNPLGNBQWMsQ0FBQ0Q7UUFDN0MsSUFBSSxDQUFDRSxvQkFBb0I7UUFDekIsSUFBSSxDQUFDQyx3QkFBd0I7UUFDN0IsTUFBTSxJQUFJLENBQUNDLEtBQUssQ0FBQ0o7UUFDakIsSUFBSSxDQUFDVixNQUFNLENBQUNlLEtBQUssQ0FBQyxXQUFXWjtRQUM3QixJQUFJLENBQUNILE1BQU0sQ0FBQ2UsS0FBSyxDQUFDLHVCQUF1Qkw7UUFDekMsTUFBTSxJQUFJLENBQUNNLFNBQVM7SUFDckI7SUFFQSxNQUFhQyxVQUFVO1FBQ3RCLElBQUksSUFBSSxDQUFDaEIsUUFBUSxFQUFFO1FBQ25CLElBQUksQ0FBQ0EsUUFBUSxHQUFHO1FBQ2hCaUIsSUFBQUEsa0NBQWtCLEVBQUMsSUFBSSxDQUFDQyxTQUFTO1FBQ2pDLEtBQUssTUFBTUMsV0FBVyxJQUFJLENBQUNaLFFBQVEsQ0FBRTtZQUNwQ1ksUUFBUUMsS0FBSztRQUNkO1FBQ0EsTUFBTSxJQUFJLENBQUNDLFlBQVk7SUFDeEI7SUFFUUMsa0JBQWtCLEdBQUduQixXQUFxQixFQUFFO1FBQ25ELElBQUksQ0FBQ0EsV0FBVyxHQUFHLElBQUksQ0FBQ0EsV0FBVyxDQUFDb0IsTUFBTSxDQUN6QyxDQUFDQyxhQUFlLENBQUNyQixZQUFZc0IsUUFBUSxDQUFDRDtJQUV4QztJQUVBLE1BQWNkLGVBQWVnQixJQUFjLEVBQUU7UUFDNUMsTUFBTUMsV0FBV0QsS0FBS0UsR0FBRyxDQUFDLENBQUNDLE1BQVEsR0FBR0EsSUFBSSxRQUFRLENBQUM7UUFDbkQsTUFBTUMsUUFBUSxNQUFNbEMsTUFBRSxDQUFDbUMsU0FBUyxDQUFDSjtRQUNqQyxPQUFPRyxNQUFNRixHQUFHLENBQUMsQ0FBQ0ksSUFBTUEsRUFBRUMsUUFBUTtJQUNuQztJQUVRdEIsdUJBQXVCO1FBQzlCdUIsSUFBQUEsK0JBQWU7UUFDZkMsSUFBQUEsK0JBQWUsRUFBQyxJQUFJLENBQUNqQixTQUFTO0lBQy9CO0lBRVFBLFlBQVksQ0FBQ2tCLFFBQXlCQztRQUM3QyxNQUFNLEVBQUVDLEdBQUcsRUFBRSxHQUFHRjtRQUNoQixNQUFNRyxpQkFBaUJGLFVBQVVHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM5QyxNQUFNQyxXQUFXLElBQUksQ0FBQ0MsY0FBYyxDQUFDSjtRQUNyQyxNQUFNSyxpQkFBaUIsSUFBSSxDQUFDRCxjQUFjLENBQUNIO1FBRTNDLElBQUlFLFlBQVlFLGdCQUFnQjtZQUMvQixJQUFJLENBQUNDLGVBQWUsQ0FBQ04sS0FBS0Q7UUFDM0I7UUFFQSxJQUFJLENBQUNJLFVBQVU7WUFDZDtRQUNEO1FBRUFMLE9BQU9FLEdBQUcsR0FBRyxJQUFJLENBQUNPLGNBQWMsQ0FBQ1A7SUFDbEMsRUFBRTtJQUVNSSxlQUFlSixHQUFXLEVBQUU7UUFDbkMsTUFBTVEsT0FBT2xELE1BQUUsQ0FBQ0MsYUFBYSxDQUFDeUM7UUFDOUIsT0FBTyxJQUFJLENBQUNuQyxXQUFXLENBQUNzQixRQUFRLENBQUNxQjtJQUNsQztJQUVRQyxtQkFBbUJDLFFBQWdCLEVBQUVDLGdCQUEwQixFQUFFLEVBQUU7UUFDMUUsSUFBSSxJQUFJLENBQUNDLE1BQU0sQ0FBQ0YsV0FBVztZQUMxQixPQUFPLEVBQUU7UUFDVjtRQUVBLE1BQU1HLGFBQWEsSUFBSSxDQUFDN0MsWUFBWSxDQUFDOEMsR0FBRyxDQUFDSixhQUFhLEVBQUU7UUFDeEQsSUFBSUMsY0FBY3hCLFFBQVEsQ0FBQ3VCLFdBQVc7WUFDckMsSUFBSSxDQUFDakQsTUFBTSxDQUFDc0QsS0FBSyxDQUFDLENBQUMsNkJBQTZCLEVBQUVMLFVBQVU7WUFDNUQsT0FBTyxFQUFFO1FBQ1Y7UUFFQSxJQUFJTSxVQUFVQyxNQUFNQyxFQUFFO1FBQ3RCLEtBQUssTUFBTUMsT0FBT04sV0FBWTtZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDaEQsV0FBVyxDQUFDc0IsUUFBUSxDQUFDZ0MsTUFBTTtZQUNyQyxNQUFNQyxPQUFPLElBQUksQ0FBQ1gsa0JBQWtCLENBQUNVLEtBQUs7Z0JBQUNUO21CQUFhQzthQUFjO1lBQ3RFSyxVQUFVO21CQUFJQTttQkFBWUk7YUFBSztRQUNoQztRQUVBLE9BQU87ZUFBSSxJQUFJQyxJQUFJO21CQUFJUjttQkFBZUc7YUFBUTtTQUFFO0lBQ2pEO0lBRVFWLGdCQUFnQk4sR0FBVyxFQUFFRCxTQUFpQixFQUFFO1FBQ3ZELE1BQU11QixXQUFXaEUsTUFBRSxDQUFDQyxhQUFhLENBQUN5QztRQUNsQyxNQUFNdUIsYUFBYWpFLE1BQUUsQ0FBQ0MsYUFBYSxDQUFDd0MsVUFBVUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzNELE1BQU1zQixPQUFPLElBQUksQ0FBQ3hELFlBQVksQ0FBQzhDLEdBQUcsQ0FBQ1EsYUFBYSxFQUFFO1FBQ2xELE1BQU1HLGNBQWMsSUFBSUosSUFBSTtlQUFJRztZQUFNRDtTQUFXO1FBQ2pELElBQUksQ0FBQ3ZELFlBQVksQ0FBQzBELEdBQUcsQ0FBQ0osVUFBVTtlQUFJRztTQUFZO0lBQ2pEO0lBRVFsQixlQUFlb0IsU0FBaUIsRUFBRTtRQUN6QyxNQUFNTCxXQUFXaEUsTUFBRSxDQUFDQyxhQUFhLENBQUNvRTtRQUNsQyxNQUFNQyxTQUFTLElBQUksQ0FBQzlELFdBQVcsQ0FBQ2dELEdBQUcsQ0FBQ1E7UUFDcEMsTUFBTU8sWUFBWUQsVUFBVSxJQUFJLENBQUNFLGFBQWEsQ0FBQ0g7UUFDL0MsSUFBSSxDQUFDN0QsV0FBVyxDQUFDNEQsR0FBRyxDQUFDSixVQUFVTztRQUMvQixPQUFPQTtJQUNSO0lBRVFDLGNBQWNILFNBQWlCLEVBQUU7UUFDeEMsTUFBTUksZUFBZSxJQUFJQyxJQUFJTDtRQUM3QkksYUFBYUUsWUFBWSxDQUFDUCxHQUFHLENBQUMsV0FBV1EsS0FBS0MsR0FBRyxHQUFHQyxRQUFRO1FBQzVELE9BQU9MLGFBQWFLLFFBQVE7SUFDN0I7SUFFUTdELFFBQVEsT0FBT2E7UUFDdEIsS0FBSyxNQUFNRyxPQUFPSCxLQUFNO1lBQ3ZCLE1BQU1QLFVBQVV2QixNQUFFLENBQUNpQixLQUFLLENBQUNnQixLQUFLO2dCQUFFOEMsU0FBUztvQkFBQztpQkFBVTtnQkFBRUMsZUFBZTtZQUFLO1lBQzFFekQsUUFDRTBELEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQ0MsV0FBVyxFQUMxQkQsRUFBRSxDQUFDLFVBQVUsSUFBSSxDQUFDRSxtQkFBbUIsRUFDckNGLEVBQUUsQ0FBQyxVQUFVLElBQUksQ0FBQ0csYUFBYTtZQUNqQyxJQUFJLENBQUN6RSxRQUFRLENBQUMwRSxJQUFJLENBQUM5RDtRQUNwQjtJQUNELEVBQUU7SUFFTTJELGNBQWMsT0FBTyxFQUFFN0MsUUFBUSxFQUFRO1FBQzlDLElBQUksQ0FBQzlCLFdBQVcsQ0FBQzhFLElBQUksQ0FBQ2hEO1FBQ3RCLElBQUksQ0FBQzdCLFdBQVcsQ0FBQzRELEdBQUcsQ0FBQy9CLFVBQVU7UUFDL0IsSUFBSSxDQUFDaUQsZ0JBQWdCLENBQUNqRDtJQUN2QixFQUFFO0lBRU04QyxzQkFBc0IsT0FBTyxFQUFFOUMsUUFBUSxFQUFRO1FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUNpRCxnQkFBZ0IsQ0FBQ2pELFdBQVc7WUFDckMsSUFBSSxDQUFDbEMsTUFBTSxDQUFDZSxLQUFLLENBQ2hCLEdBQUdtQixTQUFTLGtFQUFrRSxDQUFDO1FBRWpGO0lBQ0QsRUFBRTtJQUVNK0MsZ0JBQWdCLE9BQU8sRUFBRS9DLFFBQVEsRUFBUTtRQUNoRCxJQUFJLENBQUNYLGlCQUFpQixDQUFDVztJQUN4QixFQUFFO0lBRU1pRCxpQkFBaUJqRCxRQUFnQixFQUFXO1FBQ25ELE1BQU02QixPQUFPLElBQUksQ0FBQ2Ysa0JBQWtCLENBQUNkO1FBQ3JDLE1BQU1rRCxVQUFVO2VBQUksSUFBSXhCLElBQUk7bUJBQUlHO2dCQUFNN0I7YUFBUztTQUFFO1FBRWpELElBQUksQ0FBQ2tELFFBQVExRCxRQUFRLENBQUMsSUFBSSxDQUFDeEIsV0FBVyxHQUFHO1lBQ3hDLE9BQU87UUFDUjtRQUVBLElBQUksQ0FBQ21GLGVBQWUsSUFBSUQ7UUFDeEIsSUFBSSxDQUFDRSxjQUFjO1FBQ25CLE9BQU87SUFDUjtJQUVRbkMsT0FBT29DLE9BQWUsRUFBRTtRQUMvQixPQUFPM0Ysb0JBQW9CbUQsaUJBQUksQ0FBQ3lDLE9BQU8sQ0FBQzNGLE1BQUUsQ0FBQ0MsYUFBYSxDQUFDeUY7SUFDMUQ7SUFFUUYsZ0JBQWdCLEdBQUdELE9BQWlCLEVBQUU7UUFDN0MsS0FBSyxNQUFNSyxVQUFVTCxRQUFTO1lBQzdCLElBQUksQ0FBQy9FLFdBQVcsQ0FBQzRELEdBQUcsQ0FBQ3dCLFFBQVE7UUFDOUI7UUFDQSx5RUFBeUU7UUFDekUsdUVBQXVFO1FBQ3ZFLEtBQUssTUFBTSxDQUFDQyxPQUFPQyxRQUFRLElBQUksSUFBSSxDQUFDcEYsWUFBWSxDQUFFO1lBQ2pELE1BQU1xRixTQUFTRCxRQUFRbkUsTUFBTSxDQUFDLENBQUNxRSxJQUFNLENBQUNULFFBQVExRCxRQUFRLENBQUNtRTtZQUN2RCxJQUFJRCxPQUFPRSxNQUFNLEtBQUssR0FBRztnQkFDeEIsSUFBSSxDQUFDdkYsWUFBWSxDQUFDd0YsTUFBTSxDQUFDTDtZQUMxQixPQUFPO2dCQUNOLElBQUksQ0FBQ25GLFlBQVksQ0FBQzBELEdBQUcsQ0FBQ3lCLE9BQU9FO1lBQzlCO1FBQ0Q7SUFDRDtJQUVRL0UsMkJBQTJCO1FBQ2xDLEtBQUssTUFBTW1GLFFBQVEsSUFBSSxDQUFDNUYsV0FBVyxDQUFFO1lBQ3BDLElBQUksQ0FBQ0MsV0FBVyxDQUFDNEQsR0FBRyxDQUFDK0IsTUFBTTtRQUM1QjtJQUNEO0lBRVFWLGlCQUFpQlcsSUFBQUEsZ0JBQVEsRUFBQztRQUNqQyxNQUFNLElBQUksQ0FBQzNFLFlBQVk7UUFDdkIsTUFBTSxJQUFJLENBQUNOLFNBQVM7SUFDckIsR0FBRyxLQUFLO0lBRVIsTUFBY00sZUFBZTtRQUM1QixNQUFNLElBQUksQ0FBQ25CLEtBQUssRUFBRSxDQUFDK0YsT0FBT0MsWUFBWSxDQUFDO0lBQ3hDO0lBRUEsTUFBY25GLFlBQVk7UUFDekIsSUFBSTtZQUNILE1BQU1vRixVQUFVLElBQUksQ0FBQy9CLGFBQWEsQ0FBQ3hFLE1BQUUsQ0FBQ3dHLGFBQWEsQ0FBQyxJQUFJLENBQUNuRyxXQUFXO1lBQ3BFLElBQUksQ0FBQ0MsS0FBSyxHQUFJLENBQUEsTUFBTSxnQkFBT2lHLDJEQUFQLFlBQWMsR0FBSUU7WUFDdEMsSUFBSSxDQUFDQyxJQUFJLENBQUM7UUFDWCxFQUFFLE9BQU9qRCxPQUFPO1lBQ2YsSUFBSSxDQUFDdEQsTUFBTSxDQUFDc0QsS0FBSyxDQUNoQixDQUFDLHlGQUF5RixDQUFDLEVBQzNGQTtRQUVGO0lBQ0Q7QUFDRCJ9