@decaf-ts/logging 0.3.12 → 0.3.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/logging.cjs +542 -99
- package/dist/logging.esm.cjs +539 -100
- package/lib/LoggedClass.cjs +9 -12
- package/lib/LoggedClass.d.ts +6 -10
- package/lib/constants.cjs +40 -8
- package/lib/constants.d.ts +35 -7
- package/lib/decorators.cjs +114 -50
- package/lib/decorators.d.ts +58 -43
- package/lib/environment.cjs +73 -22
- package/lib/environment.d.ts +46 -29
- package/lib/esm/LoggedClass.d.ts +6 -10
- package/lib/esm/LoggedClass.js +9 -12
- package/lib/esm/constants.d.ts +35 -7
- package/lib/esm/constants.js +40 -8
- package/lib/esm/decorators.d.ts +58 -43
- package/lib/esm/decorators.js +113 -50
- package/lib/esm/environment.d.ts +46 -29
- package/lib/esm/environment.js +73 -22
- package/lib/esm/filters/LogFilter.d.ts +37 -0
- package/lib/esm/filters/LogFilter.js +30 -1
- package/lib/esm/filters/PatternFilter.d.ts +46 -0
- package/lib/esm/filters/PatternFilter.js +41 -1
- package/lib/esm/index.d.ts +7 -10
- package/lib/esm/index.js +8 -11
- package/lib/esm/logging.d.ts +14 -0
- package/lib/esm/logging.js +22 -1
- package/lib/esm/time.d.ts +149 -0
- package/lib/esm/time.js +212 -0
- package/lib/esm/types.d.ts +89 -51
- package/lib/esm/types.js +1 -1
- package/lib/filters/LogFilter.cjs +30 -1
- package/lib/filters/LogFilter.d.ts +37 -0
- package/lib/filters/PatternFilter.cjs +41 -1
- package/lib/filters/PatternFilter.d.ts +46 -0
- package/lib/index.cjs +8 -11
- package/lib/index.d.ts +7 -10
- package/lib/logging.cjs +22 -1
- package/lib/logging.d.ts +14 -0
- package/lib/time.cjs +217 -0
- package/lib/time.d.ts +149 -0
- package/lib/types.cjs +1 -1
- package/lib/types.d.ts +89 -51
- package/package.json +2 -2
package/lib/decorators.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { LogLevel } from "./constants";
|
|
2
|
+
export type ArgFormatFunction = (...args: any[]) => string;
|
|
3
|
+
export type ReturnFormatFunction = (e?: Error, result?: any) => string;
|
|
2
4
|
/**
|
|
3
|
-
* @description Method decorator for logging function calls
|
|
4
|
-
* @summary
|
|
5
|
-
* @param {LogLevel} level -
|
|
6
|
-
* @param {
|
|
7
|
-
* @param {
|
|
8
|
-
* @
|
|
5
|
+
* @description Method decorator for logging function calls.
|
|
6
|
+
* @summary Wraps class methods to automatically log entry, exit, timing, and optional custom messages at a configurable {@link LogLevel}.
|
|
7
|
+
* @param {LogLevel} level - Log level applied to the generated log statements (defaults to `LogLevel.info`).
|
|
8
|
+
* @param {number} [verbosity=0] - Verbosity threshold required for the entry log to appear.
|
|
9
|
+
* @param {ArgFormatFunction} [entryMessage] - Formatter invoked with the original method arguments to describe the invocation.
|
|
10
|
+
* @param {ReturnFormatFunction} [exitMessage] - Optional formatter that describes the outcome or failure of the call.
|
|
11
|
+
* @return {function(any, any, PropertyDescriptor): void} Method decorator proxy that injects logging behavior.
|
|
9
12
|
* @function log
|
|
10
13
|
* @mermaid
|
|
11
14
|
* sequenceDiagram
|
|
@@ -30,64 +33,76 @@ import { LogLevel } from "./constants";
|
|
|
30
33
|
* end
|
|
31
34
|
* @category Method Decorators
|
|
32
35
|
*/
|
|
33
|
-
export declare function log(level?: LogLevel,
|
|
36
|
+
export declare function log(level?: LogLevel, verbosity?: number, entryMessage?: ArgFormatFunction, exitMessage?: ReturnFormatFunction): (target: any, propertyKey?: any, descriptor?: any) => any;
|
|
34
37
|
/**
|
|
35
|
-
* @description Method decorator
|
|
36
|
-
* @summary
|
|
37
|
-
* @
|
|
38
|
-
* @
|
|
38
|
+
* @description Method decorator that records execution time at the benchmark level.
|
|
39
|
+
* @summary Wraps the target method to emit {@link Logger.benchmark} entries capturing completion time or failure latency.
|
|
40
|
+
* @return {function(any, any, PropertyDescriptor): void} Method decorator proxy that benchmarks the original implementation.
|
|
41
|
+
* @function benchmark
|
|
42
|
+
* @mermaid
|
|
43
|
+
* sequenceDiagram
|
|
44
|
+
* participant Caller
|
|
45
|
+
* participant Decorator as benchmark
|
|
46
|
+
* participant Method as Original Method
|
|
47
|
+
* Caller->>Decorator: invoke()
|
|
48
|
+
* Decorator->>Method: Reflect.apply(...)
|
|
49
|
+
* alt Promise result
|
|
50
|
+
* Method-->>Decorator: Promise
|
|
51
|
+
* Decorator->>Decorator: attach then()
|
|
52
|
+
* Decorator->>Decorator: log completion duration
|
|
53
|
+
* else Synchronous result
|
|
54
|
+
* Method-->>Decorator: value
|
|
55
|
+
* Decorator->>Decorator: log completion duration
|
|
56
|
+
* end
|
|
57
|
+
* Decorator-->>Caller: return result
|
|
58
|
+
* @category Method Decorators
|
|
59
|
+
*/
|
|
60
|
+
export declare function benchmark(): (target: any, propertyKey?: any, descriptor?: any) => any;
|
|
61
|
+
/**
|
|
62
|
+
* @description Method decorator for logging function calls with debug level.
|
|
63
|
+
* @summary Convenience wrapper around {@link log} that logs using `LogLevel.debug`.
|
|
64
|
+
* @return {function(any, any, PropertyDescriptor): void} Debug-level logging decorator.
|
|
39
65
|
* @function debug
|
|
40
66
|
* @category Method Decorators
|
|
41
67
|
*/
|
|
42
|
-
export declare function debug(
|
|
68
|
+
export declare function debug(): (target: any, propertyKey?: any, descriptor?: any) => any;
|
|
43
69
|
/**
|
|
44
|
-
* @description Method decorator for logging function calls with info level
|
|
45
|
-
* @summary Convenience wrapper around
|
|
46
|
-
* @
|
|
47
|
-
* @return {Function} A method decorator that wraps the original method with info logging
|
|
70
|
+
* @description Method decorator for logging function calls with info level.
|
|
71
|
+
* @summary Convenience wrapper around {@link log} that logs using `LogLevel.info`.
|
|
72
|
+
* @return {function(any, any, PropertyDescriptor): void} Info-level logging decorator.
|
|
48
73
|
* @function info
|
|
49
74
|
* @category Method Decorators
|
|
50
75
|
*/
|
|
51
|
-
export declare function info(
|
|
76
|
+
export declare function info(): (target: any, propertyKey?: any, descriptor?: any) => any;
|
|
52
77
|
/**
|
|
53
|
-
* @description Method decorator for logging function calls with silly level
|
|
54
|
-
* @summary Convenience wrapper around
|
|
55
|
-
* @
|
|
56
|
-
* @return {Function} A method decorator that wraps the original method with silly logging
|
|
78
|
+
* @description Method decorator for logging function calls with silly level.
|
|
79
|
+
* @summary Convenience wrapper around {@link log} that logs using `LogLevel.silly`.
|
|
80
|
+
* @return {function(any, any, PropertyDescriptor): void} Silly-level logging decorator.
|
|
57
81
|
* @function silly
|
|
58
82
|
* @category Method Decorators
|
|
59
83
|
*/
|
|
60
|
-
export declare function silly(
|
|
84
|
+
export declare function silly(): (target: any, propertyKey?: any, descriptor?: any) => any;
|
|
61
85
|
/**
|
|
62
|
-
* @description Method decorator for logging function calls with verbose level
|
|
63
|
-
* @summary Convenience wrapper around
|
|
64
|
-
* @return {
|
|
86
|
+
* @description Method decorator for logging function calls with verbose level.
|
|
87
|
+
* @summary Convenience wrapper around {@link log} that logs using `LogLevel.verbose` with configurable verbosity.
|
|
88
|
+
* @return {function(any, any, PropertyDescriptor): void} Verbose logging decorator.
|
|
65
89
|
* @function verbose
|
|
90
|
+
* @category Method Decorators
|
|
66
91
|
*/
|
|
67
92
|
export declare function verbose(): (target: any, propertyKey?: any, descriptor?: any) => void;
|
|
68
93
|
/**
|
|
69
|
-
* @description Method decorator for logging function calls with verbose level
|
|
70
|
-
* @summary Convenience wrapper around
|
|
71
|
-
* @
|
|
72
|
-
* @return {Function} A method decorator that wraps the original method with verbose logging
|
|
73
|
-
* @function verbose
|
|
74
|
-
*/
|
|
75
|
-
export declare function verbose(benchmark: boolean): (target: any, propertyKey?: any, descriptor?: any) => void;
|
|
76
|
-
/**
|
|
77
|
-
* @description Method decorator for logging function calls with verbose level
|
|
78
|
-
* @summary Convenience wrapper around the log decorator that uses LogLevel.verbose with configurable verbosity
|
|
79
|
-
* @param {number} verbosity - The verbosity level for the log messages (default: 0)
|
|
80
|
-
* @return {Function} A method decorator that wraps the original method with verbose logging
|
|
94
|
+
* @description Method decorator for logging function calls with verbose level.
|
|
95
|
+
* @summary Convenience wrapper around {@link log} that logs using `LogLevel.verbose` while toggling benchmarking.
|
|
96
|
+
* @return {function(any, PropertyDescriptor): void} Verbose logging decorator.
|
|
81
97
|
* @function verbose
|
|
82
98
|
* @category Method Decorators
|
|
83
99
|
*/
|
|
84
|
-
export declare function verbose(
|
|
100
|
+
export declare function verbose(): (target: any, propertyKey?: any, descriptor?: any) => void;
|
|
85
101
|
/**
|
|
86
|
-
* @description Creates a decorator that makes a method non-configurable
|
|
87
|
-
* @summary
|
|
88
|
-
*
|
|
89
|
-
* @return {Function} A decorator function that can be applied to methods
|
|
102
|
+
* @description Creates a decorator that makes a method non-configurable.
|
|
103
|
+
* @summary Prevents overriding by marking the method descriptor as non-configurable, throwing if applied to non-method targets.
|
|
104
|
+
* @return {function(object, any, PropertyDescriptor): PropertyDescriptor|undefined} Decorator that hardens the method descriptor.
|
|
90
105
|
* @function final
|
|
91
106
|
* @category Method Decorators
|
|
92
107
|
*/
|
|
93
|
-
export declare function final(): (target: object, propertyKey?: any, descriptor?:
|
|
108
|
+
export declare function final(): (target: object, propertyKey?: any, descriptor?: any) => any;
|
package/lib/environment.cjs
CHANGED
|
@@ -6,13 +6,33 @@ const text_1 = require("./text.cjs");
|
|
|
6
6
|
const web_1 = require("./web.cjs");
|
|
7
7
|
const constants_1 = require("./constants.cjs");
|
|
8
8
|
/**
|
|
9
|
-
* @
|
|
10
|
-
* @
|
|
9
|
+
* @description Environment accumulator that lazily reads from runtime sources.
|
|
10
|
+
* @summary Extends {@link ObjectAccumulator} to merge configuration objects while resolving values from Node or browser environment variables on demand.
|
|
11
11
|
* @template T
|
|
12
|
-
* @
|
|
13
|
-
* @
|
|
14
|
-
*
|
|
12
|
+
* @class Environment
|
|
13
|
+
* @example
|
|
14
|
+
* const Config = Environment.accumulate({ logging: { level: "info" } });
|
|
15
|
+
* console.log(Config.logging.level);
|
|
16
|
+
* console.log(String(Config.logging.level)); // => LOGGING__LEVEL key when serialized
|
|
17
|
+
* @mermaid
|
|
18
|
+
* sequenceDiagram
|
|
19
|
+
* participant Client
|
|
20
|
+
* participant Env as Environment
|
|
21
|
+
* participant Process as process.env
|
|
22
|
+
* participant Browser as globalThis.ENV
|
|
23
|
+
* Client->>Env: accumulate(partialConfig)
|
|
24
|
+
* Env->>Env: expand(values)
|
|
25
|
+
* Client->>Env: Config.logging.level
|
|
26
|
+
* alt Browser runtime
|
|
27
|
+
* Env->>Browser: lookup ENV key
|
|
28
|
+
* Browser-->>Env: resolved value
|
|
29
|
+
* else Node runtime
|
|
30
|
+
* Env->>Process: lookup ENV key
|
|
31
|
+
* Process-->>Env: resolved value
|
|
32
|
+
* end
|
|
33
|
+
* Env-->>Client: merged value
|
|
15
34
|
*/
|
|
35
|
+
const EmptyValue = Symbol("EnvironmentEmpty");
|
|
16
36
|
class Environment extends typed_object_accumulator_1.ObjectAccumulator {
|
|
17
37
|
/**
|
|
18
38
|
* @static
|
|
@@ -26,10 +46,10 @@ class Environment extends typed_object_accumulator_1.ObjectAccumulator {
|
|
|
26
46
|
super();
|
|
27
47
|
}
|
|
28
48
|
/**
|
|
29
|
-
* @description Retrieves a value from the environment
|
|
30
|
-
* @summary
|
|
31
|
-
* @param {string} k -
|
|
32
|
-
* @return {unknown}
|
|
49
|
+
* @description Retrieves a value from the runtime environment.
|
|
50
|
+
* @summary Handles browser and Node.js environments by normalizing keys and parsing values.
|
|
51
|
+
* @param {string} k - Key to resolve from the environment.
|
|
52
|
+
* @return {unknown} Value resolved from the environment or `undefined` when absent.
|
|
33
53
|
*/
|
|
34
54
|
fromEnv(k) {
|
|
35
55
|
let env;
|
|
@@ -43,6 +63,12 @@ class Environment extends typed_object_accumulator_1.ObjectAccumulator {
|
|
|
43
63
|
}
|
|
44
64
|
return this.parseEnvValue(env[k]);
|
|
45
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* @description Converts stringified environment values into native types.
|
|
68
|
+
* @summary Interprets booleans and numbers while leaving other types unchanged.
|
|
69
|
+
* @param {unknown} val - Raw value retrieved from the environment.
|
|
70
|
+
* @return {unknown} Parsed value converted to boolean, number, or left as-is.
|
|
71
|
+
*/
|
|
46
72
|
parseEnvValue(val) {
|
|
47
73
|
if (typeof val !== "string")
|
|
48
74
|
return val;
|
|
@@ -56,10 +82,10 @@ class Environment extends typed_object_accumulator_1.ObjectAccumulator {
|
|
|
56
82
|
return val;
|
|
57
83
|
}
|
|
58
84
|
/**
|
|
59
|
-
* @description Expands an object into the environment
|
|
60
|
-
* @summary Defines properties
|
|
61
|
-
* @template V - Type of the object being expanded
|
|
62
|
-
* @param {V} value -
|
|
85
|
+
* @description Expands an object into the environment.
|
|
86
|
+
* @summary Defines lazy properties that first consult runtime variables before falling back to seeded values.
|
|
87
|
+
* @template V - Type of the object being expanded.
|
|
88
|
+
* @param {V} value - Object to expose through environment getters and setters.
|
|
63
89
|
* @return {void}
|
|
64
90
|
*/
|
|
65
91
|
expand(value) {
|
|
@@ -72,9 +98,9 @@ class Environment extends typed_object_accumulator_1.ObjectAccumulator {
|
|
|
72
98
|
if (v && typeof v === "object") {
|
|
73
99
|
return Environment.buildEnvProxy(v, [k]);
|
|
74
100
|
}
|
|
75
|
-
// If the model provides an empty string,
|
|
101
|
+
// If the model provides an empty string, mark with EmptyValue so instance proxy can return undefined without enabling key composition
|
|
76
102
|
if (v === "") {
|
|
77
|
-
return
|
|
103
|
+
return EmptyValue;
|
|
78
104
|
}
|
|
79
105
|
return v;
|
|
80
106
|
},
|
|
@@ -90,10 +116,10 @@ class Environment extends typed_object_accumulator_1.ObjectAccumulator {
|
|
|
90
116
|
* @protected
|
|
91
117
|
* @static
|
|
92
118
|
* @description Retrieves or creates the singleton instance of the Environment class.
|
|
93
|
-
* @summary Ensures only one instance
|
|
119
|
+
* @summary Ensures only one {@link Environment} instance is created, wrapping it in a proxy to compose ENV keys on demand.
|
|
94
120
|
* @template E
|
|
95
|
-
* @param {...unknown[]} args - Arguments
|
|
96
|
-
* @return {E}
|
|
121
|
+
* @param {...unknown[]} args - Arguments forwarded to the factory when instantiating the singleton.
|
|
122
|
+
* @return {E} Singleton environment instance.
|
|
97
123
|
*/
|
|
98
124
|
static instance(...args) {
|
|
99
125
|
if (!Environment._instance) {
|
|
@@ -101,6 +127,8 @@ class Environment extends typed_object_accumulator_1.ObjectAccumulator {
|
|
|
101
127
|
const proxied = new Proxy(base, {
|
|
102
128
|
get(target, prop, receiver) {
|
|
103
129
|
const value = Reflect.get(target, prop, receiver);
|
|
130
|
+
if (value === EmptyValue)
|
|
131
|
+
return undefined;
|
|
104
132
|
if (typeof value !== "undefined")
|
|
105
133
|
return value;
|
|
106
134
|
if (typeof prop === "string") {
|
|
@@ -119,10 +147,11 @@ class Environment extends typed_object_accumulator_1.ObjectAccumulator {
|
|
|
119
147
|
/**
|
|
120
148
|
* @static
|
|
121
149
|
* @description Accumulates the given value into the environment.
|
|
122
|
-
* @summary Adds new properties
|
|
150
|
+
* @summary Adds new properties, hiding raw descriptors to avoid leaking enumeration semantics.
|
|
151
|
+
* @template T
|
|
123
152
|
* @template V
|
|
124
|
-
* @param {V} value -
|
|
125
|
-
* @return {
|
|
153
|
+
* @param {V} value - Object to merge into the environment.
|
|
154
|
+
* @return {Environment} Updated environment reference.
|
|
126
155
|
*/
|
|
127
156
|
static accumulate(value) {
|
|
128
157
|
const instance = Environment.instance();
|
|
@@ -137,9 +166,22 @@ class Environment extends typed_object_accumulator_1.ObjectAccumulator {
|
|
|
137
166
|
});
|
|
138
167
|
return instance.accumulate(value);
|
|
139
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* @description Retrieves a value using a dot-path key from the accumulated environment.
|
|
171
|
+
* @summary Delegates to the singleton instance to access stored configuration.
|
|
172
|
+
* @param {string} key - Key to resolve from the environment store.
|
|
173
|
+
* @return {unknown} Stored value corresponding to the provided key.
|
|
174
|
+
*/
|
|
140
175
|
static get(key) {
|
|
141
176
|
return Environment._instance.get(key);
|
|
142
177
|
}
|
|
178
|
+
/**
|
|
179
|
+
* @description Builds a proxy that composes environment keys for nested properties.
|
|
180
|
+
* @summary Allows chained property access to emit uppercase ENV identifiers while honoring existing runtime overrides.
|
|
181
|
+
* @param {any} current - Seed model segment used when projecting nested structures.
|
|
182
|
+
* @param {string[]} path - Accumulated path segments leading to the proxy.
|
|
183
|
+
* @return {any} Proxy that resolves environment values or composes additional proxies for deeper paths.
|
|
184
|
+
*/
|
|
143
185
|
static buildEnvProxy(current, path) {
|
|
144
186
|
const buildKey = (p) => p.map((seg) => (0, text_1.toENVFormat)(seg)).join(constants_1.ENV_PATH_DELIMITER);
|
|
145
187
|
// Helper to read from the active environment given a composed key
|
|
@@ -176,6 +218,9 @@ class Environment extends typed_object_accumulator_1.ObjectAccumulator {
|
|
|
176
218
|
const isNextObject = nextModel && typeof nextModel === "object";
|
|
177
219
|
if (isNextObject)
|
|
178
220
|
return Environment.buildEnvProxy(nextModel, nextPath);
|
|
221
|
+
// If the model marks this leaf as an empty string, treat as undefined (no proxy)
|
|
222
|
+
if (nextModel === "")
|
|
223
|
+
return undefined;
|
|
179
224
|
// Always return a proxy for further path composition when no ENV value;
|
|
180
225
|
// do not surface primitive model defaults here (this API is for key composition).
|
|
181
226
|
return Environment.buildEnvProxy(undefined, nextPath);
|
|
@@ -209,9 +254,15 @@ class Environment extends typed_object_accumulator_1.ObjectAccumulator {
|
|
|
209
254
|
}
|
|
210
255
|
}
|
|
211
256
|
exports.Environment = Environment;
|
|
257
|
+
/**
|
|
258
|
+
* @description Singleton environment instance seeded with default logging configuration.
|
|
259
|
+
* @summary Combines {@link DefaultLoggingConfig} with runtime environment variables to provide consistent logging defaults across platforms.
|
|
260
|
+
* @const LoggedEnvironment
|
|
261
|
+
* @memberOf module:Logging
|
|
262
|
+
*/
|
|
212
263
|
exports.LoggedEnvironment = Environment.accumulate(Object.assign({}, constants_1.DefaultLoggingConfig, {
|
|
213
264
|
env: ((0, web_1.isBrowser)() && globalThis[constants_1.BrowserEnvKey]
|
|
214
265
|
? globalThis[constants_1.BrowserEnvKey]["NODE_ENV"]
|
|
215
266
|
: globalThis.process.env["NODE_ENV"]) || "development",
|
|
216
267
|
}));
|
|
217
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW52aXJvbm1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUVBQTZEO0FBQzdELHFDQUFxQztBQUNyQyxtQ0FBa0M7QUFDbEMsK0NBSXFCO0FBZXJCOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLFdBQThCLFNBQVEsNENBQW9CO0lBQ3JFOzs7Ozs7T0FNRzthQUNjLFlBQU8sR0FDdEIsR0FBcUIsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLENBQUM7SUFVNUM7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLE9BQU8sQ0FBQyxDQUFTO1FBQ3pCLElBQUksR0FBNEIsQ0FBQztRQUNqQyxJQUFJLElBQUEsZUFBUyxHQUFFLEVBQUUsQ0FBQztZQUNoQixHQUFHO2dCQUVDLFVBR0QsQ0FBQyx5QkFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ04sR0FBRyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQzdCLENBQUMsR0FBRyxJQUFBLGtCQUFXLEVBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRVMsYUFBYSxDQUFDLEdBQVk7UUFDbEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDeEMsSUFBSSxHQUFHLEtBQUssTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hDLElBQUksR0FBRyxLQUFLLE9BQU87WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7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RSxVQUFrQixDQUFDLHlCQUFhLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDaEQsQ0FBQyxDQUFFLFVBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLGFBQWE7Q0FDcEUsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYmplY3RBY2N1bXVsYXRvciB9IGZyb20gXCJ0eXBlZC1vYmplY3QtYWNjdW11bGF0b3JcIjtcbmltcG9ydCB7IHRvRU5WRm9ybWF0IH0gZnJvbSBcIi4vdGV4dFwiO1xuaW1wb3J0IHsgaXNCcm93c2VyIH0gZnJvbSBcIi4vd2ViXCI7XG5pbXBvcnQge1xuICBCcm93c2VyRW52S2V5LFxuICBEZWZhdWx0TG9nZ2luZ0NvbmZpZyxcbiAgRU5WX1BBVEhfREVMSU1JVEVSLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmFjdG9yeSB0eXBlIGZvciBjcmVhdGluZyBFbnZpcm9ubWVudCBpbnN0YW5jZXMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgZnVuY3Rpb24gdHlwZSB0aGF0IGNyZWF0ZXMgYW5kIHJldHVybnMgRW52aXJvbm1lbnQgaW5zdGFuY2VzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2Ygb2JqZWN0IHRoZSBFbnZpcm9ubWVudCB3aWxsIGFjY3VtdWxhdGUuXG4gKiBAdGVtcGxhdGUgRSAtIFRoZSBzcGVjaWZpYyBFbnZpcm9ubWVudCB0eXBlIHRvIGJlIGNyZWF0ZWQsIGV4dGVuZGluZyBFbnZpcm9ubWVudDxUPi5cbiAqIEB0eXBlZGVmIHtmdW5jdGlvbiguLi51bmtub3duW10pOiBFfSBFbnZpcm9ubWVudEZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudEZhY3Rvcnk8VCBleHRlbmRzIG9iamVjdCwgRSBleHRlbmRzIEVudmlyb25tZW50PFQ+PiA9IChcbiAgLi4uYXJnczogdW5rbm93bltdXG4pID0+IEU7XG5cbi8qKlxuICogQGNsYXNzIEVudmlyb25tZW50XG4gKiBAZXh0ZW5kcyB7T2JqZWN0QWNjdW11bGF0b3I8VD59XG4gKiBAdGVtcGxhdGUgVFxuICogQGRlc2NyaXB0aW9uIEEgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGVudmlyb25tZW50IHdpdGggYWNjdW11bGF0aW9uIGNhcGFiaWxpdGllcy5cbiAqIEBzdW1tYXJ5IE1hbmFnZXMgZW52aXJvbm1lbnQtcmVsYXRlZCBkYXRhIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvciBhY2N1bXVsYXRpb24gYW5kIGtleSByZXRyaWV2YWwuXG4gKiBAcGFyYW0ge1R9IFtpbml0aWFsRGF0YV0gLSBUaGUgaW5pdGlhbCBkYXRhIHRvIHBvcHVsYXRlIHRoZSBlbnZpcm9ubWVudCB3aXRoLlxuICovXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lbnQ8VCBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBPYmplY3RBY2N1bXVsYXRvcjxUPiB7XG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGRlc2NyaXB0aW9uIEEgZmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgRW52aXJvbm1lbnQgaW5zdGFuY2VzLlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGhvdyBuZXcgaW5zdGFuY2VzIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcyBzaG91bGQgYmUgY3JlYXRlZC5cbiAgICogQHJldHVybiB7RW52aXJvbm1lbnQ8YW55Pn0gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBmYWN0b3J5OiBFbnZpcm9ubWVudEZhY3Rvcnk8YW55LCBhbnk+ID1cbiAgICAoKTogRW52aXJvbm1lbnQ8YW55PiA9PiBuZXcgRW52aXJvbm1lbnQoKTtcblxuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAcHJpdmF0ZVxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MuXG4gICAqIEB0eXBlIHtFbnZpcm9ubWVudDxhbnk+fVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBFbnZpcm9ubWVudDxhbnk+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIHRoZSBlbnZpcm9ubWVudFxuICAgKiBAc3VtbWFyeSBHZXRzIGEgdmFsdWUgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBoYW5kbGluZyBicm93c2VyIGFuZCBOb2RlLmpzIGVudmlyb25tZW50cyBkaWZmZXJlbnRseVxuICAgKiBAcGFyYW0ge3N0cmluZ30gayAtIFRoZSBrZXkgdG8gcmV0cmlldmUgZnJvbSB0aGUgZW52aXJvbm1lbnRcbiAgICogQHJldHVybiB7dW5rbm93bn0gVGhlIHZhbHVlIGZyb20gdGhlIGVudmlyb25tZW50LCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgZnJvbUVudihrOiBzdHJpbmcpIHtcbiAgICBsZXQgZW52OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICAgIGVudiA9XG4gICAgICAgIChcbiAgICAgICAgICBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICAgICAgICAgICAgW0Jyb3dzZXJFbnZLZXldOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIH1cbiAgICAgICAgKVtCcm93c2VyRW52S2V5XSB8fCB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gZ2xvYmFsVGhpcy5wcm9jZXNzLmVudjtcbiAgICAgIGsgPSB0b0VOVkZvcm1hdChrKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VFbnZWYWx1ZShlbnZba10pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlRW52VmFsdWUodmFsOiB1bmtub3duKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgIT09IFwic3RyaW5nXCIpIHJldHVybiB2YWw7XG4gICAgaWYgKHZhbCA9PT0gXCJ0cnVlXCIpIHJldHVybiB0cnVlO1xuICAgIGlmICh2YWwgPT09IFwiZmFsc2VcIikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlRmxvYXQodmFsKTtcbiAgICBpZiAoIWlzTmFOKHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhwYW5kcyBhbiBvYmplY3QgaW50byB0aGUgZW52aXJvbm1lbnRcbiAgICogQHN1bW1hcnkgRGVmaW5lcyBwcm9wZXJ0aWVzIG9uIHRoZSBlbnZpcm9ubWVudCBvYmplY3QgdGhhdCBjYW4gYmUgYWNjZXNzZWQgYXMgZ2V0dGVycyBhbmQgc2V0dGVyc1xuICAgKiBAdGVtcGxhdGUgViAtIFR5cGUgb2YgdGhlIG9iamVjdCBiZWluZyBleHBhbmRlZFxuICAgKiBAcGFyYW0ge1Z9IHZhbHVlIC0gVGhlIG9iamVjdCB0byBleHBhbmQgaW50byB0aGUgZW52aXJvbm1lbnRcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBleHBhbmQ8ViBleHRlbmRzIG9iamVjdD4odmFsdWU6IFYpOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgaywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBmcm9tRW52ID0gdGhpcy5mcm9tRW52KGspO1xuICAgICAgICAgIGlmICh0eXBlb2YgZnJvbUVudiAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZyb21FbnY7XG4gICAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5idWlsZEVudlByb3h5KHYgYXMgYW55LCBba10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBJZiB0aGUgbW9kZWwgcHJvdmlkZXMgYW4gZW1wdHkgc3RyaW5nLCBleHBvc2UgYSBwcm94eSB0aGF0IGNvbXBvc2VzIEVOViBrZXlzXG4gICAgICAgICAgaWYgKHYgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5idWlsZEVudlByb3h5KHVuZGVmaW5lZCwgW2tdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogKHZhbDogVltrZXlvZiBWXSkgPT4ge1xuICAgICAgICAgIHYgPSB2YWw7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9yIGNyZWF0ZXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MuXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzIGV4aXN0cy5cbiAgICogQHRlbXBsYXRlIEVcbiAgICogQHBhcmFtIHsuLi51bmtub3duW119IGFyZ3MgLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZmFjdG9yeSBmdW5jdGlvbiBpZiBhIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkLlxuICAgKiBAcmV0dXJuIHtFfSBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgaW5zdGFuY2U8RSBleHRlbmRzIEVudmlyb25tZW50PGFueT4+KC4uLmFyZ3M6IHVua25vd25bXSk6IEUge1xuICAgIGlmICghRW52aXJvbm1lbnQuX2luc3RhbmNlKSB7XG4gICAgICBjb25zdCBiYXNlID0gRW52aXJvbm1lbnQuZmFjdG9yeSguLi5hcmdzKSBhcyBFO1xuICAgICAgY29uc3QgcHJveGllZCA9IG5ldyBQcm94eShiYXNlIGFzIGFueSwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gQXZvaWQgaW50ZXJmZXJpbmcgd2l0aCBsb2dnaW5nIGNvbmZpZyBsb29rdXBzIGZvciBvcHRpb25hbCBmaWVsZHMgbGlrZSAnYXBwJ1xuICAgICAgICAgICAgaWYgKHByb3AgPT09IFwiYXBwXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gRW52aXJvbm1lbnQuYnVpbGRFbnZQcm94eSh1bmRlZmluZWQsIFtwcm9wXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgRW52aXJvbm1lbnQuX2luc3RhbmNlID0gcHJveGllZCBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBFbnZpcm9ubWVudC5faW5zdGFuY2UgYXMgRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBBY2N1bXVsYXRlcyB0aGUgZ2l2ZW4gdmFsdWUgaW50byB0aGUgZW52aXJvbm1lbnQuXG4gICAqIEBzdW1tYXJ5IEFkZHMgbmV3IHByb3BlcnRpZXMgdG8gdGhlIGVudmlyb25tZW50IGZyb20gdGhlIHByb3ZpZGVkIG9iamVjdC5cbiAgICogQHRlbXBsYXRlIFZcbiAgICogQHBhcmFtIHtWfSB2YWx1ZSAtIFRoZSBvYmplY3QgdG8gYWNjdW11bGF0ZSBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHJldHVybiB7Vn0gVGhlIHVwZGF0ZWQgZW52aXJvbm1lbnQgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgYWNjdW11bGF0ZTxWIGV4dGVuZHMgb2JqZWN0PihcbiAgICB2YWx1ZTogVlxuICApOiB0eXBlb2YgRW52aXJvbm1lbnQuX2luc3RhbmNlICZcbiAgICBWICZcbiAgICBPYmplY3RBY2N1bXVsYXRvcjx0eXBlb2YgRW52aXJvbm1lbnQuX2luc3RhbmNlICYgVj4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gRW52aXJvbm1lbnQuaW5zdGFuY2UoKTtcbiAgICBPYmplY3Qua2V5cyhpbnN0YW5jZSBhcyBhbnkpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW5zdGFuY2UgYXMgYW55LCBrZXkpO1xuICAgICAgaWYgKGRlc2MgJiYgZGVzYy5jb25maWd1cmFibGUgJiYgZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSBhcyBhbnksIGtleSwge1xuICAgICAgICAgIC4uLmRlc2MsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBpbnN0YW5jZS5hY2N1bXVsYXRlKHZhbHVlKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gRW52aXJvbm1lbnQuX2luc3RhbmNlLmdldChrZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRFbnZQcm94eShjdXJyZW50OiBhbnksIHBhdGg6IHN0cmluZ1tdKTogYW55IHtcbiAgICBjb25zdCBidWlsZEtleSA9IChwOiBzdHJpbmdbXSkgPT5cbiAgICAgIHAubWFwKChzZWcpID0+IHRvRU5WRm9ybWF0KHNlZykpLmpvaW4oRU5WX1BBVEhfREVMSU1JVEVSKTtcblxuICAgIC8vIEhlbHBlciB0byByZWFkIGZyb20gdGhlIGFjdGl2ZSBlbnZpcm9ubWVudCBnaXZlbiBhIGNvbXBvc2VkIGtleVxuICAgIGNvbnN0IHJlYWRFbnYgPSAoa2V5OiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICAgIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgICAgICBjb25zdCBlbnYgPSAoXG4gICAgICAgICAgZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgICAgICAgICAgIFtCcm93c2VyRW52S2V5XT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIH1cbiAgICAgICAgKVtCcm93c2VyRW52S2V5XTtcbiAgICAgICAgcmV0dXJuIGVudiA/IGVudltrZXldIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSk/LnByb2Nlc3M/LmVudj8uW2tleV07XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjxhbnk+ID0ge1xuICAgICAgZ2V0KF90YXJnZXQsIHByb3A6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgICBpZiAocHJvcCA9PT0gU3ltYm9sLnRvUHJpbWl0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuICgpID0+IGJ1aWxkS2V5KHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wID09PSBcInRvU3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gYnVpbGRLZXkocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3AgPT09IFwidmFsdWVPZlwiKSB7XG4gICAgICAgICAgcmV0dXJuICgpID0+IGJ1aWxkS2V5KHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBuZXh0TW9kZWwgPVxuICAgICAgICAgIGN1cnJlbnQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIHByb3ApXG4gICAgICAgICAgICA/IChjdXJyZW50IGFzIGFueSlbcHJvcF1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBuZXh0UGF0aCA9IFsuLi5wYXRoLCBwcm9wXTtcbiAgICAgICAgY29uc3QgY29tcG9zZWRLZXkgPSBidWlsZEtleShuZXh0UGF0aCk7XG5cbiAgICAgICAgLy8gSWYgYW4gRU5WIHZhbHVlIGV4aXN0cyBmb3IgdGhpcyBwYXRoLCByZXR1cm4gaXQgZGlyZWN0bHlcbiAgICAgICAgY29uc3QgZW52VmFsdWUgPSByZWFkRW52KGNvbXBvc2VkS2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnZWYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGVudlZhbHVlO1xuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIG1vZGVsIGhhcyBhbiBvYmplY3QgYXQgdGhpcyBwYXRoLCBrZWVwIGRyaWxsaW5nIHdpdGggYSBwcm94eVxuICAgICAgICBjb25zdCBpc05leHRPYmplY3QgPSBuZXh0TW9kZWwgJiYgdHlwZW9mIG5leHRNb2RlbCA9PT0gXCJvYmplY3RcIjtcbiAgICAgICAgaWYgKGlzTmV4dE9iamVjdCkgcmV0dXJuIEVudmlyb25tZW50LmJ1aWxkRW52UHJveHkobmV4dE1vZGVsLCBuZXh0UGF0aCk7XG5cbiAgICAgICAgLy8gQWx3YXlzIHJldHVybiBhIHByb3h5IGZvciBmdXJ0aGVyIHBhdGggY29tcG9zaXRpb24gd2hlbiBubyBFTlYgdmFsdWU7XG4gICAgICAgIC8vIGRvIG5vdCBzdXJmYWNlIHByaW1pdGl2ZSBtb2RlbCBkZWZhdWx0cyBoZXJlICh0aGlzIEFQSSBpcyBmb3Iga2V5IGNvbXBvc2l0aW9uKS5cbiAgICAgICAgcmV0dXJuIEVudmlyb25tZW50LmJ1aWxkRW52UHJveHkodW5kZWZpbmVkLCBuZXh0UGF0aCk7XG4gICAgICB9LFxuICAgICAgb3duS2V5cygpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgPyBSZWZsZWN0Lm93bktleXMoY3VycmVudCkgOiBbXTtcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX3QsIHApIHtcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBwKSkge1xuICAgICAgICAgIHJldHVybiB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IGFzIFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHRhcmdldCA9IHt9IGFzIGFueTtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7XG4gIH1cblxuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBrZXlzIG9mIHRoZSBlbnZpcm9ubWVudCwgb3B0aW9uYWxseSBjb252ZXJ0aW5nIHRoZW0gdG8gRU5WIGZvcm1hdC5cbiAgICogQHN1bW1hcnkgR2V0cyBhbGwga2V5cyBpbiB0aGUgZW52aXJvbm1lbnQsIHdpdGggYW4gb3B0aW9uIHRvIGZvcm1hdCB0aGVtIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RvRW52PXRydWVdIC0gV2hldGhlciB0byBjb252ZXJ0IHRoZSBrZXlzIHRvIEVOViBmb3JtYXQuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBrZXlzIGZyb20gdGhlIGVudmlyb25tZW50LlxuICAgKi9cbiAgc3RhdGljIGtleXModG9FbnY6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBFbnZpcm9ubWVudC5pbnN0YW5jZSgpXG4gICAgICAua2V5cygpXG4gICAgICAubWFwKChrKSA9PiAodG9FbnYgPyB0b0VOVkZvcm1hdChrKSA6IGspKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgTG9nZ2VkRW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudC5hY2N1bXVsYXRlKFxuICBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0TG9nZ2luZ0NvbmZpZywge1xuICAgIGVudjpcbiAgICAgIChpc0Jyb3dzZXIoKSAmJiAoZ2xvYmFsVGhpcyBhcyBhbnkpW0Jyb3dzZXJFbnZLZXldXG4gICAgICAgID8gKGdsb2JhbFRoaXMgYXMgYW55KVtCcm93c2VyRW52S2V5XVtcIk5PREVfRU5WXCJdXG4gICAgICAgIDogKGdsb2JhbFRoaXMgYXMgYW55KS5wcm9jZXNzLmVudltcIk5PREVfRU5WXCJdKSB8fCBcImRldmVsb3BtZW50XCIsXG4gIH0pXG4pO1xuIl19
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW52aXJvbm1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUVBQTZEO0FBQzdELHFDQUFxQztBQUNyQyxtQ0FBa0M7QUFDbEMsK0NBSXFCO0FBY3JCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBRTlDLE1BQWEsV0FBOEIsU0FBUSw0Q0FBb0I7SUFDckU7Ozs7OztPQU1HO2FBQ2MsWUFBTyxHQUN0QixHQUFxQixFQUFFLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQVU1QztRQUNFLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sT0FBTyxDQUFDLENBQVM7UUFDekIsSUFBSSxHQUE0QixDQUFDO1FBQ2pDLElBQUksSUFBQSxlQUFTLEdBQUUsRUFBRSxDQUFDO1lBQ2hCLEdBQUc7Z0JBRUMsVUFHRCxDQUFDLHlCQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDN0IsQ0FBQyxHQUFHLElBQUEsa0JBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLGFBQWEsQ0FBQyxHQUFZO1FBQ2xDLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtZQUFFLE9BQU8sR0FBRyxDQUFDO1FBQ3hDLElBQUksR0FBRyxLQUFLLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUNoQyxJQUFJLEdBQUcsS0FBSyxPQUFPO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDbEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFDbEMsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ2dCLE1BQU0sQ0FBbUIsS0FBUTtRQUNsRCxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDdkMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO2dCQUM3QixHQUFHLEVBQUUsR0FBRyxFQUFFO29CQUNSLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVzt3QkFBRSxPQUFPLE9BQU8sQ0FBQztvQkFDbkQsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQy9CLE9BQU8sV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxDQUFDO29CQUNELHNJQUFzSTtvQkFDdEksSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7d0JBQ2IsT0FBTyxVQUFtQyxDQUFDO29CQUM3QyxDQUFDO29CQUNELE9BQU8sQ0FBQyxDQUFDO2dCQUNYLENBQUM7Z0JBQ0QsR0FBRyxFQUFFLENBQUMsR0FBZSxFQUFFLEVBQUU7b0JBQ3ZCLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBQ1YsQ0FBQztnQkFDRCxZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLElBQUk7YUFDakIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxNQUFNLENBQUMsUUFBUSxDQUE2QixHQUFHLElBQWU7UUFDdEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFNLENBQUM7WUFDL0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBVyxFQUFFO2dCQUNyQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRO29CQUN4QixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ2xELElBQUksS0FBSyxLQUFLLFVBQVU7d0JBQUUsT0FBTyxTQUFTLENBQUM7b0JBQzNDLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVzt3QkFBRSxPQUFPLEtBQUssQ0FBQztvQkFDL0MsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDN0IsK0VBQStFO3dCQUMvRSxJQUFJLElBQUksS0FBSyxLQUFLOzRCQUFFLE9BQU8sU0FBUyxDQUFDO3dCQUNyQyxPQUFPLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDdEQsQ0FBQztvQkFDRCxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsV0FBVyxDQUFDLFNBQVMsR0FBRyxPQUFjLENBQUM7UUFDekMsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDLFNBQWMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUNmLEtBQVE7UUFFUixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxFQUEwQixDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDM0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLFFBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNuRSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFlLEVBQUUsR0FBRyxFQUFFO29CQUMxQyxHQUFHLElBQUk7b0JBQ1AsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBRTdCLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQVc7UUFDcEIsT0FBTyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFZLEVBQUUsSUFBYztRQUN2RCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQVcsRUFBRSxFQUFFLENBQy9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUEsa0JBQVcsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyw4QkFBa0IsQ0FBQyxDQUFDO1FBRTVELGtFQUFrRTtRQUNsRSxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQVcsRUFBVyxFQUFFO1lBQ3ZDLElBQUksSUFBQSxlQUFTLEdBQUUsRUFBRSxDQUFDO2dCQUNoQixNQUFNLEdBQUcsR0FDUCxVQUdELENBQUMseUJBQWEsQ0FBQyxDQUFDO2dCQUNqQixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDcEMsQ0FBQztZQUNELE9BQVEsVUFBa0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDO1FBRUYsTUFBTSxPQUFPLEdBQXNCO1lBQ2pDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBcUI7Z0JBQ2hDLElBQUksSUFBSSxLQUFLLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDaEMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlCLENBQUM7Z0JBQ0QsSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQ3hCLE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QixDQUFDO2dCQUNELElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUN2QixPQUFPLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUIsQ0FBQztnQkFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7b0JBQUUsT0FBTyxTQUFTLENBQUM7Z0JBRS9DLE1BQU0sU0FBUyxHQUNiLE9BQU8sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQztvQkFDNUQsQ0FBQyxDQUFFLE9BQWUsQ0FBQyxJQUFJLENBQUM7b0JBQ3hCLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ2hCLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFdkMsMkRBQTJEO2dCQUMzRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVztvQkFBRSxPQUFPLFFBQVEsQ0FBQztnQkFFckQsaUZBQWlGO2dCQUNqRixNQUFNLFlBQVksR0FBRyxTQUFTLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxDQUFDO2dCQUNoRSxJQUFJLFlBQVk7b0JBQUUsT0FBTyxXQUFXLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFFeEUsaUZBQWlGO2dCQUNqRixJQUFJLFNBQVMsS0FBSyxFQUFFO29CQUFFLE9BQU8sU0FBUyxDQUFDO2dCQUV2Qyx3RUFBd0U7Z0JBQ3hFLGtGQUFrRjtnQkFDbEYsT0FBTyxXQUFXLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsT0FBTztnQkFDTCxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pELENBQUM7WUFDRCx3QkFBd0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE9BQU87b0JBQUUsT0FBTyxTQUFnQixDQUFDO2dCQUN0QyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBd0IsQ0FBQztnQkFDeEUsQ0FBQztnQkFDRCxPQUFPLFNBQWdCLENBQUM7WUFDMUIsQ0FBQztTQUNGLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxFQUFTLENBQUM7UUFDekIsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBaUIsSUFBSTtRQUMvQixPQUFPLFdBQVcsQ0FBQyxRQUFRLEVBQUU7YUFDMUIsSUFBSSxFQUFFO2FBQ04sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBQSxrQkFBVyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7O0FBcFBILGtDQXFQQztBQUVEOzs7OztHQUtHO0FBQ1UsUUFBQSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUNyRCxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxnQ0FBb0IsRUFBRTtJQUN0QyxHQUFHLEVBQ0QsQ0FBQyxJQUFBLGVBQVMsR0FBRSxJQUFLLFVBQWtCLENBQUMseUJBQWEsQ0FBQztRQUNoRCxDQUFDLENBQUUsVUFBa0IsQ0FBQyx5QkFBYSxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ2hELENBQUMsQ0FBRSxVQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxhQUFhO0NBQ3BFLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JqZWN0QWNjdW11bGF0b3IgfSBmcm9tIFwidHlwZWQtb2JqZWN0LWFjY3VtdWxhdG9yXCI7XG5pbXBvcnQgeyB0b0VOVkZvcm1hdCB9IGZyb20gXCIuL3RleHRcIjtcbmltcG9ydCB7IGlzQnJvd3NlciB9IGZyb20gXCIuL3dlYlwiO1xuaW1wb3J0IHtcbiAgQnJvd3NlckVudktleSxcbiAgRGVmYXVsdExvZ2dpbmdDb25maWcsXG4gIEVOVl9QQVRIX0RFTElNSVRFUixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgdHlwZSBmb3IgY3JlYXRpbmcgRW52aXJvbm1lbnQgaW5zdGFuY2VzLlxuICogQHN1bW1hcnkgRGVzY3JpYmVzIGZhY3RvcmllcyB0aGF0IGNvbnN0cnVjdCB7QGxpbmsgRW52aXJvbm1lbnR9IGRlcml2YXRpdmVzIHdpdGggY3VzdG9tIGluaXRpYWxpemF0aW9uLlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiBvYmplY3QgdGhlIEVudmlyb25tZW50IHdpbGwgYWNjdW11bGF0ZS5cbiAqIEB0ZW1wbGF0ZSBFIC0gVGhlIHNwZWNpZmljIEVudmlyb25tZW50IHR5cGUgdG8gYmUgY3JlYXRlZCwgZXh0ZW5kaW5nIEVudmlyb25tZW50PFQ+LlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHVua25vd25bXSk6IEV9IEVudmlyb25tZW50RmFjdG9yeVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50RmFjdG9yeTxUIGV4dGVuZHMgb2JqZWN0LCBFIGV4dGVuZHMgRW52aXJvbm1lbnQ8VD4+ID0gKFxuICAuLi5hcmdzOiB1bmtub3duW11cbikgPT4gRTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW52aXJvbm1lbnQgYWNjdW11bGF0b3IgdGhhdCBsYXppbHkgcmVhZHMgZnJvbSBydW50aW1lIHNvdXJjZXMuXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHtAbGluayBPYmplY3RBY2N1bXVsYXRvcn0gdG8gbWVyZ2UgY29uZmlndXJhdGlvbiBvYmplY3RzIHdoaWxlIHJlc29sdmluZyB2YWx1ZXMgZnJvbSBOb2RlIG9yIGJyb3dzZXIgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9uIGRlbWFuZC5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2xhc3MgRW52aXJvbm1lbnRcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBDb25maWcgPSBFbnZpcm9ubWVudC5hY2N1bXVsYXRlKHsgbG9nZ2luZzogeyBsZXZlbDogXCJpbmZvXCIgfSB9KTtcbiAqIGNvbnNvbGUubG9nKENvbmZpZy5sb2dnaW5nLmxldmVsKTtcbiAqIGNvbnNvbGUubG9nKFN0cmluZyhDb25maWcubG9nZ2luZy5sZXZlbCkpOyAvLyA9PiBMT0dHSU5HX19MRVZFTCBrZXkgd2hlbiBzZXJpYWxpemVkXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBFbnYgYXMgRW52aXJvbm1lbnRcbiAqICAgcGFydGljaXBhbnQgUHJvY2VzcyBhcyBwcm9jZXNzLmVudlxuICogICBwYXJ0aWNpcGFudCBCcm93c2VyIGFzIGdsb2JhbFRoaXMuRU5WXG4gKiAgIENsaWVudC0+PkVudjogYWNjdW11bGF0ZShwYXJ0aWFsQ29uZmlnKVxuICogICBFbnYtPj5FbnY6IGV4cGFuZCh2YWx1ZXMpXG4gKiAgIENsaWVudC0+PkVudjogQ29uZmlnLmxvZ2dpbmcubGV2ZWxcbiAqICAgYWx0IEJyb3dzZXIgcnVudGltZVxuICogICAgIEVudi0+PkJyb3dzZXI6IGxvb2t1cCBFTlYga2V5XG4gKiAgICAgQnJvd3Nlci0tPj5FbnY6IHJlc29sdmVkIHZhbHVlXG4gKiAgIGVsc2UgTm9kZSBydW50aW1lXG4gKiAgICAgRW52LT4+UHJvY2VzczogbG9va3VwIEVOViBrZXlcbiAqICAgICBQcm9jZXNzLS0+PkVudjogcmVzb2x2ZWQgdmFsdWVcbiAqICAgZW5kXG4gKiAgIEVudi0tPj5DbGllbnQ6IG1lcmdlZCB2YWx1ZVxuICovXG5jb25zdCBFbXB0eVZhbHVlID0gU3ltYm9sKFwiRW52aXJvbm1lbnRFbXB0eVwiKTtcblxuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50PFQgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgT2JqZWN0QWNjdW11bGF0b3I8VD4ge1xuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBBIGZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIEVudmlyb25tZW50IGluc3RhbmNlcy5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBob3cgbmV3IGluc3RhbmNlcyBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3Mgc2hvdWxkIGJlIGNyZWF0ZWQuXG4gICAqIEByZXR1cm4ge0Vudmlyb25tZW50PGFueT59IEEgbmV3IGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmFjdG9yeTogRW52aXJvbm1lbnRGYWN0b3J5PGFueSwgYW55PiA9XG4gICAgKCk6IEVudmlyb25tZW50PGFueT4gPT4gbmV3IEVudmlyb25tZW50KCk7XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQHByaXZhdGVcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKiBAdHlwZSB7RW52aXJvbm1lbnQ8YW55Pn1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogRW52aXJvbm1lbnQ8YW55PjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgdmFsdWUgZnJvbSB0aGUgcnVudGltZSBlbnZpcm9ubWVudC5cbiAgICogQHN1bW1hcnkgSGFuZGxlcyBicm93c2VyIGFuZCBOb2RlLmpzIGVudmlyb25tZW50cyBieSBub3JtYWxpemluZyBrZXlzIGFuZCBwYXJzaW5nIHZhbHVlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGsgLSBLZXkgdG8gcmVzb2x2ZSBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHJldHVybiB7dW5rbm93bn0gVmFsdWUgcmVzb2x2ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZnJvbUVudihrOiBzdHJpbmcpIHtcbiAgICBsZXQgZW52OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICAgIGVudiA9XG4gICAgICAgIChcbiAgICAgICAgICBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICAgICAgICAgICAgW0Jyb3dzZXJFbnZLZXldOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIH1cbiAgICAgICAgKVtCcm93c2VyRW52S2V5XSB8fCB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gZ2xvYmFsVGhpcy5wcm9jZXNzLmVudjtcbiAgICAgIGsgPSB0b0VOVkZvcm1hdChrKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VFbnZWYWx1ZShlbnZba10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBzdHJpbmdpZmllZCBlbnZpcm9ubWVudCB2YWx1ZXMgaW50byBuYXRpdmUgdHlwZXMuXG4gICAqIEBzdW1tYXJ5IEludGVycHJldHMgYm9vbGVhbnMgYW5kIG51bWJlcnMgd2hpbGUgbGVhdmluZyBvdGhlciB0eXBlcyB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsIC0gUmF3IHZhbHVlIHJldHJpZXZlZCBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHJldHVybiB7dW5rbm93bn0gUGFyc2VkIHZhbHVlIGNvbnZlcnRlZCB0byBib29sZWFuLCBudW1iZXIsIG9yIGxlZnQgYXMtaXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcGFyc2VFbnZWYWx1ZSh2YWw6IHVua25vd24pIHtcbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbDtcbiAgICBpZiAodmFsID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG4gICAgaWYgKHZhbCA9PT0gXCJmYWxzZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VGbG9hdCh2YWwpO1xuICAgIGlmICghaXNOYU4ocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeHBhbmRzIGFuIG9iamVjdCBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBsYXp5IHByb3BlcnRpZXMgdGhhdCBmaXJzdCBjb25zdWx0IHJ1bnRpbWUgdmFyaWFibGVzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gc2VlZGVkIHZhbHVlcy5cbiAgICogQHRlbXBsYXRlIFYgLSBUeXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgZXhwYW5kZWQuXG4gICAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBPYmplY3QgdG8gZXhwb3NlIHRocm91Z2ggZW52aXJvbm1lbnQgZ2V0dGVycyBhbmQgc2V0dGVycy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBleHBhbmQ8ViBleHRlbmRzIG9iamVjdD4odmFsdWU6IFYpOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgaywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBmcm9tRW52ID0gdGhpcy5mcm9tRW52KGspO1xuICAgICAgICAgIGlmICh0eXBlb2YgZnJvbUVudiAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZyb21FbnY7XG4gICAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5idWlsZEVudlByb3h5KHYgYXMgYW55LCBba10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBJZiB0aGUgbW9kZWwgcHJvdmlkZXMgYW4gZW1wdHkgc3RyaW5nLCBtYXJrIHdpdGggRW1wdHlWYWx1ZSBzbyBpbnN0YW5jZSBwcm94eSBjYW4gcmV0dXJuIHVuZGVmaW5lZCB3aXRob3V0IGVuYWJsaW5nIGtleSBjb21wb3NpdGlvblxuICAgICAgICAgIGlmICh2ID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gRW1wdHlWYWx1ZSBhcyB1bmtub3duIGFzIFZba2V5b2YgVl07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6ICh2YWw6IFZba2V5b2YgVl0pID0+IHtcbiAgICAgICAgICB2ID0gdmFsO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvciBjcmVhdGVzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKiBAc3VtbWFyeSBFbnN1cmVzIG9ubHkgb25lIHtAbGluayBFbnZpcm9ubWVudH0gaW5zdGFuY2UgaXMgY3JlYXRlZCwgd3JhcHBpbmcgaXQgaW4gYSBwcm94eSB0byBjb21wb3NlIEVOViBrZXlzIG9uIGRlbWFuZC5cbiAgICogQHRlbXBsYXRlIEVcbiAgICogQHBhcmFtIHsuLi51bmtub3duW119IGFyZ3MgLSBBcmd1bWVudHMgZm9yd2FyZGVkIHRvIHRoZSBmYWN0b3J5IHdoZW4gaW5zdGFudGlhdGluZyB0aGUgc2luZ2xldG9uLlxuICAgKiBAcmV0dXJuIHtFfSBTaW5nbGV0b24gZW52aXJvbm1lbnQgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGluc3RhbmNlPEUgZXh0ZW5kcyBFbnZpcm9ubWVudDxhbnk+PiguLi5hcmdzOiB1bmtub3duW10pOiBFIHtcbiAgICBpZiAoIUVudmlyb25tZW50Ll9pbnN0YW5jZSkge1xuICAgICAgY29uc3QgYmFzZSA9IEVudmlyb25tZW50LmZhY3RvcnkoLi4uYXJncykgYXMgRTtcbiAgICAgIGNvbnN0IHByb3hpZWQgPSBuZXcgUHJveHkoYmFzZSBhcyBhbnksIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gRW1wdHlWYWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyBBdm9pZCBpbnRlcmZlcmluZyB3aXRoIGxvZ2dpbmcgY29uZmlnIGxvb2t1cHMgZm9yIG9wdGlvbmFsIGZpZWxkcyBsaWtlICdhcHAnXG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJhcHBcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5idWlsZEVudlByb3h5KHVuZGVmaW5lZCwgW3Byb3BdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBFbnZpcm9ubWVudC5faW5zdGFuY2UgPSBwcm94aWVkIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIEVudmlyb25tZW50Ll9pbnN0YW5jZSBhcyBFO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIEFjY3VtdWxhdGVzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHN1bW1hcnkgQWRkcyBuZXcgcHJvcGVydGllcywgaGlkaW5nIHJhdyBkZXNjcmlwdG9ycyB0byBhdm9pZCBsZWFraW5nIGVudW1lcmF0aW9uIHNlbWFudGljcy5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHRlbXBsYXRlIFZcbiAgICogQHBhcmFtIHtWfSB2YWx1ZSAtIE9iamVjdCB0byBtZXJnZSBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHJldHVybiB7RW52aXJvbm1lbnR9IFVwZGF0ZWQgZW52aXJvbm1lbnQgcmVmZXJlbmNlLlxuICAgKi9cbiAgc3RhdGljIGFjY3VtdWxhdGU8ViBleHRlbmRzIG9iamVjdCwgVEJhc2UgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+KFxuICAgIHZhbHVlOiBWXG4gICk6IEVudmlyb25tZW50PFRCYXNlICYgVj4gJiBUQmFzZSAmIFYge1xuICAgIGNvbnN0IGluc3RhbmNlID0gRW52aXJvbm1lbnQuaW5zdGFuY2U8RW52aXJvbm1lbnQ8VEJhc2UgJiBWPj4oKTtcbiAgICBPYmplY3Qua2V5cyhpbnN0YW5jZSBhcyBhbnkpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW5zdGFuY2UgYXMgYW55LCBrZXkpO1xuICAgICAgaWYgKGRlc2MgJiYgZGVzYy5jb25maWd1cmFibGUgJiYgZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSBhcyBhbnksIGtleSwge1xuICAgICAgICAgIC4uLmRlc2MsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBpbnN0YW5jZS5hY2N1bXVsYXRlKHZhbHVlKSBhcyB1bmtub3duIGFzIEVudmlyb25tZW50PFRCYXNlICYgVj4gJlxuICAgICAgVEJhc2UgJlxuICAgICAgVjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgdmFsdWUgdXNpbmcgYSBkb3QtcGF0aCBrZXkgZnJvbSB0aGUgYWNjdW11bGF0ZWQgZW52aXJvbm1lbnQuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIHRvIGFjY2VzcyBzdG9yZWQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEtleSB0byByZXNvbHZlIGZyb20gdGhlIGVudmlyb25tZW50IHN0b3JlLlxuICAgKiBAcmV0dXJuIHt1bmtub3dufSBTdG9yZWQgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQga2V5LlxuICAgKi9cbiAgc3RhdGljIGdldChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBFbnZpcm9ubWVudC5faW5zdGFuY2UuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIHByb3h5IHRoYXQgY29tcG9zZXMgZW52aXJvbm1lbnQga2V5cyBmb3IgbmVzdGVkIHByb3BlcnRpZXMuXG4gICAqIEBzdW1tYXJ5IEFsbG93cyBjaGFpbmVkIHByb3BlcnR5IGFjY2VzcyB0byBlbWl0IHVwcGVyY2FzZSBFTlYgaWRlbnRpZmllcnMgd2hpbGUgaG9ub3JpbmcgZXhpc3RpbmcgcnVudGltZSBvdmVycmlkZXMuXG4gICAqIEBwYXJhbSB7YW55fSBjdXJyZW50IC0gU2VlZCBtb2RlbCBzZWdtZW50IHVzZWQgd2hlbiBwcm9qZWN0aW5nIG5lc3RlZCBzdHJ1Y3R1cmVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoIC0gQWNjdW11bGF0ZWQgcGF0aCBzZWdtZW50cyBsZWFkaW5nIHRvIHRoZSBwcm94eS5cbiAgICogQHJldHVybiB7YW55fSBQcm94eSB0aGF0IHJlc29sdmVzIGVudmlyb25tZW50IHZhbHVlcyBvciBjb21wb3NlcyBhZGRpdGlvbmFsIHByb3hpZXMgZm9yIGRlZXBlciBwYXRocy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGJ1aWxkRW52UHJveHkoY3VycmVudDogYW55LCBwYXRoOiBzdHJpbmdbXSk6IGFueSB7XG4gICAgY29uc3QgYnVpbGRLZXkgPSAocDogc3RyaW5nW10pID0+XG4gICAgICBwLm1hcCgoc2VnKSA9PiB0b0VOVkZvcm1hdChzZWcpKS5qb2luKEVOVl9QQVRIX0RFTElNSVRFUik7XG5cbiAgICAvLyBIZWxwZXIgdG8gcmVhZCBmcm9tIHRoZSBhY3RpdmUgZW52aXJvbm1lbnQgZ2l2ZW4gYSBjb21wb3NlZCBrZXlcbiAgICBjb25zdCByZWFkRW52ID0gKGtleTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICAgICAgY29uc3QgZW52ID0gKFxuICAgICAgICAgIGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gICAgICAgICAgICBbQnJvd3NlckVudktleV0/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICB9XG4gICAgICAgIClbQnJvd3NlckVudktleV07XG4gICAgICAgIHJldHVybiBlbnYgPyBlbnZba2V5XSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpPy5wcm9jZXNzPy5lbnY/LltrZXldO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVyOiBQcm94eUhhbmRsZXI8YW55PiA9IHtcbiAgICAgIGdldChfdGFyZ2V0LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgICAgaWYgKHByb3AgPT09IFN5bWJvbC50b1ByaW1pdGl2ZSkge1xuICAgICAgICAgIHJldHVybiAoKSA9PiBidWlsZEtleShwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcCA9PT0gXCJ0b1N0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuICgpID0+IGJ1aWxkS2V5KHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wID09PSBcInZhbHVlT2ZcIikge1xuICAgICAgICAgIHJldHVybiAoKSA9PiBidWlsZEtleShwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09IFwic3ltYm9sXCIpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgbmV4dE1vZGVsID1cbiAgICAgICAgICBjdXJyZW50ICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBwcm9wKVxuICAgICAgICAgICAgPyAoY3VycmVudCBhcyBhbnkpW3Byb3BdXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbmV4dFBhdGggPSBbLi4ucGF0aCwgcHJvcF07XG4gICAgICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gYnVpbGRLZXkobmV4dFBhdGgpO1xuXG4gICAgICAgIC8vIElmIGFuIEVOViB2YWx1ZSBleGlzdHMgZm9yIHRoaXMgcGF0aCwgcmV0dXJuIGl0IGRpcmVjdGx5XG4gICAgICAgIGNvbnN0IGVudlZhbHVlID0gcmVhZEVudihjb21wb3NlZEtleSk7XG4gICAgICAgIGlmICh0eXBlb2YgZW52VmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBlbnZWYWx1ZTtcblxuICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBtb2RlbCBoYXMgYW4gb2JqZWN0IGF0IHRoaXMgcGF0aCwga2VlcCBkcmlsbGluZyB3aXRoIGEgcHJveHlcbiAgICAgICAgY29uc3QgaXNOZXh0T2JqZWN0ID0gbmV4dE1vZGVsICYmIHR5cGVvZiBuZXh0TW9kZWwgPT09IFwib2JqZWN0XCI7XG4gICAgICAgIGlmIChpc05leHRPYmplY3QpIHJldHVybiBFbnZpcm9ubWVudC5idWlsZEVudlByb3h5KG5leHRNb2RlbCwgbmV4dFBhdGgpO1xuXG4gICAgICAgIC8vIElmIHRoZSBtb2RlbCBtYXJrcyB0aGlzIGxlYWYgYXMgYW4gZW1wdHkgc3RyaW5nLCB0cmVhdCBhcyB1bmRlZmluZWQgKG5vIHByb3h5KVxuICAgICAgICBpZiAobmV4dE1vZGVsID09PSBcIlwiKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIEFsd2F5cyByZXR1cm4gYSBwcm94eSBmb3IgZnVydGhlciBwYXRoIGNvbXBvc2l0aW9uIHdoZW4gbm8gRU5WIHZhbHVlO1xuICAgICAgICAvLyBkbyBub3Qgc3VyZmFjZSBwcmltaXRpdmUgbW9kZWwgZGVmYXVsdHMgaGVyZSAodGhpcyBBUEkgaXMgZm9yIGtleSBjb21wb3NpdGlvbikuXG4gICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5idWlsZEVudlByb3h5KHVuZGVmaW5lZCwgbmV4dFBhdGgpO1xuICAgICAgfSxcbiAgICAgIG93bktleXMoKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50ID8gUmVmbGVjdC5vd25LZXlzKGN1cnJlbnQpIDogW107XG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF90LCBwKSB7XG4gICAgICAgIGlmICghY3VycmVudCkgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwgcCkpIHtcbiAgICAgICAgICByZXR1cm4geyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSBhcyBQcm9wZXJ0eURlc2NyaXB0b3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCB0YXJnZXQgPSB7fSBhcyBhbnk7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUga2V5cyBvZiB0aGUgZW52aXJvbm1lbnQsIG9wdGlvbmFsbHkgY29udmVydGluZyB0aGVtIHRvIEVOViBmb3JtYXQuXG4gICAqIEBzdW1tYXJ5IEdldHMgYWxsIGtleXMgaW4gdGhlIGVudmlyb25tZW50LCB3aXRoIGFuIG9wdGlvbiB0byBmb3JtYXQgdGhlbSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt0b0Vudj10cnVlXSAtIFdoZXRoZXIgdG8gY29udmVydCB0aGUga2V5cyB0byBFTlYgZm9ybWF0LlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQW4gYXJyYXkgb2Yga2V5cyBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAgICovXG4gIHN0YXRpYyBrZXlzKHRvRW52OiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gRW52aXJvbm1lbnQuaW5zdGFuY2UoKVxuICAgICAgLmtleXMoKVxuICAgICAgLm1hcCgoaykgPT4gKHRvRW52ID8gdG9FTlZGb3JtYXQoaykgOiBrKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2luZ2xldG9uIGVudmlyb25tZW50IGluc3RhbmNlIHNlZWRlZCB3aXRoIGRlZmF1bHQgbG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICogQHN1bW1hcnkgQ29tYmluZXMge0BsaW5rIERlZmF1bHRMb2dnaW5nQ29uZmlnfSB3aXRoIHJ1bnRpbWUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHByb3ZpZGUgY29uc2lzdGVudCBsb2dnaW5nIGRlZmF1bHRzIGFjcm9zcyBwbGF0Zm9ybXMuXG4gKiBAY29uc3QgTG9nZ2VkRW52aXJvbm1lbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgY29uc3QgTG9nZ2VkRW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudC5hY2N1bXVsYXRlKFxuICBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0TG9nZ2luZ0NvbmZpZywge1xuICAgIGVudjpcbiAgICAgIChpc0Jyb3dzZXIoKSAmJiAoZ2xvYmFsVGhpcyBhcyBhbnkpW0Jyb3dzZXJFbnZLZXldXG4gICAgICAgID8gKGdsb2JhbFRoaXMgYXMgYW55KVtCcm93c2VyRW52S2V5XVtcIk5PREVfRU5WXCJdXG4gICAgICAgIDogKGdsb2JhbFRoaXMgYXMgYW55KS5wcm9jZXNzLmVudltcIk5PREVfRU5WXCJdKSB8fCBcImRldmVsb3BtZW50XCIsXG4gIH0pXG4pO1xuIl19
|
package/lib/environment.d.ts
CHANGED
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
import { ObjectAccumulator } from "typed-object-accumulator";
|
|
2
2
|
/**
|
|
3
3
|
* @description Factory type for creating Environment instances.
|
|
4
|
-
* @summary
|
|
5
|
-
*
|
|
4
|
+
* @summary Describes factories that construct {@link Environment} derivatives with custom initialization.
|
|
6
5
|
* @template T - The type of object the Environment will accumulate.
|
|
7
6
|
* @template E - The specific Environment type to be created, extending Environment<T>.
|
|
8
|
-
* @typedef {function(
|
|
7
|
+
* @typedef {function(unknown[]): E} EnvironmentFactory
|
|
9
8
|
* @memberOf module:Logging
|
|
10
9
|
*/
|
|
11
10
|
export type EnvironmentFactory<T extends object, E extends Environment<T>> = (...args: unknown[]) => E;
|
|
12
|
-
/**
|
|
13
|
-
* @class Environment
|
|
14
|
-
* @extends {ObjectAccumulator<T>}
|
|
15
|
-
* @template T
|
|
16
|
-
* @description A class representing an environment with accumulation capabilities.
|
|
17
|
-
* @summary Manages environment-related data and provides methods for accumulation and key retrieval.
|
|
18
|
-
* @param {T} [initialData] - The initial data to populate the environment with.
|
|
19
|
-
*/
|
|
20
11
|
export declare class Environment<T extends object> extends ObjectAccumulator<T> {
|
|
21
12
|
/**
|
|
22
13
|
* @static
|
|
@@ -35,18 +26,24 @@ export declare class Environment<T extends object> extends ObjectAccumulator<T>
|
|
|
35
26
|
private static _instance;
|
|
36
27
|
protected constructor();
|
|
37
28
|
/**
|
|
38
|
-
* @description Retrieves a value from the environment
|
|
39
|
-
* @summary
|
|
40
|
-
* @param {string} k -
|
|
41
|
-
* @return {unknown}
|
|
29
|
+
* @description Retrieves a value from the runtime environment.
|
|
30
|
+
* @summary Handles browser and Node.js environments by normalizing keys and parsing values.
|
|
31
|
+
* @param {string} k - Key to resolve from the environment.
|
|
32
|
+
* @return {unknown} Value resolved from the environment or `undefined` when absent.
|
|
42
33
|
*/
|
|
43
34
|
protected fromEnv(k: string): unknown;
|
|
35
|
+
/**
|
|
36
|
+
* @description Converts stringified environment values into native types.
|
|
37
|
+
* @summary Interprets booleans and numbers while leaving other types unchanged.
|
|
38
|
+
* @param {unknown} val - Raw value retrieved from the environment.
|
|
39
|
+
* @return {unknown} Parsed value converted to boolean, number, or left as-is.
|
|
40
|
+
*/
|
|
44
41
|
protected parseEnvValue(val: unknown): unknown;
|
|
45
42
|
/**
|
|
46
|
-
* @description Expands an object into the environment
|
|
47
|
-
* @summary Defines properties
|
|
48
|
-
* @template V - Type of the object being expanded
|
|
49
|
-
* @param {V} value -
|
|
43
|
+
* @description Expands an object into the environment.
|
|
44
|
+
* @summary Defines lazy properties that first consult runtime variables before falling back to seeded values.
|
|
45
|
+
* @template V - Type of the object being expanded.
|
|
46
|
+
* @param {V} value - Object to expose through environment getters and setters.
|
|
50
47
|
* @return {void}
|
|
51
48
|
*/
|
|
52
49
|
protected expand<V extends object>(value: V): void;
|
|
@@ -54,22 +51,36 @@ export declare class Environment<T extends object> extends ObjectAccumulator<T>
|
|
|
54
51
|
* @protected
|
|
55
52
|
* @static
|
|
56
53
|
* @description Retrieves or creates the singleton instance of the Environment class.
|
|
57
|
-
* @summary Ensures only one instance
|
|
54
|
+
* @summary Ensures only one {@link Environment} instance is created, wrapping it in a proxy to compose ENV keys on demand.
|
|
58
55
|
* @template E
|
|
59
|
-
* @param {...unknown[]} args - Arguments
|
|
60
|
-
* @return {E}
|
|
56
|
+
* @param {...unknown[]} args - Arguments forwarded to the factory when instantiating the singleton.
|
|
57
|
+
* @return {E} Singleton environment instance.
|
|
61
58
|
*/
|
|
62
59
|
protected static instance<E extends Environment<any>>(...args: unknown[]): E;
|
|
63
60
|
/**
|
|
64
61
|
* @static
|
|
65
62
|
* @description Accumulates the given value into the environment.
|
|
66
|
-
* @summary Adds new properties
|
|
63
|
+
* @summary Adds new properties, hiding raw descriptors to avoid leaking enumeration semantics.
|
|
64
|
+
* @template T
|
|
67
65
|
* @template V
|
|
68
|
-
* @param {V} value -
|
|
69
|
-
* @return {
|
|
66
|
+
* @param {V} value - Object to merge into the environment.
|
|
67
|
+
* @return {Environment} Updated environment reference.
|
|
68
|
+
*/
|
|
69
|
+
static accumulate<V extends object, TBase extends object = object>(value: V): Environment<TBase & V> & TBase & V;
|
|
70
|
+
/**
|
|
71
|
+
* @description Retrieves a value using a dot-path key from the accumulated environment.
|
|
72
|
+
* @summary Delegates to the singleton instance to access stored configuration.
|
|
73
|
+
* @param {string} key - Key to resolve from the environment store.
|
|
74
|
+
* @return {unknown} Stored value corresponding to the provided key.
|
|
70
75
|
*/
|
|
71
|
-
static accumulate<V extends object>(value: V): typeof Environment._instance & V & ObjectAccumulator<typeof Environment._instance & V>;
|
|
72
76
|
static get(key: string): any;
|
|
77
|
+
/**
|
|
78
|
+
* @description Builds a proxy that composes environment keys for nested properties.
|
|
79
|
+
* @summary Allows chained property access to emit uppercase ENV identifiers while honoring existing runtime overrides.
|
|
80
|
+
* @param {any} current - Seed model segment used when projecting nested structures.
|
|
81
|
+
* @param {string[]} path - Accumulated path segments leading to the proxy.
|
|
82
|
+
* @return {any} Proxy that resolves environment values or composes additional proxies for deeper paths.
|
|
83
|
+
*/
|
|
73
84
|
private static buildEnvProxy;
|
|
74
85
|
/**
|
|
75
86
|
* @static
|
|
@@ -80,8 +91,14 @@ export declare class Environment<T extends object> extends ObjectAccumulator<T>
|
|
|
80
91
|
*/
|
|
81
92
|
static keys(toEnv?: boolean): string[];
|
|
82
93
|
}
|
|
83
|
-
|
|
94
|
+
/**
|
|
95
|
+
* @description Singleton environment instance seeded with default logging configuration.
|
|
96
|
+
* @summary Combines {@link DefaultLoggingConfig} with runtime environment variables to provide consistent logging defaults across platforms.
|
|
97
|
+
* @const LoggedEnvironment
|
|
98
|
+
* @memberOf module:Logging
|
|
99
|
+
*/
|
|
100
|
+
export declare const LoggedEnvironment: Environment<object & import("./types").LoggingConfig & {
|
|
84
101
|
env: any;
|
|
85
|
-
} &
|
|
102
|
+
}> & object & import("./types").LoggingConfig & {
|
|
86
103
|
env: any;
|
|
87
|
-
}
|
|
104
|
+
};
|
package/lib/esm/LoggedClass.d.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { Logger } from "./types";
|
|
2
2
|
/**
|
|
3
|
-
* @description Base class that provides a ready-to-use logger instance
|
|
4
|
-
* @summary
|
|
5
|
-
* into derived classes through a protected getter. Subclasses can directly access
|
|
6
|
-
* this.log to emit messages without manually creating a logger. This promotes
|
|
7
|
-
* consistent, context-aware logging across the codebase.
|
|
8
|
-
* @param {void} [constructor] - No constructor arguments; subclasses may define their own
|
|
3
|
+
* @description Base class that provides a ready-to-use logger instance.
|
|
4
|
+
* @summary Supplies inheriting classes with a lazily created, context-aware {@link Logger} via the protected `log` getter, promoting consistent structured logging without manual wiring.
|
|
9
5
|
* @class LoggedClass
|
|
10
6
|
* @example
|
|
11
7
|
* class UserService extends LoggedClass {
|
|
@@ -32,11 +28,11 @@ import { Logger } from "./types";
|
|
|
32
28
|
* Instance->>Logger: info/debug/error(...)
|
|
33
29
|
*/
|
|
34
30
|
export declare abstract class LoggedClass {
|
|
31
|
+
private _log?;
|
|
35
32
|
/**
|
|
36
|
-
* @description Lazily provides a context-aware logger for the current instance
|
|
37
|
-
* @summary
|
|
38
|
-
*
|
|
39
|
-
* @return {Logger} A logger bound to the subclass context
|
|
33
|
+
* @description Lazily provides a context-aware logger for the current instance.
|
|
34
|
+
* @summary Calls {@link Logging.for} with the subclass instance to obtain a logger whose context matches the subclass name.
|
|
35
|
+
* @return {Logger} Logger bound to the subclass context.
|
|
40
36
|
*/
|
|
41
37
|
protected get log(): Logger;
|
|
42
38
|
protected constructor();
|
package/lib/esm/LoggedClass.js
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { Logging } from "./logging.js";
|
|
2
2
|
/**
|
|
3
|
-
* @description Base class that provides a ready-to-use logger instance
|
|
4
|
-
* @summary
|
|
5
|
-
* into derived classes through a protected getter. Subclasses can directly access
|
|
6
|
-
* this.log to emit messages without manually creating a logger. This promotes
|
|
7
|
-
* consistent, context-aware logging across the codebase.
|
|
8
|
-
* @param {void} [constructor] - No constructor arguments; subclasses may define their own
|
|
3
|
+
* @description Base class that provides a ready-to-use logger instance.
|
|
4
|
+
* @summary Supplies inheriting classes with a lazily created, context-aware {@link Logger} via the protected `log` getter, promoting consistent structured logging without manual wiring.
|
|
9
5
|
* @class LoggedClass
|
|
10
6
|
* @example
|
|
11
7
|
* class UserService extends LoggedClass {
|
|
@@ -33,14 +29,15 @@ import { Logging } from "./logging.js";
|
|
|
33
29
|
*/
|
|
34
30
|
export class LoggedClass {
|
|
35
31
|
/**
|
|
36
|
-
* @description Lazily provides a context-aware logger for the current instance
|
|
37
|
-
* @summary
|
|
38
|
-
*
|
|
39
|
-
* @return {Logger} A logger bound to the subclass context
|
|
32
|
+
* @description Lazily provides a context-aware logger for the current instance.
|
|
33
|
+
* @summary Calls {@link Logging.for} with the subclass instance to obtain a logger whose context matches the subclass name.
|
|
34
|
+
* @return {Logger} Logger bound to the subclass context.
|
|
40
35
|
*/
|
|
41
36
|
get log() {
|
|
42
|
-
|
|
37
|
+
if (!this._log)
|
|
38
|
+
this._log = Logging.for(this);
|
|
39
|
+
return this._log;
|
|
43
40
|
}
|
|
44
41
|
constructor() { }
|
|
45
42
|
}
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nZ2VkQ2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvTG9nZ2VkQ2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxxQkFBa0I7QUFHcEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQU0sT0FBZ0IsV0FBVztJQUcvQjs7OztPQUlHO0lBQ0gsSUFBYyxHQUFHO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQVcsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsZ0JBQXlCLENBQUM7Q0FDM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIGEgcmVhZHktdG8tdXNlIGxvZ2dlciBpbnN0YW5jZS5cbiAqIEBzdW1tYXJ5IFN1cHBsaWVzIGluaGVyaXRpbmcgY2xhc3NlcyB3aXRoIGEgbGF6aWx5IGNyZWF0ZWQsIGNvbnRleHQtYXdhcmUge0BsaW5rIExvZ2dlcn0gdmlhIHRoZSBwcm90ZWN0ZWQgYGxvZ2AgZ2V0dGVyLCBwcm9tb3RpbmcgY29uc2lzdGVudCBzdHJ1Y3R1cmVkIGxvZ2dpbmcgd2l0aG91dCBtYW51YWwgd2lyaW5nLlxuICogQGNsYXNzIExvZ2dlZENsYXNzXG4gKiBAZXhhbXBsZVxuICogY2xhc3MgVXNlclNlcnZpY2UgZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gKiAgIGNyZWF0ZSh1c2VyOiBVc2VyKSB7XG4gKiAgICAgdGhpcy5sb2cuaW5mbyhgQ3JlYXRpbmcgdXNlciAke3VzZXIuaWR9YCk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBzdmMgPSBuZXcgVXNlclNlcnZpY2UoKTtcbiAqIHN2Yy5jcmVhdGUoeyBpZDogXCI0MlwiIH0pO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgSW5zdGFuY2UgYXMgU3ViY2xhc3MgSW5zdGFuY2VcbiAqICAgcGFydGljaXBhbnQgR2V0dGVyIGFzIExvZ2dlZENsYXNzLmxvZ1xuICogICBwYXJ0aWNpcGFudCBMb2dnaW5nIGFzIExvZ2dpbmdcbiAqICAgcGFydGljaXBhbnQgTG9nZ2VyIGFzIExvZ2dlclxuICpcbiAqICAgQ2xpZW50LT4+SW5zdGFuY2U6IGNhbGwgc29tZU1ldGhvZCgpXG4gKiAgIEluc3RhbmNlLT4+R2V0dGVyOiBhY2Nlc3MgdGhpcy5sb2dcbiAqICAgR2V0dGVyLT4+TG9nZ2luZzogTG9nZ2luZy5mb3IodGhpcylcbiAqICAgTG9nZ2luZy0tPj5HZXR0ZXI6IHJldHVybiBMb2dnZXJcbiAqICAgR2V0dGVyLS0+Pkluc3RhbmNlOiByZXR1cm4gTG9nZ2VyXG4gKiAgIEluc3RhbmNlLT4+TG9nZ2VyOiBpbmZvL2RlYnVnL2Vycm9yKC4uLilcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExvZ2dlZENsYXNzIHtcbiAgcHJpdmF0ZSBfbG9nPzogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGF6aWx5IHByb3ZpZGVzIGEgY29udGV4dC1hd2FyZSBsb2dnZXIgZm9yIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBDYWxscyB7QGxpbmsgTG9nZ2luZy5mb3J9IHdpdGggdGhlIHN1YmNsYXNzIGluc3RhbmNlIHRvIG9idGFpbiBhIGxvZ2dlciB3aG9zZSBjb250ZXh0IG1hdGNoZXMgdGhlIHN1YmNsYXNzIG5hbWUuXG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gTG9nZ2VyIGJvdW5kIHRvIHRoZSBzdWJjbGFzcyBjb250ZXh0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZykgdGhpcy5fbG9nID0gTG9nZ2luZy5mb3IodGhpcyBhcyBhbnkpO1xuICAgIHJldHVybiB0aGlzLl9sb2c7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7fVxufVxuIl19
|