@decaf-ts/logging 0.2.3 → 0.3.2
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/LICENSE.md +21 -157
- package/README.md +363 -2
- package/dist/logging.cjs +304 -89
- package/dist/logging.esm.cjs +304 -89
- package/lib/constants.cjs +28 -15
- package/lib/constants.d.ts +26 -14
- package/lib/decorators.cjs +65 -1
- package/lib/decorators.d.ts +64 -0
- package/lib/esm/constants.d.ts +26 -14
- package/lib/esm/constants.js +28 -15
- package/lib/esm/decorators.d.ts +64 -0
- package/lib/esm/decorators.js +67 -3
- package/lib/esm/index.d.ts +6 -12
- package/lib/esm/index.js +11 -17
- package/lib/esm/logging.d.ts +190 -63
- package/lib/esm/logging.js +208 -64
- package/lib/esm/types.d.ts +57 -9
- package/lib/esm/types.js +1 -1
- package/lib/esm/winston/winston.d.ts +39 -0
- package/lib/esm/winston/winston.js +41 -2
- package/lib/index.cjs +7 -13
- package/lib/index.d.ts +6 -12
- package/lib/logging.cjs +207 -63
- package/lib/logging.d.ts +190 -63
- package/lib/types.cjs +1 -1
- package/lib/types.d.ts +57 -9
- package/lib/winston/winston.cjs +40 -1
- package/lib/winston/winston.d.ts +39 -0
- package/package.json +2 -2
package/dist/logging.esm.cjs
CHANGED
|
@@ -4,7 +4,7 @@ import { style } from 'styled-string-builder';
|
|
|
4
4
|
* @description Enum for log levels.
|
|
5
5
|
* @summary Defines different levels of logging for the application.
|
|
6
6
|
* @enum {string}
|
|
7
|
-
* @memberOf
|
|
7
|
+
* @memberOf module:Logging
|
|
8
8
|
*/
|
|
9
9
|
var LogLevel;
|
|
10
10
|
(function (LogLevel) {
|
|
@@ -22,13 +22,13 @@ var LogLevel;
|
|
|
22
22
|
/**
|
|
23
23
|
* @description Numeric values associated with log levels.
|
|
24
24
|
* @summary Provides a numeric representation of log levels for comparison and filtering.
|
|
25
|
-
* @const
|
|
26
|
-
* @property {number} error - Numeric value for error level (
|
|
27
|
-
* @property {number} info - Numeric value for info level (
|
|
28
|
-
* @property {number} verbose - Numeric value for verbose level (
|
|
29
|
-
* @property {number} debug - Numeric value for debug level (
|
|
30
|
-
* @property {number} silly - Numeric value for silly level (
|
|
31
|
-
* @memberOf
|
|
25
|
+
* @const NumericLogLevels
|
|
26
|
+
* @property {number} error - Numeric value for error level (2).
|
|
27
|
+
* @property {number} info - Numeric value for info level (4).
|
|
28
|
+
* @property {number} verbose - Numeric value for verbose level (6).
|
|
29
|
+
* @property {number} debug - Numeric value for debug level (7).
|
|
30
|
+
* @property {number} silly - Numeric value for silly level (9).
|
|
31
|
+
* @memberOf module:Logging
|
|
32
32
|
*/
|
|
33
33
|
const NumericLogLevels = {
|
|
34
34
|
error: 2,
|
|
@@ -37,9 +37,17 @@ const NumericLogLevels = {
|
|
|
37
37
|
debug: 7,
|
|
38
38
|
silly: 9,
|
|
39
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* @description Enum for logging output modes.
|
|
42
|
+
* @summary Defines different output formats for log messages.
|
|
43
|
+
* @enum {string}
|
|
44
|
+
* @memberOf module:Logging
|
|
45
|
+
*/
|
|
40
46
|
var LoggingMode;
|
|
41
47
|
(function (LoggingMode) {
|
|
48
|
+
/** Raw text format for human readability */
|
|
42
49
|
LoggingMode["RAW"] = "raw";
|
|
50
|
+
/** JSON format for machine parsing */
|
|
43
51
|
LoggingMode["JSON"] = "json";
|
|
44
52
|
})(LoggingMode || (LoggingMode = {}));
|
|
45
53
|
/**
|
|
@@ -48,23 +56,24 @@ var LoggingMode;
|
|
|
48
56
|
* @const DefaultTheme
|
|
49
57
|
* @typedef {Theme} DefaultTheme
|
|
50
58
|
* @property {Object} class - Styling for class names.
|
|
51
|
-
* @property {number} class.fg - Foreground color code for class names (
|
|
59
|
+
* @property {number} class.fg - Foreground color code for class names (34).
|
|
52
60
|
* @property {Object} id - Styling for identifiers.
|
|
53
61
|
* @property {number} id.fg - Foreground color code for identifiers (36).
|
|
54
62
|
* @property {Object} stack - Styling for stack traces (empty object).
|
|
55
63
|
* @property {Object} timestamp - Styling for timestamps (empty object).
|
|
56
64
|
* @property {Object} message - Styling for different types of messages.
|
|
57
65
|
* @property {Object} message.error - Styling for error messages.
|
|
58
|
-
* @property {number} message.error.fg - Foreground color code for error messages (
|
|
66
|
+
* @property {number} message.error.fg - Foreground color code for error messages (31).
|
|
59
67
|
* @property {Object} method - Styling for method names (empty object).
|
|
60
68
|
* @property {Object} logLevel - Styling for different log levels.
|
|
61
69
|
* @property {Object} logLevel.error - Styling for error level logs.
|
|
62
|
-
* @property {number} logLevel.error.fg - Foreground color code for error level logs (
|
|
70
|
+
* @property {number} logLevel.error.fg - Foreground color code for error level logs (31).
|
|
71
|
+
* @property {string[]} logLevel.error.style - Style attributes for error level logs (["bold"]).
|
|
63
72
|
* @property {Object} logLevel.info - Styling for info level logs (empty object).
|
|
64
73
|
* @property {Object} logLevel.verbose - Styling for verbose level logs (empty object).
|
|
65
74
|
* @property {Object} logLevel.debug - Styling for debug level logs.
|
|
66
|
-
* @property {number} logLevel.debug.fg - Foreground color code for debug level logs (
|
|
67
|
-
* @memberOf
|
|
75
|
+
* @property {number} logLevel.debug.fg - Foreground color code for debug level logs (33).
|
|
76
|
+
* @memberOf module:Logging
|
|
68
77
|
*/
|
|
69
78
|
const DefaultTheme = {
|
|
70
79
|
class: {
|
|
@@ -100,12 +109,15 @@ const DefaultTheme = {
|
|
|
100
109
|
* @typedef {LoggingConfig} DefaultLoggingConfig
|
|
101
110
|
* @property {number} verbose - Verbosity level (0).
|
|
102
111
|
* @property {LogLevel} level - Default log level (LogLevel.info).
|
|
112
|
+
* @property {boolean} logLevel - Whether to display log level in output (true).
|
|
113
|
+
* @property {LoggingMode} mode - Output format mode (LoggingMode.RAW).
|
|
103
114
|
* @property {boolean} style - Whether to apply styling to log output (false).
|
|
115
|
+
* @property {string} separator - Separator between log components (" - ").
|
|
104
116
|
* @property {boolean} timestamp - Whether to include timestamps in log messages (true).
|
|
105
117
|
* @property {string} timestampFormat - Format for timestamps ("HH:mm:ss.SSS").
|
|
106
118
|
* @property {boolean} context - Whether to include context information in log messages (true).
|
|
107
119
|
* @property {Theme} theme - The theme to use for styling log messages (DefaultTheme).
|
|
108
|
-
* @memberOf
|
|
120
|
+
* @memberOf module:Logging
|
|
109
121
|
*/
|
|
110
122
|
const DefaultLoggingConfig = {
|
|
111
123
|
verbose: 0,
|
|
@@ -113,6 +125,7 @@ const DefaultLoggingConfig = {
|
|
|
113
125
|
logLevel: true,
|
|
114
126
|
mode: LoggingMode.RAW,
|
|
115
127
|
style: false,
|
|
128
|
+
contextSeparator: ".",
|
|
116
129
|
separator: " - ",
|
|
117
130
|
timestamp: true,
|
|
118
131
|
timestampFormat: "HH:mm:ss.SSS",
|
|
@@ -122,20 +135,29 @@ const DefaultLoggingConfig = {
|
|
|
122
135
|
|
|
123
136
|
/**
|
|
124
137
|
* @description A minimal logger implementation.
|
|
125
|
-
* @summary MiniLogger is a lightweight logging class that implements the
|
|
126
|
-
* It provides basic logging functionality with support for different log levels
|
|
138
|
+
* @summary MiniLogger is a lightweight logging class that implements the Logger interface.
|
|
139
|
+
* It provides basic logging functionality with support for different log levels, verbosity,
|
|
140
|
+
* context-aware logging, and customizable formatting.
|
|
141
|
+
* @param {string} context - The context (typically class name) this logger is associated with
|
|
142
|
+
* @param {Partial<LoggingConfig>} conf - Optional configuration to override global settings
|
|
143
|
+
* @class MiniLogger
|
|
144
|
+
* @example
|
|
145
|
+
* // Create a new logger for a class
|
|
146
|
+
* const logger = new MiniLogger('MyClass');
|
|
147
|
+
*
|
|
148
|
+
* // Log messages at different levels
|
|
149
|
+
* logger.info('This is an info message');
|
|
150
|
+
* logger.debug('This is a debug message');
|
|
151
|
+
* logger.error('Something went wrong');
|
|
127
152
|
*
|
|
128
|
-
*
|
|
153
|
+
* // Create a child logger for a specific method
|
|
154
|
+
* const methodLogger = logger.for('myMethod');
|
|
155
|
+
* methodLogger.verbose('Detailed information', 2);
|
|
156
|
+
*
|
|
157
|
+
* // Log with custom configuration
|
|
158
|
+
* logger.for('specialMethod', { style: true }).info('Styled message');
|
|
129
159
|
*/
|
|
130
160
|
class MiniLogger {
|
|
131
|
-
/**
|
|
132
|
-
* @description Creates a new MiniLogger instance.
|
|
133
|
-
* @summary Initializes a MiniLogger with the given class name, optional configuration, and method name.
|
|
134
|
-
*
|
|
135
|
-
* @param context - The name of the class using this logger.
|
|
136
|
-
* @param [conf] - Optional logging configuration. Defaults to Info level and verbosity 0.
|
|
137
|
-
* @param [id] - Optional unique identifier for the logger instance.
|
|
138
|
-
*/
|
|
139
161
|
constructor(context, conf) {
|
|
140
162
|
this.context = context;
|
|
141
163
|
this.conf = conf;
|
|
@@ -145,22 +167,46 @@ class MiniLogger {
|
|
|
145
167
|
return this.conf[key];
|
|
146
168
|
return Logging.getConfig()[key];
|
|
147
169
|
}
|
|
148
|
-
|
|
170
|
+
/**
|
|
171
|
+
* @description Creates a child logger for a specific method or context
|
|
172
|
+
* @summary Returns a new logger instance with the current context extended by the specified method name
|
|
173
|
+
* @param {string | Function} method - The method name or function to create a logger for
|
|
174
|
+
* @param {Partial<LoggingConfig>} config - Optional configuration to override settings
|
|
175
|
+
* @param {...any} args - Additional arguments to pass to the logger factory
|
|
176
|
+
* @return {Logger} A new logger instance for the specified method
|
|
177
|
+
*/
|
|
178
|
+
for(method, config) {
|
|
149
179
|
method = method
|
|
150
180
|
? typeof method === "string"
|
|
151
181
|
? method
|
|
152
182
|
: method.name
|
|
153
183
|
: undefined;
|
|
154
|
-
return
|
|
184
|
+
return new Proxy(this, {
|
|
185
|
+
get: (target, p, receiver) => {
|
|
186
|
+
const result = Reflect.get(target, p, receiver);
|
|
187
|
+
if (p === "config") {
|
|
188
|
+
return new Proxy(this.config, {
|
|
189
|
+
get: (target, p) => {
|
|
190
|
+
if (config && p in config)
|
|
191
|
+
return config[p];
|
|
192
|
+
return Reflect.get(target, p, receiver);
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
if (p === "context") {
|
|
197
|
+
return [result, method].join(".");
|
|
198
|
+
}
|
|
199
|
+
return result;
|
|
200
|
+
},
|
|
201
|
+
});
|
|
155
202
|
}
|
|
156
203
|
/**
|
|
157
|
-
* @description Creates a formatted log string
|
|
158
|
-
* @summary Generates a log string with timestamp, colored log level, and message
|
|
159
|
-
*
|
|
160
|
-
* @param
|
|
161
|
-
* @param
|
|
162
|
-
* @
|
|
163
|
-
* @return A formatted log string.
|
|
204
|
+
* @description Creates a formatted log string
|
|
205
|
+
* @summary Generates a log string with timestamp, colored log level, context, and message
|
|
206
|
+
* @param {LogLevel} level - The log level for this message
|
|
207
|
+
* @param {StringLike | Error} message - The message to log or an Error object
|
|
208
|
+
* @param {string} [stack] - Optional stack trace to include in the log
|
|
209
|
+
* @return {string} A formatted log string with all components
|
|
164
210
|
*/
|
|
165
211
|
createLog(level, message, stack) {
|
|
166
212
|
const log = [];
|
|
@@ -205,13 +251,13 @@ class MiniLogger {
|
|
|
205
251
|
return log.join(this.config("separator"));
|
|
206
252
|
}
|
|
207
253
|
/**
|
|
208
|
-
* @description Logs a message with the specified log level
|
|
254
|
+
* @description Logs a message with the specified log level
|
|
209
255
|
* @summary Checks if the message should be logged based on the current log level,
|
|
210
|
-
* then uses the appropriate console method to output the log
|
|
211
|
-
*
|
|
212
|
-
* @param
|
|
213
|
-
* @param
|
|
214
|
-
* @
|
|
256
|
+
* then uses the appropriate console method to output the formatted log
|
|
257
|
+
* @param {LogLevel} level - The log level of the message
|
|
258
|
+
* @param {StringLike | Error} msg - The message to be logged or an Error object
|
|
259
|
+
* @param {string} [stack] - Optional stack trace to include in the log
|
|
260
|
+
* @return {void}
|
|
215
261
|
*/
|
|
216
262
|
log(level, msg, stack) {
|
|
217
263
|
if (NumericLogLevels[this.config("level")] <
|
|
@@ -235,96 +281,166 @@ class MiniLogger {
|
|
|
235
281
|
method(this.createLog(level, msg, stack));
|
|
236
282
|
}
|
|
237
283
|
/**
|
|
238
|
-
* @description
|
|
239
|
-
* @summary Logs a message at the
|
|
240
|
-
*
|
|
241
|
-
* @param
|
|
242
|
-
* @
|
|
284
|
+
* @description Logs a message at the silly level
|
|
285
|
+
* @summary Logs a message at the silly level if the current verbosity setting allows it
|
|
286
|
+
* @param {StringLike} msg - The message to be logged
|
|
287
|
+
* @param {number} [verbosity=0] - The verbosity level of the message
|
|
288
|
+
* @return {void}
|
|
243
289
|
*/
|
|
244
290
|
silly(msg, verbosity = 0) {
|
|
245
291
|
if (this.config("verbose") >= verbosity)
|
|
246
292
|
this.log(LogLevel.verbose, msg);
|
|
247
293
|
}
|
|
248
294
|
/**
|
|
249
|
-
* @description Logs a verbose
|
|
250
|
-
* @summary Logs a message at the
|
|
251
|
-
*
|
|
252
|
-
* @param
|
|
253
|
-
* @
|
|
295
|
+
* @description Logs a message at the verbose level
|
|
296
|
+
* @summary Logs a message at the verbose level if the current verbosity setting allows it
|
|
297
|
+
* @param {StringLike} msg - The message to be logged
|
|
298
|
+
* @param {number} [verbosity=0] - The verbosity level of the message
|
|
299
|
+
* @return {void}
|
|
254
300
|
*/
|
|
255
301
|
verbose(msg, verbosity = 0) {
|
|
256
302
|
if (this.config("verbose") >= verbosity)
|
|
257
303
|
this.log(LogLevel.verbose, msg);
|
|
258
304
|
}
|
|
259
305
|
/**
|
|
260
|
-
* @description Logs
|
|
261
|
-
* @summary Logs a message at the
|
|
262
|
-
*
|
|
263
|
-
* @
|
|
306
|
+
* @description Logs a message at the info level
|
|
307
|
+
* @summary Logs a message at the info level for general application information
|
|
308
|
+
* @param {StringLike} msg - The message to be logged
|
|
309
|
+
* @return {void}
|
|
264
310
|
*/
|
|
265
311
|
info(msg) {
|
|
266
312
|
this.log(LogLevel.info, msg);
|
|
267
313
|
}
|
|
268
314
|
/**
|
|
269
|
-
* @description Logs a debug
|
|
270
|
-
* @summary Logs a message at the
|
|
271
|
-
*
|
|
272
|
-
* @
|
|
315
|
+
* @description Logs a message at the debug level
|
|
316
|
+
* @summary Logs a message at the debug level for detailed troubleshooting information
|
|
317
|
+
* @param {StringLike} msg - The message to be logged
|
|
318
|
+
* @return {void}
|
|
273
319
|
*/
|
|
274
320
|
debug(msg) {
|
|
275
321
|
this.log(LogLevel.debug, msg);
|
|
276
322
|
}
|
|
277
323
|
/**
|
|
278
|
-
* @description Logs
|
|
279
|
-
* @summary Logs a message at the
|
|
280
|
-
*
|
|
281
|
-
* @
|
|
324
|
+
* @description Logs a message at the error level
|
|
325
|
+
* @summary Logs a message at the error level for errors and exceptions
|
|
326
|
+
* @param {StringLike | Error} msg - The message to be logged or an Error object
|
|
327
|
+
* @return {void}
|
|
282
328
|
*/
|
|
283
329
|
error(msg) {
|
|
284
330
|
this.log(LogLevel.error, msg);
|
|
285
331
|
}
|
|
332
|
+
/**
|
|
333
|
+
* @description Updates the logger configuration
|
|
334
|
+
* @summary Merges the provided configuration with the existing configuration
|
|
335
|
+
* @param {Partial<LoggingConfig>} config - The configuration options to apply
|
|
336
|
+
* @return {void}
|
|
337
|
+
*/
|
|
286
338
|
setConfig(config) {
|
|
287
339
|
this.conf = { ...(this.conf || {}), ...config };
|
|
288
340
|
}
|
|
289
341
|
}
|
|
290
342
|
/**
|
|
291
|
-
* @description A static class for managing logging operations
|
|
343
|
+
* @description A static class for managing logging operations
|
|
292
344
|
* @summary The Logging class provides a centralized logging mechanism with support for
|
|
293
|
-
* different log levels and
|
|
345
|
+
* different log levels, verbosity, and styling. It uses a singleton pattern to maintain a global
|
|
294
346
|
* logger instance and allows creating specific loggers for different classes and methods.
|
|
347
|
+
* @class Logging
|
|
348
|
+
* @example
|
|
349
|
+
* // Set global configuration
|
|
350
|
+
* Logging.setConfig({ level: LogLevel.debug, style: true });
|
|
351
|
+
*
|
|
352
|
+
* // Get a logger for a specific class
|
|
353
|
+
* const logger = Logging.for('MyClass');
|
|
354
|
+
*
|
|
355
|
+
* // Log messages at different levels
|
|
356
|
+
* logger.info('Application started');
|
|
357
|
+
* logger.debug('Processing data...');
|
|
358
|
+
*
|
|
359
|
+
* // Log with context
|
|
360
|
+
* const methodLogger = Logging.for('MyClass.myMethod');
|
|
361
|
+
* methodLogger.verbose('Detailed operation information', 1);
|
|
362
|
+
*
|
|
363
|
+
* // Log errors
|
|
364
|
+
* try {
|
|
365
|
+
* // some operation
|
|
366
|
+
* } catch (error) {
|
|
367
|
+
* logger.error(error);
|
|
368
|
+
* }
|
|
369
|
+
* @mermaid
|
|
370
|
+
* classDiagram
|
|
371
|
+
* class Logger {
|
|
372
|
+
* <<interface>>
|
|
373
|
+
* +for(method, config, ...args)
|
|
374
|
+
* +silly(msg, verbosity)
|
|
375
|
+
* +verbose(msg, verbosity)
|
|
376
|
+
* +info(msg)
|
|
377
|
+
* +debug(msg)
|
|
378
|
+
* +error(msg)
|
|
379
|
+
* +setConfig(config)
|
|
380
|
+
* }
|
|
381
|
+
*
|
|
382
|
+
* class Logging {
|
|
383
|
+
* -global: Logger
|
|
384
|
+
* -_factory: LoggerFactory
|
|
385
|
+
* -_config: LoggingConfig
|
|
386
|
+
* +setFactory(factory)
|
|
387
|
+
* +setConfig(config)
|
|
388
|
+
* +getConfig()
|
|
389
|
+
* +get()
|
|
390
|
+
* +verbose(msg, verbosity)
|
|
391
|
+
* +info(msg)
|
|
392
|
+
* +debug(msg)
|
|
393
|
+
* +silly(msg)
|
|
394
|
+
* +error(msg)
|
|
395
|
+
* +for(object, config, ...args)
|
|
396
|
+
* +because(reason, id)
|
|
397
|
+
* +theme(text, type, loggerLevel, template)
|
|
398
|
+
* }
|
|
399
|
+
*
|
|
400
|
+
* class MiniLogger {
|
|
401
|
+
* +constructor(context, conf?)
|
|
402
|
+
* }
|
|
295
403
|
*
|
|
296
|
-
*
|
|
404
|
+
* Logging ..> Logger : creates
|
|
405
|
+
* Logging ..> MiniLogger : creates by default
|
|
297
406
|
*/
|
|
298
407
|
class Logging {
|
|
299
408
|
/**
|
|
300
|
-
* @description Factory function for creating logger instances
|
|
301
|
-
* @summary A function that creates new
|
|
409
|
+
* @description Factory function for creating logger instances
|
|
410
|
+
* @summary A function that creates new Logger instances. By default, it creates a MiniLogger.
|
|
302
411
|
*/
|
|
303
412
|
static { this._factory = (object, config) => {
|
|
304
413
|
return new MiniLogger(object, config);
|
|
305
414
|
}; }
|
|
306
415
|
/**
|
|
307
|
-
* @description Configuration for the logging system
|
|
308
|
-
* @summary Stores the global verbosity level and
|
|
416
|
+
* @description Configuration for the logging system
|
|
417
|
+
* @summary Stores the global logging configuration including verbosity, log level, styling, and formatting settings
|
|
309
418
|
*/
|
|
310
419
|
static { this._config = DefaultLoggingConfig; }
|
|
420
|
+
constructor() { }
|
|
311
421
|
/**
|
|
312
|
-
* @description
|
|
313
|
-
* @summary
|
|
422
|
+
* @description Sets the factory function for creating logger instances
|
|
423
|
+
* @summary Allows customizing how logger instances are created
|
|
424
|
+
* @param {LoggerFactory} factory - The factory function to use for creating loggers
|
|
425
|
+
* @return {void}
|
|
314
426
|
*/
|
|
315
|
-
constructor() { }
|
|
316
427
|
static setFactory(factory) {
|
|
317
428
|
Logging._factory = factory;
|
|
318
429
|
}
|
|
319
430
|
/**
|
|
320
|
-
* @description
|
|
321
|
-
* @summary Allows updating the global logging configuration
|
|
322
|
-
*
|
|
323
|
-
* @
|
|
431
|
+
* @description Updates the global logging configuration
|
|
432
|
+
* @summary Allows updating the global logging configuration with new settings
|
|
433
|
+
* @param {Partial<LoggingConfig>} config - The configuration options to apply
|
|
434
|
+
* @return {void}
|
|
324
435
|
*/
|
|
325
436
|
static setConfig(config) {
|
|
326
437
|
Object.assign(this._config, config);
|
|
327
438
|
}
|
|
439
|
+
/**
|
|
440
|
+
* @description Gets a copy of the current global logging configuration
|
|
441
|
+
* @summary Returns a copy of the current global logging configuration
|
|
442
|
+
* @return {LoggingConfig} A copy of the current configuration
|
|
443
|
+
*/
|
|
328
444
|
static getConfig() {
|
|
329
445
|
return Object.assign({}, this._config);
|
|
330
446
|
}
|
|
@@ -384,6 +500,14 @@ class Logging {
|
|
|
384
500
|
static error(msg) {
|
|
385
501
|
return this.get().error(msg);
|
|
386
502
|
}
|
|
503
|
+
/**
|
|
504
|
+
* @description Creates a logger for a specific object or context
|
|
505
|
+
* @summary Creates a new logger instance for the given object or context using the factory function
|
|
506
|
+
* @param {LoggingContext} object - The object, class, or context to create a logger for
|
|
507
|
+
* @param {Partial<LoggingConfig>} [config] - Optional configuration to override global settings
|
|
508
|
+
* @param {...any} args - Additional arguments to pass to the logger factory
|
|
509
|
+
* @return {Logger} A new logger instance for the specified object or context
|
|
510
|
+
*/
|
|
387
511
|
static for(object, config, ...args) {
|
|
388
512
|
object =
|
|
389
513
|
typeof object === "string"
|
|
@@ -406,6 +530,39 @@ class Logging {
|
|
|
406
530
|
static because(reason, id) {
|
|
407
531
|
return this._factory(reason, this._config, id);
|
|
408
532
|
}
|
|
533
|
+
/**
|
|
534
|
+
* @description Applies theme styling to text
|
|
535
|
+
* @summary Applies styling (colors, formatting) to text based on the theme configuration
|
|
536
|
+
* @param {string} text - The text to style
|
|
537
|
+
* @param {string} type - The type of element to style (e.g., "class", "message", "logLevel")
|
|
538
|
+
* @param {LogLevel} loggerLevel - The log level to use for styling
|
|
539
|
+
* @param {Theme} [template=DefaultTheme] - The theme to use for styling
|
|
540
|
+
* @return {string} The styled text
|
|
541
|
+
* @mermaid
|
|
542
|
+
* sequenceDiagram
|
|
543
|
+
* participant Caller
|
|
544
|
+
* participant Theme as Logging.theme
|
|
545
|
+
* participant Apply as apply function
|
|
546
|
+
* participant Style as styled-string-builder
|
|
547
|
+
*
|
|
548
|
+
* Caller->>Theme: theme(text, type, loggerLevel)
|
|
549
|
+
* Theme->>Theme: Check if styling is enabled
|
|
550
|
+
* alt styling disabled
|
|
551
|
+
* Theme-->>Caller: return original text
|
|
552
|
+
* else styling enabled
|
|
553
|
+
* Theme->>Theme: Get theme for type
|
|
554
|
+
* alt theme not found
|
|
555
|
+
* Theme-->>Caller: return original text
|
|
556
|
+
* else theme found
|
|
557
|
+
* Theme->>Theme: Determine actual theme based on log level
|
|
558
|
+
* Theme->>Apply: Apply each style property
|
|
559
|
+
* Apply->>Style: Apply colors and formatting
|
|
560
|
+
* Style-->>Apply: Return styled text
|
|
561
|
+
* Apply-->>Theme: Return styled text
|
|
562
|
+
* Theme-->>Caller: Return final styled text
|
|
563
|
+
* end
|
|
564
|
+
* end
|
|
565
|
+
*/
|
|
409
566
|
static theme(text, type, loggerLevel, template = DefaultTheme) {
|
|
410
567
|
if (!this._config.style)
|
|
411
568
|
return text;
|
|
@@ -480,6 +637,37 @@ class Logging {
|
|
|
480
637
|
}
|
|
481
638
|
}
|
|
482
639
|
|
|
640
|
+
/**
|
|
641
|
+
* @description Method decorator for logging function calls
|
|
642
|
+
* @summary Creates a decorator that logs method calls with specified level, benchmarking, and verbosity
|
|
643
|
+
* @param {LogLevel} level - The log level to use (default: LogLevel.info)
|
|
644
|
+
* @param {boolean} [benchmark=false] - Whether to log execution time (default: false)
|
|
645
|
+
* @param {number} [verbosity=0] - The verbosity level for the log messages (default: 0)
|
|
646
|
+
* @return {Function} A method decorator that wraps the original method with logging
|
|
647
|
+
* @function log
|
|
648
|
+
* @category Decorators
|
|
649
|
+
* @mermaid
|
|
650
|
+
* sequenceDiagram
|
|
651
|
+
* participant Client
|
|
652
|
+
* participant Decorator as log decorator
|
|
653
|
+
* participant Method as Original Method
|
|
654
|
+
* participant Logger as Logging instance
|
|
655
|
+
*
|
|
656
|
+
* Client->>Decorator: call decorated method
|
|
657
|
+
* Decorator->>Logger: log method call
|
|
658
|
+
* Decorator->>Method: call original method
|
|
659
|
+
* alt result is Promise
|
|
660
|
+
* Method-->>Decorator: return Promise
|
|
661
|
+
* Decorator->>Decorator: attach then handler
|
|
662
|
+
* Note over Decorator: Promise resolves
|
|
663
|
+
* Decorator->>Logger: log benchmark (if enabled)
|
|
664
|
+
* Decorator-->>Client: return result
|
|
665
|
+
* else result is not Promise
|
|
666
|
+
* Method-->>Decorator: return result
|
|
667
|
+
* Decorator->>Logger: log benchmark (if enabled)
|
|
668
|
+
* Decorator-->>Client: return result
|
|
669
|
+
* end
|
|
670
|
+
*/
|
|
483
671
|
function log(level = LogLevel.info, benchmark = false, verbosity = 0) {
|
|
484
672
|
return function (target, propertyKey, descriptor) {
|
|
485
673
|
const log = Logging.for(target).for(target[propertyKey]);
|
|
@@ -509,37 +697,64 @@ function log(level = LogLevel.info, benchmark = false, verbosity = 0) {
|
|
|
509
697
|
};
|
|
510
698
|
};
|
|
511
699
|
}
|
|
700
|
+
/**
|
|
701
|
+
* @description Method decorator for logging function calls with debug level
|
|
702
|
+
* @summary Convenience wrapper around the log decorator that uses LogLevel.debug
|
|
703
|
+
* @param {boolean} [benchmark=false] - Whether to log execution time (default: false)
|
|
704
|
+
* @return {Function} A method decorator that wraps the original method with debug logging
|
|
705
|
+
* @function debug
|
|
706
|
+
* @category Decorators
|
|
707
|
+
*/
|
|
512
708
|
function debug(benchmark = false) {
|
|
513
709
|
return log(LogLevel.debug, benchmark);
|
|
514
710
|
}
|
|
711
|
+
/**
|
|
712
|
+
* @description Method decorator for logging function calls with info level
|
|
713
|
+
* @summary Convenience wrapper around the log decorator that uses LogLevel.info
|
|
714
|
+
* @param {boolean} [benchmark=false] - Whether to log execution time (default: false)
|
|
715
|
+
* @return {Function} A method decorator that wraps the original method with info logging
|
|
716
|
+
* @function info
|
|
717
|
+
* @category Decorators
|
|
718
|
+
*/
|
|
515
719
|
function info(benchmark = false) {
|
|
516
720
|
return log(LogLevel.info, benchmark);
|
|
517
721
|
}
|
|
722
|
+
/**
|
|
723
|
+
* @description Method decorator for logging function calls with silly level
|
|
724
|
+
* @summary Convenience wrapper around the log decorator that uses LogLevel.silly
|
|
725
|
+
* @param {boolean} [benchmark=false] - Whether to log execution time (default: false)
|
|
726
|
+
* @return {Function} A method decorator that wraps the original method with silly logging
|
|
727
|
+
* @function silly
|
|
728
|
+
* @category Decorators
|
|
729
|
+
*/
|
|
518
730
|
function silly(benchmark = false) {
|
|
519
731
|
return log(LogLevel.silly, benchmark);
|
|
520
732
|
}
|
|
733
|
+
/**
|
|
734
|
+
* @description Method decorator for logging function calls with verbose level
|
|
735
|
+
* @summary Convenience wrapper around the log decorator that uses LogLevel.verbose with configurable verbosity
|
|
736
|
+
* @param {number} verbosity - The verbosity level for the log messages (default: 0)
|
|
737
|
+
* @param {boolean} [benchmark=false] - Whether to log execution time (default: false)
|
|
738
|
+
* @return {Function} A method decorator that wraps the original method with verbose logging
|
|
739
|
+
* @function verbose
|
|
740
|
+
* @category Decorators
|
|
741
|
+
*/
|
|
521
742
|
function verbose(verbosity = 0, benchmark = false) {
|
|
522
743
|
return log(LogLevel.verbose, benchmark, verbosity);
|
|
523
744
|
}
|
|
524
745
|
|
|
525
746
|
/**
|
|
526
|
-
* @
|
|
527
|
-
* @
|
|
747
|
+
* @description A logging module for TypeScript applications
|
|
748
|
+
* @summary This module provides a comprehensive logging solution for TypeScript applications. It exports constants, decorators, logging utilities, and type definitions to facilitate structured logging.
|
|
528
749
|
* @module Logging
|
|
529
750
|
*/
|
|
530
751
|
/**
|
|
531
|
-
* @
|
|
532
|
-
* @
|
|
533
|
-
* @namespace Logging
|
|
534
|
-
* @memberOf module:Logging
|
|
535
|
-
*/
|
|
536
|
-
/**
|
|
537
|
-
* @summary stores the current package version
|
|
538
|
-
* @description this is how you should document a constant
|
|
752
|
+
* @description Current package version string
|
|
753
|
+
* @summary Stores the current package version, used for version tracking and compatibility checks
|
|
539
754
|
* @const VERSION
|
|
540
|
-
* @memberOf module:
|
|
755
|
+
* @memberOf module:Logging
|
|
541
756
|
*/
|
|
542
|
-
const VERSION = "0.
|
|
757
|
+
const VERSION = "0.3.0";
|
|
543
758
|
|
|
544
759
|
export { DefaultLoggingConfig, DefaultTheme, LogLevel, Logging, LoggingMode, MiniLogger, NumericLogLevels, VERSION, debug, info, log, silly, verbose };
|
|
545
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2xvZ2dpbmcudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnaW5nQ29uZmlnLCBUaGVtZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW0gZm9yIGxvZyBsZXZlbHMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGRpZmZlcmVudCBsZXZlbHMgb2YgbG9nZ2luZyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICAvKiogRXJyb3IgZXZlbnRzIHRoYXQgYXJlIGxpa2VseSB0byBjYXVzZSBwcm9ibGVtcy4gKi9cbiAgZXJyb3IgPSBcImVycm9yXCIsXG4gIC8qKiBSb3V0aW5lIGluZm9ybWF0aW9uLCBzdWNoIGFzIG9uZ29pbmcgc3RhdHVzIG9yIHBlcmZvcm1hbmNlLiAqL1xuICBpbmZvID0gXCJpbmZvXCIsXG4gIC8qKiBBZGRpdGlvbmFsIHJlbGV2YW50IGluZm9ybWF0aW9uLiAqL1xuICB2ZXJib3NlID0gXCJ2ZXJib3NlXCIsXG4gIC8qKiBEZWJ1ZyBvciB0cmFjZSBpbmZvcm1hdGlvbi4gKi9cbiAgZGVidWcgPSBcImRlYnVnXCIsXG4gIC8qKiB3YXkgdG9vIHZlcmJvc2Ugb3Igc2lsbHkgaW5mb3JtYXRpb24uICovXG4gIHNpbGx5ID0gXCJzaWxseVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBOdW1lcmljIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggbG9nIGxldmVscy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgbnVtZXJpYyByZXByZXNlbnRhdGlvbiBvZiBsb2cgbGV2ZWxzIGZvciBjb21wYXJpc29uIGFuZCBmaWx0ZXJpbmcuXG4gKiBAY29uc3Qge09iamVjdH0gTnVtZXJpY0xvZ0xldmVsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGVycm9yIC0gTnVtZXJpYyB2YWx1ZSBmb3IgZXJyb3IgbGV2ZWwgKDApLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZm8gLSBOdW1lcmljIHZhbHVlIGZvciBpbmZvIGxldmVsICgyKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJib3NlIC0gTnVtZXJpYyB2YWx1ZSBmb3IgdmVyYm9zZSBsZXZlbCAoNCkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZGVidWcgLSBOdW1lcmljIHZhbHVlIGZvciBkZWJ1ZyBsZXZlbCAoNSkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2lsbHkgLSBOdW1lcmljIHZhbHVlIGZvciBzaWxseSBsZXZlbCAoOCkuXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBjb25zdCBOdW1lcmljTG9nTGV2ZWxzID0ge1xuICBlcnJvcjogMixcbiAgaW5mbzogNCxcbiAgdmVyYm9zZTogNixcbiAgZGVidWc6IDcsXG4gIHNpbGx5OiA5LFxufTtcblxuZXhwb3J0IGVudW0gTG9nZ2luZ01vZGUge1xuICBSQVcgPSBcInJhd1wiLFxuICBKU09OID0gXCJqc29uXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgdGhlbWUgZm9yIHN0eWxpbmcgbG9nIG91dHB1dC5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlZmF1bHQgY29sb3IgYW5kIHN0eWxlIHNldHRpbmdzIGZvciB2YXJpb3VzIGNvbXBvbmVudHMgb2YgbG9nIG1lc3NhZ2VzLlxuICogQGNvbnN0IERlZmF1bHRUaGVtZVxuICogQHR5cGVkZWYge1RoZW1lfSBEZWZhdWx0VGhlbWVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjbGFzcyAtIFN0eWxpbmcgZm9yIGNsYXNzIG5hbWVzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNsYXNzLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBjbGFzcyBuYW1lcyAoNCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gaWQgLSBTdHlsaW5nIGZvciBpZGVudGlmaWVycy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpZC5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgaWRlbnRpZmllcnMgKDM2KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBzdGFjayAtIFN0eWxpbmcgZm9yIHN0YWNrIHRyYWNlcyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0aW1lc3RhbXAgLSBTdHlsaW5nIGZvciB0aW1lc3RhbXBzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IG1lc3NhZ2UgLSBTdHlsaW5nIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWVzc2FnZXMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbWVzc2FnZS5lcnJvciAtIFN0eWxpbmcgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1lc3NhZ2UuZXJyb3IuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGVycm9yIG1lc3NhZ2VzICgzNCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbWV0aG9kIC0gU3R5bGluZyBmb3IgbWV0aG9kIG5hbWVzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsIC0gU3R5bGluZyBmb3IgZGlmZmVyZW50IGxvZyBsZXZlbHMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuZXJyb3IgLSBTdHlsaW5nIGZvciBlcnJvciBsZXZlbCBsb2dzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvZ0xldmVsLmVycm9yLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBlcnJvciBsZXZlbCBsb2dzICg2KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC5pbmZvIC0gU3R5bGluZyBmb3IgaW5mbyBsZXZlbCBsb2dzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLnZlcmJvc2UgLSBTdHlsaW5nIGZvciB2ZXJib3NlIGxldmVsIGxvZ3MgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuZGVidWcgLSBTdHlsaW5nIGZvciBkZWJ1ZyBsZXZlbCBsb2dzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvZ0xldmVsLmRlYnVnLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBkZWJ1ZyBsZXZlbCBsb2dzICg3KS5cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRUaGVtZTogVGhlbWUgPSB7XG4gIGNsYXNzOiB7XG4gICAgZmc6IDM0LFxuICB9LFxuICBpZDoge1xuICAgIGZnOiAzNixcbiAgfSxcbiAgc3RhY2s6IHt9LFxuICB0aW1lc3RhbXA6IHt9LFxuICBtZXNzYWdlOiB7XG4gICAgZXJyb3I6IHtcbiAgICAgIGZnOiAzMSxcbiAgICB9LFxuICB9LFxuICBtZXRob2Q6IHt9LFxuICBsb2dMZXZlbDoge1xuICAgIGVycm9yOiB7XG4gICAgICBmZzogMzEsXG4gICAgICBzdHlsZTogW1wiYm9sZFwiXSxcbiAgICB9LFxuICAgIGluZm86IHt9LFxuICAgIHZlcmJvc2U6IHt9LFxuICAgIGRlYnVnOiB7XG4gICAgICBmZzogMzMsXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgbG9nZ2luZy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBsb2dnaW5nIHN5c3RlbSwgaW5jbHVkaW5nIHZlcmJvc2l0eSwgbG9nIGxldmVsLCBzdHlsaW5nLCBhbmQgdGltZXN0YW1wIGZvcm1hdC5cbiAqIEBjb25zdCBEZWZhdWx0TG9nZ2luZ0NvbmZpZ1xuICogQHR5cGVkZWYge0xvZ2dpbmdDb25maWd9IERlZmF1bHRMb2dnaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZSAtIFZlcmJvc2l0eSBsZXZlbCAoMCkuXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsfSBsZXZlbCAtIERlZmF1bHQgbG9nIGxldmVsIChMb2dMZXZlbC5pbmZvKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3R5bGUgLSBXaGV0aGVyIHRvIGFwcGx5IHN0eWxpbmcgdG8gbG9nIG91dHB1dCAoZmFsc2UpLlxuICogQHByb3BlcnR5IHtib29sZWFufSB0aW1lc3RhbXAgLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGltZXN0YW1wcyBpbiBsb2cgbWVzc2FnZXMgKHRydWUpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVzdGFtcEZvcm1hdCAtIEZvcm1hdCBmb3IgdGltZXN0YW1wcyAoXCJISDptbTpzcy5TU1NcIikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNvbnRleHQgLSBXaGV0aGVyIHRvIGluY2x1ZGUgY29udGV4dCBpbmZvcm1hdGlvbiBpbiBsb2cgbWVzc2FnZXMgKHRydWUpLlxuICogQHByb3BlcnR5IHtUaGVtZX0gdGhlbWUgLSBUaGUgdGhlbWUgdG8gdXNlIGZvciBzdHlsaW5nIGxvZyBtZXNzYWdlcyAoRGVmYXVsdFRoZW1lKS5cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRMb2dnaW5nQ29uZmlnOiBMb2dnaW5nQ29uZmlnID0ge1xuICB2ZXJib3NlOiAwLFxuICBsZXZlbDogTG9nTGV2ZWwuaW5mbyxcbiAgbG9nTGV2ZWw6IHRydWUsXG4gIG1vZGU6IExvZ2dpbmdNb2RlLlJBVyxcbiAgc3R5bGU6IGZhbHNlLFxuICBzZXBhcmF0b3I6IFwiIC0gXCIsXG4gIHRpbWVzdGFtcDogdHJ1ZSxcbiAgdGltZXN0YW1wRm9ybWF0OiBcIkhIOm1tOnNzLlNTU1wiLFxuICBjb250ZXh0OiB0cnVlLFxuICB0aGVtZTogRGVmYXVsdFRoZW1lLFxufTtcbiIsImltcG9ydCB7XG4gIExvZ2dlckZhY3RvcnksXG4gIExvZ2dpbmdDb25maWcsXG4gIExvZ2dpbmdDb250ZXh0LFxuICBTdHJpbmdMaWtlLFxuICBUaGVtZSxcbiAgVGhlbWVPcHRpb24sXG4gIFRoZW1lT3B0aW9uQnlMb2dMZXZlbCxcbiAgTG9nZ2VyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29sb3JpemVPcHRpb25zLCBzdHlsZSwgU3R5bGVkU3RyaW5nIH0gZnJvbSBcInN0eWxlZC1zdHJpbmctYnVpbGRlclwiO1xuaW1wb3J0IHtcbiAgRGVmYXVsdExvZ2dpbmdDb25maWcsXG4gIERlZmF1bHRUaGVtZSxcbiAgTG9nTGV2ZWwsXG4gIE51bWVyaWNMb2dMZXZlbHMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIG1pbmltYWwgbG9nZ2VyIGltcGxlbWVudGF0aW9uLlxuICogQHN1bW1hcnkgTWluaUxvZ2dlciBpcyBhIGxpZ2h0d2VpZ2h0IGxvZ2dpbmcgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBWZXJib3NpdHlMb2dnZXIgaW50ZXJmYWNlLlxuICogSXQgcHJvdmlkZXMgYmFzaWMgbG9nZ2luZyBmdW5jdGlvbmFsaXR5IHdpdGggc3VwcG9ydCBmb3IgZGlmZmVyZW50IGxvZyBsZXZlbHMgYW5kIHZlcmJvc2l0eS5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIE1pbmlMb2dnZXIgaW1wbGVtZW50cyBMb2dnZXIge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgTWluaUxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBNaW5pTG9nZ2VyIHdpdGggdGhlIGdpdmVuIGNsYXNzIG5hbWUsIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24sIGFuZCBtZXRob2QgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdXNpbmcgdGhpcyBsb2dnZXIuXG4gICAqIEBwYXJhbSBbY29uZl0gLSBPcHRpb25hbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIEluZm8gbGV2ZWwgYW5kIHZlcmJvc2l0eSAwLlxuICAgKiBAcGFyYW0gW2lkXSAtIE9wdGlvbmFsIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNvbnRleHQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgY29uZj86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz5cbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBjb25maWcoXG4gICAga2V5OiBrZXlvZiBMb2dnaW5nQ29uZmlnXG4gICk6IExvZ2dpbmdDb25maWdba2V5b2YgTG9nZ2luZ0NvbmZpZ10ge1xuICAgIGlmICh0aGlzLmNvbmYgJiYga2V5IGluIHRoaXMuY29uZikgcmV0dXJuIHRoaXMuY29uZltrZXldO1xuICAgIHJldHVybiBMb2dnaW5nLmdldENvbmZpZygpW2tleV07XG4gIH1cblxuICBmb3IoXG4gICAgbWV0aG9kPzogc3RyaW5nIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSxcbiAgICBjb25maWc/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IExvZ2dlciB7XG4gICAgbWV0aG9kID0gbWV0aG9kXG4gICAgICA/IHR5cGVvZiBtZXRob2QgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBtZXRob2RcbiAgICAgICAgOiBtZXRob2QubmFtZVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gTG9nZ2luZy5mb3IoW3RoaXMuY29udGV4dCwgbWV0aG9kXS5qb2luKFwiLlwiKSwgY29uZmlnLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGZvcm1hdHRlZCBsb2cgc3RyaW5nLlxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBsb2cgc3RyaW5nIHdpdGggdGltZXN0YW1wLCBjb2xvcmVkIGxvZyBsZXZlbCwgYW5kIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSBsZXZlbCAtIFRoZSBsb2cgbGV2ZWwgYXMgYSBzdHJpbmcuXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqIEBwYXJhbSBzdGFja1xuICAgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvZyBzdHJpbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlTG9nKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICBtZXNzYWdlOiBTdHJpbmdMaWtlIHwgRXJyb3IsXG4gICAgc3RhY2s/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBsb2c6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLmNvbmZpZyhcInN0eWxlXCIpO1xuICAgIGlmICh0aGlzLmNvbmZpZyhcInRpbWVzdGFtcFwiKSkge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHN0eWxlID8gTG9nZ2luZy50aGVtZShkYXRlLCBcInRpbWVzdGFtcFwiLCBsZXZlbCkgOiBkYXRlO1xuICAgICAgbG9nLnB1c2godGltZXN0YW1wKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcoXCJsb2dMZXZlbFwiKSkge1xuICAgICAgY29uc3QgbHZsOiBzdHJpbmcgPSBzdHlsZVxuICAgICAgICA/IExvZ2dpbmcudGhlbWUobGV2ZWwsIFwibG9nTGV2ZWxcIiwgbGV2ZWwpXG4gICAgICAgIDogbGV2ZWw7XG4gICAgICBsb2cucHVzaChsdmwpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZyhcImNvbnRleHRcIikpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQ6IHN0cmluZyA9IHN0eWxlXG4gICAgICAgID8gTG9nZ2luZy50aGVtZSh0aGlzLmNvbnRleHQsIFwiY2xhc3NcIiwgbGV2ZWwpXG4gICAgICAgIDogdGhpcy5jb250ZXh0O1xuICAgICAgbG9nLnB1c2goY29udGV4dCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwiY29ycmVsYXRpb25JZFwiKSkge1xuICAgICAge1xuICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgICA/IExvZ2dpbmcudGhlbWUodGhpcy5jb25maWcoXCJjb3JyZWxhdGlvbklkXCIpIS50b1N0cmluZygpLCBcImlkXCIsIGxldmVsKVxuICAgICAgICAgIDogdGhpcy5jb25maWcoXCJjb3JyZWxhdGlvbklkXCIpIS50b1N0cmluZygpO1xuICAgICAgICBsb2cucHVzaChpZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbXNnOiBzdHJpbmcgPSBzdHlsZVxuICAgICAgPyBMb2dnaW5nLnRoZW1lKFxuICAgICAgICAgIHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiID8gbWVzc2FnZSA6IChtZXNzYWdlIGFzIEVycm9yKS5tZXNzYWdlLFxuICAgICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICAgIGxldmVsXG4gICAgICAgIClcbiAgICAgIDogdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBtZXNzYWdlXG4gICAgICAgIDogKG1lc3NhZ2UgYXMgRXJyb3IpLm1lc3NhZ2U7XG4gICAgbG9nLnB1c2gobXNnKTtcbiAgICBpZiAoc3RhY2sgfHwgbWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBzdGFjayA9IHN0eWxlXG4gICAgICAgID8gTG9nZ2luZy50aGVtZShcbiAgICAgICAgICAgIChzdGFjayB8fCAobWVzc2FnZSBhcyBFcnJvcikuc3RhY2spIGFzIHN0cmluZyxcbiAgICAgICAgICAgIFwic3RhY2tcIixcbiAgICAgICAgICAgIGxldmVsXG4gICAgICAgICAgKVxuICAgICAgICA6IHN0YWNrO1xuICAgICAgbG9nLnB1c2goYFxcblN0YWNrIHRyYWNlOlxcbiR7c3RhY2t9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvZy5qb2luKHRoaXMuY29uZmlnKFwic2VwYXJhdG9yXCIpIGFzIHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIHdpdGggdGhlIHNwZWNpZmllZCBsb2cgbGV2ZWwuXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBpZiB0aGUgbWVzc2FnZSBzaG91bGQgYmUgbG9nZ2VkIGJhc2VkIG9uIHRoZSBjdXJyZW50IGxvZyBsZXZlbCxcbiAgICogdGhlbiB1c2VzIHRoZSBhcHByb3ByaWF0ZSBjb25zb2xlIG1ldGhvZCB0byBvdXRwdXQgdGhlIGxvZy5cbiAgICpcbiAgICogQHBhcmFtIGxldmVsIC0gVGhlIGxvZyBsZXZlbCBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIHN0YWNrXG4gICAqL1xuICBwcm90ZWN0ZWQgbG9nKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICBtc2c6IFN0cmluZ0xpa2UgfCBFcnJvcixcbiAgICBzdGFjaz86IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBOdW1lcmljTG9nTGV2ZWxzW3RoaXMuY29uZmlnKFwibGV2ZWxcIikgYXMgTG9nTGV2ZWxdIDxcbiAgICAgIE51bWVyaWNMb2dMZXZlbHNbbGV2ZWxdXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGxldCBtZXRob2Q7XG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSBMb2dMZXZlbC5pbmZvOlxuICAgICAgICBtZXRob2QgPSBjb25zb2xlLmxvZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLnZlcmJvc2U6XG4gICAgICBjYXNlIExvZ0xldmVsLmRlYnVnOlxuICAgICAgICBtZXRob2QgPSBjb25zb2xlLmRlYnVnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwuZXJyb3I6XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsb2cgbGV2ZWxcIik7XG4gICAgfVxuICAgIG1ldGhvZCh0aGlzLmNyZWF0ZUxvZyhsZXZlbCwgbXNnLCBzdGFjaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMTG9ncyBhIGB3YXkgdG9vIHZlcmJvc2VgIG9yIGEgc2lsbHkgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIFNpbGx5IGxldmVsIGlmIHRoZSBjdXJyZW50IHZlcmJvc2l0eSBhbGxvd3MgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChkZWZhdWx0OiAwKS5cbiAgICovXG4gIHNpbGx5KG1zZzogU3RyaW5nTGlrZSwgdmVyYm9zaXR5OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgaWYgKCh0aGlzLmNvbmZpZyhcInZlcmJvc2VcIikgYXMgbnVtYmVyKSA+PSB2ZXJib3NpdHkpXG4gICAgICB0aGlzLmxvZyhMb2dMZXZlbC52ZXJib3NlLCBtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgdmVyYm9zZSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgVmVyYm9zZSBsZXZlbCBpZiB0aGUgY3VycmVudCB2ZXJib3NpdHkgYWxsb3dzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gdmVyYm9zaXR5IC0gVGhlIHZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoZGVmYXVsdDogMCkuXG4gICAqL1xuICB2ZXJib3NlKG1zZzogU3RyaW5nTGlrZSwgdmVyYm9zaXR5OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgaWYgKCh0aGlzLmNvbmZpZyhcInZlcmJvc2VcIikgYXMgbnVtYmVyKSA+PSB2ZXJib3NpdHkpXG4gICAgICB0aGlzLmxvZyhMb2dMZXZlbC52ZXJib3NlLCBtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGFuIGluZm8gbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIEluZm8gbGV2ZWwuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBpbmZvKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLmluZm8sIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBkZWJ1ZyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgRGVidWcgbGV2ZWwuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBkZWJ1Zyhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICB0aGlzLmxvZyhMb2dMZXZlbC5kZWJ1ZywgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBlcnJvciBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgRXJyb3IgbGV2ZWwuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBlcnJvcihtc2c6IFN0cmluZ0xpa2UgfCBFcnJvcik6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLmVycm9yLCBtc2cpO1xuICB9XG5cbiAgc2V0Q29uZmlnKGNvbmZpZzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPikge1xuICAgIHRoaXMuY29uZiA9IHsgLi4uKHRoaXMuY29uZiB8fCB7fSksIC4uLmNvbmZpZyB9O1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgc3RhdGljIGNsYXNzIGZvciBtYW5hZ2luZyBsb2dnaW5nIG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBUaGUgTG9nZ2luZyBjbGFzcyBwcm92aWRlcyBhIGNlbnRyYWxpemVkIGxvZ2dpbmcgbWVjaGFuaXNtIHdpdGggc3VwcG9ydCBmb3JcbiAqIGRpZmZlcmVudCBsb2cgbGV2ZWxzIGFuZCB2ZXJib3NpdHkuIEl0IHVzZXMgYSBzaW5nbGV0b24gcGF0dGVybiB0byBtYWludGFpbiBhIGdsb2JhbFxuICogbG9nZ2VyIGluc3RhbmNlIGFuZCBhbGxvd3MgY3JlYXRpbmcgc3BlY2lmaWMgbG9nZ2VycyBmb3IgZGlmZmVyZW50IGNsYXNzZXMgYW5kIG1ldGhvZHMuXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnaW5nIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgQSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgVmVyYm9zaXR5TG9nZ2VyIHVzZWQgZm9yIGdsb2JhbCBsb2dnaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2xvYmFsPzogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgbG9nZ2VyIGluc3RhbmNlcy5cbiAgICogQHN1bW1hcnkgQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgbmV3IFZlcmJvc2l0eUxvZ2dlciBpbnN0YW5jZXMuIEJ5IGRlZmF1bHQsIGl0IGNyZWF0ZXMgYSBNaW5pTG9nZ2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2ZhY3Rvcnk6IExvZ2dlckZhY3RvcnkgPSAoXG4gICAgb2JqZWN0OiBzdHJpbmcsXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPlxuICApID0+IHtcbiAgICByZXR1cm4gbmV3IE1pbmlMb2dnZXIob2JqZWN0LCBjb25maWcpO1xuICB9O1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBsb2dnaW5nIHN5c3RlbS5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBnbG9iYWwgdmVyYm9zaXR5IGxldmVsIGFuZCBsb2cgbGV2ZWwgc2V0dGluZ3MuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfY29uZmlnOiBMb2dnaW5nQ29uZmlnID0gRGVmYXVsdExvZ2dpbmdDb25maWc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgaW5zdGFudGlhdGlvbi5cbiAgICogQHN1bW1hcnkgRW5zdXJlcyB0aGF0IHRoZSBMb2dnaW5nIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYXMgaXQncyBkZXNpZ25lZCB0byBiZSB1c2VkIHN0YXRpY2FsbHkuXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGF0aWMgc2V0RmFjdG9yeShmYWN0b3J5OiBMb2dnZXJGYWN0b3J5KSB7XG4gICAgTG9nZ2luZy5fZmFjdG9yeSA9IGZhY3Rvcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHRlciBmb3IgdGhlIGxvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHN1bW1hcnkgQWxsb3dzIHVwZGF0aW5nIHRoZSBnbG9iYWwgbG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdmVyYm9zaXR5IGFuZCBsb2cgbGV2ZWwgc2V0dGluZ3MuXG4gICAqL1xuICBzdGF0aWMgc2V0Q29uZmlnKGNvbmZpZzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPikge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5fY29uZmlnLCBjb25maWcpO1xuICB9XG5cbiAgc3RhdGljIGdldENvbmZpZygpOiBMb2dnaW5nQ29uZmlnIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9yIGNyZWF0ZXMgdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGV4aXN0aW5nIGdsb2JhbCBsb2dnZXIgb3IgY3JlYXRlcyBhIG5ldyBvbmUgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICpcbiAgICogQHJldHVybiBUaGUgZ2xvYmFsIFZlcmJvc2l0eUxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBnZXQoKTogTG9nZ2VyIHtcbiAgICB0aGlzLmdsb2JhbCA9IHRoaXMuZ2xvYmFsID8gdGhpcy5nbG9iYWwgOiB0aGlzLl9mYWN0b3J5KFwiTG9nZ2luZ1wiKTtcbiAgICByZXR1cm4gdGhpcy5nbG9iYWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSB2ZXJib3NlIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgdmVyYm9zZSBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gdmVyYm9zaXR5IC0gVGhlIHZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoZGVmYXVsdDogMCkuXG4gICAqL1xuICBzdGF0aWMgdmVyYm9zZShtc2c6IFN0cmluZ0xpa2UsIHZlcmJvc2l0eTogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLnZlcmJvc2UobXNnLCB2ZXJib3NpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGFuIGluZm8gbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBpbmZvIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBzdGF0aWMgaW5mbyhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS5pbmZvKG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBkZWJ1ZyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGRlYnVnIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBzdGF0aWMgZGVidWcobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuZGVidWcobXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIHNpbGx5IG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgZGVidWcgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBzaWxseShtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS5zaWxseShtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgZXJyb3IgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBlcnJvcihtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS5lcnJvcihtc2cpO1xuICB9XG5cbiAgc3RhdGljIGZvcihcbiAgICBvYmplY3Q6IExvZ2dpbmdDb250ZXh0LFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogTG9nZ2VyIHtcbiAgICBvYmplY3QgPVxuICAgICAgdHlwZW9mIG9iamVjdCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IG9iamVjdC5jb25zdHJ1Y3RvclxuICAgICAgICAgID8gb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgICA6IG9iamVjdC5uYW1lO1xuICAgIHJldHVybiB0aGlzLl9mYWN0b3J5KG9iamVjdCwgY29uZmlnLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGxvZ2dlciBmb3IgYSBzcGVjaWZpYyByZWFzb24gb3IgY29udGV4dC5cbiAgICpcbiAgICogQHN1bW1hcnkgVGhpcyBzdGF0aWMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgbG9nZ2VyIGluc3RhbmNlIHVzaW5nIHRoZSBmYWN0b3J5IGZ1bmN0aW9uLFxuICAgKiBiYXNlZCBvbiBhIGdpdmVuIHJlYXNvbiBvciBjb250ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0gcmVhc29uIC0gQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcmVhc29uIG9yIGNvbnRleHQgZm9yIGNyZWF0aW5nIHRoaXMgbG9nZ2VyLlxuICAgKiBAcGFyYW0gaWRcbiAgICogQHJldHVybnMgQSBuZXcgVmVyYm9zaXR5TG9nZ2VyIG9yIENsYXNzTG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGJlY2F1c2UocmVhc29uOiBzdHJpbmcsIGlkPzogc3RyaW5nKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gdGhpcy5fZmFjdG9yeShyZWFzb24sIHRoaXMuX2NvbmZpZywgaWQpO1xuICB9XG5cbiAgc3RhdGljIHRoZW1lKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB0eXBlOiBrZXlvZiBUaGVtZSB8IGtleW9mIExvZ0xldmVsLFxuICAgIGxvZ2dlckxldmVsOiBMb2dMZXZlbCxcbiAgICB0ZW1wbGF0ZTogVGhlbWUgPSBEZWZhdWx0VGhlbWVcbiAgKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuc3R5bGUpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZ2V0KCkuZm9yKHRoaXMudGhlbWUpO1xuXG4gICAgZnVuY3Rpb24gYXBwbHkoXG4gICAgICB0eHQ6IHN0cmluZyxcbiAgICAgIG9wdGlvbjoga2V5b2YgVGhlbWVPcHRpb24sXG4gICAgICB2YWx1ZTogbnVtYmVyIHwgW251bWJlcl0gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudW1iZXJbXSB8IHN0cmluZ1tdXG4gICAgKTogc3RyaW5nIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQ6IHN0cmluZyB8IFN0eWxlZFN0cmluZyA9IHR4dDtcbiAgICAgICAgbGV0IGMgPSBzdHlsZSh0KTtcblxuICAgICAgICBmdW5jdGlvbiBhcHBseUNvbG9yKFxuICAgICAgICAgIHZhbDogbnVtYmVyIHwgW251bWJlcl0gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgaXNCZyA9IGZhbHNlXG4gICAgICAgICk6IFN0eWxlZFN0cmluZyB7XG4gICAgICAgICAgbGV0IGY6XG4gICAgICAgICAgICB8IHR5cGVvZiBjLmJhY2tncm91bmRcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuZm9yZWdyb3VuZFxuICAgICAgICAgICAgfCB0eXBlb2YgYy5yZ2JcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuY29sb3IyNTYgPSBpc0JnID8gYy5iYWNrZ3JvdW5kIDogYy5mb3JlZ3JvdW5kO1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gKGYgYXMgdHlwZW9mIGMuYmFja2dyb3VuZCB8IHR5cGVvZiBjLmZvcmVncm91bmQpLmNhbGwoXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICAgIHZhbHVlIGFzIG51bWJlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3dpdGNoICh2YWwubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIGYgPSBpc0JnID8gYy5iZ0NvbG9yMjU2IDogYy5jb2xvcjI1NjtcbiAgICAgICAgICAgICAgcmV0dXJuIChmIGFzIHR5cGVvZiBjLmJnQ29sb3IyNTYgfCB0eXBlb2YgYy5jb2xvcjI1NikodmFsWzBdKTtcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgZiA9IGlzQmcgPyBjLmJnUmdiIDogYy5yZ2I7XG4gICAgICAgICAgICAgIHJldHVybiBjLnJnYih2YWxbMF0sIHZhbFsxXSwgdmFsWzJdKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90IGEgdmFsaWQgY29sb3Igb3B0aW9uOiAke29wdGlvbn1gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlKHQgYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhcHBseVN0eWxlKHY6IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgYyA9IGMuc3R5bGUodik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMgPSBjW3YgYXMga2V5b2YgQ29sb3JpemVPcHRpb25zXSBhcyBTdHlsZWRTdHJpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICBjYXNlIFwiYmdcIjpcbiAgICAgICAgICBjYXNlIFwiZmdcIjpcbiAgICAgICAgICAgIHJldHVybiBhcHBseUNvbG9yKHZhbHVlIGFzIG51bWJlcikudGV4dDtcbiAgICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGFwcGx5U3R5bGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXBwbHlTdHlsZSh2YWx1ZSBhcyBudW1iZXIgfCBzdHJpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGMudGV4dDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3QgYSB2YWxpZCB0aGVtZSBvcHRpb246ICR7b3B0aW9ufWApO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGFwcGx5aW5nIHN0eWxlOiAke29wdGlvbn0gd2l0aCB2YWx1ZSAke3ZhbHVlfWApO1xuICAgICAgICByZXR1cm4gdHh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluZGl2aWR1YWxUaGVtZSA9IHRlbXBsYXRlW3R5cGUgYXMga2V5b2YgVGhlbWVdO1xuICAgIGlmICghaW5kaXZpZHVhbFRoZW1lIHx8ICFPYmplY3Qua2V5cyhpbmRpdmlkdWFsVGhlbWUpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgbGV0IGFjdHVhbFRoZW1lOiBUaGVtZU9wdGlvbiA9IGluZGl2aWR1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbjtcblxuICAgIGNvbnN0IGxvZ0xldmVscyA9IE9iamVjdC5hc3NpZ24oe30sIExvZ0xldmVsKTtcbiAgICBpZiAoT2JqZWN0LmtleXMoaW5kaXZpZHVhbFRoZW1lKVswXSBpbiBsb2dMZXZlbHMpXG4gICAgICBhY3R1YWxUaGVtZSA9XG4gICAgICAgIChpbmRpdmlkdWFsVGhlbWUgYXMgVGhlbWVPcHRpb25CeUxvZ0xldmVsKVtsb2dnZXJMZXZlbF0gfHwge307XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYWN0dWFsVGhlbWUpLnJlZHVjZSgoYWNjOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAoYWN0dWFsVGhlbWUgYXMgVGhlbWVPcHRpb24pW2tleSBhcyBrZXlvZiBUaGVtZU9wdGlvbl07XG4gICAgICBpZiAodmFsKVxuICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgYWNjLFxuICAgICAgICAgIGtleSBhcyBrZXlvZiBUaGVtZU9wdGlvbixcbiAgICAgICAgICB2YWwgYXNcbiAgICAgICAgICAgIHwgbnVtYmVyXG4gICAgICAgICAgICB8IFtudW1iZXJdXG4gICAgICAgICAgICB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXVxuICAgICAgICAgICAgfCBudW1iZXJbXVxuICAgICAgICAgICAgfCBzdHJpbmdbXVxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0ZXh0KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiLi9sb2dnaW5nXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2coXG4gIGxldmVsOiBMb2dMZXZlbCA9IExvZ0xldmVsLmluZm8sXG4gIGJlbmNobWFyazogYm9vbGVhbiA9IGZhbHNlLFxuICB2ZXJib3NpdHkgPSAwXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0YXJnZXQpLmZvcih0YXJnZXRbcHJvcGVydHlLZXldKTtcbiAgICBjb25zdCBtZXRob2QgPSBsb2dbbGV2ZWxdLmJpbmQobG9nKTtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgbWV0aG9kKGBjYWxsZWQgd2l0aCAke2FyZ3N9YCwgdmVyYm9zaXR5KTtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGxldCBlbmQ6IG51bWJlcjtcbiAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHIpID0+IHtcbiAgICAgICAgICBpZiAoYmVuY2htYXJrKSB7XG4gICAgICAgICAgICBlbmQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgaWYgKGJlbmNobWFyaykgbWV0aG9kKGBjb21wbGV0ZWQgaW4gJHtlbmQgLSBzdGFydH1tc2AsIHZlcmJvc2l0eSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChiZW5jaG1hcmspIHtcbiAgICAgICAgZW5kID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGJlbmNobWFyaykgbWV0aG9kKGBjb21wbGV0ZWQgaW4gJHtlbmQgLSBzdGFydH1tc2AsIHZlcmJvc2l0eSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnKGJlbmNobWFyazogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIHJldHVybiBsb2coTG9nTGV2ZWwuZGVidWcsIGJlbmNobWFyayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmZvKGJlbmNobWFyazogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIHJldHVybiBsb2coTG9nTGV2ZWwuaW5mbywgYmVuY2htYXJrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpbGx5KGJlbmNobWFyazogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIHJldHVybiBsb2coTG9nTGV2ZWwuc2lsbHksIGJlbmNobWFyayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZXJib3NlKHZlcmJvc2l0eSA9IDAsIGJlbmNobWFyazogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIHJldHVybiBsb2coTG9nTGV2ZWwudmVyYm9zZSwgYmVuY2htYXJrLCB2ZXJib3NpdHkpO1xufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb2dnaW5nXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IE1vZHVsZSBzdW1tYXJ5XG4gKiBAZGVzY3JpcHRpb24gTW9kdWxlIGRlc2NyaXB0aW9uXG4gKiBAbW9kdWxlIExvZ2dpbmdcbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IExvZ2dpbmdcbiAqIEBkZXNjcmlwdGlvbiBOYW1lc3BhY2UgZGVzY3JpcHRpb25cbiAqIEBuYW1lc3BhY2UgTG9nZ2luZ1xuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cblxuLyoqXG4gKiBAc3VtbWFyeSBzdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uXG4gKiBAZGVzY3JpcHRpb24gdGhpcyBpcyBob3cgeW91IHNob3VsZCBkb2N1bWVudCBhIGNvbnN0YW50XG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTp0cy13b3Jrc3BhY2VcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7QUFLRztJQUNTO0FBQVosQ0FBQSxVQUFZLFFBQVEsRUFBQTs7QUFFbEIsSUFBQSxRQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTs7QUFFZixJQUFBLFFBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFhOztBQUViLElBQUEsUUFBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1COztBQUVuQixJQUFBLFFBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztBQUVmLElBQUEsUUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7QUFDakIsQ0FBQyxFQVhXLFFBQVEsS0FBUixRQUFRLEdBV25CLEVBQUEsQ0FBQSxDQUFBO0FBRUQ7Ozs7Ozs7Ozs7QUFVRztBQUNVLE1BQUEsZ0JBQWdCLEdBQUc7QUFDOUIsSUFBQSxLQUFLLEVBQUUsQ0FBQztBQUNSLElBQUEsSUFBSSxFQUFFLENBQUM7QUFDUCxJQUFBLE9BQU8sRUFBRSxDQUFDO0FBQ1YsSUFBQSxLQUFLLEVBQUUsQ0FBQztBQUNSLElBQUEsS0FBSyxFQUFFLENBQUM7O0lBR0U7QUFBWixDQUFBLFVBQVksV0FBVyxFQUFBO0FBQ3JCLElBQUEsV0FBQSxDQUFBLEtBQUEsQ0FBQSxHQUFBLEtBQVc7QUFDWCxJQUFBLFdBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFhO0FBQ2YsQ0FBQyxFQUhXLFdBQVcsS0FBWCxXQUFXLEdBR3RCLEVBQUEsQ0FBQSxDQUFBO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJHO0FBQ1UsTUFBQSxZQUFZLEdBQVU7QUFDakMsSUFBQSxLQUFLLEVBQUU7QUFDTCxRQUFBLEVBQUUsRUFB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
|
|
760
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2xvZ2dpbmcudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnaW5nQ29uZmlnLCBUaGVtZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW0gZm9yIGxvZyBsZXZlbHMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGRpZmZlcmVudCBsZXZlbHMgb2YgbG9nZ2luZyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZW51bSBMb2dMZXZlbCB7XG4gIC8qKiBFcnJvciBldmVudHMgdGhhdCBhcmUgbGlrZWx5IHRvIGNhdXNlIHByb2JsZW1zLiAqL1xuICBlcnJvciA9IFwiZXJyb3JcIixcbiAgLyoqIFJvdXRpbmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgb25nb2luZyBzdGF0dXMgb3IgcGVyZm9ybWFuY2UuICovXG4gIGluZm8gPSBcImluZm9cIixcbiAgLyoqIEFkZGl0aW9uYWwgcmVsZXZhbnQgaW5mb3JtYXRpb24uICovXG4gIHZlcmJvc2UgPSBcInZlcmJvc2VcIixcbiAgLyoqIERlYnVnIG9yIHRyYWNlIGluZm9ybWF0aW9uLiAqL1xuICBkZWJ1ZyA9IFwiZGVidWdcIixcbiAgLyoqIHdheSB0b28gdmVyYm9zZSBvciBzaWxseSBpbmZvcm1hdGlvbi4gKi9cbiAgc2lsbHkgPSBcInNpbGx5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE51bWVyaWMgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBsb2cgbGV2ZWxzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBudW1lcmljIHJlcHJlc2VudGF0aW9uIG9mIGxvZyBsZXZlbHMgZm9yIGNvbXBhcmlzb24gYW5kIGZpbHRlcmluZy5cbiAqIEBjb25zdCBOdW1lcmljTG9nTGV2ZWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gZXJyb3IgLSBOdW1lcmljIHZhbHVlIGZvciBlcnJvciBsZXZlbCAoMikuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5mbyAtIE51bWVyaWMgdmFsdWUgZm9yIGluZm8gbGV2ZWwgKDQpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcmJvc2UgLSBOdW1lcmljIHZhbHVlIGZvciB2ZXJib3NlIGxldmVsICg2KS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkZWJ1ZyAtIE51bWVyaWMgdmFsdWUgZm9yIGRlYnVnIGxldmVsICg3KS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaWxseSAtIE51bWVyaWMgdmFsdWUgZm9yIHNpbGx5IGxldmVsICg5KS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgY29uc3QgTnVtZXJpY0xvZ0xldmVscyA9IHtcbiAgZXJyb3I6IDIsXG4gIGluZm86IDQsXG4gIHZlcmJvc2U6IDYsXG4gIGRlYnVnOiA3LFxuICBzaWxseTogOSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW0gZm9yIGxvZ2dpbmcgb3V0cHV0IG1vZGVzLlxuICogQHN1bW1hcnkgRGVmaW5lcyBkaWZmZXJlbnQgb3V0cHV0IGZvcm1hdHMgZm9yIGxvZyBtZXNzYWdlcy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGVudW0gTG9nZ2luZ01vZGUge1xuICAvKiogUmF3IHRleHQgZm9ybWF0IGZvciBodW1hbiByZWFkYWJpbGl0eSAqL1xuICBSQVcgPSBcInJhd1wiLFxuICAvKiogSlNPTiBmb3JtYXQgZm9yIG1hY2hpbmUgcGFyc2luZyAqL1xuICBKU09OID0gXCJqc29uXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgdGhlbWUgZm9yIHN0eWxpbmcgbG9nIG91dHB1dC5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlZmF1bHQgY29sb3IgYW5kIHN0eWxlIHNldHRpbmdzIGZvciB2YXJpb3VzIGNvbXBvbmVudHMgb2YgbG9nIG1lc3NhZ2VzLlxuICogQGNvbnN0IERlZmF1bHRUaGVtZVxuICogQHR5cGVkZWYge1RoZW1lfSBEZWZhdWx0VGhlbWVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjbGFzcyAtIFN0eWxpbmcgZm9yIGNsYXNzIG5hbWVzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNsYXNzLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBjbGFzcyBuYW1lcyAoMzQpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGlkIC0gU3R5bGluZyBmb3IgaWRlbnRpZmllcnMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaWQuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGlkZW50aWZpZXJzICgzNikuXG4gKiBAcHJvcGVydHkge09iamVjdH0gc3RhY2sgLSBTdHlsaW5nIGZvciBzdGFjayB0cmFjZXMgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gdGltZXN0YW1wIC0gU3R5bGluZyBmb3IgdGltZXN0YW1wcyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtZXNzYWdlIC0gU3R5bGluZyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtPYmplY3R9IG1lc3NhZ2UuZXJyb3IgLSBTdHlsaW5nIGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtZXNzYWdlLmVycm9yLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBlcnJvciBtZXNzYWdlcyAoMzEpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IG1ldGhvZCAtIFN0eWxpbmcgZm9yIG1ldGhvZCBuYW1lcyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbCAtIFN0eWxpbmcgZm9yIGRpZmZlcmVudCBsb2cgbGV2ZWxzLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLmVycm9yIC0gU3R5bGluZyBmb3IgZXJyb3IgbGV2ZWwgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsb2dMZXZlbC5lcnJvci5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgZXJyb3IgbGV2ZWwgbG9ncyAoMzEpLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gbG9nTGV2ZWwuZXJyb3Iuc3R5bGUgLSBTdHlsZSBhdHRyaWJ1dGVzIGZvciBlcnJvciBsZXZlbCBsb2dzIChbXCJib2xkXCJdKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC5pbmZvIC0gU3R5bGluZyBmb3IgaW5mbyBsZXZlbCBsb2dzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLnZlcmJvc2UgLSBTdHlsaW5nIGZvciB2ZXJib3NlIGxldmVsIGxvZ3MgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuZGVidWcgLSBTdHlsaW5nIGZvciBkZWJ1ZyBsZXZlbCBsb2dzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvZ0xldmVsLmRlYnVnLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBkZWJ1ZyBsZXZlbCBsb2dzICgzMykuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRUaGVtZTogVGhlbWUgPSB7XG4gIGNsYXNzOiB7XG4gICAgZmc6IDM0LFxuICB9LFxuICBpZDoge1xuICAgIGZnOiAzNixcbiAgfSxcbiAgc3RhY2s6IHt9LFxuICB0aW1lc3RhbXA6IHt9LFxuICBtZXNzYWdlOiB7XG4gICAgZXJyb3I6IHtcbiAgICAgIGZnOiAzMSxcbiAgICB9LFxuICB9LFxuICBtZXRob2Q6IHt9LFxuICBsb2dMZXZlbDoge1xuICAgIGVycm9yOiB7XG4gICAgICBmZzogMzEsXG4gICAgICBzdHlsZTogW1wiYm9sZFwiXSxcbiAgICB9LFxuICAgIGluZm86IHt9LFxuICAgIHZlcmJvc2U6IHt9LFxuICAgIGRlYnVnOiB7XG4gICAgICBmZzogMzMsXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgbG9nZ2luZy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBsb2dnaW5nIHN5c3RlbSwgaW5jbHVkaW5nIHZlcmJvc2l0eSwgbG9nIGxldmVsLCBzdHlsaW5nLCBhbmQgdGltZXN0YW1wIGZvcm1hdC5cbiAqIEBjb25zdCBEZWZhdWx0TG9nZ2luZ0NvbmZpZ1xuICogQHR5cGVkZWYge0xvZ2dpbmdDb25maWd9IERlZmF1bHRMb2dnaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZSAtIFZlcmJvc2l0eSBsZXZlbCAoMCkuXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsfSBsZXZlbCAtIERlZmF1bHQgbG9nIGxldmVsIChMb2dMZXZlbC5pbmZvKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbG9nTGV2ZWwgLSBXaGV0aGVyIHRvIGRpc3BsYXkgbG9nIGxldmVsIGluIG91dHB1dCAodHJ1ZSkuXG4gKiBAcHJvcGVydHkge0xvZ2dpbmdNb2RlfSBtb2RlIC0gT3V0cHV0IGZvcm1hdCBtb2RlIChMb2dnaW5nTW9kZS5SQVcpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBzdHlsZSAtIFdoZXRoZXIgdG8gYXBwbHkgc3R5bGluZyB0byBsb2cgb3V0cHV0IChmYWxzZSkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VwYXJhdG9yIC0gU2VwYXJhdG9yIGJldHdlZW4gbG9nIGNvbXBvbmVudHMgKFwiIC0gXCIpLlxuICogQHByb3BlcnR5IHtib29sZWFufSB0aW1lc3RhbXAgLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGltZXN0YW1wcyBpbiBsb2cgbWVzc2FnZXMgKHRydWUpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVzdGFtcEZvcm1hdCAtIEZvcm1hdCBmb3IgdGltZXN0YW1wcyAoXCJISDptbTpzcy5TU1NcIikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNvbnRleHQgLSBXaGV0aGVyIHRvIGluY2x1ZGUgY29udGV4dCBpbmZvcm1hdGlvbiBpbiBsb2cgbWVzc2FnZXMgKHRydWUpLlxuICogQHByb3BlcnR5IHtUaGVtZX0gdGhlbWUgLSBUaGUgdGhlbWUgdG8gdXNlIGZvciBzdHlsaW5nIGxvZyBtZXNzYWdlcyAoRGVmYXVsdFRoZW1lKS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdExvZ2dpbmdDb25maWc6IExvZ2dpbmdDb25maWcgPSB7XG4gIHZlcmJvc2U6IDAsXG4gIGxldmVsOiBMb2dMZXZlbC5pbmZvLFxuICBsb2dMZXZlbDogdHJ1ZSxcbiAgbW9kZTogTG9nZ2luZ01vZGUuUkFXLFxuICBzdHlsZTogZmFsc2UsXG4gIGNvbnRleHRTZXBhcmF0b3I6IFwiLlwiLFxuICBzZXBhcmF0b3I6IFwiIC0gXCIsXG4gIHRpbWVzdGFtcDogdHJ1ZSxcbiAgdGltZXN0YW1wRm9ybWF0OiBcIkhIOm1tOnNzLlNTU1wiLFxuICBjb250ZXh0OiB0cnVlLFxuICB0aGVtZTogRGVmYXVsdFRoZW1lLFxufTtcbiIsImltcG9ydCB7XG4gIExvZ2dlckZhY3RvcnksXG4gIExvZ2dpbmdDb25maWcsXG4gIExvZ2dpbmdDb250ZXh0LFxuICBTdHJpbmdMaWtlLFxuICBUaGVtZSxcbiAgVGhlbWVPcHRpb24sXG4gIFRoZW1lT3B0aW9uQnlMb2dMZXZlbCxcbiAgTG9nZ2VyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29sb3JpemVPcHRpb25zLCBzdHlsZSwgU3R5bGVkU3RyaW5nIH0gZnJvbSBcInN0eWxlZC1zdHJpbmctYnVpbGRlclwiO1xuaW1wb3J0IHtcbiAgRGVmYXVsdExvZ2dpbmdDb25maWcsXG4gIERlZmF1bHRUaGVtZSxcbiAgTG9nTGV2ZWwsXG4gIE51bWVyaWNMb2dMZXZlbHMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIG1pbmltYWwgbG9nZ2VyIGltcGxlbWVudGF0aW9uLlxuICogQHN1bW1hcnkgTWluaUxvZ2dlciBpcyBhIGxpZ2h0d2VpZ2h0IGxvZ2dpbmcgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBMb2dnZXIgaW50ZXJmYWNlLlxuICogSXQgcHJvdmlkZXMgYmFzaWMgbG9nZ2luZyBmdW5jdGlvbmFsaXR5IHdpdGggc3VwcG9ydCBmb3IgZGlmZmVyZW50IGxvZyBsZXZlbHMsIHZlcmJvc2l0eSxcbiAqIGNvbnRleHQtYXdhcmUgbG9nZ2luZywgYW5kIGN1c3RvbWl6YWJsZSBmb3JtYXR0aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHQgLSBUaGUgY29udGV4dCAodHlwaWNhbGx5IGNsYXNzIG5hbWUpIHRoaXMgbG9nZ2VyIGlzIGFzc29jaWF0ZWQgd2l0aFxuICogQHBhcmFtIHtQYXJ0aWFsPExvZ2dpbmdDb25maWc+fSBjb25mIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSBnbG9iYWwgc2V0dGluZ3NcbiAqIEBjbGFzcyBNaW5pTG9nZ2VyXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgbmV3IGxvZ2dlciBmb3IgYSBjbGFzc1xuICogY29uc3QgbG9nZ2VyID0gbmV3IE1pbmlMb2dnZXIoJ015Q2xhc3MnKTtcbiAqXG4gKiAvLyBMb2cgbWVzc2FnZXMgYXQgZGlmZmVyZW50IGxldmVsc1xuICogbG9nZ2VyLmluZm8oJ1RoaXMgaXMgYW4gaW5mbyBtZXNzYWdlJyk7XG4gKiBsb2dnZXIuZGVidWcoJ1RoaXMgaXMgYSBkZWJ1ZyBtZXNzYWdlJyk7XG4gKiBsb2dnZXIuZXJyb3IoJ1NvbWV0aGluZyB3ZW50IHdyb25nJyk7XG4gKlxuICogLy8gQ3JlYXRlIGEgY2hpbGQgbG9nZ2VyIGZvciBhIHNwZWNpZmljIG1ldGhvZFxuICogY29uc3QgbWV0aG9kTG9nZ2VyID0gbG9nZ2VyLmZvcignbXlNZXRob2QnKTtcbiAqIG1ldGhvZExvZ2dlci52ZXJib3NlKCdEZXRhaWxlZCBpbmZvcm1hdGlvbicsIDIpO1xuICpcbiAqIC8vIExvZyB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9uXG4gKiBsb2dnZXIuZm9yKCdzcGVjaWFsTWV0aG9kJywgeyBzdHlsZTogdHJ1ZSB9KS5pbmZvKCdTdHlsZWQgbWVzc2FnZScpO1xuICovXG5leHBvcnQgY2xhc3MgTWluaUxvZ2dlciBpbXBsZW1lbnRzIExvZ2dlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb250ZXh0OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGNvbmY/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+XG4gICkge31cblxuICBwcm90ZWN0ZWQgY29uZmlnKFxuICAgIGtleToga2V5b2YgTG9nZ2luZ0NvbmZpZ1xuICApOiBMb2dnaW5nQ29uZmlnW2tleW9mIExvZ2dpbmdDb25maWddIHtcbiAgICBpZiAodGhpcy5jb25mICYmIGtleSBpbiB0aGlzLmNvbmYpIHJldHVybiB0aGlzLmNvbmZba2V5XTtcbiAgICByZXR1cm4gTG9nZ2luZy5nZXRDb25maWcoKVtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgY2hpbGQgbG9nZ2VyIGZvciBhIHNwZWNpZmljIG1ldGhvZCBvciBjb250ZXh0XG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBuZXcgbG9nZ2VyIGluc3RhbmNlIHdpdGggdGhlIGN1cnJlbnQgY29udGV4dCBleHRlbmRlZCBieSB0aGUgc3BlY2lmaWVkIG1ldGhvZCBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgRnVuY3Rpb259IG1ldGhvZCAtIFRoZSBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBjcmVhdGUgYSBsb2dnZXIgZm9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxMb2dnaW5nQ29uZmlnPn0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSBzZXR0aW5nc1xuICAgKiBAcGFyYW0gey4uLmFueX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGxvZ2dlciBmYWN0b3J5XG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gQSBuZXcgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIG1ldGhvZFxuICAgKi9cbiAgZm9yKFxuICAgIG1ldGhvZD86IHN0cmluZyB8ICgoLi4uYXJnczogYW55W10pID0+IGFueSksXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPlxuICApOiBMb2dnZXIge1xuICAgIG1ldGhvZCA9IG1ldGhvZFxuICAgICAgPyB0eXBlb2YgbWV0aG9kID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbWV0aG9kXG4gICAgICAgIDogbWV0aG9kLm5hbWVcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQ6ICh0YXJnZXQ6IHR5cGVvZiB0aGlzLCBwOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgIGlmIChwID09PSBcImNvbmZpZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLmNvbmZpZywge1xuICAgICAgICAgICAgZ2V0OiAodGFyZ2V0OiB0eXBlb2YgdGhpcy5jb25maWcsIHA6IHN0cmluZyB8IHN5bWJvbCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIHAgaW4gY29uZmlnKVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdbcCBhcyBrZXlvZiBMb2dnaW5nQ29uZmlnXTtcbiAgICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gXCJjb250ZXh0XCIpIHtcbiAgICAgICAgICByZXR1cm4gW3Jlc3VsdCwgbWV0aG9kXS5qb2luKFwiLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGZvcm1hdHRlZCBsb2cgc3RyaW5nXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIGxvZyBzdHJpbmcgd2l0aCB0aW1lc3RhbXAsIGNvbG9yZWQgbG9nIGxldmVsLCBjb250ZXh0LCBhbmQgbWVzc2FnZVxuICAgKiBAcGFyYW0ge0xvZ0xldmVsfSBsZXZlbCAtIFRoZSBsb2cgbGV2ZWwgZm9yIHRoaXMgbWVzc2FnZVxuICAgKiBAcGFyYW0ge1N0cmluZ0xpa2UgfCBFcnJvcn0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGxvZyBvciBhbiBFcnJvciBvYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdGFja10gLSBPcHRpb25hbCBzdGFjayB0cmFjZSB0byBpbmNsdWRlIGluIHRoZSBsb2dcbiAgICogQHJldHVybiB7c3RyaW5nfSBBIGZvcm1hdHRlZCBsb2cgc3RyaW5nIHdpdGggYWxsIGNvbXBvbmVudHNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVMb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1lc3NhZ2U6IFN0cmluZ0xpa2UgfCBFcnJvcixcbiAgICBzdGFjaz86IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvZzogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuY29uZmlnKFwic3R5bGVcIik7XG4gICAgaWYgKHRoaXMuY29uZmlnKFwidGltZXN0YW1wXCIpKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gc3R5bGUgPyBMb2dnaW5nLnRoZW1lKGRhdGUsIFwidGltZXN0YW1wXCIsIGxldmVsKSA6IGRhdGU7XG4gICAgICBsb2cucHVzaCh0aW1lc3RhbXApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZyhcImxvZ0xldmVsXCIpKSB7XG4gICAgICBjb25zdCBsdmw6IHN0cmluZyA9IHN0eWxlXG4gICAgICAgID8gTG9nZ2luZy50aGVtZShsZXZlbCwgXCJsb2dMZXZlbFwiLCBsZXZlbClcbiAgICAgICAgOiBsZXZlbDtcbiAgICAgIGxvZy5wdXNoKGx2bCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwiY29udGV4dFwiKSkge1xuICAgICAgY29uc3QgY29udGV4dDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKHRoaXMuY29udGV4dCwgXCJjbGFzc1wiLCBsZXZlbClcbiAgICAgICAgOiB0aGlzLmNvbnRleHQ7XG4gICAgICBsb2cucHVzaChjb250ZXh0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcoXCJjb3JyZWxhdGlvbklkXCIpKSB7XG4gICAgICB7XG4gICAgICAgIGNvbnN0IGlkOiBzdHJpbmcgPSBzdHlsZVxuICAgICAgICAgID8gTG9nZ2luZy50aGVtZSh0aGlzLmNvbmZpZyhcImNvcnJlbGF0aW9uSWRcIikhLnRvU3RyaW5nKCksIFwiaWRcIiwgbGV2ZWwpXG4gICAgICAgICAgOiB0aGlzLmNvbmZpZyhcImNvcnJlbGF0aW9uSWRcIikhLnRvU3RyaW5nKCk7XG4gICAgICAgIGxvZy5wdXNoKGlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtc2c6IHN0cmluZyA9IHN0eWxlXG4gICAgICA/IExvZ2dpbmcudGhlbWUoXG4gICAgICAgICAgdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogKG1lc3NhZ2UgYXMgRXJyb3IpLm1lc3NhZ2UsXG4gICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgbGV2ZWxcbiAgICAgICAgKVxuICAgICAgOiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG1lc3NhZ2VcbiAgICAgICAgOiAobWVzc2FnZSBhcyBFcnJvcikubWVzc2FnZTtcbiAgICBsb2cucHVzaChtc2cpO1xuICAgIGlmIChzdGFjayB8fCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHN0YWNrID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKFxuICAgICAgICAgICAgKHN0YWNrIHx8IChtZXNzYWdlIGFzIEVycm9yKS5zdGFjaykgYXMgc3RyaW5nLFxuICAgICAgICAgICAgXCJzdGFja1wiLFxuICAgICAgICAgICAgbGV2ZWxcbiAgICAgICAgICApXG4gICAgICAgIDogc3RhY2s7XG4gICAgICBsb2cucHVzaChgXFxuU3RhY2sgdHJhY2U6XFxuJHtzdGFja31gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9nLmpvaW4odGhpcy5jb25maWcoXCJzZXBhcmF0b3JcIikgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIG1lc3NhZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGxvZyBsZXZlbFxuICAgKiBAc3VtbWFyeSBDaGVja3MgaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGxvZ2dlZCBiYXNlZCBvbiB0aGUgY3VycmVudCBsb2cgbGV2ZWwsXG4gICAqIHRoZW4gdXNlcyB0aGUgYXBwcm9wcmlhdGUgY29uc29sZSBtZXRob2QgdG8gb3V0cHV0IHRoZSBmb3JtYXR0ZWQgbG9nXG4gICAqIEBwYXJhbSB7TG9nTGV2ZWx9IGxldmVsIC0gVGhlIGxvZyBsZXZlbCBvZiB0aGUgbWVzc2FnZVxuICAgKiBAcGFyYW0ge1N0cmluZ0xpa2UgfCBFcnJvcn0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkIG9yIGFuIEVycm9yIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0YWNrXSAtIE9wdGlvbmFsIHN0YWNrIHRyYWNlIHRvIGluY2x1ZGUgaW4gdGhlIGxvZ1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgcHJvdGVjdGVkIGxvZyhcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgbXNnOiBTdHJpbmdMaWtlIHwgRXJyb3IsXG4gICAgc3RhY2s/OiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgTnVtZXJpY0xvZ0xldmVsc1t0aGlzLmNvbmZpZyhcImxldmVsXCIpIGFzIExvZ0xldmVsXSA8XG4gICAgICBOdW1lcmljTG9nTGV2ZWxzW2xldmVsXVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBsZXQgbWV0aG9kO1xuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgTG9nTGV2ZWwuaW5mbzpcbiAgICAgICAgbWV0aG9kID0gY29uc29sZS5sb2c7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb2dMZXZlbC52ZXJib3NlOlxuICAgICAgY2FzZSBMb2dMZXZlbC5kZWJ1ZzpcbiAgICAgICAgbWV0aG9kID0gY29uc29sZS5kZWJ1ZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLmVycm9yOlxuICAgICAgICBtZXRob2QgPSBjb25zb2xlLmVycm9yO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbG9nIGxldmVsXCIpO1xuICAgIH1cbiAgICBtZXRob2QodGhpcy5jcmVhdGVMb2cobGV2ZWwsIG1zZywgc3RhY2spKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIHNpbGx5IGxldmVsXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBzaWxseSBsZXZlbCBpZiB0aGUgY3VycmVudCB2ZXJib3NpdHkgc2V0dGluZyBhbGxvd3MgaXRcbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlfSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt2ZXJib3NpdHk9MF0gLSBUaGUgdmVyYm9zaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzaWxseShtc2c6IFN0cmluZ0xpa2UsIHZlcmJvc2l0eTogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgIGlmICgodGhpcy5jb25maWcoXCJ2ZXJib3NlXCIpIGFzIG51bWJlcikgPj0gdmVyYm9zaXR5KVxuICAgICAgdGhpcy5sb2coTG9nTGV2ZWwudmVyYm9zZSwgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIHZlcmJvc2UgbGV2ZWxcbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIHZlcmJvc2UgbGV2ZWwgaWYgdGhlIGN1cnJlbnQgdmVyYm9zaXR5IHNldHRpbmcgYWxsb3dzIGl0XG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZX0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdmVyYm9zaXR5PTBdIC0gVGhlIHZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgdmVyYm9zZShtc2c6IFN0cmluZ0xpa2UsIHZlcmJvc2l0eTogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgIGlmICgodGhpcy5jb25maWcoXCJ2ZXJib3NlXCIpIGFzIG51bWJlcikgPj0gdmVyYm9zaXR5KVxuICAgICAgdGhpcy5sb2coTG9nTGV2ZWwudmVyYm9zZSwgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIGluZm8gbGV2ZWxcbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIGluZm8gbGV2ZWwgZm9yIGdlbmVyYWwgYXBwbGljYXRpb24gaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlfSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWRcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGluZm8obXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuaW5mbywgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIGRlYnVnIGxldmVsXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBkZWJ1ZyBsZXZlbCBmb3IgZGV0YWlsZWQgdHJvdWJsZXNob290aW5nIGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZX0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBkZWJ1Zyhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICB0aGlzLmxvZyhMb2dMZXZlbC5kZWJ1ZywgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIGVycm9yIGxldmVsXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBlcnJvciBsZXZlbCBmb3IgZXJyb3JzIGFuZCBleGNlcHRpb25zXG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZSB8IEVycm9yfSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQgb3IgYW4gRXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBlcnJvcihtc2c6IFN0cmluZ0xpa2UgfCBFcnJvcik6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLmVycm9yLCBtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIHRoZSBsb2dnZXIgY29uZmlndXJhdGlvblxuICAgKiBAc3VtbWFyeSBNZXJnZXMgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZXhpc3RpbmcgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz59IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gYXBwbHlcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHNldENvbmZpZyhjb25maWc6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbmYgPSB7IC4uLih0aGlzLmNvbmYgfHwge30pLCAuLi5jb25maWcgfTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHN0YXRpYyBjbGFzcyBmb3IgbWFuYWdpbmcgbG9nZ2luZyBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBUaGUgTG9nZ2luZyBjbGFzcyBwcm92aWRlcyBhIGNlbnRyYWxpemVkIGxvZ2dpbmcgbWVjaGFuaXNtIHdpdGggc3VwcG9ydCBmb3JcbiAqIGRpZmZlcmVudCBsb2cgbGV2ZWxzLCB2ZXJib3NpdHksIGFuZCBzdHlsaW5nLiBJdCB1c2VzIGEgc2luZ2xldG9uIHBhdHRlcm4gdG8gbWFpbnRhaW4gYSBnbG9iYWxcbiAqIGxvZ2dlciBpbnN0YW5jZSBhbmQgYWxsb3dzIGNyZWF0aW5nIHNwZWNpZmljIGxvZ2dlcnMgZm9yIGRpZmZlcmVudCBjbGFzc2VzIGFuZCBtZXRob2RzLlxuICogQGNsYXNzIExvZ2dpbmdcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgZ2xvYmFsIGNvbmZpZ3VyYXRpb25cbiAqIExvZ2dpbmcuc2V0Q29uZmlnKHsgbGV2ZWw6IExvZ0xldmVsLmRlYnVnLCBzdHlsZTogdHJ1ZSB9KTtcbiAqXG4gKiAvLyBHZXQgYSBsb2dnZXIgZm9yIGEgc3BlY2lmaWMgY2xhc3NcbiAqIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKCdNeUNsYXNzJyk7XG4gKlxuICogLy8gTG9nIG1lc3NhZ2VzIGF0IGRpZmZlcmVudCBsZXZlbHNcbiAqIGxvZ2dlci5pbmZvKCdBcHBsaWNhdGlvbiBzdGFydGVkJyk7XG4gKiBsb2dnZXIuZGVidWcoJ1Byb2Nlc3NpbmcgZGF0YS4uLicpO1xuICpcbiAqIC8vIExvZyB3aXRoIGNvbnRleHRcbiAqIGNvbnN0IG1ldGhvZExvZ2dlciA9IExvZ2dpbmcuZm9yKCdNeUNsYXNzLm15TWV0aG9kJyk7XG4gKiBtZXRob2RMb2dnZXIudmVyYm9zZSgnRGV0YWlsZWQgb3BlcmF0aW9uIGluZm9ybWF0aW9uJywgMSk7XG4gKlxuICogLy8gTG9nIGVycm9yc1xuICogdHJ5IHtcbiAqICAgLy8gc29tZSBvcGVyYXRpb25cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGxvZ2dlci5lcnJvcihlcnJvcik7XG4gKiB9XG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIExvZ2dlciB7XG4gKiAgICAgPDxpbnRlcmZhY2U+PlxuICogICAgICtmb3IobWV0aG9kLCBjb25maWcsIC4uLmFyZ3MpXG4gKiAgICAgK3NpbGx5KG1zZywgdmVyYm9zaXR5KVxuICogICAgICt2ZXJib3NlKG1zZywgdmVyYm9zaXR5KVxuICogICAgICtpbmZvKG1zZylcbiAqICAgICArZGVidWcobXNnKVxuICogICAgICtlcnJvcihtc2cpXG4gKiAgICAgK3NldENvbmZpZyhjb25maWcpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIExvZ2dpbmcge1xuICogICAgIC1nbG9iYWw6IExvZ2dlclxuICogICAgIC1fZmFjdG9yeTogTG9nZ2VyRmFjdG9yeVxuICogICAgIC1fY29uZmlnOiBMb2dnaW5nQ29uZmlnXG4gKiAgICAgK3NldEZhY3RvcnkoZmFjdG9yeSlcbiAqICAgICArc2V0Q29uZmlnKGNvbmZpZylcbiAqICAgICArZ2V0Q29uZmlnKClcbiAqICAgICArZ2V0KClcbiAqICAgICArdmVyYm9zZShtc2csIHZlcmJvc2l0eSlcbiAqICAgICAraW5mbyhtc2cpXG4gKiAgICAgK2RlYnVnKG1zZylcbiAqICAgICArc2lsbHkobXNnKVxuICogICAgICtlcnJvcihtc2cpXG4gKiAgICAgK2ZvcihvYmplY3QsIGNvbmZpZywgLi4uYXJncylcbiAqICAgICArYmVjYXVzZShyZWFzb24sIGlkKVxuICogICAgICt0aGVtZSh0ZXh0LCB0eXBlLCBsb2dnZXJMZXZlbCwgdGVtcGxhdGUpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE1pbmlMb2dnZXIge1xuICogICAgICtjb25zdHJ1Y3Rvcihjb250ZXh0LCBjb25mPylcbiAqICAgfVxuICpcbiAqICAgTG9nZ2luZyAuLj4gTG9nZ2VyIDogY3JlYXRlc1xuICogICBMb2dnaW5nIC4uPiBNaW5pTG9nZ2VyIDogY3JlYXRlcyBieSBkZWZhdWx0XG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnaW5nIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBBIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBMb2dnZXIgdXNlZCBmb3IgZ2xvYmFsIGxvZ2dpbmdcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdsb2JhbD86IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGxvZ2dlciBpbnN0YW5jZXNcbiAgICogQHN1bW1hcnkgQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgbmV3IExvZ2dlciBpbnN0YW5jZXMuIEJ5IGRlZmF1bHQsIGl0IGNyZWF0ZXMgYSBNaW5pTG9nZ2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2ZhY3Rvcnk6IExvZ2dlckZhY3RvcnkgPSAoXG4gICAgb2JqZWN0OiBzdHJpbmcsXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPlxuICApID0+IHtcbiAgICByZXR1cm4gbmV3IE1pbmlMb2dnZXIob2JqZWN0LCBjb25maWcpO1xuICB9O1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBsb2dnaW5nIHN5c3RlbVxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGdsb2JhbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIHZlcmJvc2l0eSwgbG9nIGxldmVsLCBzdHlsaW5nLCBhbmQgZm9ybWF0dGluZyBzZXR0aW5nc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2NvbmZpZzogTG9nZ2luZ0NvbmZpZyA9IERlZmF1bHRMb2dnaW5nQ29uZmlnO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgZmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgbG9nZ2VyIGluc3RhbmNlc1xuICAgKiBAc3VtbWFyeSBBbGxvd3MgY3VzdG9taXppbmcgaG93IGxvZ2dlciBpbnN0YW5jZXMgYXJlIGNyZWF0ZWRcbiAgICogQHBhcmFtIHtMb2dnZXJGYWN0b3J5fSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgZnVuY3Rpb24gdG8gdXNlIGZvciBjcmVhdGluZyBsb2dnZXJzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0RmFjdG9yeShmYWN0b3J5OiBMb2dnZXJGYWN0b3J5KSB7XG4gICAgTG9nZ2luZy5fZmFjdG9yeSA9IGZhY3Rvcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgdGhlIGdsb2JhbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAgICogQHN1bW1hcnkgQWxsb3dzIHVwZGF0aW5nIHRoZSBnbG9iYWwgbG9nZ2luZyBjb25maWd1cmF0aW9uIHdpdGggbmV3IHNldHRpbmdzXG4gICAqIEBwYXJhbSB7UGFydGlhbDxMb2dnaW5nQ29uZmlnPn0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBhcHBseVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldENvbmZpZyhjb25maWc6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NvbmZpZywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgZ2xvYmFsIGxvZ2dpbmcgY29uZmlndXJhdGlvblxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBnbG9iYWwgbG9nZ2luZyBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm4ge0xvZ2dpbmdDb25maWd9IEEgY29weSBvZiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBzdGF0aWMgZ2V0Q29uZmlnKCk6IExvZ2dpbmdDb25maWcge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3IgY3JlYXRlcyB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2xvYmFsIGxvZ2dlciBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgKlxuICAgKiBAcmV0dXJuIFRoZSBnbG9iYWwgVmVyYm9zaXR5TG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGdldCgpOiBMb2dnZXIge1xuICAgIHRoaXMuZ2xvYmFsID0gdGhpcy5nbG9iYWwgPyB0aGlzLmdsb2JhbCA6IHRoaXMuX2ZhY3RvcnkoXCJMb2dnaW5nXCIpO1xuICAgIHJldHVybiB0aGlzLmdsb2JhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIHZlcmJvc2UgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSB2ZXJib3NlIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChkZWZhdWx0OiAwKS5cbiAgICovXG4gIHN0YXRpYyB2ZXJib3NlKG1zZzogU3RyaW5nTGlrZSwgdmVyYm9zaXR5OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkudmVyYm9zZShtc2csIHZlcmJvc2l0eSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gaW5mbyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGluZm8gbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBpbmZvKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLmluZm8obXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIGRlYnVnIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgZGVidWcgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBkZWJ1Zyhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS5kZWJ1Zyhtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgc2lsbHkgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBkZWJ1ZyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIHNpbGx5KG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLnNpbGx5KG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBlcnJvciBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGVycm9yKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLmVycm9yKG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBsb2dnZXIgZm9yIGEgc3BlY2lmaWMgb2JqZWN0IG9yIGNvbnRleHRcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBsb2dnZXIgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBvYmplY3Qgb3IgY29udGV4dCB1c2luZyB0aGUgZmFjdG9yeSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge0xvZ2dpbmdDb250ZXh0fSBvYmplY3QgLSBUaGUgb2JqZWN0LCBjbGFzcywgb3IgY29udGV4dCB0byBjcmVhdGUgYSBsb2dnZXIgZm9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxMb2dnaW5nQ29uZmlnPn0gW2NvbmZpZ10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIG92ZXJyaWRlIGdsb2JhbCBzZXR0aW5nc1xuICAgKiBAcGFyYW0gey4uLmFueX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGxvZ2dlciBmYWN0b3J5XG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gQSBuZXcgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBvciBjb250ZXh0XG4gICAqL1xuICBzdGF0aWMgZm9yKFxuICAgIG9iamVjdDogTG9nZ2luZ0NvbnRleHQsXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBMb2dnZXIge1xuICAgIG9iamVjdCA9XG4gICAgICB0eXBlb2Ygb2JqZWN0ID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gb2JqZWN0XG4gICAgICAgIDogb2JqZWN0LmNvbnN0cnVjdG9yXG4gICAgICAgICAgPyBvYmplY3QuY29uc3RydWN0b3IubmFtZVxuICAgICAgICAgIDogb2JqZWN0Lm5hbWU7XG4gICAgcmV0dXJuIHRoaXMuX2ZhY3Rvcnkob2JqZWN0LCBjb25maWcsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbG9nZ2VyIGZvciBhIHNwZWNpZmljIHJlYXNvbiBvciBjb250ZXh0LlxuICAgKlxuICAgKiBAc3VtbWFyeSBUaGlzIHN0YXRpYyBtZXRob2QgY3JlYXRlcyBhIG5ldyBsb2dnZXIgaW5zdGFuY2UgdXNpbmcgdGhlIGZhY3RvcnkgZnVuY3Rpb24sXG4gICAqIGJhc2VkIG9uIGEgZ2l2ZW4gcmVhc29uIG9yIGNvbnRleHQuXG4gICAqXG4gICAqIEBwYXJhbSByZWFzb24gLSBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSByZWFzb24gb3IgY29udGV4dCBmb3IgY3JlYXRpbmcgdGhpcyBsb2dnZXIuXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcmV0dXJucyBBIG5ldyBWZXJib3NpdHlMb2dnZXIgb3IgQ2xhc3NMb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgYmVjYXVzZShyZWFzb246IHN0cmluZywgaWQ/OiBzdHJpbmcpOiBMb2dnZXIge1xuICAgIHJldHVybiB0aGlzLl9mYWN0b3J5KHJlYXNvbiwgdGhpcy5fY29uZmlnLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdGhlbWUgc3R5bGluZyB0byB0ZXh0XG4gICAqIEBzdW1tYXJ5IEFwcGxpZXMgc3R5bGluZyAoY29sb3JzLCBmb3JtYXR0aW5nKSB0byB0ZXh0IGJhc2VkIG9uIHRoZSB0aGVtZSBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIHRleHQgdG8gc3R5bGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBlbGVtZW50IHRvIHN0eWxlIChlLmcuLCBcImNsYXNzXCIsIFwibWVzc2FnZVwiLCBcImxvZ0xldmVsXCIpXG4gICAqIEBwYXJhbSB7TG9nTGV2ZWx9IGxvZ2dlckxldmVsIC0gVGhlIGxvZyBsZXZlbCB0byB1c2UgZm9yIHN0eWxpbmdcbiAgICogQHBhcmFtIHtUaGVtZX0gW3RlbXBsYXRlPURlZmF1bHRUaGVtZV0gLSBUaGUgdGhlbWUgdG8gdXNlIGZvciBzdHlsaW5nXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN0eWxlZCB0ZXh0XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFRoZW1lIGFzIExvZ2dpbmcudGhlbWVcbiAgICogICBwYXJ0aWNpcGFudCBBcHBseSBhcyBhcHBseSBmdW5jdGlvblxuICAgKiAgIHBhcnRpY2lwYW50IFN0eWxlIGFzIHN0eWxlZC1zdHJpbmctYnVpbGRlclxuICAgKlxuICAgKiAgIENhbGxlci0+PlRoZW1lOiB0aGVtZSh0ZXh0LCB0eXBlLCBsb2dnZXJMZXZlbClcbiAgICogICBUaGVtZS0+PlRoZW1lOiBDaGVjayBpZiBzdHlsaW5nIGlzIGVuYWJsZWRcbiAgICogICBhbHQgc3R5bGluZyBkaXNhYmxlZFxuICAgKiAgICAgVGhlbWUtLT4+Q2FsbGVyOiByZXR1cm4gb3JpZ2luYWwgdGV4dFxuICAgKiAgIGVsc2Ugc3R5bGluZyBlbmFibGVkXG4gICAqICAgICBUaGVtZS0+PlRoZW1lOiBHZXQgdGhlbWUgZm9yIHR5cGVcbiAgICogICAgIGFsdCB0aGVtZSBub3QgZm91bmRcbiAgICogICAgICAgVGhlbWUtLT4+Q2FsbGVyOiByZXR1cm4gb3JpZ2luYWwgdGV4dFxuICAgKiAgICAgZWxzZSB0aGVtZSBmb3VuZFxuICAgKiAgICAgICBUaGVtZS0+PlRoZW1lOiBEZXRlcm1pbmUgYWN0dWFsIHRoZW1lIGJhc2VkIG9uIGxvZyBsZXZlbFxuICAgKiAgICAgICBUaGVtZS0+PkFwcGx5OiBBcHBseSBlYWNoIHN0eWxlIHByb3BlcnR5XG4gICAqICAgICAgIEFwcGx5LT4+U3R5bGU6IEFwcGx5IGNvbG9ycyBhbmQgZm9ybWF0dGluZ1xuICAgKiAgICAgICBTdHlsZS0tPj5BcHBseTogUmV0dXJuIHN0eWxlZCB0ZXh0XG4gICAqICAgICAgIEFwcGx5LS0+PlRoZW1lOiBSZXR1cm4gc3R5bGVkIHRleHRcbiAgICogICAgICAgVGhlbWUtLT4+Q2FsbGVyOiBSZXR1cm4gZmluYWwgc3R5bGVkIHRleHRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgc3RhdGljIHRoZW1lKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB0eXBlOiBrZXlvZiBUaGVtZSB8IGtleW9mIExvZ0xldmVsLFxuICAgIGxvZ2dlckxldmVsOiBMb2dMZXZlbCxcbiAgICB0ZW1wbGF0ZTogVGhlbWUgPSBEZWZhdWx0VGhlbWVcbiAgKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuc3R5bGUpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZ2V0KCkuZm9yKHRoaXMudGhlbWUpO1xuXG4gICAgZnVuY3Rpb24gYXBwbHkoXG4gICAgICB0eHQ6IHN0cmluZyxcbiAgICAgIG9wdGlvbjoga2V5b2YgVGhlbWVPcHRpb24sXG4gICAgICB2YWx1ZTogbnVtYmVyIHwgW251bWJlcl0gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudW1iZXJbXSB8IHN0cmluZ1tdXG4gICAgKTogc3RyaW5nIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQ6IHN0cmluZyB8IFN0eWxlZFN0cmluZyA9IHR4dDtcbiAgICAgICAgbGV0IGMgPSBzdHlsZSh0KTtcblxuICAgICAgICBmdW5jdGlvbiBhcHBseUNvbG9yKFxuICAgICAgICAgIHZhbDogbnVtYmVyIHwgW251bWJlcl0gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgaXNCZyA9IGZhbHNlXG4gICAgICAgICk6IFN0eWxlZFN0cmluZyB7XG4gICAgICAgICAgbGV0IGY6XG4gICAgICAgICAgICB8IHR5cGVvZiBjLmJhY2tncm91bmRcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuZm9yZWdyb3VuZFxuICAgICAgICAgICAgfCB0eXBlb2YgYy5yZ2JcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuY29sb3IyNTYgPSBpc0JnID8gYy5iYWNrZ3JvdW5kIDogYy5mb3JlZ3JvdW5kO1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gKGYgYXMgdHlwZW9mIGMuYmFja2dyb3VuZCB8IHR5cGVvZiBjLmZvcmVncm91bmQpLmNhbGwoXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICAgIHZhbHVlIGFzIG51bWJlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3dpdGNoICh2YWwubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIGYgPSBpc0JnID8gYy5iZ0NvbG9yMjU2IDogYy5jb2xvcjI1NjtcbiAgICAgICAgICAgICAgcmV0dXJuIChmIGFzIHR5cGVvZiBjLmJnQ29sb3IyNTYgfCB0eXBlb2YgYy5jb2xvcjI1NikodmFsWzBdKTtcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgZiA9IGlzQmcgPyBjLmJnUmdiIDogYy5yZ2I7XG4gICAgICAgICAgICAgIHJldHVybiBjLnJnYih2YWxbMF0sIHZhbFsxXSwgdmFsWzJdKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90IGEgdmFsaWQgY29sb3Igb3B0aW9uOiAke29wdGlvbn1gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlKHQgYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhcHBseVN0eWxlKHY6IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgYyA9IGMuc3R5bGUodik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMgPSBjW3YgYXMga2V5b2YgQ29sb3JpemVPcHRpb25zXSBhcyBTdHlsZWRTdHJpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICBjYXNlIFwiYmdcIjpcbiAgICAgICAgICBjYXNlIFwiZmdcIjpcbiAgICAgICAgICAgIHJldHVybiBhcHBseUNvbG9yKHZhbHVlIGFzIG51bWJlcikudGV4dDtcbiAgICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGFwcGx5U3R5bGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXBwbHlTdHlsZSh2YWx1ZSBhcyBudW1iZXIgfCBzdHJpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGMudGV4dDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3QgYSB2YWxpZCB0aGVtZSBvcHRpb246ICR7b3B0aW9ufWApO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGFwcGx5aW5nIHN0eWxlOiAke29wdGlvbn0gd2l0aCB2YWx1ZSAke3ZhbHVlfWApO1xuICAgICAgICByZXR1cm4gdHh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluZGl2aWR1YWxUaGVtZSA9IHRlbXBsYXRlW3R5cGUgYXMga2V5b2YgVGhlbWVdO1xuICAgIGlmICghaW5kaXZpZHVhbFRoZW1lIHx8ICFPYmplY3Qua2V5cyhpbmRpdmlkdWFsVGhlbWUpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgbGV0IGFjdHVhbFRoZW1lOiBUaGVtZU9wdGlvbiA9IGluZGl2aWR1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbjtcblxuICAgIGNvbnN0IGxvZ0xldmVscyA9IE9iamVjdC5hc3NpZ24oe30sIExvZ0xldmVsKTtcbiAgICBpZiAoT2JqZWN0LmtleXMoaW5kaXZpZHVhbFRoZW1lKVswXSBpbiBsb2dMZXZlbHMpXG4gICAgICBhY3R1YWxUaGVtZSA9XG4gICAgICAgIChpbmRpdmlkdWFsVGhlbWUgYXMgVGhlbWVPcHRpb25CeUxvZ0xldmVsKVtsb2dnZXJMZXZlbF0gfHwge307XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYWN0dWFsVGhlbWUpLnJlZHVjZSgoYWNjOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAoYWN0dWFsVGhlbWUgYXMgVGhlbWVPcHRpb24pW2tleSBhcyBrZXlvZiBUaGVtZU9wdGlvbl07XG4gICAgICBpZiAodmFsKVxuICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgYWNjLFxuICAgICAgICAgIGtleSBhcyBrZXlvZiBUaGVtZU9wdGlvbixcbiAgICAgICAgICB2YWwgYXNcbiAgICAgICAgICAgIHwgbnVtYmVyXG4gICAgICAgICAgICB8IFtudW1iZXJdXG4gICAgICAgICAgICB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXVxuICAgICAgICAgICAgfCBudW1iZXJbXVxuICAgICAgICAgICAgfCBzdHJpbmdbXVxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0ZXh0KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiLi9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBsb2dzIG1ldGhvZCBjYWxscyB3aXRoIHNwZWNpZmllZCBsZXZlbCwgYmVuY2htYXJraW5nLCBhbmQgdmVyYm9zaXR5XG4gKiBAcGFyYW0ge0xvZ0xldmVsfSBsZXZlbCAtIFRoZSBsb2cgbGV2ZWwgdG8gdXNlIChkZWZhdWx0OiBMb2dMZXZlbC5pbmZvKVxuICogQHBhcmFtIHtib29sZWFufSBbYmVuY2htYXJrPWZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIGV4ZWN1dGlvbiB0aW1lIChkZWZhdWx0OiBmYWxzZSlcbiAqIEBwYXJhbSB7bnVtYmVyfSBbdmVyYm9zaXR5PTBdIC0gVGhlIHZlcmJvc2l0eSBsZXZlbCBmb3IgdGhlIGxvZyBtZXNzYWdlcyAoZGVmYXVsdDogMClcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggbG9nZ2luZ1xuICogQGZ1bmN0aW9uIGxvZ1xuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IERlY29yYXRvciBhcyBsb2cgZGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IE1ldGhvZCBhcyBPcmlnaW5hbCBNZXRob2RcbiAqICAgcGFydGljaXBhbnQgTG9nZ2VyIGFzIExvZ2dpbmcgaW5zdGFuY2VcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogY2FsbCBkZWNvcmF0ZWQgbWV0aG9kXG4gKiAgIERlY29yYXRvci0+PkxvZ2dlcjogbG9nIG1ldGhvZCBjYWxsXG4gKiAgIERlY29yYXRvci0+Pk1ldGhvZDogY2FsbCBvcmlnaW5hbCBtZXRob2RcbiAqICAgYWx0IHJlc3VsdCBpcyBQcm9taXNlXG4gKiAgICAgTWV0aG9kLS0+PkRlY29yYXRvcjogcmV0dXJuIFByb21pc2VcbiAqICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IGF0dGFjaCB0aGVuIGhhbmRsZXJcbiAqICAgICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBQcm9taXNlIHJlc29sdmVzXG4gKiAgICAgRGVjb3JhdG9yLT4+TG9nZ2VyOiBsb2cgYmVuY2htYXJrIChpZiBlbmFibGVkKVxuICogICAgIERlY29yYXRvci0tPj5DbGllbnQ6IHJldHVybiByZXN1bHRcbiAqICAgZWxzZSByZXN1bHQgaXMgbm90IFByb21pc2VcbiAqICAgICBNZXRob2QtLT4+RGVjb3JhdG9yOiByZXR1cm4gcmVzdWx0XG4gKiAgICAgRGVjb3JhdG9yLT4+TG9nZ2VyOiBsb2cgYmVuY2htYXJrIChpZiBlbmFibGVkKVxuICogICAgIERlY29yYXRvci0tPj5DbGllbnQ6IHJldHVybiByZXN1bHRcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2coXG4gIGxldmVsOiBMb2dMZXZlbCA9IExvZ0xldmVsLmluZm8sXG4gIGJlbmNobWFyazogYm9vbGVhbiA9IGZhbHNlLFxuICB2ZXJib3NpdHkgPSAwXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChcbiAgICB0YXJnZXQ6IGFueSxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nLFxuICAgIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0YXJnZXQpLmZvcih0YXJnZXRbcHJvcGVydHlLZXldKTtcbiAgICBjb25zdCBtZXRob2QgPSBsb2dbbGV2ZWxdLmJpbmQobG9nKTtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgbWV0aG9kKGBjYWxsZWQgd2l0aCAke2FyZ3N9YCwgdmVyYm9zaXR5KTtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGxldCBlbmQ6IG51bWJlcjtcbiAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHIpID0+IHtcbiAgICAgICAgICBpZiAoYmVuY2htYXJrKSB7XG4gICAgICAgICAgICBlbmQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgaWYgKGJlbmNobWFyaykgbWV0aG9kKGBjb21wbGV0ZWQgaW4gJHtlbmQgLSBzdGFydH1tc2AsIHZlcmJvc2l0eSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChiZW5jaG1hcmspIHtcbiAgICAgICAgZW5kID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGJlbmNobWFyaykgbWV0aG9kKGBjb21wbGV0ZWQgaW4gJHtlbmQgLSBzdGFydH1tc2AsIHZlcmJvc2l0eSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIGRlYnVnIGxldmVsXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbG9nIGRlY29yYXRvciB0aGF0IHVzZXMgTG9nTGV2ZWwuZGVidWdcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JlbmNobWFyaz1mYWxzZV0gLSBXaGV0aGVyIHRvIGxvZyBleGVjdXRpb24gdGltZSAoZGVmYXVsdDogZmFsc2UpXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsIG1ldGhvZCB3aXRoIGRlYnVnIGxvZ2dpbmdcbiAqIEBmdW5jdGlvbiBkZWJ1Z1xuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnKGJlbmNobWFyazogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIHJldHVybiBsb2coTG9nTGV2ZWwuZGVidWcsIGJlbmNobWFyayk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCBpbmZvIGxldmVsXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbG9nIGRlY29yYXRvciB0aGF0IHVzZXMgTG9nTGV2ZWwuaW5mb1xuICogQHBhcmFtIHtib29sZWFufSBbYmVuY2htYXJrPWZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIGV4ZWN1dGlvbiB0aW1lIChkZWZhdWx0OiBmYWxzZSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggaW5mbyBsb2dnaW5nXG4gKiBAZnVuY3Rpb24gaW5mb1xuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZm8oYmVuY2htYXJrOiBib29sZWFuID0gZmFsc2UpIHtcbiAgcmV0dXJuIGxvZyhMb2dMZXZlbC5pbmZvLCBiZW5jaG1hcmspO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzIHdpdGggc2lsbHkgbGV2ZWxcbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBsb2cgZGVjb3JhdG9yIHRoYXQgdXNlcyBMb2dMZXZlbC5zaWxseVxuICogQHBhcmFtIHtib29sZWFufSBbYmVuY2htYXJrPWZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIGV4ZWN1dGlvbiB0aW1lIChkZWZhdWx0OiBmYWxzZSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggc2lsbHkgbG9nZ2luZ1xuICogQGZ1bmN0aW9uIHNpbGx5XG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2lsbHkoYmVuY2htYXJrOiBib29sZWFuID0gZmFsc2UpIHtcbiAgcmV0dXJuIGxvZyhMb2dMZXZlbC5zaWxseSwgYmVuY2htYXJrKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIHZlcmJvc2UgbGV2ZWxcbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBsb2cgZGVjb3JhdG9yIHRoYXQgdXNlcyBMb2dMZXZlbC52ZXJib3NlIHdpdGggY29uZmlndXJhYmxlIHZlcmJvc2l0eVxuICogQHBhcmFtIHtudW1iZXJ9IHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgZm9yIHRoZSBsb2cgbWVzc2FnZXMgKGRlZmF1bHQ6IDApXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtiZW5jaG1hcms9ZmFsc2VdIC0gV2hldGhlciB0byBsb2cgZXhlY3V0aW9uIHRpbWUgKGRlZmF1bHQ6IGZhbHNlKVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IHdyYXBzIHRoZSBvcmlnaW5hbCBtZXRob2Qgd2l0aCB2ZXJib3NlIGxvZ2dpbmdcbiAqIEBmdW5jdGlvbiB2ZXJib3NlXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyYm9zZSh2ZXJib3NpdHkgPSAwLCBiZW5jaG1hcms6IGJvb2xlYW4gPSBmYWxzZSkge1xuICByZXR1cm4gbG9nKExvZ0xldmVsLnZlcmJvc2UsIGJlbmNobWFyaywgdmVyYm9zaXR5KTtcbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbG9nZ2luZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBsb2dnaW5nIG1vZHVsZSBmb3IgVHlwZVNjcmlwdCBhcHBsaWNhdGlvbnNcbiAqIEBzdW1tYXJ5IFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBsb2dnaW5nIHNvbHV0aW9uIGZvciBUeXBlU2NyaXB0IGFwcGxpY2F0aW9ucy4gSXQgZXhwb3J0cyBjb25zdGFudHMsIGRlY29yYXRvcnMsIGxvZ2dpbmcgdXRpbGl0aWVzLCBhbmQgdHlwZSBkZWZpbml0aW9ucyB0byBmYWNpbGl0YXRlIHN0cnVjdHVyZWQgbG9nZ2luZy5cbiAqIEBtb2R1bGUgTG9nZ2luZ1xuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uIHN0cmluZ1xuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvbiwgdXNlZCBmb3IgdmVyc2lvbiB0cmFja2luZyBhbmQgY29tcGF0aWJpbGl0eSBjaGVja3NcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7QUFLRztJQUNTO0FBQVosQ0FBQSxVQUFZLFFBQVEsRUFBQTs7QUFFbEIsSUFBQSxRQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTs7QUFFZixJQUFBLFFBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFhOztBQUViLElBQUEsUUFBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1COztBQUVuQixJQUFBLFFBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztBQUVmLElBQUEsUUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7QUFDakIsQ0FBQyxFQVhXLFFBQVEsS0FBUixRQUFRLEdBV25CLEVBQUEsQ0FBQSxDQUFBO0FBRUQ7Ozs7Ozs7Ozs7QUFVRztBQUNVLE1BQUEsZ0JBQWdCLEdBQUc7QUFDOUIsSUFBQSxLQUFLLEVBQUUsQ0FBQztBQUNSLElBQUEsSUFBSSxFQUFFLENBQUM7QUFDUCxJQUFBLE9BQU8sRUFBRSxDQUFDO0FBQ1YsSUFBQSxLQUFLLEVBQUUsQ0FBQztBQUNSLElBQUEsS0FBSyxFQUFFLENBQUM7O0FBR1Y7Ozs7O0FBS0c7SUFDUztBQUFaLENBQUEsVUFBWSxXQUFXLEVBQUE7O0FBRXJCLElBQUEsV0FBQSxDQUFBLEtBQUEsQ0FBQSxHQUFBLEtBQVc7O0FBRVgsSUFBQSxXQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsTUFBYTtBQUNmLENBQUMsRUFMVyxXQUFXLEtBQVgsV0FBVyxHQUt0QixFQUFBLENBQUEsQ0FBQTtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3Qkc7QUFDVSxNQUFBLFlBQVksR0FBVTtBQUNqQyxJQUFBLEtBQUssRUFBRTtBQUNMLFFBQUEsRUFBRSxFQUFFLEVBQUU7QUFDUCxLQUFB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
|