@decaf-ts/cli 0.3.2 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs CHANGED
@@ -5,25 +5,35 @@
5
5
  })(this, (function (exports, commander, fs, path) { 'use strict';
6
6
 
7
7
  /**
8
- * @description The name for decaf cli modules where each library must export
9
- * a single {@link CliModule}
8
+ * @description The filename that identifies Decaf CLI modules
9
+ * @summary The standard filename for CLI module files where each library must export a single CliModule function
10
10
  *
11
- * @constant
12
- * @memberOf module:CLI.cli
11
+ * @const CLI_FILE_NAME
12
+ * @memberOf module:CLI
13
13
  */
14
14
  const CLI_FILE_NAME = "cli-module";
15
15
 
16
16
  /**
17
- * @description util class to retrieve versions and other information
17
+ * @description Utility class for CLI operations
18
+ * @summary A static utility class that provides methods for loading modules, retrieving package information, and initializing CLI commands
19
+ *
20
+ * @example
21
+ * // Initialize a Command object with package information
22
+ * const command = new Command();
23
+ * CLIUtils.initialize(command, './path/to/package');
24
+ *
25
+ * // Load a CLI module from a file
26
+ * const module = await CLIUtils.loadFromFile('./path/to/cli-module.js');
18
27
  *
19
28
  * @class CLIUtils
20
- * @static
21
29
  */
22
30
  class CLIUtils {
23
31
  /**
24
- * @description Dynamically imports a cjs file into a decaf module
25
- * @param {string} path
26
- * @static
32
+ * @description Dynamically imports a module file
33
+ * @summary Loads a JavaScript file and returns it as a CliModule, handling both ESM and CommonJS formats
34
+ *
35
+ * @param {string} path The file path to the module to load
36
+ * @return {Promise<CliModule>} A promise that resolves to the loaded CliModule
27
37
  */
28
38
  static async loadFromFile(path) {
29
39
  try {
@@ -34,11 +44,12 @@
34
44
  }
35
45
  }
36
46
  /**
37
- * @description allows safe dynamic imports
38
- * @summary property imports JS files regardless of esm status
47
+ * @description Normalizes module imports to handle both ESM and CommonJS formats
48
+ * @summary Properly imports JavaScript files regardless of their module format by handling the ESM wrapper for CommonJS modules
39
49
  *
40
- * @typeParam T
41
- * @param {Promise} importPromise
50
+ * @template T The type of the imported module
51
+ * @param {Promise<T>} importPromise The promise returned by the dynamic import
52
+ * @return {Promise<T>} A promise that resolves to the normalized module
42
53
  * @private
43
54
  */
44
55
  static async normalizeImport(importPromise) {
@@ -46,10 +57,12 @@
46
57
  return importPromise.then((m) => (m.default || m));
47
58
  }
48
59
  /**
49
- * @description initializes the Cli object
60
+ * @description Initializes a Command object with package information
61
+ * @summary Sets up a Commander Command object with the package name, description, and version from the package.json file
50
62
  *
51
- * @param {Command} command
52
- * @param {string} [basePath] defaults to the current working directory
63
+ * @param {Command} command The Command object to initialize
64
+ * @param {string} [basePath] The base path where the package.json file is located, defaults to the current working directory
65
+ * @return {void}
53
66
  */
54
67
  static initialize(command, basePath) {
55
68
  const name = CLIUtils.packageName(basePath);
@@ -59,9 +72,11 @@
59
72
  .version(CLIUtils.packageVersion(basePath));
60
73
  }
61
74
  /**
62
- * @description retrieves and parses the package.json file
75
+ * @description Retrieves and parses the package.json file
76
+ * @summary Reads the package.json file from the specified path and parses it into a JavaScript object
63
77
  *
64
- * @param {string} basePath
78
+ * @param {string} basePath The base path where the package.json file is located
79
+ * @return {Record<string, unknown>} The parsed package.json content as an object
65
80
  * @private
66
81
  */
67
82
  static getPackage(basePath) {
@@ -73,27 +88,42 @@
73
88
  }
74
89
  }
75
90
  /**
76
- * @description returns the package version
77
- * @param {string} [basePath] defaults to current working dir
91
+ * @description Returns the version from package.json
92
+ * @summary Retrieves the version field from the package.json file at the specified path
93
+ *
94
+ * @param {string} basePath The base path where the package.json file is located
95
+ * @return {string} The package version string
78
96
  */
79
97
  static packageVersion(basePath) {
80
98
  return CLIUtils.getPackage(basePath)["version"];
81
99
  }
82
100
  /**
83
- * @description returns the package name
84
- * @param {string} [basePath] defaults to current working dir
101
+ * @description Returns the name from package.json
102
+ * @summary Retrieves the name field from the package.json file at the specified path and extracts the package name without the scope
103
+ *
104
+ * @param {string} basePath The base path where the package.json file is located
105
+ * @return {string} The package name without the scope (e.g., "cli" from "@decaf-ts/cli")
85
106
  */
86
107
  static packageName(basePath) {
87
- return CLIUtils.getPackage(basePath)["name"].split("/")[1];
108
+ const name = CLIUtils.getPackage(basePath)["name"].split("/");
109
+ return name[name.length - 1];
88
110
  }
89
111
  }
90
112
 
91
113
  /**
92
- * @summary Util class to handle CLI functionality from all Decaf modules
93
- * @description CLI handler class
114
+ * @description Utility class to handle CLI functionality from all Decaf modules
115
+ * @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
116
+ * It crawls the filesystem to find CLI modules, loads them, and registers their commands.
94
117
  *
95
- * @param {string} [basepath] the base path to look for modules in. defaults to `./`
96
- * @param {string} [crawlLevels] folders to crawl to find modules from the basePath. defaults to 4
118
+ * @param {string} [basePath] The base path to look for modules in. Defaults to `./`
119
+ * @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
120
+ *
121
+ * @example
122
+ * // Create a new CLI wrapper and run it with custom options
123
+ * const cli = new CliWrapper('./src', 2);
124
+ * cli.run(process.argv).then(() => {
125
+ * console.log('CLI commands executed successfully');
126
+ * });
97
127
  *
98
128
  * @class CliWrapper
99
129
  */
@@ -102,26 +132,47 @@
102
132
  this.basePath = basePath;
103
133
  this.crawlLevels = crawlLevels;
104
134
  this.modules = {};
135
+ this.rootPath = path.resolve(__dirname, "..");
105
136
  }
106
137
  /**
107
- * @description Retrieves and initializes the {@link Command} object
138
+ * @description Retrieves and initializes the Commander Command object
139
+ * @summary Lazy-loads the Command object, initializing it with the package name, description, and version
140
+ * @return {Command} The initialized Command object
108
141
  * @private
109
142
  */
110
143
  get command() {
111
144
  if (!this._command) {
112
145
  this._command = new commander.Command();
113
- CLIUtils.initialize(this._command, this.basePath);
146
+ CLIUtils.initialize(this._command, this.rootPath);
114
147
  }
115
148
  return this._command;
116
149
  }
117
150
  /**
118
- * @description loads and registers module from a file
151
+ * @description Loads and registers a module from a file
152
+ * @summary Dynamically imports a CLI module from the specified file path, initializes it, and registers it in the modules collection
119
153
  *
120
- * @param {string} filePath path to look for modules
121
- * @param {string} rootPath repo root to find the package.json
122
- * @return {string} the module name
154
+ * @param {string} filePath Path to the module file to load
155
+ * @param {string} rootPath Repository root path to find the package.json
156
+ * @return {Promise<string>} A promise that resolves to the module name
123
157
  *
124
158
  * @private
159
+ * @mermaid
160
+ * sequenceDiagram
161
+ * participant CliWrapper
162
+ * participant CLIUtils
163
+ * participant Module
164
+ *
165
+ * CliWrapper->>CLIUtils: loadFromFile(filePath)
166
+ * CLIUtils-->>CliWrapper: module
167
+ * CliWrapper->>CliWrapper: Get module name
168
+ * CliWrapper->>Command: new Command()
169
+ * Command-->>CliWrapper: cmd
170
+ * CliWrapper->>CLIUtils: initialize(cmd, path.dirname(rootPath))
171
+ * CliWrapper->>Module: module()
172
+ * Note over CliWrapper,Module: Handle Promise if needed
173
+ * Module-->>CliWrapper: Command instance
174
+ * CliWrapper->>CliWrapper: Store in modules[name]
175
+ * CliWrapper-->>CliWrapper: Return name
125
176
  */
126
177
  async load(filePath, rootPath) {
127
178
  let name;
@@ -129,7 +180,7 @@
129
180
  const module = await CLIUtils.loadFromFile(filePath);
130
181
  name = module.name;
131
182
  const cmd = new commander.Command();
132
- CLIUtils.initialize(cmd, path.dirname(rootPath));
183
+ CLIUtils.initialize(cmd, rootPath);
133
184
  let m = module();
134
185
  if (m instanceof Promise)
135
186
  m = await m;
@@ -141,12 +192,36 @@
141
192
  return name;
142
193
  }
143
194
  /**
144
- * @description finds all the cli modules in the basePath via {@link CliWrapper.crawl}
145
- * and loads them
195
+ * @description Finds and loads all CLI modules in the basePath
196
+ * @summary Uses the crawl method to find all CLI modules in the specified base path,
197
+ * then loads and registers each module as a subcommand
198
+ *
199
+ * @return {Promise<void>} A promise that resolves when all modules are loaded
200
+ *
146
201
  * @private
202
+ * @mermaid
203
+ * sequenceDiagram
204
+ * participant CliWrapper
205
+ * participant Filesystem
206
+ * participant Module
207
+ *
208
+ * CliWrapper->>Filesystem: Join basePath with cwd
209
+ * CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
210
+ * CliWrapper-->>CliWrapper: modules[]
211
+ * loop For each module
212
+ * alt Not @decaf-ts/cli
213
+ * CliWrapper->>CliWrapper: load(module, cwd)
214
+ * CliWrapper-->>CliWrapper: name
215
+ * CliWrapper->>CliWrapper: Check if command exists
216
+ * alt Command doesn't exist
217
+ * CliWrapper->>Command: command(name).addCommand(modules[name])
218
+ * end
219
+ * end
220
+ * end
221
+ * CliWrapper->>Console: Log loaded modules
147
222
  */
148
223
  async boot() {
149
- const basePath = path.join(process.cwd(), this.basePath);
224
+ const basePath = path.resolve(this.rootPath, this.basePath);
150
225
  const modules = this.crawl(basePath, this.crawlLevels);
151
226
  for (const module of modules) {
152
227
  if (module.includes("@decaf-ts/cli")) {
@@ -154,7 +229,7 @@
154
229
  }
155
230
  let name;
156
231
  try {
157
- name = await this.load(module, process.cwd());
232
+ name = await this.load(module, this.rootPath);
158
233
  }
159
234
  catch (e) {
160
235
  console.error(e);
@@ -173,9 +248,13 @@
173
248
  .join("\n")}`);
174
249
  }
175
250
  /**
176
- * @description crawls the basePath up for 'levels' folders to find a module,eg a {@link CLI_FILE_NAME} named file
177
- * @param {string} basePath the relative base batch to start searching in
178
- * @param {number} [levels] the max number of levels to crawl. defaults to 2
251
+ * @description Recursively searches for CLI module files in the directory structure
252
+ * @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
253
+ *
254
+ * @param {string} basePath The absolute base path to start searching in
255
+ * @param {number} [levels=2] The maximum number of directory levels to crawl
256
+ * @return {string[]} An array of file paths to CLI modules
257
+ *
179
258
  * @private
180
259
  */
181
260
  crawl(basePath, levels = 2) {
@@ -193,9 +272,24 @@
193
272
  }, []);
194
273
  }
195
274
  /**
196
- * @description runs the given command
275
+ * @description Executes the CLI with the provided arguments
276
+ * @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
277
+ *
278
+ * @param {string[]} [args=process.argv] Command line arguments to parse and execute
279
+ * @return {Promise<void>} A promise that resolves when the command execution is complete
197
280
  *
198
- * @param {string[]} [args] args to run. defaults to process.argv
281
+ * @mermaid
282
+ * sequenceDiagram
283
+ * participant Client
284
+ * participant CliWrapper
285
+ * participant Command
286
+ *
287
+ * Client->>CliWrapper: run(args)
288
+ * CliWrapper->>CliWrapper: boot()
289
+ * Note over CliWrapper: Loads all modules
290
+ * CliWrapper->>Command: parseAsync(args)
291
+ * Command-->>CliWrapper: result
292
+ * CliWrapper-->>Client: result
199
293
  */
200
294
  async run(args = process.argv) {
201
295
  await this.boot();
@@ -206,7 +300,8 @@
206
300
  /**
207
301
  * @description Decaf-ts' CLI module
208
302
  * @summary This file will crawl the current working directory for files called {@link CLI_FILE_NAME}
209
- * within the @decaf-ts namespace and load then as subcommands
303
+ * within the @decaf-ts namespace and load them as subcommands. It serves as the main entry point
304
+ * for the CLI functionality, exporting the CliWrapper class and VERSION constant.
210
305
  *
211
306
  * @example
212
307
  * run module command - $ npx decaf <module name> <module command> ...<module command options>
@@ -217,29 +312,15 @@
217
312
  * @module CLI
218
313
  */
219
314
  /**
220
- * @description Decaf-ts' CLI namespace
221
- * @summary This file will crawl the current working directory for files called {@link CLI_FILE_NAME}
222
- * within the @decaf-ts namespace and load then as subcommands
223
- *
224
- * @example
225
- * run module command - $ npx decaf <module name> <module command> ...<module command options>
226
- * get module help - $ npx decaf help <module name>;
227
- * list imported modules - $ npx decaf list;
228
- * get cli help - $ npx decaf help;
229
- *
230
- * @namespace cli
231
- * @memberOf module:CLI
232
- */
233
- /**
234
- * @summary stores the current package version
235
- * @description this is how you should document a constant
315
+ * @description Stores the current package version
316
+ * @summary A constant that holds the version string of the package, which is replaced during build
236
317
  * @const VERSION
237
318
  * @memberOf module:CLI
238
319
  */
239
- const VERSION = "0.3.1";
320
+ const VERSION = "0.3.6";
240
321
 
241
322
  exports.CliWrapper = CliWrapper;
242
323
  exports.VERSION = VERSION;
243
324
 
244
325
  }));
245
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9DbGlXcmFwcGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmltcG9ydCB7IENsaU1vZHVsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRoZSBuYW1lIGZvciBkZWNhZiBjbGkgbW9kdWxlcyB3aGVyZSBlYWNoIGxpYnJhcnkgbXVzdCBleHBvcnRcbiAqIGEgc2luZ2xlIHtAbGluayBDbGlNb2R1bGV9XG4gKlxuICogQGNvbnN0YW50XG4gKiBAbWVtYmVyT2YgbW9kdWxlOkNMSS5jbGlcbiAqL1xuZXhwb3J0IGNvbnN0IENMSV9GSUxFX05BTUUgPSBcImNsaS1tb2R1bGVcIjtcbiIsImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgQ2xpTW9kdWxlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gdXRpbCBjbGFzcyB0byByZXRyaWV2ZSB2ZXJzaW9ucyBhbmQgb3RoZXIgaW5mb3JtYXRpb25cbiAqXG4gKiBAY2xhc3MgQ0xJVXRpbHNcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0IGNsYXNzIENMSVV0aWxzIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEeW5hbWljYWxseSBpbXBvcnRzIGEgY2pzIGZpbGUgaW50byBhIGRlY2FmIG1vZHVsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgbG9hZEZyb21GaWxlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Q2xpTW9kdWxlPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBDTElVdGlscy5ub3JtYWxpemVJbXBvcnQoaW1wb3J0KHBhdGgpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gbG9hZCBmcm9tICR7cGF0aH06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogZX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gYWxsb3dzIHNhZmUgZHluYW1pYyBpbXBvcnRzXG4gICAqIEBzdW1tYXJ5IHByb3BlcnR5IGltcG9ydHMgSlMgZmlsZXMgcmVnYXJkbGVzcyBvZiBlc20gc3RhdHVzXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVFxuICAgKiBAcGFyYW0ge1Byb21pc2V9IGltcG9ydFByb21pc2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXRpYyBhc3luYyBub3JtYWxpemVJbXBvcnQ8VD4oaW1wb3J0UHJvbWlzZTogUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIC8vIENvbW1vbkpTJ3MgYG1vZHVsZS5leHBvcnRzYCBpcyB3cmFwcGVkIGFzIGBkZWZhdWx0YCBpbiBFU01vZHVsZS5cbiAgICByZXR1cm4gaW1wb3J0UHJvbWlzZS50aGVuKFxuICAgICAgKG06IHVua25vd24pID0+ICgobSBhcyB7IGRlZmF1bHQ6IFQgfSkuZGVmYXVsdCB8fCBtKSBhcyBUXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gaW5pdGlhbGl6ZXMgdGhlIENsaSBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjb21tYW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZVBhdGhdIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gICAqL1xuICBzdGF0aWMgaW5pdGlhbGl6ZShjb21tYW5kOiBDb21tYW5kLCBiYXNlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgbmFtZSA9IENMSVV0aWxzLnBhY2thZ2VOYW1lKGJhc2VQYXRoKTtcbiAgICBjb21tYW5kXG4gICAgICAubmFtZShuYW1lKVxuICAgICAgLmRlc2NyaXB0aW9uKGBSdW5zICR7bmFtZX0gcmVsYXRlZCBjb21tYW5kc2ApXG4gICAgICAudmVyc2lvbihDTElVdGlscy5wYWNrYWdlVmVyc2lvbihiYXNlUGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiByZXRyaWV2ZXMgYW5kIHBhcnNlcyB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRQYWNrYWdlKGJhc2VQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGJhc2VQYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGY4XCIpXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlYWQgdmVyc2lvbiBmcm9tICR7YmFzZVBhdGh9OiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiByZXR1cm5zIHRoZSBwYWNrYWdlIHZlcnNpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtiYXNlUGF0aF0gZGVmYXVsdHMgdG8gY3VycmVudCB3b3JraW5nIGRpclxuICAgKi9cbiAgc3RhdGljIHBhY2thZ2VWZXJzaW9uKGJhc2VQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBDTElVdGlscy5nZXRQYWNrYWdlKGJhc2VQYXRoKVtcInZlcnNpb25cIl0gYXMgc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiByZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtiYXNlUGF0aF0gZGVmYXVsdHMgdG8gY3VycmVudCB3b3JraW5nIGRpclxuICAgKi9cbiAgc3RhdGljIHBhY2thZ2VOYW1lKGJhc2VQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoQ0xJVXRpbHMuZ2V0UGFja2FnZShiYXNlUGF0aClbXCJuYW1lXCJdIGFzIHN0cmluZykuc3BsaXQoXCIvXCIpWzFdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IENMSV9GSUxFX05BTUUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENMSVV0aWxzIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGNsYXNzIHRvIGhhbmRsZSBDTEkgZnVuY3Rpb25hbGl0eSBmcm9tIGFsbCBEZWNhZiBtb2R1bGVzXG4gKiBAZGVzY3JpcHRpb24gQ0xJIGhhbmRsZXIgY2xhc3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VwYXRoXSB0aGUgYmFzZSBwYXRoIHRvIGxvb2sgZm9yIG1vZHVsZXMgaW4uIGRlZmF1bHRzIHRvIGAuL2BcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY3Jhd2xMZXZlbHNdIGZvbGRlcnMgdG8gY3Jhd2wgdG8gZmluZCBtb2R1bGVzIGZyb20gdGhlIGJhc2VQYXRoLiBkZWZhdWx0cyB0byA0XG4gKlxuICogQGNsYXNzIENsaVdyYXBwZXJcbiAqL1xuZXhwb3J0IGNsYXNzIENsaVdyYXBwZXIge1xuICBwcml2YXRlIF9jb21tYW5kPzogQ29tbWFuZDtcbiAgcHJpdmF0ZSBtb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBDb21tYW5kPiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYmFzZVBhdGg6IHN0cmluZyA9IFwiLi9cIixcbiAgICBwcml2YXRlIGNyYXdsTGV2ZWxzID0gNFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIGluaXRpYWxpemVzIHRoZSB7QGxpbmsgQ29tbWFuZH0gb2JqZWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldCBjb21tYW5kKCkge1xuICAgIGlmICghdGhpcy5fY29tbWFuZCkge1xuICAgICAgdGhpcy5fY29tbWFuZCA9IG5ldyBDb21tYW5kKCk7XG4gICAgICBDTElVdGlscy5pbml0aWFsaXplKHRoaXMuX2NvbW1hbmQsIHRoaXMuYmFzZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29tbWFuZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gbG9hZHMgYW5kIHJlZ2lzdGVycyBtb2R1bGUgZnJvbSBhIGZpbGVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIHBhdGggdG8gbG9vayBmb3IgbW9kdWxlc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9vdFBhdGggcmVwbyByb290IHRvIGZpbmQgdGhlIHBhY2thZ2UuanNvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBtb2R1bGUgbmFtZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcsIHJvb3RQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBuYW1lO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBDTElVdGlscy5sb2FkRnJvbUZpbGUoZmlsZVBhdGgpO1xuICAgICAgbmFtZSA9IG1vZHVsZS5uYW1lO1xuICAgICAgY29uc3QgY21kID0gbmV3IENvbW1hbmQoKTtcbiAgICAgIENMSVV0aWxzLmluaXRpYWxpemUoY21kLCBwYXRoLmRpcm5hbWUocm9vdFBhdGgpKTtcbiAgICAgIGxldCBtID0gbW9kdWxlKCk7XG4gICAgICBpZiAobSBpbnN0YW5jZW9mIFByb21pc2UpIG0gPSBhd2FpdCBtO1xuICAgICAgdGhpcy5tb2R1bGVzW25hbWVdID0gbTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBmYWlsZWQgdG8gbG9hZCBtb2R1bGUgJHtuYW1lIHx8IFwidW5uYW1lZFwifSB1bmRlciAke2ZpbGVQYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBmaW5kcyBhbGwgdGhlIGNsaSBtb2R1bGVzIGluIHRoZSBiYXNlUGF0aCB2aWEge0BsaW5rIENsaVdyYXBwZXIuY3Jhd2x9XG4gICAqIGFuZCBsb2FkcyB0aGVtXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJvb3QoKSB7XG4gICAgY29uc3QgYmFzZVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgdGhpcy5iYXNlUGF0aCk7XG4gICAgY29uc3QgbW9kdWxlcyA9IHRoaXMuY3Jhd2woYmFzZVBhdGgsIHRoaXMuY3Jhd2xMZXZlbHMpO1xuICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICAgIGlmIChtb2R1bGUuaW5jbHVkZXMoXCJAZGVjYWYtdHMvY2xpXCIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IG5hbWU6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIG5hbWUgPSBhd2FpdCB0aGlzLmxvYWQobW9kdWxlLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuY29tbWFuZC5jb21tYW5kcy5maW5kKFxuICAgICAgICAgIChjKSA9PiAoYyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pW1wiX25hbWVcIl0gPT09IG5hbWVcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuY29tbWFuZC5jb21tYW5kKG5hbWUpLmFkZENvbW1hbmQodGhpcy5tb2R1bGVzW25hbWVdKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgbG9hZGVkIG1vZHVsZXM6XFxuJHtPYmplY3Qua2V5cyh0aGlzLm1vZHVsZXMpXG4gICAgICAgIC5tYXAoKGspID0+IGAtICR7a31gKVxuICAgICAgICAuam9pbihcIlxcblwiKX1gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gY3Jhd2xzIHRoZSBiYXNlUGF0aCB1cCBmb3IgJ2xldmVscycgZm9sZGVycyB0byBmaW5kIGEgbW9kdWxlLGVnIGEge0BsaW5rIENMSV9GSUxFX05BTUV9IG5hbWVkIGZpbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoIHRoZSByZWxhdGl2ZSBiYXNlIGJhdGNoIHRvIHN0YXJ0IHNlYXJjaGluZyBpblxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xldmVsc10gdGhlIG1heCBudW1iZXIgb2YgbGV2ZWxzIHRvIGNyYXdsLiBkZWZhdWx0cyB0byAyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNyYXdsKGJhc2VQYXRoOiBzdHJpbmcsIGxldmVsczogbnVtYmVyID0gMikge1xuICAgIGlmIChsZXZlbHMgPD0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBmcy5yZWFkZGlyU3luYyhiYXNlUGF0aCkucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGZpbGUpID0+IHtcbiAgICAgIGZpbGUgPSBwYXRoLmpvaW4oYmFzZVBhdGgsIGZpbGUpO1xuICAgICAgaWYgKGZzLnN0YXRTeW5jKGZpbGUpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgYWNjdW0ucHVzaCguLi50aGlzLmNyYXdsKGZpbGUsIGxldmVscyAtIDEpKTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsZS5tYXRjaChuZXcgUmVnRXhwKGAke0NMSV9GSUxFX05BTUV9LltjbV0/anMkYCwgXCJnbVwiKSkpIHtcbiAgICAgICAgYWNjdW0ucHVzaChmaWxlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIHJ1bnMgdGhlIGdpdmVuIGNvbW1hbmRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3NdIGFyZ3MgdG8gcnVuLiBkZWZhdWx0cyB0byBwcm9jZXNzLmFyZ3ZcbiAgICovXG4gIGFzeW5jIHJ1bihhcmdzOiBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndikge1xuICAgIGF3YWl0IHRoaXMuYm9vdCgpO1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQucGFyc2VBc3luYyhhcmdzKTtcbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vQ2xpV3JhcHBlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNhZi10cycgQ0xJIG1vZHVsZVxuICogQHN1bW1hcnkgVGhpcyBmaWxlIHdpbGwgY3Jhd2wgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIGZpbGVzIGNhbGxlZCB7QGxpbmsgQ0xJX0ZJTEVfTkFNRX1cbiAqIHdpdGhpbiB0aGUgQGRlY2FmLXRzIG5hbWVzcGFjZSBhbmQgbG9hZCB0aGVuIGFzIHN1YmNvbW1hbmRzXG4gKlxuICogQGV4YW1wbGVcbiAqIHJ1biBtb2R1bGUgY29tbWFuZCAgICAgLSAkIG5weCBkZWNhZiA8bW9kdWxlIG5hbWU+IDxtb2R1bGUgY29tbWFuZD4gLi4uPG1vZHVsZSBjb21tYW5kIG9wdGlvbnM+XG4gKiBnZXQgbW9kdWxlIGhlbHAgICAgICAgIC0gJCBucHggZGVjYWYgaGVscCA8bW9kdWxlIG5hbWU+O1xuICogbGlzdCBpbXBvcnRlZCBtb2R1bGVzICAtICQgbnB4IGRlY2FmIGxpc3Q7XG4gKiBnZXQgY2xpIGhlbHAgICAgICAgICAgIC0gJCBucHggZGVjYWYgaGVscDtcbiAqXG4gKiBAbW9kdWxlIENMSVxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY2FmLXRzJyBDTEkgbmFtZXNwYWNlXG4gKiBAc3VtbWFyeSBUaGlzIGZpbGUgd2lsbCBjcmF3bCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgZmlsZXMgY2FsbGVkIHtAbGluayBDTElfRklMRV9OQU1FfVxuICogd2l0aGluIHRoZSBAZGVjYWYtdHMgbmFtZXNwYWNlIGFuZCBsb2FkIHRoZW4gYXMgc3ViY29tbWFuZHNcbiAqXG4gKiBAZXhhbXBsZVxuICogcnVuIG1vZHVsZSBjb21tYW5kICAgICAtICQgbnB4IGRlY2FmIDxtb2R1bGUgbmFtZT4gPG1vZHVsZSBjb21tYW5kPiAuLi48bW9kdWxlIGNvbW1hbmQgb3B0aW9ucz5cbiAqIGdldCBtb2R1bGUgaGVscCAgICAgICAgLSAkIG5weCBkZWNhZiBoZWxwIDxtb2R1bGUgbmFtZT47XG4gKiBsaXN0IGltcG9ydGVkIG1vZHVsZXMgIC0gJCBucHggZGVjYWYgbGlzdDtcbiAqIGdldCBjbGkgaGVscCAgICAgICAgICAgLSAkIG5weCBkZWNhZiBoZWxwO1xuICpcbiAqIEBuYW1lc3BhY2UgY2xpXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkNMSVxuICovXG5cbi8qKlxuICogQHN1bW1hcnkgc3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvblxuICogQGRlc2NyaXB0aW9uIHRoaXMgaXMgaG93IHlvdSBzaG91bGQgZG9jdW1lbnQgYSBjb25zdGFudFxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Q0xJXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkNvbW1hbmQiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUdBOzs7Ozs7SUFNRztJQUNJLE1BQU0sYUFBYSxHQUFHLFlBQVk7O0lDTHpDOzs7OztJQUtHO1VBQ1UsUUFBUSxDQUFBO0lBQ25COzs7O0lBSUc7SUFDSCxJQUFBLGFBQWEsWUFBWSxDQUFDLElBQVksRUFBQTtJQUNwQyxRQUFBLElBQUk7Z0JBQ0YsT0FBTyxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7O1lBQzdDLE9BQU8sQ0FBVSxFQUFFO2dCQUNuQixNQUFNLElBQUksS0FBSyxDQUNiLENBQUEsb0JBQUEsRUFBdUIsSUFBSSxDQUFLLEVBQUEsRUFBQSxDQUFDLFlBQVksS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFFLENBQUEsQ0FDckU7OztJQUlMOzs7Ozs7O0lBT0c7SUFDSCxJQUFBLGFBQWEsZUFBZSxDQUFJLGFBQXlCLEVBQUE7O0lBRXZELFFBQUEsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUN2QixDQUFDLENBQVUsTUFBTyxDQUFvQixDQUFDLE9BQU8sSUFBSSxDQUFDLENBQU0sQ0FDMUQ7O0lBR0g7Ozs7O0lBS0c7SUFDSCxJQUFBLE9BQU8sVUFBVSxDQUFDLE9BQWdCLEVBQUUsUUFBZ0IsRUFBQTtZQUNsRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUMzQztpQkFDRyxJQUFJLENBQUMsSUFBSTtJQUNULGFBQUEsV0FBVyxDQUFDLENBQUEsS0FBQSxFQUFRLElBQUksQ0FBQSxpQkFBQSxDQUFtQjtpQkFDM0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7O0lBRy9DOzs7OztJQUtHO1FBQ0ssT0FB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
326
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9DbGlXcmFwcGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmltcG9ydCB7IENsaU1vZHVsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRoZSBmaWxlbmFtZSB0aGF0IGlkZW50aWZpZXMgRGVjYWYgQ0xJIG1vZHVsZXNcbiAqIEBzdW1tYXJ5IFRoZSBzdGFuZGFyZCBmaWxlbmFtZSBmb3IgQ0xJIG1vZHVsZSBmaWxlcyB3aGVyZSBlYWNoIGxpYnJhcnkgbXVzdCBleHBvcnQgYSBzaW5nbGUgQ2xpTW9kdWxlIGZ1bmN0aW9uXG4gKlxuICogQGNvbnN0IENMSV9GSUxFX05BTUVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Q0xJXG4gKi9cbmV4cG9ydCBjb25zdCBDTElfRklMRV9OQU1FID0gXCJjbGktbW9kdWxlXCI7XG4iLCJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IENsaU1vZHVsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFV0aWxpdHkgY2xhc3MgZm9yIENMSSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBBIHN0YXRpYyB1dGlsaXR5IGNsYXNzIHRoYXQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgbG9hZGluZyBtb2R1bGVzLCByZXRyaWV2aW5nIHBhY2thZ2UgaW5mb3JtYXRpb24sIGFuZCBpbml0aWFsaXppbmcgQ0xJIGNvbW1hbmRzXG4gKiBcbiAqIEBleGFtcGxlXG4gKiAvLyBJbml0aWFsaXplIGEgQ29tbWFuZCBvYmplY3Qgd2l0aCBwYWNrYWdlIGluZm9ybWF0aW9uXG4gKiBjb25zdCBjb21tYW5kID0gbmV3IENvbW1hbmQoKTtcbiAqIENMSVV0aWxzLmluaXRpYWxpemUoY29tbWFuZCwgJy4vcGF0aC90by9wYWNrYWdlJyk7XG4gKiBcbiAqIC8vIExvYWQgYSBDTEkgbW9kdWxlIGZyb20gYSBmaWxlXG4gKiBjb25zdCBtb2R1bGUgPSBhd2FpdCBDTElVdGlscy5sb2FkRnJvbUZpbGUoJy4vcGF0aC90by9jbGktbW9kdWxlLmpzJyk7XG4gKiBcbiAqIEBjbGFzcyBDTElVdGlsc1xuICovXG5leHBvcnQgY2xhc3MgQ0xJVXRpbHMge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIER5bmFtaWNhbGx5IGltcG9ydHMgYSBtb2R1bGUgZmlsZVxuICAgKiBAc3VtbWFyeSBMb2FkcyBhIEphdmFTY3JpcHQgZmlsZSBhbmQgcmV0dXJucyBpdCBhcyBhIENsaU1vZHVsZSwgaGFuZGxpbmcgYm90aCBFU00gYW5kIENvbW1vbkpTIGZvcm1hdHNcbiAgICogXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBmaWxlIHBhdGggdG8gdGhlIG1vZHVsZSB0byBsb2FkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q2xpTW9kdWxlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxvYWRlZCBDbGlNb2R1bGVcbiAgICovXG4gIHN0YXRpYyBhc3luYyBsb2FkRnJvbUZpbGUocGF0aDogc3RyaW5nKTogUHJvbWlzZTxDbGlNb2R1bGU+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIENMSVV0aWxzLm5vcm1hbGl6ZUltcG9ydChpbXBvcnQocGF0aCkpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBsb2FkIGZyb20gJHtwYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3JtYWxpemVzIG1vZHVsZSBpbXBvcnRzIHRvIGhhbmRsZSBib3RoIEVTTSBhbmQgQ29tbW9uSlMgZm9ybWF0c1xuICAgKiBAc3VtbWFyeSBQcm9wZXJseSBpbXBvcnRzIEphdmFTY3JpcHQgZmlsZXMgcmVnYXJkbGVzcyBvZiB0aGVpciBtb2R1bGUgZm9ybWF0IGJ5IGhhbmRsaW5nIHRoZSBFU00gd3JhcHBlciBmb3IgQ29tbW9uSlMgbW9kdWxlc1xuICAgKlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgaW1wb3J0ZWQgbW9kdWxlXG4gICAqIEBwYXJhbSB7UHJvbWlzZTxUPn0gaW1wb3J0UHJvbWlzZSBUaGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgZHluYW1pYyBpbXBvcnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxUPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5vcm1hbGl6ZWQgbW9kdWxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgbm9ybWFsaXplSW1wb3J0PFQ+KGltcG9ydFByb21pc2U6IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAvLyBDb21tb25KUydzIGBtb2R1bGUuZXhwb3J0c2AgaXMgd3JhcHBlZCBhcyBgZGVmYXVsdGAgaW4gRVNNb2R1bGUuXG4gICAgcmV0dXJuIGltcG9ydFByb21pc2UudGhlbihcbiAgICAgIChtOiB1bmtub3duKSA9PiAoKG0gYXMgeyBkZWZhdWx0OiBUIH0pLmRlZmF1bHQgfHwgbSkgYXMgVFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIGEgQ29tbWFuZCBvYmplY3Qgd2l0aCBwYWNrYWdlIGluZm9ybWF0aW9uXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgYSBDb21tYW5kZXIgQ29tbWFuZCBvYmplY3Qgd2l0aCB0aGUgcGFja2FnZSBuYW1lLCBkZXNjcmlwdGlvbiwgYW5kIHZlcnNpb24gZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjb21tYW5kIFRoZSBDb21tYW5kIG9iamVjdCB0byBpbml0aWFsaXplXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZVBhdGhdIFRoZSBiYXNlIHBhdGggd2hlcmUgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGlzIGxvY2F0ZWQsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgaW5pdGlhbGl6ZShjb21tYW5kOiBDb21tYW5kLCBiYXNlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgbmFtZSA9IENMSVV0aWxzLnBhY2thZ2VOYW1lKGJhc2VQYXRoKTtcbiAgICBjb21tYW5kXG4gICAgICAubmFtZShuYW1lKVxuICAgICAgLmRlc2NyaXB0aW9uKGBSdW5zICR7bmFtZX0gcmVsYXRlZCBjb21tYW5kc2ApXG4gICAgICAudmVyc2lvbihDTElVdGlscy5wYWNrYWdlVmVyc2lvbihiYXNlUGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIHBhcnNlcyB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGZyb20gdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBwYXJzZXMgaXQgaW50byBhIEphdmFTY3JpcHQgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUaGUgcGFyc2VkIHBhY2thZ2UuanNvbiBjb250ZW50IGFzIGFuIG9iamVjdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UGFja2FnZShiYXNlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihiYXNlUGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmOFwiKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZWFkIHZlcnNpb24gZnJvbSAke2Jhc2VQYXRofTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHZlcnNpb24gZmllbGQgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhY2thZ2UgdmVyc2lvbiBzdHJpbmdcbiAgICovXG4gIHN0YXRpYyBwYWNrYWdlVmVyc2lvbihiYXNlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQ0xJVXRpbHMuZ2V0UGFja2FnZShiYXNlUGF0aClbXCJ2ZXJzaW9uXCJdIGFzIHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgbmFtZSBmcm9tIHBhY2thZ2UuanNvblxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG5hbWUgZmllbGQgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBleHRyYWN0cyB0aGUgcGFja2FnZSBuYW1lIHdpdGhvdXQgdGhlIHNjb3BlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhY2thZ2UgbmFtZSB3aXRob3V0IHRoZSBzY29wZSAoZS5nLiwgXCJjbGlcIiBmcm9tIFwiQGRlY2FmLXRzL2NsaVwiKVxuICAgKi9cbiAgc3RhdGljIHBhY2thZ2VOYW1lKGJhc2VQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSAoQ0xJVXRpbHMuZ2V0UGFja2FnZShiYXNlUGF0aClbXCJuYW1lXCJdIGFzIHN0cmluZykuc3BsaXQoXCIvXCIpO1xuICAgIHJldHVybiBuYW1lW25hbWUubGVuZ3RoIC0gMV07XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgQ0xJX0ZJTEVfTkFNRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ0xJVXRpbHMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBVdGlsaXR5IGNsYXNzIHRvIGhhbmRsZSBDTEkgZnVuY3Rpb25hbGl0eSBmcm9tIGFsbCBEZWNhZiBtb2R1bGVzXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgQ29tbWFuZGVyLmpzIHRvIGhhbmRsZSBDTEkgY29tbWFuZHMgZnJvbSBkaWZmZXJlbnQgRGVjYWYgbW9kdWxlcy5cbiAqIEl0IGNyYXdscyB0aGUgZmlsZXN5c3RlbSB0byBmaW5kIENMSSBtb2R1bGVzLCBsb2FkcyB0aGVtLCBhbmQgcmVnaXN0ZXJzIHRoZWlyIGNvbW1hbmRzLlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VQYXRoXSBUaGUgYmFzZSBwYXRoIHRvIGxvb2sgZm9yIG1vZHVsZXMgaW4uIERlZmF1bHRzIHRvIGAuL2BcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY3Jhd2xMZXZlbHNdIE51bWJlciBvZiBmb2xkZXIgbGV2ZWxzIHRvIGNyYXdsIHRvIGZpbmQgbW9kdWxlcyBmcm9tIHRoZSBiYXNlUGF0aC4gRGVmYXVsdHMgdG8gNFxuICogXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgbmV3IENMSSB3cmFwcGVyIGFuZCBydW4gaXQgd2l0aCBjdXN0b20gb3B0aW9uc1xuICogY29uc3QgY2xpID0gbmV3IENsaVdyYXBwZXIoJy4vc3JjJywgMik7XG4gKiBjbGkucnVuKHByb2Nlc3MuYXJndikudGhlbigoKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKCdDTEkgY29tbWFuZHMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gKiB9KTtcbiAqIFxuICogQGNsYXNzIENsaVdyYXBwZXJcbiAqL1xuZXhwb3J0IGNsYXNzIENsaVdyYXBwZXIge1xuICBwcml2YXRlIF9jb21tYW5kPzogQ29tbWFuZDtcbiAgcHJpdmF0ZSBtb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBDb21tYW5kPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiYXNlUGF0aDogc3RyaW5nID0gXCIuL1wiLFxuICAgIHByaXZhdGUgY3Jhd2xMZXZlbHMgPSA0XG4gICkge1xuICAgIHRoaXMucm9vdFBhdGggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcIi4uXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBDb21tYW5kZXIgQ29tbWFuZCBvYmplY3RcbiAgICogQHN1bW1hcnkgTGF6eS1sb2FkcyB0aGUgQ29tbWFuZCBvYmplY3QsIGluaXRpYWxpemluZyBpdCB3aXRoIHRoZSBwYWNrYWdlIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgdmVyc2lvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBUaGUgaW5pdGlhbGl6ZWQgQ29tbWFuZCBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0IGNvbW1hbmQoKSB7XG4gICAgaWYgKCF0aGlzLl9jb21tYW5kKSB7XG4gICAgICB0aGlzLl9jb21tYW5kID0gbmV3IENvbW1hbmQoKTtcbiAgICAgIENMSVV0aWxzLmluaXRpYWxpemUodGhpcy5fY29tbWFuZCwgdGhpcy5yb290UGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb21tYW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkcyBhbmQgcmVnaXN0ZXJzIGEgbW9kdWxlIGZyb20gYSBmaWxlXG4gICAqIEBzdW1tYXJ5IER5bmFtaWNhbGx5IGltcG9ydHMgYSBDTEkgbW9kdWxlIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIHBhdGgsIGluaXRpYWxpemVzIGl0LCBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBtb2R1bGVzIGNvbGxlY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIFBhdGggdG8gdGhlIG1vZHVsZSBmaWxlIHRvIGxvYWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoIFJlcG9zaXRvcnkgcm9vdCBwYXRoIHRvIGZpbmQgdGhlIHBhY2thZ2UuanNvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBtb2R1bGUgbmFtZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGlXcmFwcGVyXG4gICAqICAgcGFydGljaXBhbnQgQ0xJVXRpbHNcbiAgICogICBwYXJ0aWNpcGFudCBNb2R1bGVcbiAgICogICBcbiAgICogICBDbGlXcmFwcGVyLT4+Q0xJVXRpbHM6IGxvYWRGcm9tRmlsZShmaWxlUGF0aClcbiAgICogICBDTElVdGlscy0tPj5DbGlXcmFwcGVyOiBtb2R1bGVcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogR2V0IG1vZHVsZSBuYW1lXG4gICAqICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IG5ldyBDb21tYW5kKClcbiAgICogICBDb21tYW5kLS0+PkNsaVdyYXBwZXI6IGNtZFxuICAgKiAgIENsaVdyYXBwZXItPj5DTElVdGlsczogaW5pdGlhbGl6ZShjbWQsIHBhdGguZGlybmFtZShyb290UGF0aCkpXG4gICAqICAgQ2xpV3JhcHBlci0+Pk1vZHVsZTogbW9kdWxlKClcbiAgICogICBOb3RlIG92ZXIgQ2xpV3JhcHBlcixNb2R1bGU6IEhhbmRsZSBQcm9taXNlIGlmIG5lZWRlZFxuICAgKiAgIE1vZHVsZS0tPj5DbGlXcmFwcGVyOiBDb21tYW5kIGluc3RhbmNlXG4gICAqICAgQ2xpV3JhcHBlci0+PkNsaVdyYXBwZXI6IFN0b3JlIGluIG1vZHVsZXNbbmFtZV1cbiAgICogICBDbGlXcmFwcGVyLS0+PkNsaVdyYXBwZXI6IFJldHVybiBuYW1lXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWQoZmlsZVBhdGg6IHN0cmluZywgcm9vdFBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IG5hbWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IENMSVV0aWxzLmxvYWRGcm9tRmlsZShmaWxlUGF0aCk7XG4gICAgICBuYW1lID0gbW9kdWxlLm5hbWU7XG4gICAgICBjb25zdCBjbWQgPSBuZXcgQ29tbWFuZCgpO1xuICAgICAgQ0xJVXRpbHMuaW5pdGlhbGl6ZShjbWQsIHJvb3RQYXRoKTtcbiAgICAgIGxldCBtID0gbW9kdWxlKCk7XG4gICAgICBpZiAobSBpbnN0YW5jZW9mIFByb21pc2UpIG0gPSBhd2FpdCBtO1xuICAgICAgdGhpcy5tb2R1bGVzW25hbWVdID0gbTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBmYWlsZWQgdG8gbG9hZCBtb2R1bGUgJHtuYW1lIHx8IFwidW5uYW1lZFwifSB1bmRlciAke2ZpbGVQYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kcyBhbmQgbG9hZHMgYWxsIENMSSBtb2R1bGVzIGluIHRoZSBiYXNlUGF0aFxuICAgKiBAc3VtbWFyeSBVc2VzIHRoZSBjcmF3bCBtZXRob2QgdG8gZmluZCBhbGwgQ0xJIG1vZHVsZXMgaW4gdGhlIHNwZWNpZmllZCBiYXNlIHBhdGgsIFxuICAgKiB0aGVuIGxvYWRzIGFuZCByZWdpc3RlcnMgZWFjaCBtb2R1bGUgYXMgYSBzdWJjb21tYW5kXG4gICAqIFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBtb2R1bGVzIGFyZSBsb2FkZWRcbiAgICogXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBGaWxlc3lzdGVtXG4gICAqICAgcGFydGljaXBhbnQgTW9kdWxlXG4gICAqICAgXG4gICAqICAgQ2xpV3JhcHBlci0+PkZpbGVzeXN0ZW06IEpvaW4gYmFzZVBhdGggd2l0aCBjd2RcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogY3Jhd2woYmFzZVBhdGgsIGNyYXdsTGV2ZWxzKVxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpV3JhcHBlcjogbW9kdWxlc1tdXG4gICAqICAgbG9vcCBGb3IgZWFjaCBtb2R1bGVcbiAgICogICAgIGFsdCBOb3QgQGRlY2FmLXRzL2NsaVxuICAgKiAgICAgICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogbG9hZChtb2R1bGUsIGN3ZClcbiAgICogICAgICAgQ2xpV3JhcHBlci0tPj5DbGlXcmFwcGVyOiBuYW1lXG4gICAqICAgICAgIENsaVdyYXBwZXItPj5DbGlXcmFwcGVyOiBDaGVjayBpZiBjb21tYW5kIGV4aXN0c1xuICAgKiAgICAgICBhbHQgQ29tbWFuZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICAgICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IGNvbW1hbmQobmFtZSkuYWRkQ29tbWFuZChtb2R1bGVzW25hbWVdKVxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIENsaVdyYXBwZXItPj5Db25zb2xlOiBMb2cgbG9hZGVkIG1vZHVsZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdCgpIHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLnJvb3RQYXRoLCB0aGlzLmJhc2VQYXRoKTtcbiAgICBjb25zdCBtb2R1bGVzID0gdGhpcy5jcmF3bChiYXNlUGF0aCwgdGhpcy5jcmF3bExldmVscyk7XG4gICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgaWYgKG1vZHVsZS5pbmNsdWRlcyhcIkBkZWNhZi10cy9jbGlcIikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgbmFtZTogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmFtZSA9IGF3YWl0IHRoaXMubG9hZChtb2R1bGUsIHRoaXMucm9vdFBhdGgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5jb21tYW5kLmNvbW1hbmRzLmZpbmQoXG4gICAgICAgICAgKGMpID0+IChjIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbXCJfbmFtZVwiXSA9PT0gbmFtZVxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5jb21tYW5kLmNvbW1hbmQobmFtZSkuYWRkQ29tbWFuZCh0aGlzLm1vZHVsZXNbbmFtZV0pO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBsb2FkZWQgbW9kdWxlczpcXG4ke09iamVjdC5rZXlzKHRoaXMubW9kdWxlcylcbiAgICAgICAgLm1hcCgoaykgPT4gYC0gJHtrfWApXG4gICAgICAgIC5qb2luKFwiXFxuXCIpfWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzZWFyY2hlcyBmb3IgQ0xJIG1vZHVsZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgKiBAc3VtbWFyeSBDcmF3bHMgdGhlIGJhc2VQYXRoIHVwIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGZvbGRlciBsZXZlbHMgdG8gZmluZCBmaWxlcyBuYW1lZCBhY2NvcmRpbmcgdG8gQ0xJX0ZJTEVfTkFNRVxuICAgKiBcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoIFRoZSBhYnNvbHV0ZSBiYXNlIHBhdGggdG8gc3RhcnQgc2VhcmNoaW5nIGluXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGV2ZWxzPTJdIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkaXJlY3RvcnkgbGV2ZWxzIHRvIGNyYXdsXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBmaWxlIHBhdGhzIHRvIENMSSBtb2R1bGVzXG4gICAqIFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmF3bChiYXNlUGF0aDogc3RyaW5nLCBsZXZlbHM6IG51bWJlciA9IDIpIHtcbiAgICBpZiAobGV2ZWxzIDw9IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gZnMucmVhZGRpclN5bmMoYmFzZVBhdGgpLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBmaWxlKSA9PiB7XG4gICAgICBmaWxlID0gcGF0aC5qb2luKGJhc2VQYXRoLCBmaWxlKTtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhmaWxlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goLi4udGhpcy5jcmF3bChmaWxlLCBsZXZlbHMgLSAxKSk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGUubWF0Y2gobmV3IFJlZ0V4cChgJHtDTElfRklMRV9OQU1FfS5bY21dP2pzJGAsIFwiZ21cIikpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goZmlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyB0aGUgQ0xJIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50c1xuICAgKiBAc3VtbWFyeSBCb290cyB0aGUgQ0xJIGJ5IGxvYWRpbmcgYWxsIG1vZHVsZXMsIHRoZW4gcGFyc2VzIGFuZCBleGVjdXRlcyB0aGUgY29tbWFuZCBzcGVjaWZpZWQgaW4gdGhlIGFyZ3VtZW50c1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncz1wcm9jZXNzLmFyZ3ZdIENvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gcGFyc2UgYW5kIGV4ZWN1dGVcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29tbWFuZCBleGVjdXRpb24gaXMgY29tcGxldGVcbiAgICogXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBDb21tYW5kXG4gICAqICAgXG4gICAqICAgQ2xpZW50LT4+Q2xpV3JhcHBlcjogcnVuKGFyZ3MpXG4gICAqICAgQ2xpV3JhcHBlci0+PkNsaVdyYXBwZXI6IGJvb3QoKVxuICAgKiAgIE5vdGUgb3ZlciBDbGlXcmFwcGVyOiBMb2FkcyBhbGwgbW9kdWxlc1xuICAgKiAgIENsaVdyYXBwZXItPj5Db21tYW5kOiBwYXJzZUFzeW5jKGFyZ3MpXG4gICAqICAgQ29tbWFuZC0tPj5DbGlXcmFwcGVyOiByZXN1bHRcbiAgICogICBDbGlXcmFwcGVyLS0+PkNsaWVudDogcmVzdWx0XG4gICAqL1xuICBhc3luYyBydW4oYXJnczogc3RyaW5nW10gPSBwcm9jZXNzLmFyZ3YpIHtcbiAgICBhd2FpdCB0aGlzLmJvb3QoKTtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kLnBhcnNlQXN5bmMoYXJncyk7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL0NsaVdyYXBwZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjYWYtdHMnIENMSSBtb2R1bGVcbiAqIEBzdW1tYXJ5IFRoaXMgZmlsZSB3aWxsIGNyYXdsIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciBmaWxlcyBjYWxsZWQge0BsaW5rIENMSV9GSUxFX05BTUV9XG4gKiB3aXRoaW4gdGhlIEBkZWNhZi10cyBuYW1lc3BhY2UgYW5kIGxvYWQgdGhlbSBhcyBzdWJjb21tYW5kcy4gSXQgc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50XG4gKiBmb3IgdGhlIENMSSBmdW5jdGlvbmFsaXR5LCBleHBvcnRpbmcgdGhlIENsaVdyYXBwZXIgY2xhc3MgYW5kIFZFUlNJT04gY29uc3RhbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIHJ1biBtb2R1bGUgY29tbWFuZCAgICAgLSAkIG5weCBkZWNhZiA8bW9kdWxlIG5hbWU+IDxtb2R1bGUgY29tbWFuZD4gLi4uPG1vZHVsZSBjb21tYW5kIG9wdGlvbnM+XG4gKiBnZXQgbW9kdWxlIGhlbHAgICAgICAgIC0gJCBucHggZGVjYWYgaGVscCA8bW9kdWxlIG5hbWU+O1xuICogbGlzdCBpbXBvcnRlZCBtb2R1bGVzICAtICQgbnB4IGRlY2FmIGxpc3Q7XG4gKiBnZXQgY2xpIGhlbHAgICAgICAgICAgIC0gJCBucHggZGVjYWYgaGVscDtcbiAqXG4gKiBAbW9kdWxlIENMSVxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb25cbiAqIEBzdW1tYXJ5IEEgY29uc3RhbnQgdGhhdCBob2xkcyB0aGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIHBhY2thZ2UsIHdoaWNoIGlzIHJlcGxhY2VkIGR1cmluZyBidWlsZFxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Q0xJXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkNvbW1hbmQiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUdBOzs7Ozs7SUFNRztJQUNJLE1BQU0sYUFBYSxHQUFHLFlBQVk7O0lDTHpDOzs7Ozs7Ozs7Ozs7O0lBYUc7VUFDVSxRQUFRLENBQUE7SUFDbkI7Ozs7OztJQU1HO0lBQ0gsSUFBQSxhQUFhLFlBQVksQ0FBQyxJQUFZLEVBQUE7SUFDcEMsUUFBQSxJQUFJO2dCQUNGLE9BQU8sUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDOztZQUM3QyxPQUFPLENBQVUsRUFBRTtnQkFDbkIsTUFBTSxJQUFJLEtBQUssQ0FDYixDQUFBLG9CQUFBLEVBQXVCLElBQUksQ0FBSyxFQUFBLEVBQUEsQ0FBQyxZQUFZLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBRSxDQUFBLENBQ3JFOzs7SUFJTDs7Ozs7Ozs7SUFRRztJQUNILElBQUEsYUFBYSxlQUFlLENBQUksYUFBeUIsRUFBQTs7SUFFdkQsUUFBQSxPQUFPLGFBQWEsQ0FBQyxJ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