@decohere/flux 0.0.1-dev.73 → 0.0.1-dev.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "DeferredScriptRunner", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return DeferredScriptRunner;
9
+ }
10
+ });
11
+ const _nodechild_process = require("node:child_process");
12
+ const _decorators = require("@decohere/crucible/decorators");
13
+ const _interop = require("@decohere/nexus/interop");
14
+ const _scribe = require("@decohere/scribe");
15
+ function _ts_decorate(decorators, target, key, desc) {
16
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
17
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
18
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
19
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
20
+ }
21
+ class DeferredScriptRunner {
22
+ logger = _scribe.scribe.logger(DeferredScriptRunner.name);
23
+ children = [];
24
+ start(options) {
25
+ const pm = (0, _interop.detectPackageManager)(options.workspaceRoot) ?? (0, _interop.packageManagerFromString)("pnpm");
26
+ this.logger.info(`deferred ${options.label} — running ${pm.name} run ${options.script} in ${options.cwd}`);
27
+ const child = (0, _nodechild_process.spawn)(pm.name, [
28
+ "run",
29
+ options.script
30
+ ], {
31
+ cwd: options.cwd,
32
+ stdio: "inherit",
33
+ env: process.env,
34
+ shell: false
35
+ });
36
+ child.on("exit", (code, signal)=>{
37
+ if (signal) return;
38
+ if (code != null && code !== 0) {
39
+ this.logger.warn(`deferred ${options.label} exited with ${code}`);
40
+ }
41
+ });
42
+ this.children.push(child);
43
+ return child;
44
+ }
45
+ async [Symbol.asyncDispose]() {
46
+ for (const child of this.children){
47
+ if (!child.killed) {
48
+ child.kill("SIGTERM");
49
+ }
50
+ }
51
+ this.children.length = 0;
52
+ }
53
+ }
54
+ DeferredScriptRunner = _ts_decorate([
55
+ (0, _decorators.injectable)()
56
+ ], DeferredScriptRunner);
57
+
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2RlZmVycmVkLXNjcmlwdC1ydW5uZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDaGlsZFByb2Nlc3MsIHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZGV0ZWN0UGFja2FnZU1hbmFnZXIsIHBhY2thZ2VNYW5hZ2VyRnJvbVN0cmluZyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW50ZXJvcFwiO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5cbmV4cG9ydCB0eXBlIERlZmVycmVkU2NyaXB0U3RhcnQgPSB7XG5cdHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuXHRyZWFkb25seSBzY3JpcHQ6IHN0cmluZztcblx0LyoqIFdvcmtzcGFjZSByb290IHVzZWQgdG8gZGV0ZWN0IHBucG0vbnBtL3lhcm4uICovXG5cdHJlYWRvbmx5IHdvcmtzcGFjZVJvb3Q6IHN0cmluZztcbn07XG5cbi8qKlxuICogTml4cGFja3Mtc3R5bGUgY2hpbGQgcHJvY2Vzc2VzIGZvciBmb3JlaWduIHBhY2thZ2VzIGluIGEgZmx1eCBzZXJ2ZSBzbGljZS5cbiAqIEtpbGxlZCB3aGVuIHRoZSBGbHV4IGNvbnRhaW5lciBkaXNwb3NlcyAoU0lHSU5UIOKGkiBSb290TW9kdWxlIHRlYXJkb3duKS5cbiAqL1xuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlZmVycmVkU2NyaXB0UnVubmVyIGltcGxlbWVudHMgQXN5bmNEaXNwb3NhYmxlIHtcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoRGVmZXJyZWRTY3JpcHRSdW5uZXIubmFtZSk7XG5cdHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW46IENoaWxkUHJvY2Vzc1tdID0gW107XG5cblx0cHVibGljIHN0YXJ0KG9wdGlvbnM6IERlZmVycmVkU2NyaXB0U3RhcnQpOiBDaGlsZFByb2Nlc3Mge1xuXHRcdGNvbnN0IHBtID0gZGV0ZWN0UGFja2FnZU1hbmFnZXIob3B0aW9ucy53b3Jrc3BhY2VSb290KSA/PyBwYWNrYWdlTWFuYWdlckZyb21TdHJpbmcoXCJwbnBtXCIpO1xuXHRcdHRoaXMubG9nZ2VyLmluZm8oXG5cdFx0XHRgZGVmZXJyZWQgJHtvcHRpb25zLmxhYmVsfSDigJQgcnVubmluZyAke3BtLm5hbWV9IHJ1biAke29wdGlvbnMuc2NyaXB0fSBpbiAke29wdGlvbnMuY3dkfWAsXG5cdFx0KTtcblx0XHRjb25zdCBjaGlsZCA9IHNwYXduKHBtLm5hbWUsIFtcInJ1blwiLCBvcHRpb25zLnNjcmlwdF0sIHtcblx0XHRcdGN3ZDogb3B0aW9ucy5jd2QsXG5cdFx0XHRzdGRpbzogXCJpbmhlcml0XCIsXG5cdFx0XHRlbnY6IHByb2Nlc3MuZW52LFxuXHRcdFx0c2hlbGw6IGZhbHNlLFxuXHRcdH0pO1xuXHRcdGNoaWxkLm9uKFwiZXhpdFwiLCAoY29kZSwgc2lnbmFsKSA9PiB7XG5cdFx0XHRpZiAoc2lnbmFsKSByZXR1cm47XG5cdFx0XHRpZiAoY29kZSAhPSBudWxsICYmIGNvZGUgIT09IDApIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIud2FybihgZGVmZXJyZWQgJHtvcHRpb25zLmxhYmVsfSBleGl0ZWQgd2l0aCAke2NvZGV9YCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0dGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcblx0XHRyZXR1cm4gY2hpbGQ7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuXHRcdGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuXHRcdFx0aWYgKCFjaGlsZC5raWxsZWQpIHtcblx0XHRcdFx0Y2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gMDtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkRlZmVycmVkU2NyaXB0UnVubmVyIiwibG9nZ2VyIiwic2NyaWJlIiwibmFtZSIsImNoaWxkcmVuIiwic3RhcnQiLCJvcHRpb25zIiwicG0iLCJkZXRlY3RQYWNrYWdlTWFuYWdlciIsIndvcmtzcGFjZVJvb3QiLCJwYWNrYWdlTWFuYWdlckZyb21TdHJpbmciLCJpbmZvIiwibGFiZWwiLCJzY3JpcHQiLCJjd2QiLCJjaGlsZCIsInNwYXduIiwic3RkaW8iLCJlbnYiLCJwcm9jZXNzIiwic2hlbGwiLCJvbiIsImNvZGUiLCJzaWduYWwiLCJ3YXJuIiwicHVzaCIsIlN5bWJvbCIsImFzeW5jRGlzcG9zZSIsImtpbGxlZCIsImtpbGwiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiI7Ozs7K0JBa0JhQTs7O2VBQUFBOzs7bUNBbEI0Qjs0QkFDZDt5QkFDb0M7d0JBQzNCOzs7Ozs7O0FBZTdCLE1BQU1BO0lBQ0tDLFNBQWlCQyxjQUFNLENBQUNELE1BQU0sQ0FBQ0QscUJBQXFCRyxJQUFJLEVBQUU7SUFDMURDLFdBQTJCLEVBQUUsQ0FBQztJQUV4Q0MsTUFBTUMsT0FBNEIsRUFBZ0I7UUFDeEQsTUFBTUMsS0FBS0MsSUFBQUEsNkJBQW9CLEVBQUNGLFFBQVFHLGFBQWEsS0FBS0MsSUFBQUEsaUNBQXdCLEVBQUM7UUFDbkYsSUFBSSxDQUFDVCxNQUFNLENBQUNVLElBQUksQ0FDZixDQUFDLFNBQVMsRUFBRUwsUUFBUU0sS0FBSyxDQUFDLFdBQVcsRUFBRUwsR0FBR0osSUFBSSxDQUFDLEtBQUssRUFBRUcsUUFBUU8sTUFBTSxDQUFDLElBQUksRUFBRVAsUUFBUVEsR0FBRyxFQUFFO1FBRXpGLE1BQU1DLFFBQVFDLElBQUFBLHdCQUFLLEVBQUNULEdBQUdKLElBQUksRUFBRTtZQUFDO1lBQU9HLFFBQVFPLE1BQU07U0FBQyxFQUFFO1lBQ3JEQyxLQUFLUixRQUFRUSxHQUFHO1lBQ2hCRyxPQUFPO1lBQ1BDLEtBQUtDLFFBQVFELEdBQUc7WUFDaEJFLE9BQU87UUFDUjtRQUNBTCxNQUFNTSxFQUFFLENBQUMsUUFBUSxDQUFDQyxNQUFNQztZQUN2QixJQUFJQSxRQUFRO1lBQ1osSUFBSUQsUUFBUSxRQUFRQSxTQUFTLEdBQUc7Z0JBQy9CLElBQUksQ0FBQ3JCLE1BQU0sQ0FBQ3VCLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRWxCLFFBQVFNLEtBQUssQ0FBQyxhQUFhLEVBQUVVLE1BQU07WUFDakU7UUFDRDtRQUNBLElBQUksQ0FBQ2xCLFFBQVEsQ0FBQ3FCLElBQUksQ0FBQ1Y7UUFDbkIsT0FBT0E7SUFDUjtJQUVBLE1BQWEsQ0FBQ1csT0FBT0MsWUFBWSxDQUFDLEdBQUc7UUFDcEMsS0FBSyxNQUFNWixTQUFTLElBQUksQ0FBQ1gsUUFBUSxDQUFFO1lBQ2xDLElBQUksQ0FBQ1csTUFBTWEsTUFBTSxFQUFFO2dCQUNsQmIsTUFBTWMsSUFBSSxDQUFDO1lBQ1o7UUFDRDtRQUNBLElBQUksQ0FBQ3pCLFFBQVEsQ0FBQzBCLE1BQU0sR0FBRztJQUN4QjtBQUNEIn0=
@@ -10,6 +10,7 @@ Object.defineProperty(exports, "FluxModule", {
10
10
  });
11
11
  const _mesh = require("@decohere/mesh");
12
12
  const _cli = require("@decohere/nexus/cli");
13
+ const _deferredscriptrunner = require("./deferred-script-runner.js");
13
14
  const _fluxcommand = require("./flux.command.js");
14
15
  const _hotreloadserver = require("./hot-reload-server.js");
15
16
  const _serveaction = require("./serve.action.js");
@@ -21,6 +22,7 @@ class FluxModule extends _cli.ModuleManifest {
21
22
  };
22
23
  registerServices(builder) {
23
24
  builder.registerSingleton(_hotreloadserver.HotReloadServer);
25
+ builder.registerSingleton(_deferredscriptrunner.DeferredScriptRunner);
24
26
  }
