@decohere/flux 0.0.1-dev.6 → 0.0.1-dev.61

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.
@@ -1,82 +1,263 @@
1
1
  import { EventEmitter } from "node:events";
2
+ import { registerHooks } from "node:module";
2
3
  import path from "node:path";
3
- import { io } from "@decohere/nexus/io";
4
+ import { BuildTargets, SwcTranspiler, WorkspaceDefaults } from "@decohere/forge";
5
+ import { WorkspaceFactory } from "@decohere/mesh";
6
+ import { FileEx, io } from "@decohere/nexus/io";
4
7
  import { debounce } from "@decohere/nexus/system";
5
- import { addResolverHook, initModuleHooks, removeResolverHook } from "./hot-module-hooks.js";
8
+ import { scribe } from "@decohere/scribe";
6
9
  const currentFilePath = io.fileUrlToPath(import.meta.url);
10
+ const VERSION_URL_PARAM = "version";
11
+ const REBOOT_DEBOUNCE_MS = 250;
7
12
  export class HotReloadServer extends EventEmitter {
8
- logger;
13
+ // ── State ────────────────────────────────────────────────────────────────
14
+ logger = scribe.logger(HotReloadServer.name);
9
15
  disposed = false;
16
+ hooksRegistered = false;
17
+ entryModulePath;
10
18
  entryModule;
11
- entry;
12
- sourceFiles = [];
19
+ workspace;
20
+ buildConfig = "debug";
21
+ watchSubscription;
22
+ /** Map from absolute .ts source file path to project info */ fileInfoMap = new Map();
13
23
  moduleCache = new Map();
14
24
  dependencies = new Map();
15
- watchers = [];
16
- constructor(logger){
17
- super();
18
- this.logger = logger;
19
- }
20
- async start(entry, ...watchDirs) {
21
- this.entryModule = entry;
22
- this.sourceFiles = await this.getSourceFiles(watchDirs);
23
- this.configureModuleHooks();
25
+ transpileCache = new Map();
26
+ transpiler = new SwcTranspiler();
27
+ // ── Public API ───────────────────────────────────────────────────────────
28
+ async start(options) {
29
+ this.disposed = false;
30
+ this.dependencies.clear();
31
+ this.moduleCache.clear();
32
+ this.transpileCache.clear();
33
+ const { buildConfig } = options;
34
+ this.buildConfig = buildConfig;
35
+ this.workspace = await this.resolveWorkspace(options);
36
+ const project = this.resolveProject(buildConfig, options.project);
37
+ this.entryModulePath = path.resolve(project.getSourceEntryPath());
38
+ this.fileInfoMap = await this.buildFileInfoMap(buildConfig);
39
+ this.registerHooks();
24
40
  this.invalidateAllSourceFiles();
25
- await this.watch(watchDirs);
26
- this.logger.trace("Serving", entry);
27
- this.logger.trace("Hot reload watching", watchDirs);
41
+ await this.workspace.watch(buildConfig);
42
+ this.watchSubscription = this.workspace.projectFileChanged$.subscribe(this.onFileChange);
43
+ this.logger.trace(`Serving ${this.entryModulePath}`);
28
44
  await this.bootEntry();
45
+ this.emit("start");
29
46
  }
30
47
  async dispose() {
31
48
  if (this.disposed) return;
32
49
  this.disposed = true;
33
- removeResolverHook(this.onResolve);
34
- for (const watcher of this.watchers){
35
- watcher.close();
50
+ this.watchSubscription?.unsubscribe();
51
+ this.workspace?.[Symbol.dispose]();
52
+ await this.disposeEntry();
53
+ }
54
+ async [Symbol.asyncDispose]() {
55
+ await this.dispose();
56
+ }
57
+ // ── Lifecycle ────────────────────────────────────────────────────────────
58
+ async bootEntry() {
59
+ try {
60
+ const url = this.versionModule(io.pathToFileUrl(this.entryModulePath));
61
+ this.entryModule = (await import(url))?.default;
62
+ } catch (error) {
63
+ this.logger.error("There was an error booting the entry point. Your application may not function as expected", error);
36
64
  }
65
+ }
66
+ async reboot() {
67
+ this.logger.trace("Rebooting entry module");
37
68
  await this.disposeEntry();
69
+ this.emit("reboot");
70
+ await this.bootEntry();
71
+ }
72
+ async disposeEntry() {
73
+ await this.entryModule?.[Symbol.asyncDispose]();
38
74
  }
39
- removeSourceFiles(...sourceFiles) {
40
- this.sourceFiles = this.sourceFiles.filter((sourceFile)=>!sourceFiles.includes(sourceFile));
75
+ scheduleReboot = debounce(()=>this.reboot(), REBOOT_DEBOUNCE_MS);
76
+ // ── Setup ────────────────────────────────────────────────────────────────
77
+ async resolveWorkspace(options) {
78
+ return options.workspace ?? WorkspaceFactory.create({
79
+ ...WorkspaceDefaults,
80
+ rootDir: process.cwd()
81
+ });
41
82
  }
42
- async getSourceFiles(dirs) {
43
- const patterns = dirs.map((dir)=>`${dir}/**/*.js`);
44
- const files = await io.findFiles(patterns);
45
- return files.map((f)=>f.fullPath);
83
+ resolveProject(buildConfig, name) {
84
+ const projects = this.workspace?.getProjects(buildConfig) ?? [];
85
+ const found = name == null ? projects.at(0) : projects.find((p)=>p.name === name);
86
+ if (found == null) {
87
+ throw new Error(name == null ? `No projects found for configuration: ${buildConfig}` : `Project "${name}" not found in workspace`);
88
+ }
89
+ return found;
46
90
  }
47
- configureModuleHooks() {
48
- initModuleHooks();
49
- addResolverHook(this.onResolve);
91
+ async buildFileInfoMap(buildConfig) {
92
+ const projects = this.workspace?.getProjects(buildConfig) ?? [];
93
+ const entries = await Promise.all(projects.map(async (project)=>{
94
+ const files = await project.getAllFiles();
95
+ return files.map((file)=>[
96
+ file.fullPath,
97
+ {
98
+ project
99
+ }
100
+ ]);
101
+ }));
102
+ return new Map(entries.flat());
50
103
  }
51
- onResolve = (result, parentUrl)=>{
104
+ registerHooks() {
105
+ if (this.hooksRegistered) return;
106
+ this.hooksRegistered = true;
107
+ registerHooks({
108
+ resolve: (specifier, context, next)=>{
109
+ if (this.disposed) return next(specifier, context);
110
+ const parentUrl = context.parentURL ?? "";
111
+ const rewritten = this.rewriteJsToTs(specifier, parentUrl) ?? specifier;
112
+ const result = next(rewritten, context);
113
+ this.onPostResolve(result, parentUrl);
114
+ return result;
115
+ },
116
+ load: (url, context, next)=>{
117
+ if (this.disposed) return next(url, context);
118
+ const result = this.loadTs(url);
119
+ if (result != null) return {
120
+ format: "module",
121
+ source: result.source,
122
+ shortCircuit: true
123
+ };
124
+ return next(url, context);
125
+ }
126
+ });
127
+ }
128
+ // ── Module hooks ─────────────────────────────────────────────────────────
129
+ /**
130
+ * Pre-next specifier rewriter: if specifier is a .js import that maps to a
131
+ * known .ts source file, returns the versioned .ts file URL so next() never
132
+ * tries to load a non-existent .js file from disk.
133
+ */ rewriteJsToTs = (specifier, parentUrl)=>{
134
+ if (!specifier.endsWith(".js")) return null;
135
+ const parentClean = parentUrl.split("?")[0];
136
+ if (!parentClean) return null;
137
+ let jsPath;
138
+ try {
139
+ const resolved = new URL(specifier, parentClean);
140
+ jsPath = io.fileUrlToPath(resolved.toString());
141
+ } catch {
142
+ return null;
143
+ }
144
+ if (!jsPath.endsWith(".js")) return null;
145
+ const tsPath = jsPath.replace(/\.js$/, ".ts");
146
+ if (!this.fileInfoMap.has(tsPath)) return null;
147
+ return this.getCachedOrNew(io.pathToFileUrl(tsPath));
148
+ };
149
+ /**
150
+ * Post-next dependency tracker: records which source files import which
151
+ * other source files so that reloadIfAffected can traverse the graph.
152
+ */ onPostResolve = (result, parentUrl)=>{
52
153
  const { url } = result;
53
154
  const parentUrlClean = parentUrl.split("?")[0];
54
- const isSource = this.isSourceModule(url);
55
- const parentIsSource = this.isSourceModule(parentUrlClean);
155
+ let filePath;
156
+ let parentPath;
157
+ try {
158
+ const urlObj = new URL(url);
159
+ urlObj.search = "";
160
+ filePath = io.fileUrlToPath(urlObj.toString());
161
+ } catch {
162
+ return;
163
+ }
164
+ try {
165
+ parentPath = io.fileUrlToPath(parentUrlClean);
166
+ } catch {
167
+ parentPath = "";
168
+ }
169
+ const isSource = this.fileInfoMap.has(filePath);
170
+ const parentIsSource = this.fileInfoMap.has(parentPath);
56
171
  if (isSource || parentIsSource) {
57
- this.trackDependency(url, parentUrl);
172
+ this.trackDependency(filePath, parentPath);
173
+ }
174
+ };
175
+ loadTs = (url)=>{
176
+ if (!url.startsWith("file:")) return null;
177
+ const cleanPath = new URL(url).pathname;
178
+ const fileInfo = this.fileInfoMap.get(cleanPath);
179
+ if (fileInfo == null) return null;
180
+ const cached = this.transpileCache.get(cleanPath);
181
+ if (cached != null) return {
182
+ source: cached
183
+ };
184
+ const { project } = fileInfo;
185
+ const tsConfig = project.getTsConfigSync();
186
+ const userConfig = project.getSwcConfigSync();
187
+ const file = new FileEx({
188
+ fullPath: cleanPath
189
+ });
190
+ const response = this.transpiler.transformFileSync(file, BuildTargets.es6, {
191
+ tsConfig,
192
+ aliasPaths: true,
193
+ userConfig,
194
+ workspace: this.workspace,
195
+ projects: this.workspace?.getProjects(this.buildConfig)
196
+ });
197
+ if (response.outcome !== "success") {
198
+ this.logger.error(`Failed to transpile ${cleanPath}`, response);
199
+ return null;
58
200
  }
59
- if (!isSource) {
201
+ this.transpileCache.set(cleanPath, response.code);
202
+ return {
203
+ source: response.code
204
+ };
205
+ };
206
+ // ── File watching ────────────────────────────────────────────────────────
207
+ onFileChange = (evt)=>{
208
+ const { file, eventName, project } = evt;
209
+ const fullPath = file.fullPath;
210
+ this.logger.trace(`File ${eventName}: ${fullPath}`);
211
+ if (eventName === io.WatchEvents.unlink) {
212
+ this.fileInfoMap.delete(fullPath);
213
+ return;
214
+ }
215
+ if (eventName === io.WatchEvents.add) {
216
+ if (project.isSourceFile(file)) {
217
+ this.fileInfoMap.set(fullPath, {
218
+ project
219
+ });
220
+ this.moduleCache.set(fullPath, null);
221
+ this.reloadIfAffected(fullPath);
222
+ }
60
223
  return;
61
224
  }
62
- result.url = this.getCachedOrNew(url);
225
+ // change
226
+ if (!project.isSourceFile(file)) return;
227
+ this.transpileCache.delete(fullPath);
228
+ this.transpiler.invalidateContentCache(new FileEx({
229
+ fullPath
230
+ }));
231
+ this.reloadIfAffected(fullPath);
63
232
  };
64
- isSourceModule(url) {
65
- const path = io.fileUrlToPath(url);
66
- return this.sourceFiles.includes(path);
233
+ reloadIfAffected(fullPath) {
234
+ const deps = this.getDependencyGraph(fullPath);
235
+ const modules = [
236
+ ...new Set([
237
+ ...deps,
238
+ fullPath
239
+ ])
240
+ ];
241
+ if (!modules.includes(this.entryModulePath)) {
242
+ this.logger.trace(`Change in ${fullPath} does not affect entry — skipping reload`);
243
+ return false;
244
+ }
245
+ this.logger.trace(`Change in ${fullPath} affects ${modules.length} module(s) — scheduling reload`);
246
+ this.invalidateModule(...modules);
247
+ this.scheduleReboot();
248
+ return true;
67
249
  }
250
+ // ── Dependency graph ─────────────────────────────────────────────────────
68
251
  getDependencyGraph(moduleId, parentModules = []) {
69
- if (this.isSelf(moduleId)) {
70
- return [];
71
- }
252
+ if (this.isSelf(moduleId)) return [];
72
253
  const moduleDeps = this.dependencies.get(moduleId) ?? [];
73
254
  if (parentModules.includes(moduleId)) {
74
255
  this.logger.error(`Circular reference detected: ${moduleId}`);
75
256
  return [];
76
257
  }
77
- let subDeps = Array.of();
258
+ let subDeps = [];
78
259
  for (const dep of moduleDeps){
79
- if (!this.sourceFiles.includes(dep)) continue;
260
+ if (!this.fileInfoMap.has(dep)) continue;
80
261
  const subs = this.getDependencyGraph(dep, [
81
262
  moduleId,
82
263
  ...parentModules
@@ -93,9 +274,8 @@ export class HotReloadServer extends EventEmitter {
93
274
  ])
94
275
  ];
95
276
  }
96
- trackDependency(url, parentUrl) {
97
- const filePath = io.fileUrlToPath(url);
98
- const parentPath = io.fileUrlToPath(parentUrl.split("?")[0]);
277
+ trackDependency(filePath, parentPath) {
278
+ if (!parentPath) return;
99
279
  const deps = this.dependencies.get(filePath) ?? [];
100
280
  const updatedDeps = new Set([
101
281
  ...deps,
@@ -105,6 +285,7 @@ export class HotReloadServer extends EventEmitter {
105
285
  ...updatedDeps
106
286
  ]);
107
287
  }
288
+ // ── Module cache ─────────────────────────────────────────────────────────
108
289
  getCachedOrNew(moduleUrl) {
109
290
  const filePath = io.fileUrlToPath(moduleUrl);
110
291
  const cached = this.moduleCache.get(filePath);
@@ -114,88 +295,33 @@ export class HotReloadServer extends EventEmitter {
114
295
  }
115
296
  versionModule(moduleUrl) {
116
297
  const versionedUrl = new URL(moduleUrl);
117
- versionedUrl.searchParams.set("version", Date.now().toString());
298
+ versionedUrl.searchParams.set(VERSION_URL_PARAM, Date.now().toString());
118
299
  return versionedUrl.toString();
119
300
  }
120
- watch = async (dirs)=>{
121
- for (const dir of dirs){
122
- const watcher = io.watch(dir, {
123
- include: [
124
- "**/*.js"
125
- ],
126
- ignoreInitial: true
127
- });
128
- watcher.on("add", this.onFileAdded).on("change", this.onSourceFileChanged).on("unlink", this.onFileDeleted);
129
- this.watchers.push(watcher);
130
- }
131
- };
132
- onFileAdded = async ({ fullPath })=>{
133
- this.sourceFiles.push(fullPath);
134
- this.moduleCache.set(fullPath, null);
135
- this.reloadIfAffected(fullPath);
136
- };
137
- onSourceFileChanged = async ({ fullPath })=>{
138
- if (!this.reloadIfAffected(fullPath)) {
139
- this.logger.trace(`${fullPath} is not part of the current dependency graph. Not reloading entry.`);
140
- }
141
- };
142
- onFileDeleted = async ({ fullPath })=>{
143
- this.removeSourceFiles(fullPath);
144
- };
145
- reloadIfAffected(fullPath) {
146
- const deps = this.getDependencyGraph(fullPath);
147
- const modules = [
148
- ...new Set([
149
- ...deps,
150
- fullPath
151
- ])
152
- ];
153
- if (!modules.includes(this.entryModule)) {
154
- return false;
155
- }
156
- this.invlidateModule(...modules);
157
- this.disposeAndBoot();
158
- return true;
159
- }
160
- isSelf(urlLike) {
161
- return currentFilePath === path.resolve(io.fileUrlToPath(urlLike));
162
- }
163
- invlidateModule(...modules) {
301
+ invalidateModule(...modules) {
164
302
  for (const module of modules){
165
303
  this.moduleCache.set(module, null);
166
- }
167
- // Prune invalidated modules from all parent lists so stale relationships
168
- // are cleared. The fresh boot rebuilds only what is actually imported.
169
- for (const [child, parents] of this.dependencies){
170
- const pruned = parents.filter((p)=>!modules.includes(p));
171
- if (pruned.length === 0) {
172
- this.dependencies.delete(child);
173
- } else {
174
- this.dependencies.set(child, pruned);
304
+ this.transpileCache.delete(module);
305
+ // Prune stale outgoing edges: remove this module as a parent from all dependency lists
306
+ for (const [key, parents] of this.dependencies){
307
+ const filtered = parents.filter((p)=>p !== module);
308
+ if (filtered.length === 0) {
309
+ this.dependencies.delete(key);
310
+ } else {
311
+ this.dependencies.set(key, filtered);
312
+ }
175
313
  }
176
314
  }
177
315
  }
178
316
  invalidateAllSourceFiles() {
179
- for (const file of this.sourceFiles){
180
- this.moduleCache.set(file, null);
317
+ for (const filePath of this.fileInfoMap.keys()){
318
+ this.moduleCache.set(filePath, null);
181
319
  }
182
320
  }
183
- disposeAndBoot = debounce(async ()=>{
184
- await this.disposeEntry();
185
- await this.bootEntry();
186
- }, 250);
187
- async disposeEntry() {
188
- await this.entry?.[Symbol.asyncDispose]();
189
- }
190
- async bootEntry() {
191
- try {
192
- const version = this.versionModule(io.pathToFileUrl(this.entryModule));
193
- this.entry = (await import(version))?.default;
194
- this.emit("reboot");
195
- } catch (error) {
196
- this.logger.error(`There was an error booting the entry point. Your application may not function as expected`, error);
197
- }
321
+ // ── Utilities ────────────────────────────────────────────────────────────
322
+ isSelf(filePath) {
323
+ return currentFilePath === path.resolve(filePath);
198
324
  }
199
325
  }
200
326
 
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHR5cGUgRmlsZSwgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvc3lzdGVtXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgeyBhZGRSZXNvbHZlckhvb2ssIGluaXRNb2R1bGVIb29rcywgcmVtb3ZlUmVzb2x2ZXJIb29rIH0gZnJvbSBcIi4vaG90LW1vZHVsZS1ob29rcy5qc1wiO1xuXG5jb25zdCBjdXJyZW50RmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0cmVib290OiBbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGVudHJ5TW9kdWxlOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnk6IEFzeW5jRGlzcG9zYWJsZTtcblx0cHJpdmF0ZSBzb3VyY2VGaWxlczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSBtb2R1bGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPigpO1xuXHRwcml2YXRlIGRlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcblx0cHJpdmF0ZSB3YXRjaGVyczogUmV0dXJuVHlwZTx0eXBlb2YgaW8ud2F0Y2g+W10gPSBbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IobG9nZ2VyOiBMb2dnZXIpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIHN0YXJ0KGVudHJ5OiBzdHJpbmcsIC4uLndhdGNoRGlyczogc3RyaW5nW10pIHtcblx0XHR0aGlzLmVudHJ5TW9kdWxlID0gZW50cnk7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0U291cmNlRmlsZXMod2F0Y2hEaXJzKTtcblx0XHR0aGlzLmNvbmZpZ3VyZU1vZHVsZUhvb2tzKCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKTtcblx0XHRhd2FpdCB0aGlzLndhdGNoKHdhdGNoRGlycyk7XG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoXCJTZXJ2aW5nXCIsIGVudHJ5KTtcblx0XHR0aGlzLmxvZ2dlci50cmFjZShcIkhvdCByZWxvYWQgd2F0Y2hpbmdcIiwgd2F0Y2hEaXJzKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHRyZW1vdmVSZXNvbHZlckhvb2sodGhpcy5vblJlc29sdmUpO1xuXHRcdGZvciAoY29uc3Qgd2F0Y2hlciBvZiB0aGlzLndhdGNoZXJzKSB7XG5cdFx0XHR3YXRjaGVyLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJ5KCk7XG5cdH1cblxuXHRwcml2YXRlIHJlbW92ZVNvdXJjZUZpbGVzKC4uLnNvdXJjZUZpbGVzOiBzdHJpbmdbXSkge1xuXHRcdHRoaXMuc291cmNlRmlsZXMgPSB0aGlzLnNvdXJjZUZpbGVzLmZpbHRlcihcblx0XHRcdChzb3VyY2VGaWxlKSA9PiAhc291cmNlRmlsZXMuaW5jbHVkZXMoc291cmNlRmlsZSksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0U291cmNlRmlsZXMoZGlyczogc3RyaW5nW10pIHtcblx0XHRjb25zdCBwYXR0ZXJucyA9IGRpcnMubWFwKChkaXIpID0+IGAke2Rpcn0vKiovKi5qc2ApO1xuXHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgaW8uZmluZEZpbGVzKHBhdHRlcm5zKTtcblx0XHRyZXR1cm4gZmlsZXMubWFwKChmKSA9PiBmLmZ1bGxQYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgY29uZmlndXJlTW9kdWxlSG9va3MoKSB7XG5cdFx0aW5pdE1vZHVsZUhvb2tzKCk7XG5cdFx0YWRkUmVzb2x2ZXJIb29rKHRoaXMub25SZXNvbHZlKTtcblx0fVxuXG5cdHByaXZhdGUgb25SZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZSh1cmwpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZShwYXJlbnRVcmxDbGVhbik7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KHVybCwgcGFyZW50VXJsKTtcblx0XHR9XG5cblx0XHRpZiAoIWlzU291cmNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmVzdWx0LnVybCA9IHRoaXMuZ2V0Q2FjaGVkT3JOZXcodXJsKTtcblx0fTtcblxuXHRwcml2YXRlIGlzU291cmNlTW9kdWxlKHVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRyZXR1cm4gdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhwYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUdyYXBoKG1vZHVsZUlkOiBzdHJpbmcsIHBhcmVudE1vZHVsZXM6IHN0cmluZ1tdID0gW10pIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kdWxlRGVwcyA9IHRoaXMuZGVwZW5kZW5jaWVzLmdldChtb2R1bGVJZCkgPz8gW107XG5cdFx0aWYgKHBhcmVudE1vZHVsZXMuaW5jbHVkZXMobW9kdWxlSWQpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAke21vZHVsZUlkfWApO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGxldCBzdWJEZXBzID0gQXJyYXkub2Y8c3RyaW5nPigpO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIG1vZHVsZURlcHMpIHtcblx0XHRcdGlmICghdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeSh1cmw6IHN0cmluZywgcGFyZW50VXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRjb25zdCBwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdKTtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRDYWNoZWRPck5ldyhtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChtb2R1bGVVcmwpO1xuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMubW9kdWxlQ2FjaGUuZ2V0KGZpbGVQYXRoKTtcblx0XHRjb25zdCB2ZXJzaW9uZWQgPSBjYWNoZWQgPz8gdGhpcy52ZXJzaW9uTW9kdWxlKG1vZHVsZVVybCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZVBhdGgsIHZlcnNpb25lZCk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZDtcblx0fVxuXG5cdHByaXZhdGUgdmVyc2lvbk1vZHVsZShtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IHZlcnNpb25lZFVybCA9IG5ldyBVUkwobW9kdWxlVXJsKTtcblx0XHR2ZXJzaW9uZWRVcmwuc2VhcmNoUGFyYW1zLnNldChcInZlcnNpb25cIiwgRGF0ZS5ub3coKS50b1N0cmluZygpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIHdhdGNoID0gYXN5bmMgKGRpcnM6IHN0cmluZ1tdKSA9PiB7XG5cdFx0Zm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuXHRcdFx0Y29uc3Qgd2F0Y2hlciA9IGlvLndhdGNoKGRpciwgeyBpbmNsdWRlOiBbXCIqKi8qLmpzXCJdLCBpZ25vcmVJbml0aWFsOiB0cnVlIH0pO1xuXHRcdFx0d2F0Y2hlclxuXHRcdFx0XHQub24oXCJhZGRcIiwgdGhpcy5vbkZpbGVBZGRlZClcblx0XHRcdFx0Lm9uKFwiY2hhbmdlXCIsIHRoaXMub25Tb3VyY2VGaWxlQ2hhbmdlZClcblx0XHRcdFx0Lm9uKFwidW5saW5rXCIsIHRoaXMub25GaWxlRGVsZXRlZCk7XG5cdFx0XHR0aGlzLndhdGNoZXJzLnB1c2god2F0Y2hlcik7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlQWRkZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIG9uU291cmNlRmlsZUNoYW5nZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0aWYgKCF0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdFx0YCR7ZnVsbFBhdGh9IGlzIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IGRlcGVuZGVuY3kgZ3JhcGguIE5vdCByZWxvYWRpbmcgZW50cnkuYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlRGVsZXRlZCA9IGFzeW5jICh7IGZ1bGxQYXRoIH06IEZpbGUpID0+IHtcblx0XHR0aGlzLnJlbW92ZVNvdXJjZUZpbGVzKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXMpO1xuXHRcdHRoaXMuZGlzcG9zZUFuZEJvb3QoKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHByaXZhdGUgaXNTZWxmKHVybExpa2U6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShpby5maWxlVXJsVG9QYXRoKHVybExpa2UpKTtcblx0fVxuXG5cdHByaXZhdGUgaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHR9XG5cdFx0Ly8gUHJ1bmUgaW52YWxpZGF0ZWQgbW9kdWxlcyBmcm9tIGFsbCBwYXJlbnQgbGlzdHMgc28gc3RhbGUgcmVsYXRpb25zaGlwc1xuXHRcdC8vIGFyZSBjbGVhcmVkLiBUaGUgZnJlc2ggYm9vdCByZWJ1aWxkcyBvbmx5IHdoYXQgaXMgYWN0dWFsbHkgaW1wb3J0ZWQuXG5cdFx0Zm9yIChjb25zdCBbY2hpbGQsIHBhcmVudHNdIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG5cdFx0XHRjb25zdCBwcnVuZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gIW1vZHVsZXMuaW5jbHVkZXMocCkpO1xuXHRcdFx0aWYgKHBydW5lZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZGVsZXRlKGNoaWxkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChjaGlsZCwgcHJ1bmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpIHtcblx0XHRmb3IgKGNvbnN0IGZpbGUgb2YgdGhpcy5zb3VyY2VGaWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZSwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBkaXNwb3NlQW5kQm9vdCA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdH0sIDI1MCk7XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cnkoKSB7XG5cdFx0YXdhaXQgdGhpcy5lbnRyeT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeSgpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdmVyc2lvbiA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGUpKTtcblx0XHRcdHRoaXMuZW50cnkgPSAoYXdhaXQgaW1wb3J0KHZlcnNpb24pKT8uZGVmYXVsdDtcblx0XHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdGBUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZGAsXG5cdFx0XHRcdGVycm9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJwYXRoIiwiaW8iLCJkZWJvdW5jZSIsImFkZFJlc29sdmVySG9vayIsImluaXRNb2R1bGVIb29rcyIsInJlbW92ZVJlc29sdmVySG9vayIsImN1cnJlbnRGaWxlUGF0aCIsImZpbGVVcmxUb1BhdGgiLCJ1cmwiLCJIb3RSZWxvYWRTZXJ2ZXIiLCJsb2dnZXIiLCJkaXNwb3NlZCIsImVudHJ5TW9kdWxlIiwiZW50cnkiLCJzb3VyY2VGaWxlcyIsIm1vZHVsZUNhY2hlIiwiTWFwIiwiZGVwZW5kZW5jaWVzIiwid2F0Y2hlcnMiLCJzdGFydCIsIndhdGNoRGlycyIsImdldFNvdXJjZUZpbGVzIiwiY29uZmlndXJlTW9kdWxlSG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInRyYWNlIiwiYm9vdEVudHJ5IiwiZGlzcG9zZSIsIm9uUmVzb2x2ZSIsIndhdGNoZXIiLCJjbG9zZSIsImRpc3Bvc2VFbnRyeSIsInJlbW92ZVNvdXJjZUZpbGVzIiwiZmlsdGVyIiwic291cmNlRmlsZSIsImluY2x1ZGVzIiwiZGlycyIsInBhdHRlcm5zIiwibWFwIiwiZGlyIiwiZmlsZXMiLCJmaW5kRmlsZXMiLCJmIiwiZnVsbFBhdGgiLCJyZXN1bHQiLCJwYXJlbnRVcmwiLCJwYXJlbnRVcmxDbGVhbiIsInNwbGl0IiwiaXNTb3VyY2UiLCJpc1NvdXJjZU1vZHVsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZ2V0Q2FjaGVkT3JOZXciLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVJZCIsInBhcmVudE1vZHVsZXMiLCJpc1NlbGYiLCJtb2R1bGVEZXBzIiwiZ2V0IiwiZXJyb3IiLCJzdWJEZXBzIiwiQXJyYXkiLCJvZiIsImRlcCIsInN1YnMiLCJTZXQiLCJmaWxlUGF0aCIsInBhcmVudFBhdGgiLCJkZXBzIiwidXBkYXRlZERlcHMiLCJzZXQiLCJtb2R1bGVVcmwiLCJjYWNoZWQiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uTW9kdWxlIiwidmVyc2lvbmVkVXJsIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwiRGF0ZSIsIm5vdyIsInRvU3RyaW5nIiwiaW5jbHVkZSIsImlnbm9yZUluaXRpYWwiLCJvbiIsIm9uRmlsZUFkZGVkIiwib25Tb3VyY2VGaWxlQ2hhbmdlZCIsIm9uRmlsZURlbGV0ZWQiLCJwdXNoIiwicmVsb2FkSWZBZmZlY3RlZCIsIm1vZHVsZXMiLCJpbnZsaWRhdGVNb2R1bGUiLCJkaXNwb3NlQW5kQm9vdCIsInVybExpa2UiLCJyZXNvbHZlIiwibW9kdWxlIiwiY2hpbGQiLCJwYXJlbnRzIiwicHJ1bmVkIiwicCIsImxlbmd0aCIsImRlbGV0ZSIsImZpbGUiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiLCJ2ZXJzaW9uIiwicGF0aFRvRmlsZVVybCIsImRlZmF1bHQiLCJlbWl0Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxZQUFZLFFBQVEsY0FBYztBQUUzQyxPQUFPQyxVQUFVLFlBQVk7QUFDN0IsU0FBb0JDLEVBQUUsUUFBUSxxQkFBcUI7QUFDbkQsU0FBU0MsUUFBUSxRQUFRLHlCQUF5QjtBQUVsRCxTQUFTQyxlQUFlLEVBQUVDLGVBQWUsRUFBRUMsa0JBQWtCLFFBQVEsd0JBQXdCO0FBRTdGLE1BQU1DLGtCQUFrQkwsR0FBR00sYUFBYSxDQUFDLFlBQVlDLEdBQUc7QUFNeEQsT0FBTyxNQUFNQyx3QkFBd0JWO0lBQ25CVyxPQUFlO0lBQ3hCQyxXQUFXLE1BQU07SUFDakJDLFlBQW9CO0lBQ3BCQyxNQUF1QjtJQUN2QkMsY0FBd0IsRUFBRSxDQUFDO0lBQzNCQyxjQUFjLElBQUlDLE1BQTZCO0lBQy9DQyxlQUFlLElBQUlELE1BQXdCO0lBQzNDRSxXQUEwQyxFQUFFLENBQUM7SUFFckQsWUFBbUJSLE1BQWMsQ0FBRTtRQUNsQyxLQUFLO1FBQ0wsSUFBSSxDQUFDQSxNQUFNLEdBQUdBO0lBQ2Y7SUFFQSxNQUFhUyxNQUFNTixLQUFhLEVBQUUsR0FBR08sU0FBbUIsRUFBRTtRQUN6RCxJQUFJLENBQUNSLFdBQVcsR0FBR0M7UUFDbkIsSUFBSSxDQUFDQyxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUNPLGNBQWMsQ0FBQ0Q7UUFDN0MsSUFBSSxDQUFDRSxvQkFBb0I7UUFDekIsSUFBSSxDQUFDQyx3QkFBd0I7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
327
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuXHRMb2FkRm5PdXRwdXQsXG5cdExvYWRIb29rQ29udGV4dCxcblx0UmVzb2x2ZUZuT3V0cHV0LFxuXHRSZXNvbHZlSG9va0NvbnRleHQsXG59IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQnVpbGRUYXJnZXRzLCBTd2NUcmFuc3BpbGVyLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBXb3Jrc3BhY2VGYWN0b3J5IH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBGaWxlRXgsIGlvIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pb1wiO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL3N5c3RlbVwiO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgdHlwZSB7IFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5cbnR5cGUgTG9hZERlbGVnYXRlID0gKHVybDogc3RyaW5nKSA9PiB7IHNvdXJjZTogc3RyaW5nIH0gfCBudWxsO1xuXG5jb25zdCBjdXJyZW50RmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBWRVJTSU9OX1VSTF9QQVJBTSA9IFwidmVyc2lvblwiO1xuY29uc3QgUkVCT09UX0RFQk9VTkNFX01TID0gMjUwO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlckV2ZW50cyB7XG5cdHN0YXJ0OiBbXTtcblx0cmVib290OiBbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zIHtcblx0LyoqIEJ1aWxkIGNvbmZpZ3VyYXRpb24gbmFtZS4gKi9cblx0YnVpbGRDb25maWc6IHN0cmluZztcblx0LyoqIE5hbWUgb2YgdGhlIHByb2plY3QgdG8gc2VydmUuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UuICovXG5cdHByb2plY3Q/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBQcmUtYnVpbHQgV29ya3NwYWNlIGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgV29ya3NwYWNlRmFjdG9yeS5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIGJ5cGFzcyBmaWxlc3lzdGVtLWJhc2VkIHdvcmtzcGFjZSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG59XG5cbnR5cGUgRmlsZUluZm8gPSB7IHByb2plY3Q6IFByb2plY3QgfTtcblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0Ly8g4pSA4pSAIFN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXHRwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihIb3RSZWxvYWRTZXJ2ZXIubmFtZSk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBob29rc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBlbnRyeU1vZHVsZVBhdGghOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnlNb2R1bGU/OiBBc3luY0Rpc3Bvc2FibGU7XG5cdHByaXZhdGUgd29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHRwcml2YXRlIGJ1aWxkQ29uZmlnID0gXCJkZWJ1Z1wiO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHQvKiogTWFwIGZyb20gYWJzb2x1dGUgLnRzIHNvdXJjZSBmaWxlIHBhdGggdG8gcHJvamVjdCBpbmZvICovXG5cdHByaXZhdGUgZmlsZUluZm9NYXAgPSBuZXcgTWFwPHN0cmluZywgRmlsZUluZm8+KCk7XG5cdHByaXZhdGUgbW9kdWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcblx0cHJpdmF0ZSBkZXBlbmRlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cdHByaXZhdGUgdHJhbnNwaWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXHRwcml2YXRlIHRyYW5zcGlsZXIgPSBuZXcgU3djVHJhbnNwaWxlcigpO1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuY2xlYXIoKTtcblxuXHRcdGNvbnN0IHsgYnVpbGRDb25maWcgfSA9IG9wdGlvbnM7XG5cdFx0dGhpcy5idWlsZENvbmZpZyA9IGJ1aWxkQ29uZmlnO1xuXHRcdHRoaXMud29ya3NwYWNlID0gYXdhaXQgdGhpcy5yZXNvbHZlV29ya3NwYWNlKG9wdGlvbnMpO1xuXHRcdGNvbnN0IHByb2plY3QgPSB0aGlzLnJlc29sdmVQcm9qZWN0KGJ1aWxkQ29uZmlnLCBvcHRpb25zLnByb2plY3QpO1xuXG5cdFx0dGhpcy5lbnRyeU1vZHVsZVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5nZXRTb3VyY2VFbnRyeVBhdGgoKSk7XG5cdFx0dGhpcy5maWxlSW5mb01hcCA9IGF3YWl0IHRoaXMuYnVpbGRGaWxlSW5mb01hcChidWlsZENvbmZpZyk7XG5cblx0XHR0aGlzLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgdGhpcy53b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLndvcmtzcGFjZS5wcm9qZWN0RmlsZUNoYW5nZWQkLnN1YnNjcmliZSh0aGlzLm9uRmlsZUNoYW5nZSk7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgU2VydmluZyAke3RoaXMuZW50cnlNb2R1bGVQYXRofWApO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdFx0dGhpcy5lbWl0KFwic3RhcnRcIik7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZGlzcG9zZSgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cdFx0dGhpcy53b3Jrc3BhY2U/LltTeW1ib2wuZGlzcG9zZV0oKTtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2UoKTtcblx0fVxuXG5cdC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cnkoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybCA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGVQYXRoKSk7XG5cdFx0XHR0aGlzLmVudHJ5TW9kdWxlID0gKGF3YWl0IGltcG9ydCh1cmwpKT8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFwiVGhlcmUgd2FzIGFuIGVycm9yIGJvb3RpbmcgdGhlIGVudHJ5IHBvaW50LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWRcIixcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcmVib290KCkge1xuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKFwiUmVib290aW5nIGVudHJ5IG1vZHVsZVwiKTtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cnkoKSB7XG5cdFx0YXdhaXQgdGhpcy5lbnRyeU1vZHVsZT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdH1cblxuXHRwcml2YXRlIHNjaGVkdWxlUmVib290ID0gZGVib3VuY2UoKCkgPT4gdGhpcy5yZWJvb3QoKSwgUkVCT09UX0RFQk9VTkNFX01TKTtcblxuXHQvLyDilIDilIAgU2V0dXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyByZXNvbHZlV29ya3NwYWNlKG9wdGlvbnM6IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMpOiBQcm9taXNlPFdvcmtzcGFjZT4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRvcHRpb25zLndvcmtzcGFjZSA/P1xuXHRcdFx0V29ya3NwYWNlRmFjdG9yeS5jcmVhdGUoeyAuLi5Xb3Jrc3BhY2VEZWZhdWx0cywgcm9vdERpcjogcHJvY2Vzcy5jd2QoKSB9KVxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVQcm9qZWN0KGJ1aWxkQ29uZmlnOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcpOiBQcm9qZWN0IHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgZm91bmQgPSBuYW1lID09IG51bGwgPyBwcm9qZWN0cy5hdCgwKSA6IHByb2plY3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0aWYgKGZvdW5kID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0bmFtZSA9PSBudWxsXG5cdFx0XHRcdFx0PyBgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7YnVpbGRDb25maWd9YFxuXHRcdFx0XHRcdDogYFByb2plY3QgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIHdvcmtzcGFjZWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gZm91bmQ7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJ1aWxkRmlsZUluZm9NYXAoYnVpbGRDb25maWc6IHN0cmluZyk6IFByb21pc2U8TWFwPHN0cmluZywgRmlsZUluZm8+PiB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IGVudHJpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdHByb2plY3RzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCBmaWxlcyA9IGF3YWl0IHByb2plY3QuZ2V0QWxsRmlsZXMoKTtcblx0XHRcdFx0cmV0dXJuIGZpbGVzLm1hcCgoZmlsZSk6IFtzdHJpbmcsIEZpbGVJbmZvXSA9PiBbZmlsZS5mdWxsUGF0aCwgeyBwcm9qZWN0IH1dKTtcblx0XHRcdH0pLFxuXHRcdCk7XG5cdFx0cmV0dXJuIG5ldyBNYXAoZW50cmllcy5mbGF0KCkpO1xuXHR9XG5cblx0cHJpdmF0ZSByZWdpc3Rlckhvb2tzKCkge1xuXHRcdGlmICh0aGlzLmhvb2tzUmVnaXN0ZXJlZCkgcmV0dXJuO1xuXHRcdHRoaXMuaG9va3NSZWdpc3RlcmVkID0gdHJ1ZTtcblx0XHRyZWdpc3Rlckhvb2tzKHtcblx0XHRcdHJlc29sdmU6IChcblx0XHRcdFx0c3BlY2lmaWVyOiBzdHJpbmcsXG5cdFx0XHRcdGNvbnRleHQ6IFJlc29sdmVIb29rQ29udGV4dCxcblx0XHRcdFx0bmV4dDogKHNwZWNpZmllcjogc3RyaW5nLCBjb250ZXh0PzogUGFydGlhbDxSZXNvbHZlSG9va0NvbnRleHQ+KSA9PiBSZXNvbHZlRm5PdXRwdXQsXG5cdFx0XHQpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybiBuZXh0KHNwZWNpZmllciwgY29udGV4dCk7XG5cdFx0XHRcdGNvbnN0IHBhcmVudFVybCA9IGNvbnRleHQucGFyZW50VVJMID8/IFwiXCI7XG5cdFx0XHRcdGNvbnN0IHJld3JpdHRlbiA9IHRoaXMucmV3cml0ZUpzVG9UcyhzcGVjaWZpZXIsIHBhcmVudFVybCkgPz8gc3BlY2lmaWVyO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBuZXh0KHJld3JpdHRlbiwgY29udGV4dCkgYXMgUmVzb2x2ZUZuT3V0cHV0O1xuXHRcdFx0XHR0aGlzLm9uUG9zdFJlc29sdmUocmVzdWx0LCBwYXJlbnRVcmwpO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdGxvYWQ6IChcblx0XHRcdFx0dXJsOiBzdHJpbmcsXG5cdFx0XHRcdGNvbnRleHQ6IExvYWRIb29rQ29udGV4dCxcblx0XHRcdFx0bmV4dDogKHVybDogc3RyaW5nLCBjb250ZXh0PzogUGFydGlhbDxMb2FkSG9va0NvbnRleHQ+KSA9PiBMb2FkRm5PdXRwdXQsXG5cdFx0XHQpOiBMb2FkRm5PdXRwdXQgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuIG5leHQodXJsLCBjb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5sb2FkVHModXJsKTtcblx0XHRcdFx0aWYgKHJlc3VsdCAhPSBudWxsKVxuXHRcdFx0XHRcdHJldHVybiB7IGZvcm1hdDogXCJtb2R1bGVcIiwgc291cmNlOiByZXN1bHQuc291cmNlLCBzaG9ydENpcmN1aXQ6IHRydWUgfTtcblx0XHRcdFx0cmV0dXJuIG5leHQodXJsLCBjb250ZXh0KTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGhvb2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdC8qKlxuXHQgKiBQcmUtbmV4dCBzcGVjaWZpZXIgcmV3cml0ZXI6IGlmIHNwZWNpZmllciBpcyBhIC5qcyBpbXBvcnQgdGhhdCBtYXBzIHRvIGFcblx0ICoga25vd24gLnRzIHNvdXJjZSBmaWxlLCByZXR1cm5zIHRoZSB2ZXJzaW9uZWQgLnRzIGZpbGUgVVJMIHNvIG5leHQoKSBuZXZlclxuXHQgKiB0cmllcyB0byBsb2FkIGEgbm9uLWV4aXN0ZW50IC5qcyBmaWxlIGZyb20gZGlzay5cblx0ICovXG5cdHByaXZhdGUgcmV3cml0ZUpzVG9UcyA9IChzcGVjaWZpZXI6IHN0cmluZywgcGFyZW50VXJsOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcblx0XHRpZiAoIXNwZWNpZmllci5lbmRzV2l0aChcIi5qc1wiKSkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBwYXJlbnRDbGVhbiA9IHBhcmVudFVybC5zcGxpdChcIj9cIilbMF07XG5cdFx0aWYgKCFwYXJlbnRDbGVhbikgcmV0dXJuIG51bGw7XG5cblx0XHRsZXQganNQYXRoOiBzdHJpbmc7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHJlc29sdmVkID0gbmV3IFVSTChzcGVjaWZpZXIsIHBhcmVudENsZWFuKTtcblx0XHRcdGpzUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgocmVzb2x2ZWQudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoIWpzUGF0aC5lbmRzV2l0aChcIi5qc1wiKSkgcmV0dXJuIG51bGw7XG5cdFx0Y29uc3QgdHNQYXRoID0ganNQYXRoLnJlcGxhY2UoL1xcLmpzJC8sIFwiLnRzXCIpO1xuXHRcdGlmICghdGhpcy5maWxlSW5mb01hcC5oYXModHNQYXRoKSkgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRDYWNoZWRPck5ldyhpby5wYXRoVG9GaWxlVXJsKHRzUGF0aCkpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBQb3N0LW5leHQgZGVwZW5kZW5jeSB0cmFja2VyOiByZWNvcmRzIHdoaWNoIHNvdXJjZSBmaWxlcyBpbXBvcnQgd2hpY2hcblx0ICogb3RoZXIgc291cmNlIGZpbGVzIHNvIHRoYXQgcmVsb2FkSWZBZmZlY3RlZCBjYW4gdHJhdmVyc2UgdGhlIGdyYXBoLlxuXHQgKi9cblx0cHJpdmF0ZSBvblBvc3RSZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0bGV0IGZpbGVQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IHBhcmVudFBhdGg6IHN0cmluZztcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cdFx0XHR1cmxPYmouc2VhcmNoID0gXCJcIjtcblx0XHRcdGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aCh1cmxPYmoudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHBhcmVudFBhdGggPSBpby5maWxlVXJsVG9QYXRoKHBhcmVudFVybENsZWFuKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHBhcmVudFBhdGggPSBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5maWxlSW5mb01hcC5oYXMoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5maWxlSW5mb01hcC5oYXMocGFyZW50UGF0aCk7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoLCBwYXJlbnRQYXRoKTtcblx0XHR9XG5cdH07XG5cblx0cHJpdmF0ZSBsb2FkVHM6IExvYWREZWxlZ2F0ZSA9ICh1cmw6IHN0cmluZykgPT4ge1xuXHRcdGlmICghdXJsLnN0YXJ0c1dpdGgoXCJmaWxlOlwiKSkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjbGVhblBhdGggPSBuZXcgVVJMKHVybCkucGF0aG5hbWU7XG5cdFx0Y29uc3QgZmlsZUluZm8gPSB0aGlzLmZpbGVJbmZvTWFwLmdldChjbGVhblBhdGgpO1xuXHRcdGlmIChmaWxlSW5mbyA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMudHJhbnNwaWxlQ2FjaGUuZ2V0KGNsZWFuUGF0aCk7XG5cdFx0aWYgKGNhY2hlZCAhPSBudWxsKSByZXR1cm4geyBzb3VyY2U6IGNhY2hlZCB9O1xuXG5cdFx0Y29uc3QgeyBwcm9qZWN0IH0gPSBmaWxlSW5mbztcblx0XHRjb25zdCB0c0NvbmZpZyA9IHByb2plY3QuZ2V0VHNDb25maWdTeW5jKCk7XG5cdFx0Y29uc3QgdXNlckNvbmZpZyA9IHByb2plY3QuZ2V0U3djQ29uZmlnU3luYygpO1xuXG5cdFx0Y29uc3QgZmlsZSA9IG5ldyBGaWxlRXgoeyBmdWxsUGF0aDogY2xlYW5QYXRoIH0pO1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gdGhpcy50cmFuc3BpbGVyLnRyYW5zZm9ybUZpbGVTeW5jKGZpbGUsIEJ1aWxkVGFyZ2V0cy5lczYsIHtcblx0XHRcdHRzQ29uZmlnLFxuXHRcdFx0YWxpYXNQYXRoczogdHJ1ZSxcblx0XHRcdHVzZXJDb25maWcsXG5cdFx0XHR3b3Jrc3BhY2U6IHRoaXMud29ya3NwYWNlLFxuXHRcdFx0cHJvamVjdHM6IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyh0aGlzLmJ1aWxkQ29uZmlnKSxcblx0XHR9KTtcblxuXHRcdGlmIChyZXNwb25zZS5vdXRjb21lICE9PSBcInN1Y2Nlc3NcIikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB0cmFuc3BpbGUgJHtjbGVhblBhdGh9YCwgcmVzcG9uc2UpO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5zZXQoY2xlYW5QYXRoLCByZXNwb25zZS5jb2RlKTtcblx0XHRyZXR1cm4geyBzb3VyY2U6IHJlc3BvbnNlLmNvZGUgfTtcblx0fTtcblxuXHQvLyDilIDilIAgRmlsZSB3YXRjaGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIG9uRmlsZUNoYW5nZSA9IChldnQ6IFByb2plY3RGaWxlRXZlbnQpID0+IHtcblx0XHRjb25zdCB7IGZpbGUsIGV2ZW50TmFtZSwgcHJvamVjdCB9ID0gZXZ0O1xuXHRcdGNvbnN0IGZ1bGxQYXRoID0gZmlsZS5mdWxsUGF0aDtcblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBGaWxlICR7ZXZlbnROYW1lfTogJHtmdWxsUGF0aH1gKTtcblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLnVubGluaykge1xuXHRcdFx0dGhpcy5maWxlSW5mb01hcC5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLmFkZCkge1xuXHRcdFx0aWYgKHByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRcdHRoaXMuZmlsZUluZm9NYXAuc2V0KGZ1bGxQYXRoLCB7IHByb2plY3QgfSk7XG5cdFx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBjaGFuZ2Vcblx0XHRpZiAoIXByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSByZXR1cm47XG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUoZnVsbFBhdGgpO1xuXHRcdHRoaXMudHJhbnNwaWxlci5pbnZhbGlkYXRlQ29udGVudENhY2hlKG5ldyBGaWxlRXgoeyBmdWxsUGF0aCB9KSk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlUGF0aCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gZG9lcyBub3QgYWZmZWN0IGVudHJ5IOKAlCBza2lwcGluZyByZWxvYWRgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gYWZmZWN0cyAke21vZHVsZXMubGVuZ3RofSBtb2R1bGUocykg4oCUIHNjaGVkdWxpbmcgcmVsb2FkYCxcblx0XHQpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZU1vZHVsZSguLi5tb2R1bGVzKTtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290KCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyDilIDilIAgRGVwZW5kZW5jeSBncmFwaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldERlcGVuZGVuY3lHcmFwaChtb2R1bGVJZDogc3RyaW5nLCBwYXJlbnRNb2R1bGVzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuXHRcdGlmICh0aGlzLmlzU2VsZihtb2R1bGVJZCkpIHJldHVybiBbXTtcblxuXHRcdGNvbnN0IG1vZHVsZURlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQobW9kdWxlSWQpID8/IFtdO1xuXHRcdGlmIChwYXJlbnRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZUlkKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZDogJHttb2R1bGVJZH1gKTtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRsZXQgc3ViRGVwczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGRlcCBvZiBtb2R1bGVEZXBzKSB7XG5cdFx0XHRpZiAoIXRoaXMuZmlsZUluZm9NYXAuaGFzKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIERhdGUubm93KCkudG9TdHJpbmcoKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKG1vZHVsZSk7XG5cdFx0XHQvLyBQcnVuZSBzdGFsZSBvdXRnb2luZyBlZGdlczogcmVtb3ZlIHRoaXMgbW9kdWxlIGFzIGEgcGFyZW50IGZyb20gYWxsIGRlcGVuZGVuY3kgbGlzdHNcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5maWxlSW5mb01hcC5rZXlzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHQvLyDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgaXNTZWxmKGZpbGVQYXRoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gY3VycmVudEZpbGVQYXRoID09PSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiRXZlbnRFbWl0dGVyIiwicmVnaXN0ZXJIb29rcyIsInBhdGgiLCJCdWlsZFRhcmdldHMiLCJTd2NUcmFuc3BpbGVyIiwiV29ya3NwYWNlRGVmYXVsdHMiLCJXb3Jrc3BhY2VGYWN0b3J5IiwiRmlsZUV4IiwiaW8iLCJkZWJvdW5jZSIsInNjcmliZSIsImN1cnJlbnRGaWxlUGF0aCIsImZpbGVVcmxUb1BhdGgiLCJ1cmwiLCJWRVJTSU9OX1VSTF9QQVJBTSIsIlJFQk9PVF9ERUJPVU5DRV9NUyIsIkhvdFJlbG9hZFNlcnZlciIsImxvZ2dlciIsIm5hbWUiLCJkaXNwb3NlZCIsImhvb2tzUmVnaXN0ZXJlZCIsImVudHJ5TW9kdWxlUGF0aCIsImVudHJ5TW9kdWxlIiwid29ya3NwYWNlIiwiYnVpbGRDb25maWciLCJ3YXRjaFN1YnNjcmlwdGlvbiIsImZpbGVJbmZvTWFwIiwiTWFwIiwibW9kdWxlQ2FjaGUiLCJkZXBlbmRlbmNpZXMiLCJ0cmFuc3BpbGVDYWNoZSIsInRyYW5zcGlsZXIiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsInJlc29sdmVXb3Jrc3BhY2UiLCJwcm9qZWN0IiwicmVzb2x2ZVByb2plY3QiLCJyZXNvbHZlIiwiZ2V0U291cmNlRW50cnlQYXRoIiwiYnVpbGRGaWxlSW5mb01hcCIsImludmFsaWRhdGVBbGxTb3VyY2VGaWxlcyIsIndhdGNoIiwicHJvamVjdEZpbGVDaGFuZ2VkJCIsInN1YnNjcmliZSIsIm9uRmlsZUNoYW5nZSIsInRyYWNlIiwiYm9vdEVudHJ5IiwiZW1pdCIsImRpc3Bvc2UiLCJ1bnN1YnNjcmliZSIsIlN5bWJvbCIsImRpc3Bvc2VFbnRyeSIsImFzeW5jRGlzcG9zZSIsInZlcnNpb25Nb2R1bGUiLCJwYXRoVG9GaWxlVXJsIiwiZGVmYXVsdCIsImVycm9yIiwicmVib290Iiwic2NoZWR1bGVSZWJvb3QiLCJjcmVhdGUiLCJyb290RGlyIiwicHJvY2VzcyIsImN3ZCIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJmb3VuZCIsImF0IiwiZmluZCIsInAiLCJFcnJvciIsImVudHJpZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiZmlsZXMiLCJnZXRBbGxGaWxlcyIsImZpbGUiLCJmdWxsUGF0aCIsImZsYXQiLCJzcGVjaWZpZXIiLCJjb250ZXh0IiwibmV4dCIsInBhcmVudFVybCIsInBhcmVudFVSTCIsInJld3JpdHRlbiIsInJld3JpdGVKc1RvVHMiLCJyZXN1bHQiLCJvblBvc3RSZXNvbHZlIiwibG9hZCIsImxvYWRUcyIsImZvcm1hdCIsInNvdXJjZSIsInNob3J0Q2lyY3VpdCIsImVuZHNXaXRoIiwicGFyZW50Q2xlYW4iLCJzcGxpdCIsImpzUGF0aCIsInJlc29sdmVkIiwiVVJMIiwidG9TdHJpbmciLCJ0c1BhdGgiLCJyZXBsYWNlIiwiaGFzIiwiZ2V0Q2FjaGVkT3JOZXciLCJwYXJlbnRVcmxDbGVhbiIsImZpbGVQYXRoIiwicGFyZW50UGF0aCIsInVybE9iaiIsInNlYXJjaCIsImlzU291cmNlIiwicGFyZW50SXNTb3VyY2UiLCJ0cmFja0RlcGVuZGVuY3kiLCJzdGFydHNXaXRoIiwiY2xlYW5QYXRoIiwicGF0aG5hbWUiLCJmaWxlSW5mbyIsImdldCIsImNhY2hlZCIsInRzQ29uZmlnIiwiZ2V0VHNDb25maWdTeW5jIiwidXNlckNvbmZpZyIsImdldFN3Y0NvbmZpZ1N5bmMiLCJyZXNwb25zZSIsInRyYW5zZm9ybUZpbGVTeW5jIiwiZXM2IiwiYWxpYXNQYXRocyIsIm91dGNvbWUiLCJzZXQiLCJjb2RlIiwiZXZ0IiwiZXZlbnROYW1lIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJkZWxldGUiLCJhZGQiLCJpc1NvdXJjZUZpbGUiLCJyZWxvYWRJZkFmZmVjdGVkIiwiaW52YWxpZGF0ZUNvbnRlbnRDYWNoZSIsImRlcHMiLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVzIiwiU2V0IiwiaW5jbHVkZXMiLCJsZW5ndGgiLCJpbnZhbGlkYXRlTW9kdWxlIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsInN1YkRlcHMiLCJkZXAiLCJzdWJzIiwidXBkYXRlZERlcHMiLCJtb2R1bGVVcmwiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uZWRVcmwiLCJzZWFyY2hQYXJhbXMiLCJEYXRlIiwibm93IiwibW9kdWxlIiwia2V5IiwicGFyZW50cyIsImZpbHRlcmVkIiwiZmlsdGVyIiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsWUFBWSxRQUFRLGNBQWM7QUFPM0MsU0FBU0MsYUFBYSxRQUFRLGNBQWM7QUFDNUMsT0FBT0MsVUFBVSxZQUFZO0FBQzdCLFNBQVNDLFlBQVksRUFBRUMsYUFBYSxFQUFFQyxpQkFBaUIsUUFBUSxrQkFBa0I7QUFFakYsU0FBU0MsZ0JBQWdCLFFBQVEsaUJBQWlCO0FBQ2xELFNBQVNDLE1BQU0sRUFBRUMsRUFBRSxRQUFRLHFCQUFxQjtBQUNoRCxTQUFTQyxRQUFRLFFBQVEseUJBQXlCO0FBQ2xELFNBQXNCQyxNQUFNLFFBQVEsbUJBQW1CO0FBS3ZELE1BQU1DLGtCQUFrQkgsR0FBR0ksYUFBYSxDQUFDLFlBQVlDLEdBQUc7QUFDeEQsTUFBTUMsb0JBQW9CO0FBQzFCLE1BQU1DLHFCQUFxQjtBQXFCM0IsT0FBTyxNQUFNQyx3QkFBd0JoQjtJQUNwQyw0RUFBNEU7SUFDM0RpQixTQUFpQlAsT0FBT08sTUFBTSxDQUFDRCxnQkFBZ0JFLElBQUksRUFBRTtJQUM5REMsV0FBVyxNQUFN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
package/es6/src/index.js CHANGED
@@ -1,8 +1,4 @@
1
- export { EmberCommand } from "./ember.command.js";
2
- export { EmberActions, EmberModule } from "./ember.module.js";
3
- export * from "./hot-reload-server.js";
4
- export { ServeAction } from "./serve.action.js";
5
- export { ServeCommand } from "./serve.command.js";
6
- export { WorkspaceServeAction } from "./workspace-serve.action.js";
1
+ export { FluxModule } from "./flux.module.js";
2
+ export { HotReloadServer } from "./hot-reload-server.js";
7
3
 
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEVtYmVyQ29tbWFuZCB9IGZyb20gXCIuL2VtYmVyLmNvbW1hbmQuanNcIjtcbmV4cG9ydCB0eXBlIHsgRW1iZXJNb2R1bGVDb250ZXh0LCBFbWJlck1vZHVsZVJlc3VsdCB9IGZyb20gXCIuL2VtYmVyLm1vZHVsZS5qc1wiO1xuZXhwb3J0IHsgRW1iZXJBY3Rpb25zLCBFbWJlck1vZHVsZSB9IGZyb20gXCIuL2VtYmVyLm1vZHVsZS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmVPcHRpb25zIH0gZnJvbSBcIi4vc2VydmUuYWN0aW9uLmpzXCI7XG5leHBvcnQgeyBTZXJ2ZUFjdGlvbiB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuZXhwb3J0IHsgU2VydmVDb21tYW5kIH0gZnJvbSBcIi4vc2VydmUuY29tbWFuZC5qc1wiO1xuZXhwb3J0IHR5cGUgeyBXb3Jrc3BhY2VTZXJ2ZU9wdGlvbnMgfSBmcm9tIFwiLi93b3Jrc3BhY2Utc2VydmUuYWN0aW9uLmpzXCI7XG5leHBvcnQgeyBXb3Jrc3BhY2VTZXJ2ZUFjdGlvbiB9IGZyb20gXCIuL3dvcmtzcGFjZS1zZXJ2ZS5hY3Rpb24uanNcIjtcbiJdLCJuYW1lcyI6WyJFbWJlckNvbW1hbmQiLCJFbWJlckFjdGlvbnMiLCJFbWJlck1vZHVsZSIsIlNlcnZlQWN0aW9uIiwiU2VydmVDb21tYW5kIiwiV29ya3NwYWNlU2VydmVBY3Rpb24iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFlBQVksUUFBUSxxQkFBcUI7QUFFbEQsU0FBU0MsWUFBWSxFQUFFQyxXQUFXLFFBQVEsb0JBQW9CO0FBQzlELGNBQWMseUJBQXlCO0FBRXZDLFNBQVNDLFdBQVcsUUFBUSxvQkFBb0I7QUFDaEQsU0FBU0MsWUFBWSxRQUFRLHFCQUFxQjtBQUVsRCxTQUFTQyxvQkFBb0IsUUFBUSw4QkFBOEIifQ==
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEZsdXhNb2R1bGUgfSBmcm9tIFwiLi9mbHV4Lm1vZHVsZS5qc1wiO1xuZXhwb3J0IHR5cGUgeyBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zIH0gZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmV4cG9ydCB7IEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5leHBvcnQgdHlwZSB7IFNlcnZlT3B0aW9ucyB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuIl0sIm5hbWVzIjpbIkZsdXhNb2R1bGUiLCJIb3RSZWxvYWRTZXJ2ZXIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxtQkFBbUI7QUFFOUMsU0FBU0MsZUFBZSxRQUFRLHlCQUF5QiJ9
@@ -4,25 +4,38 @@ function _ts_decorate(decorators, target, key, desc) {
4
4
  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;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  }
7
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
7
10
  import { injectable } from "@decohere/crucible/decorators";
11
+ // biome-ignore lint/style/useImportType: <DI>
12
+ import { Workspace } from "@decohere/mesh";
8
13
  import { ActionResponse } from "@decohere/nexus/cli";
9
- import { scribe } from "@decohere/scribe";
14
+ // biome-ignore lint/style/useImportType: <DI>
10
15
  import { HotReloadServer } from "./hot-reload-server.js";
11
16
  export class ServeAction {
17
+ server;
18
+ workspace;
19
+ constructor(server, workspace){
20
+ this.server = server;
21
+ this.workspace = workspace;
22
+ }
12
23
  async run(options) {
13
- const { entry, watchDir } = options;
14
- const logger = scribe.logger("ServeAction");
15
- const server = new HotReloadServer(logger);
16
- process.on("SIGINT", async ()=>{
17
- await server.dispose();
18
- process.exit(0);
24
+ await this.server.start({
25
+ workspace: this.workspace,
26
+ buildConfig: options.configuration,
27
+ project: options.project
19
28
  });
20
- await server.start(entry, watchDir);
21
- return ActionResponse.Success(ServeAction.name);
29
+ return ActionResponse.Blocking(ServeAction.name);
22
30
  }
23
31
  }
24
32
  ServeAction = _ts_decorate([
25
- injectable()
33
+ injectable(),
34
+ _ts_metadata("design:type", Function),
35
+ _ts_metadata("design:paramtypes", [
36
+ typeof HotReloadServer === "undefined" ? Object : HotReloadServer,
37
+ typeof Workspace === "undefined" ? Object : Workspace
38
+ ])
26
39
  ], ServeAction);
27
40
 
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyB0eXBlIEFjdGlvbiwgQWN0aW9uUmVzcG9uc2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjtcbmltcG9ydCB7IEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFNlcnZlT3B0aW9ucyA9IHtcblx0ZW50cnk6IHN0cmluZztcblx0d2F0Y2hEaXI6IHN0cmluZztcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZXJ2ZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxTZXJ2ZU9wdGlvbnM+IHtcblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBTZXJ2ZU9wdGlvbnMpOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdFx0Y29uc3QgeyBlbnRyeSwgd2F0Y2hEaXIgfSA9IG9wdGlvbnM7XG5cdFx0Y29uc3QgbG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihcIlNlcnZlQWN0aW9uXCIpO1xuXHRcdGNvbnN0IHNlcnZlciA9IG5ldyBIb3RSZWxvYWRTZXJ2ZXIobG9nZ2VyKTtcblxuXHRcdHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0YXdhaXQgc2VydmVyLmRpc3Bvc2UoKTtcblx0XHRcdHByb2Nlc3MuZXhpdCgwKTtcblx0XHR9KTtcblxuXHRcdGF3YWl0IHNlcnZlci5zdGFydChlbnRyeSwgd2F0Y2hEaXIpO1xuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5TdWNjZXNzKFNlcnZlQWN0aW9uLm5hbWUpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiaW5qZWN0YWJsZSIsIkFjdGlvblJlc3BvbnNlIiwic2NyaWJlIiwiSG90UmVsb2FkU2VydmVyIiwiU2VydmVBY3Rpb24iLCJydW4iLCJvcHRpb25zIiwiZW50cnkiLCJ3YXRjaERpciIsImxvZ2dlciIsInNlcnZlciIsInByb2Nlc3MiLCJvbiIsImRpc3Bvc2UiLCJleGl0Iiwic3RhcnQiLCJTdWNjZXNzIiwibmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLGdDQUFnQztBQUMzRCxTQUFzQkMsY0FBYyxRQUFRLHNCQUFzQjtBQUNsRSxTQUFTQyxNQUFNLFFBQVEsbUJBQW1CO0FBQzFDLFNBQVNDLGVBQWUsUUFBUSx5QkFBeUI7QUFRekQsT0FBTyxNQUFNQztJQUNaLE1BQWFDLElBQUlDLE9BQXFCLEVBQTJCO1FBQ2hFLE1BQU0sRUFBRUMsS0FBSyxFQUFFQyxRQUFRLEVBQUUsR0FBR0Y7UUFDNUIsTUFBTUcsU0FBU1AsT0FBT08sTUFBTSxDQUFDO1FBQzdCLE1BQU1DLFNBQVMsSUFBSVAsZ0JBQWdCTTtRQUVuQ0UsUUFBUUMsRUFBRSxDQUFDLFVBQVU7WUFDcEIsTUFBTUYsT0FBT0csT0FBTztZQUNwQkYsUUFBUUcsSUFBSSxDQUFDO1FBQ2Q7UUFFQSxNQUFNSixPQUFPSyxLQUFLLENBQUNSLE9BQU9DO1FBQzFCLE9BQU9QLGVBQWVlLE9BQU8sQ0FBQ1osWUFBWWEsSUFBSTtJQUMvQztBQUNEIn0=
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB7IHR5cGUgQWN0aW9uLCBBY3Rpb25SZXNwb25zZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBIb3RSZWxvYWRTZXJ2ZXIgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuXG5leHBvcnQgdHlwZSBTZXJ2ZU9wdGlvbnMgPSB7XG5cdGNvbmZpZ3VyYXRpb246IHN0cmluZztcblx0cHJvamVjdD86IHN0cmluZztcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZXJ2ZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxTZXJ2ZU9wdGlvbnM+IHtcblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgc2VydmVyOiBIb3RSZWxvYWRTZXJ2ZXIsXG5cdFx0cHJpdmF0ZSByZWFkb25seSB3b3Jrc3BhY2U6IFdvcmtzcGFjZSxcblx0KSB7fVxuXG5cdHB1YmxpYyBhc3luYyBydW4ob3B0aW9uczogU2VydmVPcHRpb25zKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4ge1xuXHRcdGF3YWl0IHRoaXMuc2VydmVyLnN0YXJ0KHtcblx0XHRcdHdvcmtzcGFjZTogdGhpcy53b3Jrc3BhY2UsXG5cdFx0XHRidWlsZENvbmZpZzogb3B0aW9ucy5jb25maWd1cmF0aW9uLFxuXHRcdFx0cHJvamVjdDogb3B0aW9ucy5wcm9qZWN0LFxuXHRcdH0pO1xuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5CbG9ja2luZyhTZXJ2ZUFjdGlvbi5uYW1lKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbImluamVjdGFibGUiLCJXb3Jrc3BhY2UiLCJBY3Rpb25SZXNwb25zZSIsIkhvdFJlbG9hZFNlcnZlciIsIlNlcnZlQWN0aW9uIiwic2VydmVyIiwid29ya3NwYWNlIiwicnVuIiwib3B0aW9ucyIsInN0YXJ0IiwiYnVpbGRDb25maWciLCJjb25maWd1cmF0aW9uIiwicHJvamVjdCIsIkJsb2NraW5nIiwibmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLGdDQUFnQztBQUMzRCw4Q0FBOEM7QUFDOUMsU0FBU0MsU0FBUyxRQUFRLGlCQUFpQjtBQUMzQyxTQUFzQkMsY0FBYyxRQUFRLHNCQUFzQjtBQUNsRSw4Q0FBOEM7QUFDOUMsU0FBU0MsZUFBZSxRQUFRLHlCQUF5QjtBQVF6RCxPQUFPLE1BQU1DOzs7SUFDWixZQUNDLEFBQWlCQyxNQUF1QixFQUN4QyxBQUFpQkMsU0FBb0IsQ0FDcEM7YUFGZ0JELFNBQUFBO2FBQ0FDLFlBQUFBO0lBQ2Y7SUFFSCxNQUFhQyxJQUFJQyxPQUFxQixFQUEyQjtRQUNoRSxNQUFNLElBQUksQ0FBQ0gsTUFBTSxDQUFDSSxLQUFLLENBQUM7WUFDdkJILFdBQVcsSUFBSSxDQUFDQSxTQUFTO1lBQ3pCSSxhQUFhRixRQUFRRyxhQUFhO1lBQ2xDQyxTQUFTSixRQUFRSSxPQUFPO1FBQ3pCO1FBQ0EsT0FBT1YsZUFBZVcsUUFBUSxDQUFDVCxZQUFZVSxJQUFJO0lBQ2hEO0FBQ0QifQ==