25
27
  createWorkspace(options) {
26
28
  return _mesh.WorkspaceFactory.create({
@@ -29,4 +31,4 @@ class FluxModule extends _cli.ModuleManifest {
29
31
  }
30
32
  }
31
33
 
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2ZsdXgubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtzcGFjZUZhY3RvcnkgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlRmFjdG9yeU9wdGlvbnMgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgTW9kdWxlTWFuaWZlc3QgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHR5cGUgeyBDb250YWluZXJCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jb21wb3NpdGlvblwiO1xuaW1wb3J0IHsgRmx1eENvbW1hbmQgfSBmcm9tIFwiLi9mbHV4LmNvbW1hbmQuanNcIjtcbmltcG9ydCB7IEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5pbXBvcnQgeyBTZXJ2ZUFjdGlvbiB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuXG5leHBvcnQgY2xhc3MgRmx1eE1vZHVsZSBleHRlbmRzIE1vZHVsZU1hbmlmZXN0IHtcblx0cHVibGljIHJlYWRvbmx5IGlkID0gXCJmbHV4XCI7XG5cdHB1YmxpYyByZWFkb25seSBjb21tYW5kID0gRmx1eENvbW1hbmQ7XG5cdHB1YmxpYyByZWFkb25seSBhY3Rpb25zID0ge1xuXHRcdHNlcnZlOiBTZXJ2ZUFjdGlvbixcblx0fTtcblxuXHRwdWJsaWMgcmVnaXN0ZXJTZXJ2aWNlcyhidWlsZGVyOiBDb250YWluZXJCdWlsZGVyKSB7XG5cdFx0YnVpbGRlci5yZWdpc3RlclNpbmdsZXRvbihIb3RSZWxvYWRTZXJ2ZXIpO1xuXHR9XG5cblx0cHVibGljIG92ZXJyaWRlIGNyZWF0ZVdvcmtzcGFjZShvcHRpb25zOiBXb3Jrc3BhY2VGYWN0b3J5T3B0aW9ucykge1xuXHRcdHJldHVybiBXb3Jrc3BhY2VGYWN0b3J5LmNyZWF0ZSh7IGNvbmZpZ0ZpbGU6IG9wdGlvbnMuY29uZmlnRmlsZSB9KTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkZsdXhNb2R1bGUiLCJNb2R1bGVNYW5pZmVzdCIsImlkIiwiY29tbWFuZCIsIkZsdXhDb21tYW5kIiwiYWN0aW9ucyIsInNlcnZlIiwiU2VydmVBY3Rpb24iLCJyZWdpc3RlclNlcnZpY2VzIiwiYnVpbGRlciIsInJlZ2lzdGVyU2luZ2xldG9uIiwiSG90UmVsb2FkU2VydmVyIiwiY3JlYXRlV29ya3NwYWNlIiwib3B0aW9ucyIsIldvcmtzcGFjZUZhY3RvcnkiLCJjcmVhdGUiLCJjb25maWdGaWxlIl0sIm1hcHBpbmdzIjoiOzs7OytCQVFhQTs7O2VBQUFBOzs7c0JBUm9CO3FCQUVGOzZCQUVIO2lDQUNJOzZCQUNKO0FBRXJCLE1BQU1BLG1CQUFtQkMsbUJBQWM7SUFDN0JDLEtBQUssT0FBTztJQUNaQyxVQUFVQyx3QkFBVyxDQUFDO0lBQ3RCQyxVQUFVO1FBQ3pCQyxPQUFPQyx3QkFBVztJQUNuQixFQUFFO0lBRUtDLGlCQUFpQkMsT0FBeUIsRUFBRTtRQUNsREEsUUFBUUMsaUJBQWlCLENBQUNDLGdDQUFlO0lBQzFDO0lBRWdCQyxnQkFBZ0JDLE9BQWdDLEVBQUU7UUFDakUsT0FBT0Msc0JBQWdCLENBQUNDLE1BQU0sQ0FBQztZQUFFQyxZQUFZSCxRQUFRRyxVQUFVO1FBQUM7SUFDakU7QUFDRCJ9
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2ZsdXgubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtzcGFjZUZhY3RvcnkgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlRmFjdG9yeU9wdGlvbnMgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgTW9kdWxlTWFuaWZlc3QgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHR5cGUgeyBDb250YWluZXJCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jb21wb3NpdGlvblwiO1xuaW1wb3J0IHsgRGVmZXJyZWRTY3JpcHRSdW5uZXIgfSBmcm9tIFwiLi9kZWZlcnJlZC1zY3JpcHQtcnVubmVyLmpzXCI7XG5pbXBvcnQgeyBGbHV4Q29tbWFuZCB9IGZyb20gXCIuL2ZsdXguY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgSG90UmVsb2FkU2VydmVyIH0gZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmltcG9ydCB7IFNlcnZlQWN0aW9uIH0gZnJvbSBcIi4vc2VydmUuYWN0aW9uLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBGbHV4TW9kdWxlIGV4dGVuZHMgTW9kdWxlTWFuaWZlc3Qge1xuXHRwdWJsaWMgcmVhZG9ubHkgaWQgPSBcImZsdXhcIjtcblx0cHVibGljIHJlYWRvbmx5IGNvbW1hbmQgPSBGbHV4Q29tbWFuZDtcblx0cHVibGljIHJlYWRvbmx5IGFjdGlvbnMgPSB7XG5cdFx0c2VydmU6IFNlcnZlQWN0aW9uLFxuXHR9O1xuXG5cdHB1YmxpYyByZWdpc3RlclNlcnZpY2VzKGJ1aWxkZXI6IENvbnRhaW5lckJ1aWxkZXIpIHtcblx0XHRidWlsZGVyLnJlZ2lzdGVyU2luZ2xldG9uKEhvdFJlbG9hZFNlcnZlcik7XG5cdFx0YnVpbGRlci5yZWdpc3RlclNpbmdsZXRvbihEZWZlcnJlZFNjcmlwdFJ1bm5lcik7XG5cdH1cblxuXHRwdWJsaWMgb3ZlcnJpZGUgY3JlYXRlV29ya3NwYWNlKG9wdGlvbnM6IFdvcmtzcGFjZUZhY3RvcnlPcHRpb25zKSB7XG5cdFx0cmV0dXJuIFdvcmtzcGFjZUZhY3RvcnkuY3JlYXRlKHsgY29uZmlnRmlsZTogb3B0aW9ucy5jb25maWdGaWxlIH0pO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiRmx1eE1vZHVsZSIsIk1vZHVsZU1hbmlmZXN0IiwiaWQiLCJjb21tYW5kIiwiRmx1eENvbW1hbmQiLCJhY3Rpb25zIiwic2VydmUiLCJTZXJ2ZUFjdGlvbiIsInJlZ2lzdGVyU2VydmljZXMiLCJidWlsZGVyIiwicmVnaXN0ZXJTaW5nbGV0b24iLCJIb3RSZWxvYWRTZXJ2ZXIiLCJEZWZlcnJlZFNjcmlwdFJ1bm5lciIsImNyZWF0ZVdvcmtzcGFjZSIsIm9wdGlvbnMiLCJXb3Jrc3BhY2VGYWN0b3J5IiwiY3JlYXRlIiwiY29uZmlnRmlsZSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFTYUE7OztlQUFBQTs7O3NCQVRvQjtxQkFFRjtzQ0FFTTs2QkFDVDtpQ0FDSTs2QkFDSjtBQUVyQixNQUFNQSxtQkFBbUJDLG1CQUFjO0lBQzdCQyxLQUFLLE9BQU87SUFDWkMsVUFBVUMsd0JBQVcsQ0FBQztJQUN0QkMsVUFBVTtRQUN6QkMsT0FBT0Msd0JBQVc7SUFDbkIsRUFBRTtJQUVLQyxpQkFBaUJDLE9BQXlCLEVBQUU7UUFDbERBLFFBQVFDLGlCQUFpQixDQUFDQyxnQ0FBZTtRQUN6Q0YsUUFBUUMsaUJBQWlCLENBQUNFLDBDQUFvQjtJQUMvQztJQUVnQkMsZ0JBQWdCQyxPQUFnQyxFQUFFO1FBQ2pFLE9BQU9DLHNCQUFnQixDQUFDQyxNQUFNLENBQUM7WUFBRUMsWUFBWUgsUUFBUUcsVUFBVTtRQUFDO0lBQ2pFO0FBQ0QifQ==
@@ -90,8 +90,8 @@ class HotReloadServer extends _nodeevents.EventEmitter {
90
90
  logger = _scribe.scribe.logger(HotReloadServer.name);
91
91
  disposed = false;
92
92
  hooksRegistered = false;
93
- entryModulePath;
94
- entryModule;
93
+ /** Absolute entry paths currently served (one or more Flux apps). */ entries = new Map();
94
+ pendingEntryReboots = new Set();
95
95
  workspace;
96
96
  buildConfig = "debug";
97
97
  watchSubscription;
@@ -114,6 +114,8 @@ class HotReloadServer extends _nodeevents.EventEmitter {
114
114
  this.dependencies.clear();
115
115
  this.moduleCache.clear();
116
116
  this.transpileCache.clear();
117
+ this.entries.clear();
118
+ this.pendingEntryReboots.clear();
117
119
  this.rebootTail = Promise.resolve();
118
120
  this.rebootInFlight = false;
119
121
  this.rebootFollowUp = false;
@@ -122,16 +124,25 @@ class HotReloadServer extends _nodeevents.EventEmitter {
122
124
  const { buildConfig } = options;
123
125
  this.buildConfig = buildConfig;
124
126
  this.workspace = await this.resolveWorkspace(options);
125
- const project = this.resolveProject(buildConfig, options.project);
126
- this.entryModulePath = _nodepath.default.resolve(project.getSourceEntryPath());
127
+ const selected = this.resolveProjects(buildConfig, options);
128
+ for (const project of selected){
129
+ const entryPath = _nodepath.default.resolve(project.getSourceEntryPath());
130
+ this.entries.set(entryPath, {
131
+ path: entryPath
132
+ });
133
+ }
127
134
  this.fileInfoMap = await this.buildFileInfoMap(buildConfig);
128
135
  this.aliasPaths = await this.buildAliasPaths();
129
136
  this.registerHooks();
130
137
  this.invalidateAllSourceFiles();
131
138
  await this.workspace.watch(buildConfig);
132
139
  this.watchSubscription = this.workspace.projectFileChanged$.subscribe(this.onFileChange);
133
- this.logger.trace(`Serving ${this.entryModulePath}`);
134
- await this.bootEntry();
140
+ for (const entry of this.entries.values()){
141
+ this.logger.trace(`Serving ${entry.path}`);
142
+ }
143
+ await this.bootEntries([
144
+ ...this.entries.keys()
145
+ ]);
135
146
  this.emit("start");
136
147
  }
137
148
  async dispose() {
@@ -141,18 +152,25 @@ class HotReloadServer extends _nodeevents.EventEmitter {
141
152
  this.watchSubscription?.unsubscribe();
142
153
  this.workspace?.[Symbol.dispose]();
143
154
  await this.rebootTail;
144
- await this.disposeEntry();
155
+ await this.disposeEntries([
156
+ ...this.entries.keys()
157
+ ]);
145
158
  }
146
159
  async [Symbol.asyncDispose]() {
147
160
  await this.dispose();
148
161
  }
149
162
  // ── Lifecycle ────────────────────────────────────────────────────────────
150
- async bootEntry() {
163
+ async bootEntries(entryPaths) {
164
+ await Promise.all(entryPaths.map((entryPath)=>this.bootEntry(entryPath)));
165
+ }
166
+ async bootEntry(entryPath) {
167
+ const state = this.entries.get(entryPath);
168
+ if (state == null) return;
151
169
  try {
152
- const url = this.versionModule(_io.io.pathToFileUrl(this.entryModulePath));
153
- this.entryModule = (await Promise.resolve(url).then((p)=>/*#__PURE__*/ _interop_require_wildcard(require(p))))?.default;
170
+ const url = this.versionModule(_io.io.pathToFileUrl(entryPath));
171
+ state.module = (await Promise.resolve(url).then((p)=>/*#__PURE__*/ _interop_require_wildcard(require(p))))?.default;
154
172
  } catch (error) {
155
- this.entryModule = undefined;
173
+ state.module = undefined;
156
174
  this.logger.error("There was an error booting the entry point. Your application may not function as expected", error);
157
175
  }
158
176
  }
@@ -181,9 +199,15 @@ class HotReloadServer extends _nodeevents.EventEmitter {
181
199
  do {
182
200
  this.rebootFollowUp = false;
183
201
  if (this.disposed) return;
184
- this.logger.trace("Rebooting entry module");
185
- await this.disposeEntry();
186
- await this.bootEntry();
202
+ const toReboot = this.pendingEntryReboots.size > 0 ? [
203
+ ...this.pendingEntryReboots
204
+ ] : [
205
+ ...this.entries.keys()
206
+ ];
207
+ this.pendingEntryReboots.clear();
208
+ this.logger.trace(`Rebooting ${toReboot.length} entry module(s)`);
209
+ await this.disposeEntries(toReboot);
210
+ await this.bootEntries(toReboot);
187
211
  this.emit("reboot");
188
212
  }while (this.rebootFollowUp && !this.disposed)
189
213
  } finally{
@@ -193,13 +217,25 @@ class HotReloadServer extends _nodeevents.EventEmitter {
193
217
  if (needsFollowUp) this.requestReboot();
194
218
  }
195
219
  }
196
- async disposeEntry() {
197
- const entry = this.entryModule;
198
- this.entryModule = undefined;
199
- try {
200
- await entry?.[Symbol.asyncDispose]();
201
- } catch (error) {
202
- this.logger.error("Entry asyncDispose failed", error);
220
+ async disposeEntries(entryPaths) {
221
+ await Promise.all(entryPaths.map((entryPath)=>this.disposeEntry(entryPath)));
222
+ }
223
+ async disposeEntry(entryPath) {
224
+ const paths = entryPath != null ? [
225
+ entryPath
226
+ ] : [
227
+ ...this.entries.keys()
228
+ ];
229
+ for (const p of paths){
230
+ const state = this.entries.get(p);
231
+ if (state == null) continue;
232
+ const entry = state.module;
233
+ state.module = undefined;
234
+ try {
235
+ await entry?.[Symbol.asyncDispose]();
236
+ } catch (error) {
237
+ this.logger.error("Entry asyncDispose failed", error);
238
+ }
203
239
  }
204
240
  }
205
241
  // ── Setup ────────────────────────────────────────────────────────────────
@@ -209,13 +245,29 @@ class HotReloadServer extends _nodeevents.EventEmitter {
209
245
  rootDir: process.cwd()
210
246
  });
211
247
  }
212
- resolveProject(buildConfig, name) {
248
+ resolveProjects(buildConfig, options) {
213
249
  const projects = this.workspace?.getProjects(buildConfig) ?? [];
214
- const found = name == null ? projects.at(0) : projects.find((p)=>p.name === name);
215
- if (found == null) {
216
- throw new Error(name == null ? `No projects found for configuration: ${buildConfig}` : `Project "${name}" not found in workspace`);
250
+ const names = options.projects != null && options.projects.length > 0 ? options.projects : options.project != null ? [
251
+ options.project
252
+ ] : undefined;
253
+ if (names == null) {
254
+ const first = projects.at(0);
255
+ if (first == null) {
256
+ throw new Error(`No projects found for configuration: ${buildConfig}`);
257
+ }
258
+ return [
259
+ first
260
+ ];
217
261
  }
218
- return found;
262
+ const selected = [];
263
+ for (const name of names){
264
+ const found = projects.find((p)=>p.name === name);
265
+ if (found == null) {
266
+ throw new Error(`Project "${name}" not found in workspace`);
267
+ }
268
+ selected.push(found);
269
+ }
270
+ return selected;
219
271
  }
220
272
  async buildFileInfoMap(buildConfig) {
221
273
  const projects = this.workspace?.getProjects(buildConfig) ?? [];
@@ -363,12 +415,18 @@ class HotReloadServer extends _nodeevents.EventEmitter {
363
415
  fullPath
364
416
  ])
365
417
  ];
366
- if (!modules.includes(this.entryModulePath)) {
418
+ const affectedEntries = [
419
+ ...this.entries.keys()
420
+ ].filter((entryPath)=>modules.includes(entryPath));
421
+ if (affectedEntries.length === 0) {
367
422
  this.logger.trace(`Change in ${fullPath} does not affect entry — skipping reload`);
368
423
  return false;
369
424
  }
370
425
  this.logger.trace(`Change in ${fullPath} affects ${modules.length} module(s) — scheduling reload`);
371
426
  this.invalidateModule(...modules);
427
+ for (const entryPath of affectedEntries){
428
+ this.pendingEntryReboots.add(entryPath);
429
+ }
372
430
  this.scheduleReboot();
373
431
  return true;
374
432
  }
@@ -449,4 +507,4 @@ class HotReloadServer extends _nodeevents.EventEmitter {
449
507
  }
450
508
  }
451
509
 
452
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuXHRMb2FkRm5PdXRwdXQsXG5cdExvYWRIb29rQ29udGV4dCxcblx0UmVzb2x2ZUZuT3V0cHV0LFxuXHRSZXNvbHZlSG9va0NvbnRleHQsXG59IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQnVpbGRUYXJnZXRzLCBTd2NUcmFuc3BpbGVyLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBwYWNrYWdlQWxpYXNlcywgV29ya3NwYWNlRmFjdG9yeSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgRmlsZUV4LCBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgcmV3cml0ZVNlcnZlU3BlY2lmaWVyIH0gZnJvbSBcIi4vcmV3cml0ZS1zZXJ2ZS1zcGVjaWZpZXIuanNcIjtcblxudHlwZSBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHsgc291cmNlOiBzdHJpbmcgfSB8IG51bGw7XG5cbmNvbnN0IGN1cnJlbnRGaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IFZFUlNJT05fVVJMX1BBUkFNID0gXCJ2ZXJzaW9uXCI7XG4vKiogRGVmYXVsdCBxdWlldCB3aW5kb3cgYmVmb3JlIGEgZmlsZS1jaGFuZ2UgcmVib290LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TID0gMjUwO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlYm9vdERlYm91bmNlTXModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG5cdGNvbnN0IGRlbGF5ID0gdmFsdWUgPz8gREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVM7XG5cdGlmICghTnVtYmVyLmlzRmluaXRlKGRlbGF5KSB8fCBkZWxheSA8IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHJlYm9vdERlYm91bmNlTXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIGdvdCAke1N0cmluZyh2YWx1ZSl9YCk7XG5cdH1cblx0cmV0dXJuIGRlbGF5O1xufVxuXG4vKiogUHJvY2Vzcy13aWRlOiBOb2RlJ3MgRVNNIGNhY2hlIGlzIHByb2Nlc3MtZ2xvYmFsLCBpbmNsdWRpbmcgYWNyb3NzIEhvdFJlbG9hZFNlcnZlciBpbnN0YW5jZXMuICovXG5sZXQgbW9kdWxlVmVyc2lvblNlcSA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0c3RhcnQ6IFtdO1xuXHRyZWJvb3Q6IFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlck9wdGlvbnMge1xuXHQvKiogQnVpbGQgY29uZmlndXJhdGlvbiBuYW1lLiAqL1xuXHRidWlsZENvbmZpZzogc3RyaW5nO1xuXHQvKiogTmFtZSBvZiB0aGUgcHJvamVjdCB0byBzZXJ2ZS4gRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4gKi9cblx0cHJvamVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIFByZS1idWlsdCBXb3Jrc3BhY2UgaW5zdGFuY2UgdG8gdXNlIGluc3RlYWQgb2YgcnVubmluZyBXb3Jrc3BhY2VGYWN0b3J5LlxuXHQgKiBVc2VmdWwgaW4gdGVzdHMgdG8gYnlwYXNzIGZpbGVzeXN0ZW0tYmFzZWQgd29ya3NwYWNlIGRpc2NvdmVyeS5cblx0ICovXG5cdHdvcmtzcGFjZT86IFdvcmtzcGFjZTtcblx0LyoqXG5cdCAqIFF1aWV0IHdpbmRvdyBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhlIGxhc3QgYWZmZWN0aW5nIHNhdmUgYmVmb3JlIGEgcmVib290LlxuXHQgKiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVN9LiBSYWlzZSB0aGlzIGZvciBhZ2VudCBzYXZlIHRyYWlucy5cblx0ICovXG5cdHJlYm9vdERlYm91bmNlTXM/OiBudW1iZXI7XG59XG5cbnR5cGUgRmlsZUluZm8gPSB7IHByb2plY3Q6IFByb2plY3QgfTtcblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0Ly8g4pSA4pSAIFN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXHRwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihIb3RSZWxvYWRTZXJ2ZXIubmFtZSk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBob29rc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBlbnRyeU1vZHVsZVBhdGghOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnlNb2R1bGU/OiBBc3luY0Rpc3Bvc2FibGU7XG5cdHByaXZhdGUgd29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHRwcml2YXRlIGJ1aWxkQ29uZmlnID0gXCJkZWJ1Z1wiO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHQvKiogTWFwIGZyb20gYWJzb2x1dGUgLnRzIHNvdXJjZSBmaWxlIHBhdGggdG8gcHJvamVjdCBpbmZvICovXG5cdHByaXZhdGUgZmlsZUluZm9NYXAgPSBuZXcgTWFwPHN0cmluZywgRmlsZUluZm8+KCk7XG5cdHByaXZhdGUgbW9kdWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcblx0cHJpdmF0ZSBkZXBlbmRlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cdHByaXZhdGUgdHJhbnNwaWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXHRwcml2YXRlIHRyYW5zcGlsZXIgPSBuZXcgU3djVHJhbnNwaWxlcigpO1xuXHRwcml2YXRlIGFsaWFzUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXHRwcml2YXRlIGFsaWFzQmFzZVVybCA9IHBhdGgucmVzb2x2ZShcIi5cIik7XG5cdHByaXZhdGUgcmVib290VGFpbDogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRwcml2YXRlIHJlYm9vdERlYm91bmNlR2VuID0gMDtcblx0cHJpdmF0ZSByZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdHByaXZhdGUgcmVib290UXVldWVkID0gZmFsc2U7XG5cdHByaXZhdGUgc2NoZWR1bGVSZWJvb3Q6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuXHQvLyDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwdWJsaWMgYXN5bmMgc3RhcnQob3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucykge1xuXHRcdHRoaXMuZGlzcG9zZWQgPSBmYWxzZTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5jbGVhcigpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuY2xlYXIoKTtcblx0XHR0aGlzLnRyYW5zcGlsZUNhY2hlLmNsZWFyKCk7XG5cdFx0dGhpcy5yZWJvb3RUYWlsID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRcdHRoaXMucmVib290Rm9sbG93VXAgPSBmYWxzZTtcblx0XHR0aGlzLnJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHRcdHRoaXMuYmluZFNjaGVkdWxlUmVib290KHJlc29sdmVSZWJvb3REZWJvdW5jZU1zKG9wdGlvbnMucmVib290RGVib3VuY2VNcykpO1xuXG5cdFx0Y29uc3QgeyBidWlsZENvbmZpZyB9ID0gb3B0aW9ucztcblx0XHR0aGlzLmJ1aWxkQ29uZmlnID0gYnVpbGRDb25maWc7XG5cdFx0dGhpcy53b3Jrc3BhY2UgPSBhd2FpdCB0aGlzLnJlc29sdmVXb3Jrc3BhY2Uob3B0aW9ucyk7XG5cdFx0Y29uc3QgcHJvamVjdCA9IHRoaXMucmVzb2x2ZVByb2plY3QoYnVpbGRDb25maWcsIG9wdGlvbnMucHJvamVjdCk7XG5cblx0XHR0aGlzLmVudHJ5TW9kdWxlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmdldFNvdXJjZUVudHJ5UGF0aCgpKTtcblx0XHR0aGlzLmZpbGVJbmZvTWFwID0gYXdhaXQgdGhpcy5idWlsZEZpbGVJbmZvTWFwKGJ1aWxkQ29uZmlnKTtcblx0XHR0aGlzLmFsaWFzUGF0aHMgPSBhd2FpdCB0aGlzLmJ1aWxkQWxpYXNQYXRocygpO1xuXG5cdFx0dGhpcy5yZWdpc3Rlckhvb2tzKCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKTtcblxuXHRcdGF3YWl0IHRoaXMud29ya3NwYWNlLndhdGNoKGJ1aWxkQ29uZmlnKTtcblx0XHR0aGlzLndhdGNoU3Vic2NyaXB0aW9uID0gdGhpcy53b3Jrc3BhY2UucHJvamVjdEZpbGVDaGFuZ2VkJC5zdWJzY3JpYmUodGhpcy5vbkZpbGVDaGFuZ2UpO1xuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYFNlcnZpbmcgJHt0aGlzLmVudHJ5TW9kdWxlUGF0aH1gKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHRcdHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHR0aGlzLnJlYm9vdERlYm91bmNlR2VuICs9IDE7XG5cdFx0dGhpcy53YXRjaFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblx0XHR0aGlzLndvcmtzcGFjZT8uW1N5bWJvbC5kaXNwb3NlXSgpO1xuXHRcdGF3YWl0IHRoaXMucmVib290VGFpbDtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2UoKTtcblx0fVxuXG5cdC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cnkoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybCA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGVQYXRoKSk7XG5cdFx0XHR0aGlzLmVudHJ5TW9kdWxlID0gKGF3YWl0IGltcG9ydCh1cmwpKT8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5lbnRyeU1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFxuXHRcdFx0XHRcIlRoZXJlIHdhcyBhbiBlcnJvciBib290aW5nIHRoZSBlbnRyeSBwb2ludC4gWW91ciBhcHBsaWNhdGlvbiBtYXkgbm90IGZ1bmN0aW9uIGFzIGV4cGVjdGVkXCIsXG5cdFx0XHRcdGVycm9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGJpbmRTY2hlZHVsZVJlYm9vdChkZWxheU1zOiBudW1iZXIpIHtcblx0XHRjb25zdCBnZW4gPSArK3RoaXMucmVib290RGVib3VuY2VHZW47XG5cdFx0dGhpcy5zY2hlZHVsZVJlYm9vdCA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcblx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkIHx8IGdlbiAhPT0gdGhpcy5yZWJvb3REZWJvdW5jZUdlbikgcmV0dXJuO1xuXHRcdFx0dGhpcy5yZXF1ZXN0UmVib290KCk7XG5cdFx0fSwgZGVsYXlNcyk7XG5cdH1cblxuXHRwcml2YXRlIHJlcXVlc3RSZWJvb3QoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHRpZiAodGhpcy5yZWJvb3RJbkZsaWdodCkge1xuXHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IHRydWU7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICh0aGlzLnJlYm9vdFF1ZXVlZCkgcmV0dXJuO1xuXHRcdHRoaXMucmVib290UXVldWVkID0gdHJ1ZTtcblx0XHR0aGlzLnJlYm9vdFRhaWwgPSB0aGlzLnJlYm9vdFRhaWwudGhlbihcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0XHQoKSA9PiB0aGlzLnJ1blJlYm9vdCgpLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJ1blJlYm9vdCgpIHtcblx0XHR0aGlzLnJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IHRydWU7XG5cdFx0dHJ5IHtcblx0XHRcdGRvIHtcblx0XHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci50cmFjZShcIlJlYm9vdGluZyBlbnRyeSBtb2R1bGVcIik7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJ5KCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdFx0XHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHRcdH0gd2hpbGUgKHRoaXMucmVib290Rm9sbG93VXAgJiYgIXRoaXMuZGlzcG9zZWQpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRjb25zdCBuZWVkc0ZvbGxvd1VwID0gdGhpcy5yZWJvb3RGb2xsb3dVcCAmJiAhdGhpcy5kaXNwb3NlZDtcblx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSBmYWxzZTtcblx0XHRcdHRoaXMucmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0XHRcdGlmIChuZWVkc0ZvbGxvd1VwKSB0aGlzLnJlcXVlc3RSZWJvb3QoKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyeSgpIHtcblx0XHRjb25zdCBlbnRyeSA9IHRoaXMuZW50cnlNb2R1bGU7XG5cdFx0dGhpcy5lbnRyeU1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgZW50cnk/LltTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcIkVudHJ5IGFzeW5jRGlzcG9zZSBmYWlsZWRcIiwgZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdC8vIOKUgOKUgCBTZXR1cCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGFzeW5jIHJlc29sdmVXb3Jrc3BhY2Uob3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucyk6IFByb21pc2U8V29ya3NwYWNlPiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG9wdGlvbnMud29ya3NwYWNlID8/XG5cdFx0XHRXb3Jrc3BhY2VGYWN0b3J5LmNyZWF0ZSh7IC4uLldvcmtzcGFjZURlZmF1bHRzLCByb290RGlyOiBwcm9jZXNzLmN3ZCgpIH0pXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVByb2plY3QoYnVpbGRDb25maWc6IHN0cmluZywgbmFtZT86IHN0cmluZyk6IFByb2plY3Qge1xuXHRcdGNvbnN0IHByb2plY3RzID0gdGhpcy53b3Jrc3BhY2U/LmdldFByb2plY3RzKGJ1aWxkQ29uZmlnKSA/PyBbXTtcblx0XHRjb25zdCBmb3VuZCA9IG5hbWUgPT0gbnVsbCA/IHByb2plY3RzLmF0KDApIDogcHJvamVjdHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBuYW1lKTtcblx0XHRpZiAoZm91bmQgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRuYW1lID09IG51bGxcblx0XHRcdFx0XHQ/IGBObyBwcm9qZWN0cyBmb3VuZCBmb3IgY29uZmlndXJhdGlvbjogJHtidWlsZENvbmZpZ31gXG5cdFx0XHRcdFx0OiBgUHJvamVjdCBcIiR7bmFtZX1cIiBub3QgZm91bmQgaW4gd29ya3NwYWNlYCxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBmb3VuZDtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgYnVpbGRGaWxlSW5mb01hcChidWlsZENvbmZpZzogc3RyaW5nKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBGaWxlSW5mbz4+IHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgZW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0cHJvamVjdHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvamVjdC5nZXRBbGxGaWxlcygpO1xuXHRcdFx0XHRyZXR1cm4gZmlsZXMubWFwKChmaWxlKTogW3N0cmluZywgRmlsZUluZm9dID0+IFtmaWxlLmZ1bGxQYXRoLCB7IHByb2plY3QgfV0pO1xuXHRcdFx0fSksXG5cdFx0KTtcblx0XHRyZXR1cm4gbmV3IE1hcChlbnRyaWVzLmZsYXQoKSk7XG5cdH1cblxuXHRwcml2YXRlIHJlZ2lzdGVySG9va3MoKSB7XG5cdFx0aWYgKHRoaXMuaG9va3NSZWdpc3RlcmVkKSByZXR1cm47XG5cdFx0dGhpcy5ob29rc1JlZ2lzdGVyZWQgPSB0cnVlO1xuXHRcdHJlZ2lzdGVySG9va3Moe1xuXHRcdFx0cmVzb2x2ZTogKFxuXHRcdFx0XHRzcGVjaWZpZXI6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogUmVzb2x2ZUhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAoc3BlY2lmaWVyOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPFJlc29sdmVIb29rQ29udGV4dD4pID0+IFJlc29sdmVGbk91dHB1dCxcblx0XHRcdCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuIG5leHQoc3BlY2lmaWVyLCBjb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgcGFyZW50VXJsID0gY29udGV4dC5wYXJlbnRVUkwgPz8gXCJcIjtcblx0XHRcdFx0Y29uc3QgcmV3cml0dGVuID1cblx0XHRcdFx0XHRyZXdyaXRlU2VydmVTcGVjaWZpZXIoe1xuXHRcdFx0XHRcdFx0c3BlY2lmaWVyLFxuXHRcdFx0XHRcdFx0cGFyZW50VXJsLFxuXHRcdFx0XHRcdFx0aXNXYXRjaGVkVHM6IChmaWxlUGF0aCkgPT4gdGhpcy5maWxlSW5mb01hcC5oYXMoZmlsZVBhdGgpLFxuXHRcdFx0XHRcdFx0cmVzb2x2ZUJhcmU6IChiYXJlKSA9PlxuXHRcdFx0XHRcdFx0XHRwYWNrYWdlQWxpYXNlcy5yZXNvbHZlUGF0aChiYXJlLCB0aGlzLmFsaWFzUGF0aHMsIHRoaXMuYWxpYXNCYXNlVXJsKSxcblx0XHRcdFx0XHRcdHZlcnNpb25GaWxlVXJsOiAoZmlsZVVybCkgPT4gdGhpcy5nZXRDYWNoZWRPck5ldyhmaWxlVXJsKSxcblx0XHRcdFx0XHR9KSA/PyBzcGVjaWZpZXI7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IG5leHQocmV3cml0dGVuLCBjb250ZXh0KSBhcyBSZXNvbHZlRm5PdXRwdXQ7XG5cdFx0XHRcdHRoaXMub25Qb3N0UmVzb2x2ZShyZXN1bHQsIHBhcmVudFVybCk7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0bG9hZDogKFxuXHRcdFx0XHR1cmw6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogTG9hZEhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAodXJsOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPExvYWRIb29rQ29udGV4dD4pID0+IExvYWRGbk91dHB1dCxcblx0XHRcdCk6IExvYWRGbk91dHB1dCA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmxvYWRUcyh1cmwpO1xuXHRcdFx0XHRpZiAocmVzdWx0ICE9IG51bGwpXG5cdFx0XHRcdFx0cmV0dXJuIHsgZm9ybWF0OiBcIm1vZHVsZVwiLCBzb3VyY2U6IHJlc3VsdC5zb3VyY2UsIHNob3J0Q2lyY3VpdDogdHJ1ZSB9O1xuXHRcdFx0XHRyZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdC8vIOKUgOKUgCBNb2R1bGUgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBidWlsZEFsaWFzUGF0aHMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+IHtcblx0XHRjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLndvcmtzcGFjZTtcblx0XHRpZiAod29ya3NwYWNlID09IG51bGwpIHJldHVybiB7fTtcblxuXHRcdGNvbnN0IHBhY2thZ2VBbGlhc2VzID0gd29ya3NwYWNlLmdldFBhY2thZ2VBbGlhc2VzKHRoaXMuYnVpbGRDb25maWcpO1xuXHRcdHRoaXMuYWxpYXNCYXNlVXJsID0gcGFja2FnZUFsaWFzZXMuYmFzZVVybDtcblx0XHRyZXR1cm4gcGFja2FnZUFsaWFzZXMucGF0aHM7XG5cdH1cblxuXHQvKipcblx0ICogUG9zdC1uZXh0IGRlcGVuZGVuY3kgdHJhY2tlcjogcmVjb3JkcyB3aGljaCBzb3VyY2UgZmlsZXMgaW1wb3J0IHdoaWNoXG5cdCAqIG90aGVyIHNvdXJjZSBmaWxlcyBzbyB0aGF0IHJlbG9hZElmQWZmZWN0ZWQgY2FuIHRyYXZlcnNlIHRoZSBncmFwaC5cblx0ICovXG5cdHByaXZhdGUgb25Qb3N0UmVzb2x2ZSA9IChyZXN1bHQ6IFJlc29sdmVGbk91dHB1dCwgcGFyZW50VXJsOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCB7IHVybCB9ID0gcmVzdWx0O1xuXHRcdGNvbnN0IHBhcmVudFVybENsZWFuID0gcGFyZW50VXJsLnNwbGl0KFwiP1wiKVswXTtcblxuXHRcdGxldCBmaWxlUGF0aDogc3RyaW5nO1xuXHRcdGxldCBwYXJlbnRQYXRoOiBzdHJpbmc7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXHRcdFx0dXJsT2JqLnNlYXJjaCA9IFwiXCI7XG5cdFx0XHRmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsT2JqLnRvU3RyaW5nKCkpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmxDbGVhbik7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRwYXJlbnRQYXRoID0gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBpc1NvdXJjZSA9IHRoaXMuZmlsZUluZm9NYXAuaGFzKGZpbGVQYXRoKTtcblx0XHRjb25zdCBwYXJlbnRJc1NvdXJjZSA9IHRoaXMuZmlsZUluZm9NYXAuaGFzKHBhcmVudFBhdGgpO1xuXG5cdFx0aWYgKGlzU291cmNlIHx8IHBhcmVudElzU291cmNlKSB7XG5cdFx0XHR0aGlzLnRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aCwgcGFyZW50UGF0aCk7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgbG9hZFRzOiBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHtcblx0XHRpZiAoIXVybC5zdGFydHNXaXRoKFwiZmlsZTpcIikpIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3QgY2xlYW5QYXRoID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lO1xuXHRcdGNvbnN0IGZpbGVJbmZvID0gdGhpcy5maWxlSW5mb01hcC5nZXQoY2xlYW5QYXRoKTtcblx0XHRpZiAoZmlsZUluZm8gPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLnRyYW5zcGlsZUNhY2hlLmdldChjbGVhblBhdGgpO1xuXHRcdGlmIChjYWNoZWQgIT0gbnVsbCkgcmV0dXJuIHsgc291cmNlOiBjYWNoZWQgfTtcblxuXHRcdGNvbnN0IHsgcHJvamVjdCB9ID0gZmlsZUluZm87XG5cdFx0Y29uc3QgdHNDb25maWcgPSBwcm9qZWN0LmdldFRzQ29uZmlnU3luYygpO1xuXHRcdGNvbnN0IHVzZXJDb25maWcgPSBwcm9qZWN0LmdldFN3Y0NvbmZpZ1N5bmMoKTtcblxuXHRcdGNvbnN0IGZpbGUgPSBuZXcgRmlsZUV4KHsgZnVsbFBhdGg6IGNsZWFuUGF0aCB9KTtcblx0XHRjb25zdCByZXNwb25zZSA9IHRoaXMudHJhbnNwaWxlci50cmFuc2Zvcm1GaWxlU3luYyhmaWxlLCBCdWlsZFRhcmdldHMuZXM2LCB7XG5cdFx0XHR0c0NvbmZpZyxcblx0XHRcdGFsaWFzUGF0aHM6IHRydWUsXG5cdFx0XHR1c2VyQ29uZmlnLFxuXHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdHByb2plY3RzOiB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHModGhpcy5idWlsZENvbmZpZyksXG5cdFx0fSk7XG5cblx0XHRpZiAocmVzcG9uc2Uub3V0Y29tZSAhPT0gXCJzdWNjZXNzXCIpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gdHJhbnNwaWxlICR7Y2xlYW5QYXRofWAsIHJlc3BvbnNlKTtcblx0XHRcdC8vIERvIG5vdCBmYWxsIHRocm91Z2ggdG8gbmV4dCgpOiBWaXRlc3QvTm9kZSBsb2FkZXJzIGNhbiBkZWFkbG9jayBvbiBhXG5cdFx0XHQvLyB2ZXJzaW9uZWQgLnRzIFVSTC4gRmFpbCB0aGUgaW1wb3J0IHNvIGJvb3RFbnRyeSBjYW4gY2F0Y2ggYW5kIGNvbnRpbnVlLlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gdHJhbnNwaWxlICR7Y2xlYW5QYXRofWApO1xuXHRcdH1cblxuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuc2V0KGNsZWFuUGF0aCwgcmVzcG9uc2UuY29kZSk7XG5cdFx0cmV0dXJuIHsgc291cmNlOiByZXNwb25zZS5jb2RlIH07XG5cdH07XG5cblx0Ly8g4pSA4pSAIEZpbGUgd2F0Y2hpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBvbkZpbGVDaGFuZ2UgPSAoZXZ0OiBQcm9qZWN0RmlsZUV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgeyBmaWxlLCBldmVudE5hbWUsIHByb2plY3QgfSA9IGV2dDtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGZpbGUuZnVsbFBhdGg7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgRmlsZSAke2V2ZW50TmFtZX06ICR7ZnVsbFBhdGh9YCk7XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy51bmxpbmspIHtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKGZ1bGxQYXRoKTtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy5hZGQpIHtcblx0XHRcdGlmIChwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkge1xuXHRcdFx0XHR0aGlzLmZpbGVJbmZvTWFwLnNldChmdWxsUGF0aCwgeyBwcm9qZWN0IH0pO1xuXHRcdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0XHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gY2hhbmdlXG5cdFx0aWYgKCFwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkgcmV0dXJuO1xuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKGZ1bGxQYXRoKTtcblx0XHR0aGlzLnRyYW5zcGlsZXIuaW52YWxpZGF0ZUNvbnRlbnRDYWNoZShuZXcgRmlsZUV4KHsgZnVsbFBhdGggfSkpO1xuXHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdH07XG5cblx0cHJpdmF0ZSByZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5nZXREZXBlbmRlbmN5R3JhcGgoZnVsbFBhdGgpO1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4ubmV3IFNldChbLi4uZGVwcywgZnVsbFBhdGhdKV07XG5cblx0XHRpZiAoIW1vZHVsZXMuaW5jbHVkZXModGhpcy5lbnRyeU1vZHVsZVBhdGgpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShgQ2hhbmdlIGluICR7ZnVsbFBhdGh9IGRvZXMgbm90IGFmZmVjdCBlbnRyeSDigJQgc2tpcHBpbmcgcmVsb2FkYCk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoXG5cdFx0XHRgQ2hhbmdlIGluICR7ZnVsbFBhdGh9IGFmZmVjdHMgJHttb2R1bGVzLmxlbmd0aH0gbW9kdWxlKHMpIOKAlCBzY2hlZHVsaW5nIHJlbG9hZGAsXG5cdFx0KTtcblx0XHR0aGlzLmludmFsaWRhdGVNb2R1bGUoLi4ubW9kdWxlcyk7XG5cdFx0dGhpcy5zY2hlZHVsZVJlYm9vdCgpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8g4pSA4pSAIERlcGVuZGVuY3kgZ3JhcGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBnZXREZXBlbmRlbmN5R3JhcGgobW9kdWxlSWQ6IHN0cmluZywgcGFyZW50TW9kdWxlczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSByZXR1cm4gW107XG5cblx0XHRjb25zdCBtb2R1bGVEZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KG1vZHVsZUlkKSA/PyBbXTtcblx0XHRpZiAocGFyZW50TW9kdWxlcy5pbmNsdWRlcyhtb2R1bGVJZCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQ6ICR7bW9kdWxlSWR9YCk7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0bGV0IHN1YkRlcHM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBkZXAgb2YgbW9kdWxlRGVwcykge1xuXHRcdFx0aWYgKCF0aGlzLmZpbGVJbmZvTWFwLmhhcyhkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aDogc3RyaW5nLCBwYXJlbnRQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoIXBhcmVudFBhdGgpIHJldHVybjtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0Ly8g4pSA4pSAIE1vZHVsZSBjYWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldENhY2hlZE9yTmV3KG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKG1vZHVsZVVybCk7XG5cdFx0Y29uc3QgY2FjaGVkID0gdGhpcy5tb2R1bGVDYWNoZS5nZXQoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHZlcnNpb25lZCA9IGNhY2hlZCA/PyB0aGlzLnZlcnNpb25Nb2R1bGUobW9kdWxlVXJsKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgdmVyc2lvbmVkKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSB2ZXJzaW9uTW9kdWxlKG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgdmVyc2lvbmVkVXJsID0gbmV3IFVSTChtb2R1bGVVcmwpO1xuXHRcdHZlcnNpb25lZFVybC5zZWFyY2hQYXJhbXMuc2V0KFZFUlNJT05fVVJMX1BBUkFNLCBTdHJpbmcoKyttb2R1bGVWZXJzaW9uU2VxKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKG1vZHVsZSk7XG5cdFx0XHQvLyBQcnVuZSBzdGFsZSBvdXRnb2luZyBlZGdlczogcmVtb3ZlIHRoaXMgbW9kdWxlIGFzIGEgcGFyZW50IGZyb20gYWxsIGRlcGVuZGVuY3kgbGlzdHNcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5maWxlSW5mb01hcC5rZXlzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHQvLyDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgaXNTZWxmKGZpbGVQYXRoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gY3VycmVudEZpbGVQYXRoID09PSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMiLCJIb3RSZWxvYWRTZXJ2ZXIiLCJyZXNvbHZlUmVib290RGVib3VuY2VNcyIsImN1cnJlbnRGaWxlUGF0aCIsImlvIiwiZmlsZVVybFRvUGF0aCIsIlZFUlNJT05fVVJMX1BBUkFNIiwidmFsdWUiLCJkZWxheSIsIk51bWJlciIsImlzRmluaXRlIiwiRXJyb3IiLCJTdHJpbmciLCJtb2R1bGVWZXJzaW9uU2VxIiwiRXZlbnRFbWl0dGVyIiwibG9nZ2VyIiwic2NyaWJlIiwibmFtZSIsImRpc3Bvc2VkIiwiaG9va3NSZWdpc3RlcmVkIiwiZW50cnlNb2R1bGVQYXRoIiwiZW50cnlNb2R1bGUiLCJ3b3Jrc3BhY2UiLCJidWlsZENvbmZpZyIsIndhdGNoU3Vic2NyaXB0aW9uIiwiZmlsZUluZm9NYXAiLCJNYXAiLCJtb2R1bGVDYWNoZSIsImRlcGVuZGVuY2llcyIsInRyYW5zcGlsZUNhY2hlIiwidHJhbnNwaWxlciIsIlN3Y1RyYW5zcGlsZXIiLCJhbGlhc1BhdGhzIiwiYWxpYXNCYXNlVXJsIiwicGF0aCIsInJlc29sdmUiLCJyZWJvb3RUYWlsIiwiUHJvbWlzZSIsInJlYm9vdERlYm91bmNlR2VuIiwicmVib290SW5GbGlnaHQiLCJyZWJvb3RGb2xsb3dVcCIsInJlYm9vdFF1ZXVlZCIsInNjaGVkdWxlUmVib290Iiwic3RhcnQiLCJvcHRpb25zIiwiY2xlYXIiLCJiaW5kU2NoZWR1bGVSZWJvb3QiLCJyZWJvb3REZWJvdW5jZU1zIiwicmVzb2x2ZVdvcmtzcGFjZSIsInByb2plY3QiLCJyZXNvbHZlUHJvamVjdCIsImdldFNvdXJjZUVudHJ5UGF0aCIsImJ1aWxkRmlsZUluZm9NYXAiLCJidWlsZEFsaWFzUGF0aHMiLCJyZWdpc3Rlckhvb2tzIiwiaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzIiwid2F0Y2giLCJwcm9qZWN0RmlsZUNoYW5nZWQkIiwic3Vic2NyaWJlIiwib25GaWxlQ2hhbmdlIiwidHJhY2UiLCJib290RW50cnkiLCJlbWl0IiwiZGlzcG9zZSIsInVuc3Vic2NyaWJlIiwiU3ltYm9sIiwiZGlzcG9zZUVudHJ5IiwiYXN5bmNEaXNwb3NlIiwidXJsIiwidmVyc2lvbk1vZHVsZSIsInBhdGhUb0ZpbGVVcmwiLCJkZWZhdWx0IiwiZXJyb3IiLCJ1bmRlZmluZWQiLCJkZWxheU1zIiwiZ2VuIiwiZGVib3VuY2UiLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsIm5lZWRzRm9sbG93VXAiLCJlbnRyeSIsIldvcmtzcGFjZUZhY3RvcnkiLCJjcmVhdGUiLCJXb3Jrc3BhY2VEZWZhdWx0cyIsInJvb3REaXIiLCJwcm9jZXNzIiwiY3dkIiwicHJvamVjdHMiLCJnZXRQcm9qZWN0cyIsImZvdW5kIiwiYXQiLCJmaW5kIiwicCIsImVudHJpZXMiLCJhbGwiLCJtYXAiLCJmaWxlcyIsImdldEFsbEZpbGVzIiwiZmlsZSIsImZ1bGxQYXRoIiwiZmxhdCIsInNwZWNpZmllciIsImNvbnRleHQiLCJuZXh0IiwicGFyZW50VXJsIiwicGFyZW50VVJMIiwicmV3cml0dGVuIiwicmV3cml0ZVNlcnZlU3BlY2lmaWVyIiwiaXNXYXRjaGVkVHMiLCJmaWxlUGF0aCIsImhhcyIsInJlc29sdmVCYXJlIiwiYmFyZSIsInBhY2thZ2VBbGlhc2VzIiwicmVzb2x2ZVBhdGgiLCJ2ZXJzaW9uRmlsZVVybCIsImZpbGVVcmwiLCJnZXRDYWNoZWRPck5ldyIsInJlc3VsdCIsIm9uUG9zdFJlc29sdmUiLCJsb2FkIiwibG9hZFRzIiwiZm9ybWF0Iiwic291cmNlIiwic2hvcnRDaXJjdWl0IiwiZ2V0UGFja2FnZUFsaWFzZXMiLCJiYXNlVXJsIiwicGF0aHMiLCJwYXJlbnRVcmxDbGVhbiIsInNwbGl0IiwicGFyZW50UGF0aCIsInVybE9iaiIsIlVSTCIsInNlYXJjaCIsInRvU3RyaW5nIiwiaXNTb3VyY2UiLCJwYXJlbnRJc1NvdXJjZSIsInRyYWNrRGVwZW5kZW5jeSIsInN0YXJ0c1dpdGgiLCJjbGVhblBhdGgiLCJwYXRobmFtZSIsImZpbGVJbmZvIiwiZ2V0IiwiY2FjaGVkIiwidHNDb25maWciLCJnZXRUc0NvbmZpZ1N5bmMiLCJ1c2VyQ29uZmlnIiwiZ2V0U3djQ29uZmlnU3luYyIsIkZpbGVFeCIsInJlc3BvbnNlIiwidHJhbnNmb3JtRmlsZVN5bmMiLCJCdWlsZFRhcmdldHMiLCJlczYiLCJvdXRjb21lIiwic2V0IiwiY29kZSIsImV2dCIsImV2ZW50TmFtZSIsIldhdGNoRXZlbnRzIiwidW5saW5rIiwiZGVsZXRlIiwiYWRkIiwiaXNTb3VyY2VGaWxlIiwicmVsb2FkSWZBZmZlY3RlZCIsImludmFsaWRhdGVDb250ZW50Q2FjaGUiLCJkZXBzIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlcyIsIlNldCIsImluY2x1ZGVzIiwibGVuZ3RoIiwiaW52YWxpZGF0ZU1vZHVsZSIsIm1vZHVsZUlkIiwicGFyZW50TW9kdWxlcyIsImlzU2VsZiIsIm1vZHVsZURlcHMiLCJzdWJEZXBzIiwiZGVwIiwic3VicyIsInVwZGF0ZWREZXBzIiwibW9kdWxlVXJsIiwidmVyc2lvbmVkIiwidmVyc2lvbmVkVXJsIiwic2VhcmNoUGFyYW1zIiwibW9kdWxlIiwia2V5IiwicGFyZW50cyIsImZpbHRlcmVkIiwiZmlsdGVyIiwia2V5cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUF1QmFBO2VBQUFBOztRQXFDQUM7ZUFBQUE7O1FB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
510
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuXHRMb2FkRm5PdXRwdXQsXG5cdExvYWRIb29rQ29udGV4dCxcblx0UmVzb2x2ZUZuT3V0cHV0LFxuXHRSZXNvbHZlSG9va0NvbnRleHQsXG59IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQnVpbGRUYXJnZXRzLCBTd2NUcmFuc3BpbGVyLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBwYWNrYWdlQWxpYXNlcywgV29ya3NwYWNlRmFjdG9yeSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgRmlsZUV4LCBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgcmV3cml0ZVNlcnZlU3BlY2lmaWVyIH0gZnJvbSBcIi4vcmV3cml0ZS1zZXJ2ZS1zcGVjaWZpZXIuanNcIjtcblxudHlwZSBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHsgc291cmNlOiBzdHJpbmcgfSB8IG51bGw7XG5cbmNvbnN0IGN1cnJlbnRGaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IFZFUlNJT05fVVJMX1BBUkFNID0gXCJ2ZXJzaW9uXCI7XG4vKiogRGVmYXVsdCBxdWlldCB3aW5kb3cgYmVmb3JlIGEgZmlsZS1jaGFuZ2UgcmVib290LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TID0gMjUwO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlYm9vdERlYm91bmNlTXModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG5cdGNvbnN0IGRlbGF5ID0gdmFsdWUgPz8gREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVM7XG5cdGlmICghTnVtYmVyLmlzRmluaXRlKGRlbGF5KSB8fCBkZWxheSA8IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHJlYm9vdERlYm91bmNlTXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIGdvdCAke1N0cmluZyh2YWx1ZSl9YCk7XG5cdH1cblx0cmV0dXJuIGRlbGF5O1xufVxuXG4vKiogUHJvY2Vzcy13aWRlOiBOb2RlJ3MgRVNNIGNhY2hlIGlzIHByb2Nlc3MtZ2xvYmFsLCBpbmNsdWRpbmcgYWNyb3NzIEhvdFJlbG9hZFNlcnZlciBpbnN0YW5jZXMuICovXG5sZXQgbW9kdWxlVmVyc2lvblNlcSA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0c3RhcnQ6IFtdO1xuXHRyZWJvb3Q6IFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlck9wdGlvbnMge1xuXHQvKiogQnVpbGQgY29uZmlndXJhdGlvbiBuYW1lLiAqL1xuXHRidWlsZENvbmZpZzogc3RyaW5nO1xuXHQvKiogTmFtZSBvZiB0aGUgcHJvamVjdCB0byBzZXJ2ZS4gRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4gKi9cblx0cHJvamVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIE11bHRpcGxlIEZsdXggYXBwIHBhY2thZ2UgbmFtZXMgdG8gYm9vdCBpbiBvbmUgcHJvY2VzcyAoZGlyZWN0b3J5IHNsaWNlKS5cblx0ICogV2hlbiBzZXQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB7QGxpbmsgcHJvamVjdH0uXG5cdCAqL1xuXHRwcm9qZWN0cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHQvKipcblx0ICogUHJlLWJ1aWx0IFdvcmtzcGFjZSBpbnN0YW5jZSB0byB1c2UgaW5zdGVhZCBvZiBydW5uaW5nIFdvcmtzcGFjZUZhY3RvcnkuXG5cdCAqIFVzZWZ1bCBpbiB0ZXN0cyB0byBieXBhc3MgZmlsZXN5c3RlbS1iYXNlZCB3b3Jrc3BhY2UgZGlzY292ZXJ5LlxuXHQgKi9cblx0d29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHQvKipcblx0ICogUXVpZXQgd2luZG93IGluIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgbGFzdCBhZmZlY3Rpbmcgc2F2ZSBiZWZvcmUgYSByZWJvb3QuXG5cdCAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NU30uIFJhaXNlIHRoaXMgZm9yIGFnZW50IHNhdmUgdHJhaW5zLlxuXHQgKi9cblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn1cblxudHlwZSBGaWxlSW5mbyA9IHsgcHJvamVjdDogUHJvamVjdCB9O1xudHlwZSBFbnRyeVN0YXRlID0geyBwYXRoOiBzdHJpbmc7IG1vZHVsZT86IEFzeW5jRGlzcG9zYWJsZSB9O1xuXG5leHBvcnQgY2xhc3MgSG90UmVsb2FkU2VydmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPEhvdFJlbG9hZFNlcnZlckV2ZW50cz4ge1xuXHQvLyDilIDilIAgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKEhvdFJlbG9hZFNlcnZlci5uYW1lKTtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGhvb2tzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXHQvKiogQWJzb2x1dGUgZW50cnkgcGF0aHMgY3VycmVudGx5IHNlcnZlZCAob25lIG9yIG1vcmUgRmx1eCBhcHBzKS4gKi9cblx0cHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEVudHJ5U3RhdGU+KCk7XG5cdHByaXZhdGUgcGVuZGluZ0VudHJ5UmVib290cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdvcmtzcGFjZT86IFdvcmtzcGFjZTtcblx0cHJpdmF0ZSBidWlsZENvbmZpZyA9IFwiZGVidWdcIjtcblx0cHJpdmF0ZSB3YXRjaFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblx0LyoqIE1hcCBmcm9tIGFic29sdXRlIC50cyBzb3VyY2UgZmlsZSBwYXRoIHRvIHByb2plY3QgaW5mbyAqL1xuXHRwcml2YXRlIGZpbGVJbmZvTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZpbGVJbmZvPigpO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHRyYW5zcGlsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblx0cHJpdmF0ZSB0cmFuc3BpbGVyID0gbmV3IFN3Y1RyYW5zcGlsZXIoKTtcblx0cHJpdmF0ZSBhbGlhc1BhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblx0cHJpdmF0ZSBhbGlhc0Jhc2VVcmwgPSBwYXRoLnJlc29sdmUoXCIuXCIpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHRwcml2YXRlIHNjaGVkdWxlUmVib290OiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cblx0Ly8g4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHVibGljIGFzeW5jIHN0YXJ0KG9wdGlvbnM6IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMpIHtcblx0XHR0aGlzLmRpc3Bvc2VkID0gZmFsc2U7XG5cdFx0dGhpcy5kZXBlbmRlbmNpZXMuY2xlYXIoKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLmNsZWFyKCk7XG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucmVib290VGFpbCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdHRoaXMucmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmJpbmRTY2hlZHVsZVJlYm9vdChyZXNvbHZlUmVib290RGVib3VuY2VNcyhvcHRpb25zLnJlYm9vdERlYm91bmNlTXMpKTtcblxuXHRcdGNvbnN0IHsgYnVpbGRDb25maWcgfSA9IG9wdGlvbnM7XG5cdFx0dGhpcy5idWlsZENvbmZpZyA9IGJ1aWxkQ29uZmlnO1xuXHRcdHRoaXMud29ya3NwYWNlID0gYXdhaXQgdGhpcy5yZXNvbHZlV29ya3NwYWNlKG9wdGlvbnMpO1xuXHRcdGNvbnN0IHNlbGVjdGVkID0gdGhpcy5yZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWcsIG9wdGlvbnMpO1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiBzZWxlY3RlZCkge1xuXHRcdFx0Y29uc3QgZW50cnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZ2V0U291cmNlRW50cnlQYXRoKCkpO1xuXHRcdFx0dGhpcy5lbnRyaWVzLnNldChlbnRyeVBhdGgsIHsgcGF0aDogZW50cnlQYXRoIH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuZmlsZUluZm9NYXAgPSBhd2FpdCB0aGlzLmJ1aWxkRmlsZUluZm9NYXAoYnVpbGRDb25maWcpO1xuXHRcdHRoaXMuYWxpYXNQYXRocyA9IGF3YWl0IHRoaXMuYnVpbGRBbGlhc1BhdGhzKCk7XG5cblx0XHR0aGlzLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgdGhpcy53b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLndvcmtzcGFjZS5wcm9qZWN0RmlsZUNoYW5nZWQkLnN1YnNjcmliZSh0aGlzLm9uRmlsZUNoYW5nZSk7XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcy52YWx1ZXMoKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYFNlcnZpbmcgJHtlbnRyeS5wYXRofWApO1xuXHRcdH1cblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyaWVzKFsuLi50aGlzLmVudHJpZXMua2V5cygpXSk7XG5cdFx0dGhpcy5lbWl0KFwic3RhcnRcIik7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZGlzcG9zZSgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuXHRcdHRoaXMucmVib290RGVib3VuY2VHZW4gKz0gMTtcblx0XHR0aGlzLndhdGNoU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuXHRcdHRoaXMud29ya3NwYWNlPy5bU3ltYm9sLmRpc3Bvc2VdKCk7XG5cdFx0YXdhaXQgdGhpcy5yZWJvb3RUYWlsO1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlKCk7XG5cdH1cblxuXHQvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgYm9vdEVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmJvb3RFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeShlbnRyeVBhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5lbnRyaWVzLmdldChlbnRyeVBhdGgpO1xuXHRcdGlmIChzdGF0ZSA9PSBudWxsKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybCA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKGVudHJ5UGF0aCkpO1xuXHRcdFx0c3RhdGUubW9kdWxlID0gKGF3YWl0IGltcG9ydCh1cmwpKT8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFwiVGhlcmUgd2FzIGFuIGVycm9yIGJvb3RpbmcgdGhlIGVudHJ5IHBvaW50LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWRcIixcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYmluZFNjaGVkdWxlUmVib290KGRlbGF5TXM6IG51bWJlcikge1xuXHRcdGNvbnN0IGdlbiA9ICsrdGhpcy5yZWJvb3REZWJvdW5jZUdlbjtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290ID0gZGVib3VuY2UoYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQgfHwgZ2VuICE9PSB0aGlzLnJlYm9vdERlYm91bmNlR2VuKSByZXR1cm47XG5cdFx0XHR0aGlzLnJlcXVlc3RSZWJvb3QoKTtcblx0XHR9LCBkZWxheU1zKTtcblx0fVxuXG5cdHByaXZhdGUgcmVxdWVzdFJlYm9vdCgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdGlmICh0aGlzLnJlYm9vdEluRmxpZ2h0KSB7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHRoaXMucmVib290UXVldWVkKSByZXR1cm47XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSB0cnVlO1xuXHRcdHRoaXMucmVib290VGFpbCA9IHRoaXMucmVib290VGFpbC50aGVuKFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuUmVib290KCkge1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gdHJ1ZTtcblx0XHR0cnkge1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0XHRcdGNvbnN0IHRvUmVib290ID1cblx0XHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuc2l6ZSA+IDBcblx0XHRcdFx0XHRcdD8gWy4uLnRoaXMucGVuZGluZ0VudHJ5UmVib290c11cblx0XHRcdFx0XHRcdDogWy4uLnRoaXMuZW50cmllcy5rZXlzKCldO1xuXHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuY2xlYXIoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJlYm9vdGluZyAke3RvUmVib290Lmxlbmd0aH0gZW50cnkgbW9kdWxlKHMpYCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXModG9SZWJvb3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0dGhpcy5lbWl0KFwicmVib290XCIpO1xuXHRcdFx0fSB3aGlsZSAodGhpcy5yZWJvb3RGb2xsb3dVcCAmJiAhdGhpcy5kaXNwb3NlZCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGNvbnN0IG5lZWRzRm9sbG93VXAgPSB0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkO1xuXHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRcdFx0aWYgKG5lZWRzRm9sbG93VXApIHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmRpc3Bvc2VFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyeShlbnRyeVBhdGg/OiBzdHJpbmcpIHtcblx0XHRjb25zdCBwYXRocyA9IGVudHJ5UGF0aCAhPSBudWxsID8gW2VudHJ5UGF0aF0gOiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0Zm9yIChjb25zdCBwIG9mIHBhdGhzKSB7XG5cdFx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQocCk7XG5cdFx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgY29udGludWU7XG5cdFx0XHRjb25zdCBlbnRyeSA9IHN0YXRlLm1vZHVsZTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGVudHJ5Py5bU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFwiRW50cnkgYXN5bmNEaXNwb3NlIGZhaWxlZFwiLCBlcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8g4pSA4pSAIFNldHVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgcmVzb2x2ZVdvcmtzcGFjZShvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKTogUHJvbWlzZTxXb3Jrc3BhY2U+IHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0b3B0aW9ucy53b3Jrc3BhY2UgPz9cblx0XHRcdFdvcmtzcGFjZUZhY3RvcnkuY3JlYXRlKHsgLi4uV29ya3NwYWNlRGVmYXVsdHMsIHJvb3REaXI6IHByb2Nlc3MuY3dkKCkgfSlcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWc6IHN0cmluZywgb3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucyk6IFByb2plY3RbXSB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IG5hbWVzID1cblx0XHRcdG9wdGlvbnMucHJvamVjdHMgIT0gbnVsbCAmJiBvcHRpb25zLnByb2plY3RzLmxlbmd0aCA+IDBcblx0XHRcdFx0PyBvcHRpb25zLnByb2plY3RzXG5cdFx0XHRcdDogb3B0aW9ucy5wcm9qZWN0ICE9IG51bGxcblx0XHRcdFx0XHQ/IFtvcHRpb25zLnByb2plY3RdXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHRpZiAobmFtZXMgPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgZmlyc3QgPSBwcm9qZWN0cy5hdCgwKTtcblx0XHRcdGlmIChmaXJzdCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7YnVpbGRDb25maWd9YCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gW2ZpcnN0XTtcblx0XHR9XG5cblx0XHRjb25zdCBzZWxlY3RlZDogUHJvamVjdFtdID0gW107XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG5cdFx0XHRjb25zdCBmb3VuZCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0XHRpZiAoZm91bmQgPT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFByb2plY3QgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIHdvcmtzcGFjZWApO1xuXHRcdFx0fVxuXHRcdFx0c2VsZWN0ZWQucHVzaChmb3VuZCk7XG5cdFx0fVxuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgYnVpbGRGaWxlSW5mb01hcChidWlsZENvbmZpZzogc3RyaW5nKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBGaWxlSW5mbz4+IHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgZW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0cHJvamVjdHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvamVjdC5nZXRBbGxGaWxlcygpO1xuXHRcdFx0XHRyZXR1cm4gZmlsZXMubWFwKChmaWxlKTogW3N0cmluZywgRmlsZUluZm9dID0+IFtmaWxlLmZ1bGxQYXRoLCB7IHByb2plY3QgfV0pO1xuXHRcdFx0fSksXG5cdFx0KTtcblx0XHRyZXR1cm4gbmV3IE1hcChlbnRyaWVzLmZsYXQoKSk7XG5cdH1cblxuXHRwcml2YXRlIHJlZ2lzdGVySG9va3MoKSB7XG5cdFx0aWYgKHRoaXMuaG9va3NSZWdpc3RlcmVkKSByZXR1cm47XG5cdFx0dGhpcy5ob29rc1JlZ2lzdGVyZWQgPSB0cnVlO1xuXHRcdHJlZ2lzdGVySG9va3Moe1xuXHRcdFx0cmVzb2x2ZTogKFxuXHRcdFx0XHRzcGVjaWZpZXI6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogUmVzb2x2ZUhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAoc3BlY2lmaWVyOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPFJlc29sdmVIb29rQ29udGV4dD4pID0+IFJlc29sdmVGbk91dHB1dCxcblx0XHRcdCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuIG5leHQoc3BlY2lmaWVyLCBjb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgcGFyZW50VXJsID0gY29udGV4dC5wYXJlbnRVUkwgPz8gXCJcIjtcblx0XHRcdFx0Y29uc3QgcmV3cml0dGVuID1cblx0XHRcdFx0XHRyZXdyaXRlU2VydmVTcGVjaWZpZXIoe1xuXHRcdFx0XHRcdFx0c3BlY2lmaWVyLFxuXHRcdFx0XHRcdFx0cGFyZW50VXJsLFxuXHRcdFx0XHRcdFx0aXNXYXRjaGVkVHM6IChmaWxlUGF0aCkgPT4gdGhpcy5maWxlSW5mb01hcC5oYXMoZmlsZVBhdGgpLFxuXHRcdFx0XHRcdFx0cmVzb2x2ZUJhcmU6IChiYXJlKSA9PlxuXHRcdFx0XHRcdFx0XHRwYWNrYWdlQWxpYXNlcy5yZXNvbHZlUGF0aChiYXJlLCB0aGlzLmFsaWFzUGF0aHMsIHRoaXMuYWxpYXNCYXNlVXJsKSxcblx0XHRcdFx0XHRcdHZlcnNpb25GaWxlVXJsOiAoZmlsZVVybCkgPT4gdGhpcy5nZXRDYWNoZWRPck5ldyhmaWxlVXJsKSxcblx0XHRcdFx0XHR9KSA/PyBzcGVjaWZpZXI7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IG5leHQocmV3cml0dGVuLCBjb250ZXh0KSBhcyBSZXNvbHZlRm5PdXRwdXQ7XG5cdFx0XHRcdHRoaXMub25Qb3N0UmVzb2x2ZShyZXN1bHQsIHBhcmVudFVybCk7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0bG9hZDogKFxuXHRcdFx0XHR1cmw6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogTG9hZEhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAodXJsOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPExvYWRIb29rQ29udGV4dD4pID0+IExvYWRGbk91dHB1dCxcblx0XHRcdCk6IExvYWRGbk91dHB1dCA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmxvYWRUcyh1cmwpO1xuXHRcdFx0XHRpZiAocmVzdWx0ICE9IG51bGwpXG5cdFx0XHRcdFx0cmV0dXJuIHsgZm9ybWF0OiBcIm1vZHVsZVwiLCBzb3VyY2U6IHJlc3VsdC5zb3VyY2UsIHNob3J0Q2lyY3VpdDogdHJ1ZSB9O1xuXHRcdFx0XHRyZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdC8vIOKUgOKUgCBNb2R1bGUgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBidWlsZEFsaWFzUGF0aHMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+IHtcblx0XHRjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLndvcmtzcGFjZTtcblx0XHRpZiAod29ya3NwYWNlID09IG51bGwpIHJldHVybiB7fTtcblxuXHRcdGNvbnN0IHBhY2thZ2VBbGlhc2VzID0gd29ya3NwYWNlLmdldFBhY2thZ2VBbGlhc2VzKHRoaXMuYnVpbGRDb25maWcpO1xuXHRcdHRoaXMuYWxpYXNCYXNlVXJsID0gcGFja2FnZUFsaWFzZXMuYmFzZVVybDtcblx0XHRyZXR1cm4gcGFja2FnZUFsaWFzZXMucGF0aHM7XG5cdH1cblxuXHQvKipcblx0ICogUG9zdC1uZXh0IGRlcGVuZGVuY3kgdHJhY2tlcjogcmVjb3JkcyB3aGljaCBzb3VyY2UgZmlsZXMgaW1wb3J0IHdoaWNoXG5cdCAqIG90aGVyIHNvdXJjZSBmaWxlcyBzbyB0aGF0IHJlbG9hZElmQWZmZWN0ZWQgY2FuIHRyYXZlcnNlIHRoZSBncmFwaC5cblx0ICovXG5cdHByaXZhdGUgb25Qb3N0UmVzb2x2ZSA9IChyZXN1bHQ6IFJlc29sdmVGbk91dHB1dCwgcGFyZW50VXJsOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCB7IHVybCB9ID0gcmVzdWx0O1xuXHRcdGNvbnN0IHBhcmVudFVybENsZWFuID0gcGFyZW50VXJsLnNwbGl0KFwiP1wiKVswXTtcblxuXHRcdGxldCBmaWxlUGF0aDogc3RyaW5nO1xuXHRcdGxldCBwYXJlbnRQYXRoOiBzdHJpbmc7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXHRcdFx0dXJsT2JqLnNlYXJjaCA9IFwiXCI7XG5cdFx0XHRmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsT2JqLnRvU3RyaW5nKCkpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmxDbGVhbik7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRwYXJlbnRQYXRoID0gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBpc1NvdXJjZSA9IHRoaXMuZmlsZUluZm9NYXAuaGFzKGZpbGVQYXRoKTtcblx0XHRjb25zdCBwYXJlbnRJc1NvdXJjZSA9IHRoaXMuZmlsZUluZm9NYXAuaGFzKHBhcmVudFBhdGgpO1xuXG5cdFx0aWYgKGlzU291cmNlIHx8IHBhcmVudElzU291cmNlKSB7XG5cdFx0XHR0aGlzLnRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aCwgcGFyZW50UGF0aCk7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgbG9hZFRzOiBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHtcblx0XHRpZiAoIXVybC5zdGFydHNXaXRoKFwiZmlsZTpcIikpIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3QgY2xlYW5QYXRoID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lO1xuXHRcdGNvbnN0IGZpbGVJbmZvID0gdGhpcy5maWxlSW5mb01hcC5nZXQoY2xlYW5QYXRoKTtcblx0XHRpZiAoZmlsZUluZm8gPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLnRyYW5zcGlsZUNhY2hlLmdldChjbGVhblBhdGgpO1xuXHRcdGlmIChjYWNoZWQgIT0gbnVsbCkgcmV0dXJuIHsgc291cmNlOiBjYWNoZWQgfTtcblxuXHRcdGNvbnN0IHsgcHJvamVjdCB9ID0gZmlsZUluZm87XG5cdFx0Y29uc3QgdHNDb25maWcgPSBwcm9qZWN0LmdldFRzQ29uZmlnU3luYygpO1xuXHRcdGNvbnN0IHVzZXJDb25maWcgPSBwcm9qZWN0LmdldFN3Y0NvbmZpZ1N5bmMoKTtcblxuXHRcdGNvbnN0IGZpbGUgPSBuZXcgRmlsZUV4KHsgZnVsbFBhdGg6IGNsZWFuUGF0aCB9KTtcblx0XHRjb25zdCByZXNwb25zZSA9IHRoaXMudHJhbnNwaWxlci50cmFuc2Zvcm1GaWxlU3luYyhmaWxlLCBCdWlsZFRhcmdldHMuZXM2LCB7XG5cdFx0XHR0c0NvbmZpZyxcblx0XHRcdGFsaWFzUGF0aHM6IHRydWUsXG5cdFx0XHR1c2VyQ29uZmlnLFxuXHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdHByb2plY3RzOiB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHModGhpcy5idWlsZENvbmZpZyksXG5cdFx0fSk7XG5cblx0XHRpZiAocmVzcG9uc2Uub3V0Y29tZSAhPT0gXCJzdWNjZXNzXCIpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gdHJhbnNwaWxlICR7Y2xlYW5QYXRofWAsIHJlc3BvbnNlKTtcblx0XHRcdC8vIERvIG5vdCBmYWxsIHRocm91Z2ggdG8gbmV4dCgpOiBWaXRlc3QvTm9kZSBsb2FkZXJzIGNhbiBkZWFkbG9jayBvbiBhXG5cdFx0XHQvLyB2ZXJzaW9uZWQgLnRzIFVSTC4gRmFpbCB0aGUgaW1wb3J0IHNvIGJvb3RFbnRyeSBjYW4gY2F0Y2ggYW5kIGNvbnRpbnVlLlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gdHJhbnNwaWxlICR7Y2xlYW5QYXRofWApO1xuXHRcdH1cblxuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuc2V0KGNsZWFuUGF0aCwgcmVzcG9uc2UuY29kZSk7XG5cdFx0cmV0dXJuIHsgc291cmNlOiByZXNwb25zZS5jb2RlIH07XG5cdH07XG5cblx0Ly8g4pSA4pSAIEZpbGUgd2F0Y2hpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBvbkZpbGVDaGFuZ2UgPSAoZXZ0OiBQcm9qZWN0RmlsZUV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgeyBmaWxlLCBldmVudE5hbWUsIHByb2plY3QgfSA9IGV2dDtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGZpbGUuZnVsbFBhdGg7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgRmlsZSAke2V2ZW50TmFtZX06ICR7ZnVsbFBhdGh9YCk7XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy51bmxpbmspIHtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKGZ1bGxQYXRoKTtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy5hZGQpIHtcblx0XHRcdGlmIChwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkge1xuXHRcdFx0XHR0aGlzLmZpbGVJbmZvTWFwLnNldChmdWxsUGF0aCwgeyBwcm9qZWN0IH0pO1xuXHRcdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0XHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gY2hhbmdlXG5cdFx0aWYgKCFwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkgcmV0dXJuO1xuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKGZ1bGxQYXRoKTtcblx0XHR0aGlzLnRyYW5zcGlsZXIuaW52YWxpZGF0ZUNvbnRlbnRDYWNoZShuZXcgRmlsZUV4KHsgZnVsbFBhdGggfSkpO1xuXHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdH07XG5cblx0cHJpdmF0ZSByZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5nZXREZXBlbmRlbmN5R3JhcGgoZnVsbFBhdGgpO1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4ubmV3IFNldChbLi4uZGVwcywgZnVsbFBhdGhdKV07XG5cdFx0Y29uc3QgYWZmZWN0ZWRFbnRyaWVzID0gWy4uLnRoaXMuZW50cmllcy5rZXlzKCldLmZpbHRlcigoZW50cnlQYXRoKSA9PlxuXHRcdFx0bW9kdWxlcy5pbmNsdWRlcyhlbnRyeVBhdGgpLFxuXHRcdCk7XG5cblx0XHRpZiAoYWZmZWN0ZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYENoYW5nZSBpbiAke2Z1bGxQYXRofSBkb2VzIG5vdCBhZmZlY3QgZW50cnkg4oCUIHNraXBwaW5nIHJlbG9hZGApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKFxuXHRcdFx0YENoYW5nZSBpbiAke2Z1bGxQYXRofSBhZmZlY3RzICR7bW9kdWxlcy5sZW5ndGh9IG1vZHVsZShzKSDigJQgc2NoZWR1bGluZyByZWxvYWRgLFxuXHRcdCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlTW9kdWxlKC4uLm1vZHVsZXMpO1xuXHRcdGZvciAoY29uc3QgZW50cnlQYXRoIG9mIGFmZmVjdGVkRW50cmllcykge1xuXHRcdFx0dGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzLmFkZChlbnRyeVBhdGgpO1xuXHRcdH1cblx0XHR0aGlzLnNjaGVkdWxlUmVib290KCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyDilIDilIAgRGVwZW5kZW5jeSBncmFwaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldERlcGVuZGVuY3lHcmFwaChtb2R1bGVJZDogc3RyaW5nLCBwYXJlbnRNb2R1bGVzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuXHRcdGlmICh0aGlzLmlzU2VsZihtb2R1bGVJZCkpIHJldHVybiBbXTtcblxuXHRcdGNvbnN0IG1vZHVsZURlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQobW9kdWxlSWQpID8/IFtdO1xuXHRcdGlmIChwYXJlbnRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZUlkKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZDogJHttb2R1bGVJZH1gKTtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRsZXQgc3ViRGVwczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGRlcCBvZiBtb2R1bGVEZXBzKSB7XG5cdFx0XHRpZiAoIXRoaXMuZmlsZUluZm9NYXAuaGFzKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIFN0cmluZygrK21vZHVsZVZlcnNpb25TZXEpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVNb2R1bGUoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChtb2R1bGUsIG51bGwpO1xuXHRcdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUobW9kdWxlKTtcblx0XHRcdC8vIFBydW5lIHN0YWxlIG91dGdvaW5nIGVkZ2VzOiByZW1vdmUgdGhpcyBtb2R1bGUgYXMgYSBwYXJlbnQgZnJvbSBhbGwgZGVwZW5kZW5jeSBsaXN0c1xuXHRcdFx0Zm9yIChjb25zdCBba2V5LCBwYXJlbnRzXSBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJlZCA9IHBhcmVudHMuZmlsdGVyKChwKSA9PiBwICE9PSBtb2R1bGUpO1xuXHRcdFx0XHRpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZGVsZXRlKGtleSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuc2V0KGtleSwgZmlsdGVyZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKSB7XG5cdFx0Zm9yIChjb25zdCBmaWxlUGF0aCBvZiB0aGlzLmZpbGVJbmZvTWFwLmtleXMoKSkge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZVBhdGgsIG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdC8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBpc1NlbGYoZmlsZVBhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUyIsIkhvdFJlbG9hZFNlcnZlciIsInJlc29sdmVSZWJvb3REZWJvdW5jZU1zIiwiY3VycmVudEZpbGVQYXRoIiwiaW8iLCJmaWxlVXJsVG9QYXRoIiwiVkVSU0lPTl9VUkxfUEFSQU0iLCJ2YWx1ZSIsImRlbGF5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJFcnJvciIsIlN0cmluZyIsIm1vZHVsZVZlcnNpb25TZXEiLCJFdmVudEVtaXR0ZXIiLCJsb2dnZXIiLCJzY3JpYmUiLCJuYW1lIiwiZGlzcG9zZWQiLCJob29rc1JlZ2lzdGVyZWQiLCJlbnRyaWVzIiwiTWFwIiwicGVuZGluZ0VudHJ5UmVib290cyIsIlNldCIsIndvcmtzcGFjZSIsImJ1aWxkQ29uZmlnIiwid2F0Y2hTdWJzY3JpcHRpb24iLCJmaWxlSW5mb01hcCIsIm1vZHVsZUNhY2hlIiwiZGVwZW5kZW5jaWVzIiwidHJhbnNwaWxlQ2FjaGUiLCJ0cmFuc3BpbGVyIiwiU3djVHJhbnNwaWxlciIsImFsaWFzUGF0aHMiLCJhbGlhc0Jhc2VVcmwiLCJwYXRoIiwicmVzb2x2ZSIsInJlYm9vdFRhaWwiLCJQcm9taXNlIiwicmVib290RGVib3VuY2VHZW4iLCJyZWJvb3RJbkZsaWdodCIsInJlYm9vdEZvbGxvd1VwIiwicmVib290UXVldWVkIiwic2NoZWR1bGVSZWJvb3QiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsImJpbmRTY2hlZHVsZVJlYm9vdCIsInJlYm9vdERlYm91bmNlTXMiLCJyZXNvbHZlV29ya3NwYWNlIiwic2VsZWN0ZWQiLCJyZXNvbHZlUHJvamVjdHMiLCJwcm9qZWN0IiwiZW50cnlQYXRoIiwiZ2V0U291cmNlRW50cnlQYXRoIiwic2V0IiwiYnVpbGRGaWxlSW5mb01hcCIsImJ1aWxkQWxpYXNQYXRocyIsInJlZ2lzdGVySG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJvbkZpbGVDaGFuZ2UiLCJlbnRyeSIsInZhbHVlcyIsInRyYWNlIiwiYm9vdEVudHJpZXMiLCJrZXlzIiwiZW1pdCIsImRpc3Bvc2UiLCJ1bnN1YnNjcmliZSIsIlN5bWJvbCIsImRpc3Bvc2VFbnRyaWVzIiwiYXN5bmNEaXNwb3NlIiwiZW50cnlQYXRocyIsImFsbCIsIm1hcCIsImJvb3RFbnRyeSIsInN0YXRlIiwiZ2V0IiwidXJsIiwidmVyc2lvbk1vZHVsZSIsInBhdGhUb0ZpbGVVcmwiLCJtb2R1bGUiLCJkZWZhdWx0IiwiZXJyb3IiLCJ1bmRlZmluZWQiLCJkZWxheU1zIiwiZ2VuIiwiZGVib3VuY2UiLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsInRvUmVib290Iiwic2l6ZSIsImxlbmd0aCIsIm5lZWRzRm9sbG93VXAiLCJkaXNwb3NlRW50cnkiLCJwYXRocyIsInAiLCJXb3Jrc3BhY2VGYWN0b3J5IiwiY3JlYXRlIiwiV29ya3NwYWNlRGVmYXVsdHMiLCJyb290RGlyIiwicHJvY2VzcyIsImN3ZCIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJuYW1lcyIsImZpcnN0IiwiYXQiLCJmb3VuZCIsImZpbmQiLCJwdXNoIiwiZmlsZXMiLCJnZXRBbGxGaWxlcyIsImZpbGUiLCJmdWxsUGF0aCIsImZsYXQiLCJzcGVjaWZpZXIiLCJjb250ZXh0IiwibmV4dCIsInBhcmVudFVybCIsInBhcmVudFVSTCIsInJld3JpdHRlbiIsInJld3JpdGVTZXJ2ZVNwZWNpZmllciIsImlzV2F0Y2hlZFRzIiwiZmlsZVBhdGgiLCJoYXMiLCJyZXNvbHZlQmFyZSIsImJhcmUiLCJwYWNrYWdlQWxpYXNlcyIsInJlc29sdmVQYXRoIiwidmVyc2lvbkZpbGVVcmwiLCJmaWxlVXJsIiwiZ2V0Q2FjaGVkT3JOZXciLCJyZXN1bHQiLCJvblBvc3RSZXNvbHZlIiwibG9hZCIsImxvYWRUcyIsImZvcm1hdCIsInNvdXJjZSIsInNob3J0Q2lyY3VpdCIsImdldFBhY2thZ2VBbGlhc2VzIiwiYmFzZVVybCIsInBhcmVudFVybENsZWFuIiwic3BsaXQiLCJwYXJlbnRQYXRoIiwidXJsT2JqIiwiVVJMIiwic2VhcmNoIiwidG9TdHJpbmciLCJpc1NvdXJjZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5Iiwic3RhcnRzV2l0aCIsImNsZWFuUGF0aCIsInBhdGhuYW1lIiwiZmlsZUluZm8iLCJjYWNoZWQiLCJ0c0NvbmZpZyIsImdldFRzQ29uZmlnU3luYyIsInVzZXJDb25maWciLCJnZXRTd2NDb25maWdTeW5jIiwiRmlsZUV4IiwicmVzcG9uc2UiLCJ0cmFuc2Zvcm1GaWxlU3luYyIsIkJ1aWxkVGFyZ2V0cyIsImVzNiIsIm91dGNvbWUiLCJjb2RlIiwiZXZ0IiwiZXZlbnROYW1lIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJkZWxldGUiLCJhZGQiLCJpc1NvdXJjZUZpbGUiLCJyZWxvYWRJZkFmZmVjdGVkIiwiaW52YWxpZGF0ZUNvbnRlbnRDYWNoZSIsImRlcHMiLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVzIiwiYWZmZWN0ZWRFbnRyaWVzIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJpbnZhbGlkYXRlTW9kdWxlIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsInN1YkRlcHMiLCJkZXAiLCJzdWJzIiwidXBkYXRlZERlcHMiLCJtb2R1bGVVcmwiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uZWRVcmwiLCJzZWFyY2hQYXJhbXMiLCJrZXkiLCJwYXJlbnRzIiwiZmlsdGVyZWQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBdUJhQTtlQUFBQTs7UUEyQ0FDO2VBQUFBOztRQXpDR0M7ZUFBQUE7Ozs0QkF6QmE7NEJBT0M7aUVBQ2I7dUJBQzhDO3NCQUVkO29CQUN0Qjt3QkFDRjt3QkFDVzt1Q0FFRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJdEMsTUFBTUMsa0JBQWtCQyxNQUFFLENBQUNDLGFBQWEsQ0FBQztBQUN6QyxNQUFNQyxvQkFBb0I7QUFFbkIsTUFBTU4sNkJBQTZCO0FBRW5DLFNBQVNFLHdCQUF3QkssS0FBeUI7SUFDaEUsTUFBTUMsUUFBUUQsU0FBU1A7SUFDdkIsSUFBSSxDQUFDUyxPQUFPQyxRQUFRLENBQUNGLFVBQVVBLFFBQVEsR0FBRztRQUN6QyxNQUFNLElBQUlHLE1BQU0sQ0FBQyxvREFBb0QsRUFBRUMsT0FBT0wsUUFBUTtJQUN2RjtJQUNBLE9BQU9DO0FBQ1I7QUFFQSxrR0FBa0csR0FDbEcsSUFBSUssbUJBQW1CO0FBZ0NoQixNQUFNWix3QkFBd0JhLHdCQUFZO0lBQ2hELDRFQUE0RTtJQUMzREMsU0FBaUJDLGNBQU0sQ0FBQ0QsTUFBTSxDQUFDZCxnQkFBZ0JnQixJQUFJLEVBQUU7SUFD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
@@ -12,14 +12,37 @@ _export(exports, {
12
12
  get DEFAULT_REBOOT_DEBOUNCE_MS () {
13
13
  return _hotreloadserver.DEFAULT_REBOOT_DEBOUNCE_MS;
14
14
  },
15
+ get DeferredScriptRunner () {
16
+ return _deferredscriptrunner.DeferredScriptRunner;
17
+ },
15
18
  get FluxModule () {
16
19
  return _fluxmodule.FluxModule;
17
20
  },
18
21
  get HotReloadServer () {
19
22
  return _hotreloadserver.HotReloadServer;
23
+ },
24
+ get classifySliceProject () {
25
+ return _sliceserve.classifySliceProject;
26
+ },
27
+ get classifySliceProjects () {
28
+ return _sliceserve.classifySliceProjects;
29
+ },
30
+ get normalizeSlicePrefix () {
31
+ return _sliceserve.normalizeSlicePrefix;
32
+ },
33
+ get projectsInSlice () {
34
+ return _sliceserve.projectsInSlice;
35
+ },
36
+ get projectsInSlices () {
37
+ return _sliceserve.projectsInSlices;
38
+ },
39
+ get resolveDeferScript () {
40
+ return _sliceserve.resolveDeferScript;
20
41
  }
21
42
  });
43
+ const _deferredscriptrunner = require("./deferred-script-runner.js");
22
44
  const _fluxmodule = require("./flux.module.js");
23
45
  const _hotreloadserver = require("./hot-reload-server.js");
46
+ const _sliceserve = require("./slice-serve.js");
24
47
 
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEZsdXhNb2R1bGUgfSBmcm9tIFwiLi9mbHV4Lm1vZHVsZS5qc1wiO1xuZXhwb3J0IHR5cGUgeyBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zIH0gZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmV4cG9ydCB7IERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TLCBIb3RSZWxvYWRTZXJ2ZXIgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuZXhwb3J0IHR5cGUgeyBTZXJ2ZU9wdGlvbnMgfSBmcm9tIFwiLi9zZXJ2ZS5hY3Rpb24uanNcIjtcbiJdLCJuYW1lcyI6WyJERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUyIsIkZsdXhNb2R1bGUiLCJIb3RSZWxvYWRTZXJ2ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBRVNBO2VBQUFBLDJDQUEwQjs7UUFGMUJDO2VBQUFBLHNCQUFVOztRQUVrQkM7ZUFBQUEsZ0NBQWU7Ozs0QkFGekI7aUNBRWlDIn0=
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IERlZmVycmVkU2NyaXB0UnVubmVyIH0gZnJvbSBcIi4vZGVmZXJyZWQtc2NyaXB0LXJ1bm5lci5qc1wiO1xuZXhwb3J0IHsgRmx1eE1vZHVsZSB9IGZyb20gXCIuL2ZsdXgubW9kdWxlLmpzXCI7XG5leHBvcnQgdHlwZSB7IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuZXhwb3J0IHsgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMsIEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5leHBvcnQgdHlwZSB7IFNlcnZlT3B0aW9ucyB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuZXhwb3J0IHtcblx0dHlwZSBDbGFzc2lmaWVkU2xpY2UsXG5cdGNsYXNzaWZ5U2xpY2VQcm9qZWN0LFxuXHRjbGFzc2lmeVNsaWNlUHJvamVjdHMsXG5cdG5vcm1hbGl6ZVNsaWNlUHJlZml4LFxuXHRwcm9qZWN0c0luU2xpY2UsXG5cdHByb2plY3RzSW5TbGljZXMsXG5cdHJlc29sdmVEZWZlclNjcmlwdCxcblx0dHlwZSBTbGljZUtpbmQsXG5cdHR5cGUgU2xpY2VQcm9qZWN0Vmlldyxcbn0gZnJvbSBcIi4vc2xpY2Utc2VydmUuanNcIjtcbiJdLCJuYW1lcyI6WyJERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUyIsIkRlZmVycmVkU2NyaXB0UnVubmVyIiwiRmx1eE1vZHVsZSIsIkhvdFJlbG9hZFNlcnZlciIsImNsYXNzaWZ5U2xpY2VQcm9qZWN0IiwiY2xhc3NpZnlTbGljZVByb2plY3RzIiwibm9ybWFsaXplU2xpY2VQcmVmaXgiLCJwcm9qZWN0c0luU2xpY2UiLCJwcm9qZWN0c0luU2xpY2VzIiwicmVzb2x2ZURlZmVyU2NyaXB0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztRQUdTQTtlQUFBQSwyQ0FBMEI7O1FBSDFCQztlQUFBQSwwQ0FBb0I7O1FBQ3BCQztlQUFBQSxzQkFBVTs7UUFFa0JDO2VBQUFBLGdDQUFlOztRQUluREM7ZUFBQUEsZ0NBQW9COztRQUNwQkM7ZUFBQUEsaUNBQXFCOztRQUNyQkM7ZUFBQUEsZ0NBQW9COztRQUNwQkM7ZUFBQUEsMkJBQWU7O1FBQ2ZDO2VBQUFBLDRCQUFnQjs7UUFDaEJDO2VBQUFBLDhCQUFrQjs7O3NDQVprQjs0QkFDVjtpQ0FFaUM7NEJBWXJEIn0=