@mnaoumov/typescript-lib 1.2.0 → 1.4.0
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/README.md +4 -1
- package/dist/lib/cjs/api-contract.cjs +49 -3
- package/dist/lib/cjs/api-contract.d.cts +86 -0
- package/dist/lib/cjs/async.cjs +5 -8
- package/dist/lib/cjs/async.d.cts +3 -6
- package/dist/lib/cjs/debug-switches.cjs +125 -0
- package/dist/lib/cjs/debug-switches.d.cts +124 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/type-guards.cjs +79 -3
- package/dist/lib/cjs/type-guards.d.cts +142 -1
- package/dist/lib/cjs/type.cjs +1 -1
- package/dist/lib/esm/api-contract.d.mts +86 -0
- package/dist/lib/esm/api-contract.mjs +47 -3
- package/dist/lib/esm/async.d.mts +3 -6
- package/dist/lib/esm/async.mjs +5 -8
- package/dist/lib/esm/debug-switches.d.mts +124 -0
- package/dist/lib/esm/debug-switches.mjs +96 -0
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/type-guards.d.mts +142 -1
- package/dist/lib/esm/type-guards.mjs +67 -2
- package/dist/lib/esm/type.mjs +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -48,7 +48,10 @@ export const COUNTER_API_CONTRACT = defineApiContract<CounterApi>({
|
|
|
48
48
|
- `createArgumentsSchema(guards, { vendor })` validates an argument list: one guard per parameter, issues carrying the argument index, too many arguments refused.
|
|
49
49
|
- `createTypeGuardSchema({ expected, typeGuard, vendor })` validates one value.
|
|
50
50
|
- `BOOLEAN_GUARD`, `NUMBER_GUARD`, `STRING_GUARD`, `STRING_ARRAY_GUARD` and `UNDEFINED_GUARD` are ready-made guards, `optionalGuard` and `nullableGuard` widen one, and a spread renames what it expects.
|
|
51
|
-
-
|
|
51
|
+
- `arrayGuard`, `literalGuard`, `unionGuard` and `instanceOfGuard` build a guard together with what it expects, and `createExpectedTypeGuard(expected, typeGuard)` pairs any other type guard with its text.
|
|
52
|
+
- The schema `vendor` defaults to `@mnaoumov/typescript-lib`. `createApiContractSchemaBuilders(vendor)` binds it once: destructure `createArgumentsSchema` and `createTypeGuardSchema` from it, and no call passes the vendor again.
|
|
53
|
+
|
|
54
|
+
The guards for an API's own shapes come from `@mnaoumov/typescript-lib/type-guards`, whose combinators work on bare type guards: `objectTypeGuard<T>({ ... })` takes one guard per property of `T` and none may be missing (`{ shouldRejectUnknownKeys: true }` refuses extra keys), and `arrayTypeGuard`, `literalTypeGuard`, `unionTypeGuard`, `optionalTypeGuard`, `nullableTypeGuard`, `instanceOfTypeGuard` and `functionTypeGuard` build the rest. A name ending in `TypeGuard` returns a bare type guard; the `api-contract` name without `Type` returns the same guard paired with its `expected` text.
|
|
52
55
|
|
|
53
56
|
Running the schemas belongs to whoever owns the call path. `@mnaoumov/obsidian-lib`'s plugin API registry runs them while its debugger is on.
|
|
54
57
|
|
|
@@ -28,11 +28,17 @@ __export(api_contract_exports, {
|
|
|
28
28
|
STRING_ARRAY_GUARD: () => STRING_ARRAY_GUARD,
|
|
29
29
|
STRING_GUARD: () => STRING_GUARD,
|
|
30
30
|
UNDEFINED_GUARD: () => UNDEFINED_GUARD,
|
|
31
|
+
arrayGuard: () => arrayGuard,
|
|
32
|
+
createApiContractSchemaBuilders: () => createApiContractSchemaBuilders,
|
|
31
33
|
createArgumentsSchema: () => createArgumentsSchema,
|
|
34
|
+
createExpectedTypeGuard: () => createExpectedTypeGuard,
|
|
32
35
|
createTypeGuardSchema: () => createTypeGuardSchema,
|
|
33
36
|
defineApiContract: () => defineApiContract,
|
|
37
|
+
instanceOfGuard: () => instanceOfGuard,
|
|
38
|
+
literalGuard: () => literalGuard,
|
|
34
39
|
nullableGuard: () => nullableGuard,
|
|
35
|
-
optionalGuard: () => optionalGuard
|
|
40
|
+
optionalGuard: () => optionalGuard,
|
|
41
|
+
unionGuard: () => unionGuard
|
|
36
42
|
});
|
|
37
43
|
module.exports = __toCommonJS(api_contract_exports);
|
|
38
44
|
var import_library = require('./library.cjs');
|
|
@@ -43,6 +49,15 @@ const NUMBER_GUARD = { expected: "a number", typeGuard: import_type_guards.isNum
|
|
|
43
49
|
const STRING_GUARD = { expected: "a string", typeGuard: import_type_guards.isString };
|
|
44
50
|
const STRING_ARRAY_GUARD = { expected: "an array of strings", typeGuard: import_type_guards.isStringArray };
|
|
45
51
|
const UNDEFINED_GUARD = { expected: "undefined", typeGuard: import_type_guards.isUndefined };
|
|
52
|
+
function arrayGuard(itemGuard) {
|
|
53
|
+
return createExpectedTypeGuard(`an array whose every item is ${itemGuard.expected}`, (0, import_type_guards.arrayTypeGuard)(itemGuard.typeGuard));
|
|
54
|
+
}
|
|
55
|
+
function createApiContractSchemaBuilders(vendor) {
|
|
56
|
+
return {
|
|
57
|
+
createArgumentsSchema: (parameters) => createArgumentsSchema(parameters, { vendor }),
|
|
58
|
+
createTypeGuardSchema: (guard) => createTypeGuardSchema({ ...guard, vendor })
|
|
59
|
+
};
|
|
60
|
+
}
|
|
46
61
|
function createArgumentsSchema(parameters, options) {
|
|
47
62
|
const parameterList = (0, import_object_utils.castTo)(parameters);
|
|
48
63
|
return createSchema((value) => {
|
|
@@ -56,6 +71,9 @@ function createArgumentsSchema(parameters, options) {
|
|
|
56
71
|
return issues.length === 0 ? { value: (0, import_object_utils.castTo)(value) } : { issues };
|
|
57
72
|
}, options?.vendor);
|
|
58
73
|
}
|
|
74
|
+
function createExpectedTypeGuard(expected, typeGuard) {
|
|
75
|
+
return { expected, typeGuard };
|
|
76
|
+
}
|
|
59
77
|
function createTypeGuardSchema(params) {
|
|
60
78
|
return createSchema(
|
|
61
79
|
(value) => params.typeGuard(value) ? { value } : { issues: [{ message: `Expected ${params.expected}.` }] },
|
|
@@ -65,6 +83,13 @@ function createTypeGuardSchema(params) {
|
|
|
65
83
|
function defineApiContract(contract) {
|
|
66
84
|
return contract;
|
|
67
85
|
}
|
|
86
|
+
function instanceOfGuard(constructor) {
|
|
87
|
+
return createExpectedTypeGuard(`an instance of ${constructor.name}`, (0, import_type_guards.instanceOfTypeGuard)(constructor));
|
|
88
|
+
}
|
|
89
|
+
function literalGuard(literals) {
|
|
90
|
+
const literalList = isReadonlyArray(literals) ? literals : Object.keys(literals);
|
|
91
|
+
return createExpectedTypeGuard(`one of ${literalList.map((literal) => formatLiteral(literal)).join(", ")}`, (0, import_type_guards.literalTypeGuard)(literalList));
|
|
92
|
+
}
|
|
68
93
|
function nullableGuard(guard) {
|
|
69
94
|
return {
|
|
70
95
|
expected: `${guard.expected} or null`,
|
|
@@ -77,6 +102,12 @@ function optionalGuard(guard) {
|
|
|
77
102
|
typeGuard: (value) => value === void 0 || guard.typeGuard(value)
|
|
78
103
|
};
|
|
79
104
|
}
|
|
105
|
+
function unionGuard(...guards) {
|
|
106
|
+
return createExpectedTypeGuard(
|
|
107
|
+
guards.map((guard) => guard.expected).join(" or "),
|
|
108
|
+
(0, import_type_guards.unionTypeGuard)(...guards.map((guard) => guard.typeGuard))
|
|
109
|
+
);
|
|
110
|
+
}
|
|
80
111
|
function createSchema(validate, vendor) {
|
|
81
112
|
return {
|
|
82
113
|
"~standard": {
|
|
@@ -86,6 +117,15 @@ function createSchema(validate, vendor) {
|
|
|
86
117
|
}
|
|
87
118
|
};
|
|
88
119
|
}
|
|
120
|
+
function formatLiteral(literal) {
|
|
121
|
+
if ((0, import_type_guards.isString)(literal)) {
|
|
122
|
+
return `'${literal}'`;
|
|
123
|
+
}
|
|
124
|
+
return typeof literal === "bigint" ? `${String(literal)}n` : String(literal);
|
|
125
|
+
}
|
|
126
|
+
function isReadonlyArray(value) {
|
|
127
|
+
return Array.isArray(value);
|
|
128
|
+
}
|
|
89
129
|
// Annotate the CommonJS export names for ESM import in node:
|
|
90
130
|
0 && (module.exports = {
|
|
91
131
|
BOOLEAN_GUARD,
|
|
@@ -93,10 +133,16 @@ function createSchema(validate, vendor) {
|
|
|
93
133
|
STRING_ARRAY_GUARD,
|
|
94
134
|
STRING_GUARD,
|
|
95
135
|
UNDEFINED_GUARD,
|
|
136
|
+
arrayGuard,
|
|
137
|
+
createApiContractSchemaBuilders,
|
|
96
138
|
createArgumentsSchema,
|
|
139
|
+
createExpectedTypeGuard,
|
|
97
140
|
createTypeGuardSchema,
|
|
98
141
|
defineApiContract,
|
|
142
|
+
instanceOfGuard,
|
|
143
|
+
literalGuard,
|
|
99
144
|
nullableGuard,
|
|
100
|
-
optionalGuard
|
|
145
|
+
optionalGuard,
|
|
146
|
+
unionGuard
|
|
101
147
|
});
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwaS1jb250cmFjdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBjb250cmFjdCBvZiBhbiBBUEkgb25lIG1vZHVsZSBleHBvc2VzIHRvIGFub3RoZXI6IHdoaWNoIG1ldGhvZHMgaXQgcHJvbWlzZXMsIGFuZCBhXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdGFuZGFyZHNjaGVtYS5kZXYgfCBTdGFuZGFyZCBTY2hlbWF9IG92ZXIgZWFjaCBtZXRob2QncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS5cbiAqXG4gKiBUaGUgc2NoZW1hcyBhcmUgcGxhaW4gb2JqZWN0cyBvdmVyIHBsYWluIGZ1bmN0aW9ucywgd2hpY2ggYSB0eXBlIGd1YXJkIGFscmVhZHkgaXMsIHNvIGEgY29udHJhY3QgY2FuIGNyb3NzIGFcbiAqIGJvdW5kYXJ5IGJldHdlZW4gdHdvIGNvcGllcyBvZiBhIGxpYnJhcnkgYW5kIHN0aWxsIGJlIHJ1biBieSB3aGljaGV2ZXIgY29weSByZWFkcyBpdC4gVGhlIGJ1aWxkZXJzIGhlcmUgdHVyblxuICogdGhlIGd1YXJkcyBhIG1vZHVsZSBhbHJlYWR5IGhhcyBpbnRvIHRoZSB0d28gc2hhcGVzIGEgbWV0aG9kIGNvbnRyYWN0IG5lZWRzOiBvbmUgdmFsdWUgKGFuIG91dHB1dCkgYW5kIG9uZVxuICogYXJndW1lbnQgbGlzdCAoYW4gaW5wdXQpLiB6b2QgLyB2YWxpYm90IC8gYXJrdHlwZSBzY2hlbWFzIHBsdWcgaW50byB0aGUgc2FtZSBzbG90cyB1bmNoYW5nZWQ7IHRoaXMgbW9kdWxlIGp1c3RcbiAqIGRvZXMgbm90IG1ha2UgZXZlcnkgcHJvdmlkZXIgYnVuZGxlIG9uZSB0byBkZXNjcmliZSB0d28gYXJndW1lbnRzLlxuICpcbiAqIFJ1bm5pbmcgdGhlIHNjaGVtYXMgaXMgbGVmdCB0byB3aG9ldmVyIG93bnMgdGhlIGNhbGwgcGF0aCwgc2luY2UgdGhhdCBpcyB3aGVyZSBhbiBpc3N1ZSBjYW4gYmUgcmVwb3J0ZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFuZGFyZFNjaGVtYVYxIH0gZnJvbSAnQHN0YW5kYXJkLXNjaGVtYS9zcGVjJztcblxuaW1wb3J0IHsgTElCUkFSWV9OQU1FIH0gZnJvbSAnLi9saWJyYXJ5LnRzJztcbmltcG9ydCB7IGNhc3RUbyB9IGZyb20gJy4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGlzQm9vbGVhbixcbiAgaXNOdW1iZXIsXG4gIGlzU3RyaW5nLFxuICBpc1N0cmluZ0FycmF5LFxuICBpc1VuZGVmaW5lZFxufSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcblxuLyoqXG4gKiBUaGUgY29udHJhY3QgYW4gQVBJIGRlY2xhcmVzOiBldmVyeSBrZXkgaXMgYSBtZXRob2QgdGhlIEFQSSBwcm9taXNlcyB0byBleHBvc2UsIGFuZCBpdHMgdmFsdWUgb3B0aW9uYWxseVxuICogY2FycmllcyB0aGUgcGF5bG9hZCBzY2hlbWFzIGZvciB0aGF0IG1ldGhvZC5cbiAqXG4gKiBUeXBlZCBvdmVyIHRoZSBBUEkgd2hlbiBvbmUgaXMgbmFtZWQ6IGBBcGlDb250cmFjdDxNeUFwaT5gIGhhcyBleGFjdGx5IG9uZSBlbnRyeSBwZXIgZnVuY3Rpb24gbWVtYmVyIG9mXG4gKiBgTXlBcGlgIChhIG1pc3NpbmcgbWV0aG9kLCBhbiBleHRyYSBvbmUgb3IgYSBtaXNzcGVsbGVkIG9uZSBkb2VzIG5vdCBjb21waWxlKSwgYW5kIGVhY2ggZW50cnkncyBzY2hlbWFzIG11c3RcbiAqIHByb2R1Y2UgdGhhdCBtZXRob2QncyBwYXJhbWV0ZXJzIGFuZCBhd2FpdGVkIHJldHVybiB2YWx1ZS4gV2l0aG91dCBhIHR5cGUgYXJndW1lbnQsIG9yIGZvciBgb2JqZWN0YCwgaXQgaXMgdGhlXG4gKiBsb29zZSByZWNvcmQgYSByZWFkZXIgdGhhdCBrbm93cyBub3RoaW5nIGFib3V0IHRoZSBBUEkgc2Vlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHRoZSBjb250cmFjdCBkZXNjcmliZXMuIGBvYmplY3RgLCB0aGUgZGVmYXVsdCwgbWVhbnMgXCJub3QgdHlwZWRcIi5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpQ29udHJhY3Q8VEFwaSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4gPSBvYmplY3QgZXh0ZW5kcyBUQXBpID8gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQXBpTWV0aG9kQ29udHJhY3Q+PlxuICA6IFR5cGVkQXBpQ29udHJhY3Q8VEFwaT47XG5cbi8qKlxuICogVGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgYSBzaW5nbGUgQVBJIG1ldGhvZC4gQm90aCBoYWx2ZXMgYXJlIG9wdGlvbmFsOiBhIG1ldGhvZCBtYXkgZGVjbGFyZSBvbmx5IGl0cyBpbnB1dCxcbiAqIG9ubHkgaXRzIG91dHB1dCwgbmVpdGhlciAodGhlIGVudHJ5IHRoZW4ganVzdCBkZWNsYXJlcyB0aGF0IHRoZSBtZXRob2QgbXVzdCBleGlzdCksIG9yIGJvdGguXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLCBhcyBhIHR1cGxlLCB3aGljaCB0aGUgaW5wdXQgc2NoZW1hIG11c3QgcHJvZHVjZS5cbiAqIEB0eXBlUGFyYW0gVFJldHVyblZhbHVlIC0gVGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSwgYXdhaXRlZCwgd2hpY2ggdGhlIG91dHB1dCBzY2hlbWEgbXVzdCBwcm9kdWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaU1ldGhvZENvbnRyYWN0PFRQYXJhbWV0ZXJzID0gdW5rbm93biwgVFJldHVyblZhbHVlID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyBhcmd1bWVudHMsIGFzIGFuIGFycmF5LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ/OiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFRQYXJhbWV0ZXJzPjtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUsIG9yLCB3aGVuIHRoZSBtZXRob2QgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgdmFsdWUgaXQgcmVzb2x2ZXMgdG8uXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ/OiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFRSZXR1cm5WYWx1ZT47XG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbiBtZW1iZXJzIG9mIGFuIEFQSSwgd2hpY2ggYXJlIGV4YWN0bHkgdGhlIGtleXMgYSB0eXBlZCB7QGxpbmsgQXBpQ29udHJhY3R9IGhhcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJLlxuICovXG5leHBvcnQgdHlwZSBBcGlNZXRob2ROYW1lPFRBcGkgZXh0ZW5kcyBvYmplY3Q+ID0ga2V5b2YgQXBpTWV0aG9kczxUQXBpPiAmIHN0cmluZztcblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gbWVtYmVycyBvZiBhbiBBUEkuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpTWV0aG9kczxUQXBpIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW1RLZXkgaW4ga2V5b2YgVEFwaSBhcyBUQXBpW1RLZXldIGV4dGVuZHMgKC4uLmFyZ3VtZW50c186IG5ldmVyKSA9PiB1bmtub3duID8gVEtleSA6IG5ldmVyXTogVEFwaVtUS2V5XTtcbn07XG5cbi8qKlxuICogT25lIHR5cGUgZ3VhcmQgcGVyIHBhcmFtZXRlciBvZiBhIG1ldGhvZCwgaW4gb3JkZXIuXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgdHlwZSBBcmd1bWVudFR5cGVHdWFyZHM8VFBhcmFtZXRlcnMgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+ID0ge1xuICByZWFkb25seSBbVEluZGV4IGluIGtleW9mIFRQYXJhbWV0ZXJzXTogRXhwZWN0ZWRUeXBlR3VhcmQ8VFBhcmFtZXRlcnNbVEluZGV4XT47XG59O1xuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlQXJndW1lbnRzU2NoZW1hfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcmd1bWVudHNTY2hlbWFPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBTdGFuZGFyZCBTY2hlbWEgYHZlbmRvcmAgdGhlIHNjaGVtYSByZXBvcnRzLiBEZWZhdWx0cyB0byB0aGlzIGxpYnJhcnkncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVuZG9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVUeXBlR3VhcmRTY2hlbWF9OiB0aGUgZ3VhcmQsIHdoYXQgaXQgZXhwZWN0cywgYW5kIG9wdGlvbmFsbHkgdGhlIHNjaGVtYSdzIHZlbmRvci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVUeXBlR3VhcmRTY2hlbWFQYXJhbXM8VD4gZXh0ZW5kcyBFeHBlY3RlZFR5cGVHdWFyZDxUPiB7XG4gIC8qKlxuICAgKiBUaGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIHRoZSBzY2hlbWEgcmVwb3J0cy4gRGVmYXVsdHMgdG8gdGhpcyBsaWJyYXJ5J3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlbmRvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPbmUgdmFsdWUgYSBzY2hlbWEgYWNjZXB0cywgZGVzY3JpYmVkIGJ5IGEgdHlwZSBndWFyZCBhbmQgYnkgd2hhdCBpdCBleHBlY3RzLCBmb3IgdGhlIGlzc3VlIG1lc3NhZ2UuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICAvKipcbiAgICogV2hhdCB0aGUgdmFsdWUgc2hvdWxkIGhhdmUgYmVlbiwgcGhyYXNlZCB0byBmb2xsb3cgXCJFeHBlY3RlZFwiLCBlLmcuIGAnYSBzdHJpbmcnYC5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdGVkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciB0aGUgdmFsdWUgaXMgYWNjZXB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIGBUYC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGVHdWFyZDogKHZhbHVlOiB1bmtub3duKSA9PiB2YWx1ZSBpcyBUO1xufVxuXG4vKipcbiAqIFRoZSB7QGxpbmsgQXBpQ29udHJhY3R9IG9mIGEgbmFtZWQgQVBJOiBvbmUgZW50cnkgcGVyIGZ1bmN0aW9uIG1lbWJlciwgZWFjaCB0eXBlZCBhZ2FpbnN0IHRoYXQgbWVtYmVyLiBCb3RoXG4gKiBzY2hlbWFzIGFyZSBSRVFVSVJFRCBoZXJlLCBzbyBhIHR5cGVkIGNvbnRyYWN0IGlzIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiBldmVyeSBzaWduYXR1cmUgYW5kIGEgYHt9YCBlbnRyeSBkb2VzXG4gKiBub3QgY29tcGlsZS4gT25seSB0aGUgbG9vc2UgZm9ybSBsZWF2ZXMgdGhlbSBvcHRpb25hbC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHRoZSBjb250cmFjdCBkZXNjcmliZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFR5cGVkQXBpQ29udHJhY3Q8VEFwaSBleHRlbmRzIG9iamVjdD4gPSB7XG4gIHJlYWRvbmx5IFtUS2V5IGluIEFwaU1ldGhvZE5hbWU8VEFwaT5dLT86IFRBcGlbVEtleV0gZXh0ZW5kcyAoLi4uYXJndW1lbnRzXzogaW5mZXIgVFBhcmFtZXRlcnMpID0+IGluZmVyIFRSZXR1cm5WYWx1ZSA/IFJlcXVpcmVkPEFwaU1ldGhvZENvbnRyYWN0PFRQYXJhbWV0ZXJzLCBBd2FpdGVkPFRSZXR1cm5WYWx1ZT4+PlxuICAgIDogbmV2ZXI7XG59O1xuXG50eXBlIE11dGFibGVUdXBsZTxUVHVwbGUgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+ID0geyAtcmVhZG9ubHkgW1RJbmRleCBpbiBrZXlvZiBUVHVwbGVdOiBUVHVwbGVbVEluZGV4XSB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYSBib29sZWFuLlxuICovXG5leHBvcnQgY29uc3QgQk9PTEVBTl9HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8Ym9vbGVhbj4gPSB7IGV4cGVjdGVkOiAnYSBib29sZWFuJywgdHlwZUd1YXJkOiBpc0Jvb2xlYW4gfTtcblxuLyoqXG4gKiBBY2NlcHRzIGEgbnVtYmVyLlxuICovXG5leHBvcnQgY29uc3QgTlVNQkVSX0dVQVJEOiBFeHBlY3RlZFR5cGVHdWFyZDxudW1iZXI+ID0geyBleHBlY3RlZDogJ2EgbnVtYmVyJywgdHlwZUd1YXJkOiBpc051bWJlciB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYSBzdHJpbmcuIFNwcmVhZCBpdCB0byBzYXkgd2hhdCB0aGUgc3RyaW5nIGlzOiBgeyAuLi5TVFJJTkdfR1VBUkQsIGV4cGVjdGVkOiAnYSBwYXRoJyB9YC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUUklOR19HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8c3RyaW5nPiA9IHsgZXhwZWN0ZWQ6ICdhIHN0cmluZycsIHR5cGVHdWFyZDogaXNTdHJpbmcgfTtcblxuLyoqXG4gKiBBY2NlcHRzIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKi9cbmV4cG9ydCBjb25zdCBTVFJJTkdfQVJSQVlfR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPHN0cmluZ1tdPiA9IHsgZXhwZWN0ZWQ6ICdhbiBhcnJheSBvZiBzdHJpbmdzJywgdHlwZUd1YXJkOiBpc1N0cmluZ0FycmF5IH07XG5cbi8qKlxuICogQWNjZXB0cyBgdW5kZWZpbmVkYCwgd2hpY2ggaXMgdGhlIG91dHB1dCBvZiBhIG1ldGhvZCByZXR1cm5pbmcgYHZvaWRgIG9yIGBQcm9taXNlPHZvaWQ+YC5cbiAqL1xuZXhwb3J0IGNvbnN0IFVOREVGSU5FRF9HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8dW5kZWZpbmVkPiA9IHsgZXhwZWN0ZWQ6ICd1bmRlZmluZWQnLCB0eXBlR3VhcmQ6IGlzVW5kZWZpbmVkIH07XG5cbi8qKlxuICogQnVpbGRzIHRoZSBpbnB1dCBzY2hlbWEgb2YgYSBtZXRob2QgY29udHJhY3Q6IGEgc2NoZW1hIG92ZXIgdGhlIG1ldGhvZCdzIEFSR1VNRU5UIExJU1QsIG9uZSB0eXBlIGd1YXJkIHBlclxuICogcGFyYW1ldGVyLiBBbiBhcmd1bWVudCB0aGF0IGZhaWxzIGl0cyBndWFyZCBpcyByZXBvcnRlZCB3aXRoIGl0cyBpbmRleCBhcyB0aGUgaXNzdWUgcGF0aCwgYW5kIGFuIGFyZ3VtZW50IGxpc3RcbiAqIGxvbmdlciB0aGFuIHRoZSBwYXJhbWV0ZXIgbGlzdCBpcyByZWZ1c2VkLiBBIG1pc3NpbmcgYXJndW1lbnQgcmVhY2hlcyBpdHMgZ3VhcmQgYXMgYHVuZGVmaW5lZGAsIHNvIGFuIG9wdGlvbmFsXG4gKiBwYXJhbWV0ZXIncyBndWFyZCBhY2NlcHRzIGB1bmRlZmluZWRgIChzZWUge0BsaW5rIG9wdGlvbmFsR3VhcmR9KS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXJhbWV0ZXJzIC0gVGhlIG1ldGhvZCdzIHBhcmFtZXRlcnMsIGluZmVycmVkIGZyb20gdGhlIGd1YXJkcyBvciBmcm9tIHRoZSBjb250cmFjdCBlbnRyeS5cbiAqIEBwYXJhbSBwYXJhbWV0ZXJzIC0gT25lIGd1YXJkIHBlciBwYXJhbWV0ZXIsIGluIG9yZGVyLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHNjaGVtYS5cbiAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcmd1bWVudHNTY2hlbWE8Y29uc3QgVFBhcmFtZXRlcnMgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+KFxuICBwYXJhbWV0ZXJzOiBBcmd1bWVudFR5cGVHdWFyZHM8VFBhcmFtZXRlcnM+LFxuICBvcHRpb25zPzogQ3JlYXRlQXJndW1lbnRzU2NoZW1hT3B0aW9uc1xuKTogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBNdXRhYmxlVHVwbGU8VFBhcmFtZXRlcnM+PiB7XG4gIGNvbnN0IHBhcmFtZXRlckxpc3QgPSBjYXN0VG88cmVhZG9ubHkgRXhwZWN0ZWRUeXBlR3VhcmQ8dW5rbm93bj5bXT4ocGFyYW1ldGVycyk7XG4gIHJldHVybiBjcmVhdGVTY2hlbWEoKHZhbHVlOiB1bmtub3duKTogU3RhbmRhcmRTY2hlbWFWMS5SZXN1bHQ8TXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj4gPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGlzc3VlczogW3sgbWVzc2FnZTogJ0V4cGVjdGVkIGFuIGFyZ3VtZW50IGxpc3QuJyB9XSB9O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5sZW5ndGggPiBwYXJhbWV0ZXJMaXN0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgaXNzdWVzOiBbeyBtZXNzYWdlOiBgRXhwZWN0ZWQgYXQgbW9zdCAke1N0cmluZyhwYXJhbWV0ZXJMaXN0Lmxlbmd0aCl9IGFyZ3VtZW50KHMpLCBnb3QgJHtTdHJpbmcodmFsdWUubGVuZ3RoKX0uYCB9XSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGlzc3VlcyA9IHBhcmFtZXRlckxpc3QuZmxhdE1hcCgocGFyYW1ldGVyLCBpbmRleCk6IFN0YW5kYXJkU2NoZW1hVjEuSXNzdWVbXSA9PiBwYXJhbWV0ZXIudHlwZUd1YXJkKHZhbHVlW2luZGV4XSkgPyBbXSA6IFt7IG1lc3NhZ2U6IGBFeHBlY3RlZCAke3BhcmFtZXRlci5leHBlY3RlZH0uYCwgcGF0aDogW2luZGV4XSB9XSk7XG4gICAgcmV0dXJuIGlzc3Vlcy5sZW5ndGggPT09IDAgPyB7IHZhbHVlOiBjYXN0VG88TXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj4odmFsdWUpIH0gOiB7IGlzc3VlcyB9O1xuICB9LCBvcHRpb25zPy52ZW5kb3IpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHNjaGVtYSBvdmVyIG9uZSB2YWx1ZSBmcm9tIGEgdHlwZSBndWFyZDogdGhlIG91dHB1dCBzY2hlbWEgb2YgYSBtZXRob2QgY29udHJhY3QsIHR5cGljYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZ3VhcmQsIHdoYXQgaXQgZXhwZWN0cywgYW5kIG9wdGlvbmFsbHkgdGhlIHNjaGVtYSdzIHZlbmRvci5cbiAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUeXBlR3VhcmRTY2hlbWE8VD4ocGFyYW1zOiBDcmVhdGVUeXBlR3VhcmRTY2hlbWFQYXJhbXM8VD4pOiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFQ+IHtcbiAgcmV0dXJuIGNyZWF0ZVNjaGVtYShcbiAgICAodmFsdWU6IHVua25vd24pOiBTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDxUPiA9PiBwYXJhbXMudHlwZUd1YXJkKHZhbHVlKSA/IHsgdmFsdWUgfSA6IHsgaXNzdWVzOiBbeyBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtwYXJhbXMuZXhwZWN0ZWR9LmAgfV0gfSxcbiAgICBwYXJhbXMudmVuZG9yXG4gICk7XG59XG5cbi8qKlxuICogU3RhdGVzIGEgY29udHJhY3QgYWdhaW5zdCBhbiBBUEkgdHlwZSwgc28gZXZlcnkgZW50cnkgaXMgY2hlY2tlZCBhZ2FpbnN0IGl0cyBtZXRob2QgYW5kIHRoZSBzY2hlbWEgYnVpbGRlcnNcbiAqIGluc2lkZSBpdCBpbmZlciB0aGVpciB0eXBlcyBmcm9tIHRoZSBtZXRob2QgcmF0aGVyIHRoYW4gZnJvbSBhIHJlc3RhdGVkIHR1cGxlLiBJdCByZXR1cm5zIHRoZSBjb250cmFjdCBhcyBpcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHRoZSBjb250cmFjdCBkZXNjcmliZXMuXG4gKiBAcGFyYW0gY29udHJhY3QgLSBUaGUgY29udHJhY3QuXG4gKiBAcmV0dXJucyBUaGUgc2FtZSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUFwaUNvbnRyYWN0PFRBcGkgZXh0ZW5kcyBvYmplY3Q+KGNvbnRyYWN0OiBUeXBlZEFwaUNvbnRyYWN0PE5vSW5mZXI8VEFwaT4+KTogVHlwZWRBcGlDb250cmFjdDxUQXBpPiB7XG4gIHJldHVybiBjb250cmFjdDtcbn1cblxuLyoqXG4gKiBXaWRlbnMgYSBndWFyZCB0byBhbHNvIGFjY2VwdCBgbnVsbGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZ3VhcmQgLSBUaGUgZ3VhcmQgdG8gd2lkZW4uXG4gKiBAcmV0dXJucyBBIGd1YXJkIGFjY2VwdGluZyB3aGF0IGBndWFyZGAgYWNjZXB0cywgb3IgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbnVsbGFibGVHdWFyZDxUPihndWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4pOiBFeHBlY3RlZFR5cGVHdWFyZDxudWxsIHwgVD4ge1xuICByZXR1cm4ge1xuICAgIGV4cGVjdGVkOiBgJHtndWFyZC5leHBlY3RlZH0gb3IgbnVsbGAsXG4gICAgdHlwZUd1YXJkOiAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHwgVCA9PiB2YWx1ZSA9PT0gbnVsbCB8fCBndWFyZC50eXBlR3VhcmQodmFsdWUpXG4gIH07XG59XG5cbi8qKlxuICogV2lkZW5zIGEgZ3VhcmQgdG8gYWxzbyBhY2NlcHQgYHVuZGVmaW5lZGAsIHdoaWNoIGlzIHdoYXQgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHJlY2VpdmVzIHdoZW4gaXQgaXMgbGVmdCBvdXQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZ3VhcmQgLSBUaGUgZ3VhcmQgdG8gd2lkZW4uXG4gKiBAcmV0dXJucyBBIGd1YXJkIGFjY2VwdGluZyB3aGF0IGBndWFyZGAgYWNjZXB0cywgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbEd1YXJkPFQ+KGd1YXJkOiBFeHBlY3RlZFR5cGVHdWFyZDxUPik6IEV4cGVjdGVkVHlwZUd1YXJkPFQgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHtcbiAgICBleHBlY3RlZDogYCR7Z3VhcmQuZXhwZWN0ZWR9IG9yIHVuZGVmaW5lZGAsXG4gICAgdHlwZUd1YXJkOiAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUIHwgdW5kZWZpbmVkID0+IHZhbHVlID09PSB1bmRlZmluZWQgfHwgZ3VhcmQudHlwZUd1YXJkKHZhbHVlKVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTY2hlbWE8VD4odmFsaWRhdGU6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RhbmRhcmRTY2hlbWFWMS5SZXN1bHQ8VD4sIHZlbmRvcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBUPiB7XG4gIHJldHVybiB7XG4gICAgJ35zdGFuZGFyZCc6IHtcbiAgICAgIHZhbGlkYXRlLFxuICAgICAgdmVuZG9yOiB2ZW5kb3IgPz8gTElCUkFSWV9OQU1FLFxuICAgICAgdmVyc2lvbjogMVxuICAgIH1cbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlCQSxxQkFBNkI7QUFDN0IsMEJBQXVCO0FBQ3ZCLHlCQU1PO0FBc0hBLE1BQU0sZ0JBQTRDLEVBQUUsVUFBVSxhQUFhLFdBQVcsNkJBQVU7QUFLaEcsTUFBTSxlQUEwQyxFQUFFLFVBQVUsWUFBWSxXQUFXLDRCQUFTO0FBSzVGLE1BQU0sZUFBMEMsRUFBRSxVQUFVLFlBQVksV0FBVyw0QkFBUztBQUs1RixNQUFNLHFCQUFrRCxFQUFFLFVBQVUsdUJBQXVCLFdBQVcsaUNBQWM7QUFLcEgsTUFBTSxrQkFBZ0QsRUFBRSxVQUFVLGFBQWEsV0FBVywrQkFBWTtBQWF0RyxTQUFTLHNCQUNkLFlBQ0EsU0FDc0Q7QUFDdEQsUUFBTSxvQkFBZ0IsNEJBQThDLFVBQVU7QUFDOUUsU0FBTyxhQUFhLENBQUMsVUFBdUU7QUFDMUYsUUFBSSxDQUFDLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFDekIsYUFBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFNBQVMsNkJBQTZCLENBQUMsRUFBRTtBQUFBLElBQy9EO0FBRUEsUUFBSSxNQUFNLFNBQVMsY0FBYyxRQUFRO0FBQ3ZDLGFBQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLG9CQUFvQixPQUFPLGNBQWMsTUFBTSxDQUFDLHFCQUFxQixPQUFPLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQUEsSUFDL0g7QUFFQSxVQUFNLFNBQVMsY0FBYyxRQUFRLENBQUMsV0FBVyxVQUFvQyxVQUFVLFVBQVUsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsWUFBWSxVQUFVLFFBQVEsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUM3TCxXQUFPLE9BQU8sV0FBVyxJQUFJLEVBQUUsV0FBTyw0QkFBa0MsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPO0FBQUEsRUFDOUYsR0FBRyxTQUFTLE1BQU07QUFDcEI7QUFTTyxTQUFTLHNCQUF5QixRQUFzRTtBQUM3RyxTQUFPO0FBQUEsSUFDTCxDQUFDLFVBQStDLE9BQU8sVUFBVSxLQUFLLElBQUksRUFBRSxNQUFNLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLFlBQVksT0FBTyxRQUFRLElBQUksQ0FBQyxFQUFFO0FBQUEsSUFDOUksT0FBTztBQUFBLEVBQ1Q7QUFDRjtBQVVPLFNBQVMsa0JBQXVDLFVBQW1FO0FBQ3hILFNBQU87QUFDVDtBQVNPLFNBQVMsY0FBaUIsT0FBMEQ7QUFDekYsU0FBTztBQUFBLElBQ0wsVUFBVSxHQUFHLE1BQU0sUUFBUTtBQUFBLElBQzNCLFdBQVcsQ0FBQyxVQUFzQyxVQUFVLFFBQVEsTUFBTSxVQUFVLEtBQUs7QUFBQSxFQUMzRjtBQUNGO0FBU08sU0FBUyxjQUFpQixPQUErRDtBQUM5RixTQUFPO0FBQUEsSUFDTCxVQUFVLEdBQUcsTUFBTSxRQUFRO0FBQUEsSUFDM0IsV0FBVyxDQUFDLFVBQTJDLFVBQVUsVUFBYSxNQUFNLFVBQVUsS0FBSztBQUFBLEVBQ3JHO0FBQ0Y7QUFFQSxTQUFTLGFBQWdCLFVBQTBELFFBQTBEO0FBQzNJLFNBQU87QUFBQSxJQUNMLGFBQWE7QUFBQSxNQUNYO0FBQUEsTUFDQSxRQUFRLFVBQVU7QUFBQSxNQUNsQixTQUFTO0FBQUEsSUFDWDtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwaS1jb250cmFjdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBjb250cmFjdCBvZiBhbiBBUEkgb25lIG1vZHVsZSBleHBvc2VzIHRvIGFub3RoZXI6IHdoaWNoIG1ldGhvZHMgaXQgcHJvbWlzZXMsIGFuZCBhXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdGFuZGFyZHNjaGVtYS5kZXYgfCBTdGFuZGFyZCBTY2hlbWF9IG92ZXIgZWFjaCBtZXRob2QncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS5cbiAqXG4gKiBUaGUgc2NoZW1hcyBhcmUgcGxhaW4gb2JqZWN0cyBvdmVyIHBsYWluIGZ1bmN0aW9ucywgd2hpY2ggYSB0eXBlIGd1YXJkIGFscmVhZHkgaXMsIHNvIGEgY29udHJhY3QgY2FuIGNyb3NzIGFcbiAqIGJvdW5kYXJ5IGJldHdlZW4gdHdvIGNvcGllcyBvZiBhIGxpYnJhcnkgYW5kIHN0aWxsIGJlIHJ1biBieSB3aGljaGV2ZXIgY29weSByZWFkcyBpdC4gVGhlIGJ1aWxkZXJzIGhlcmUgdHVyblxuICogdGhlIGd1YXJkcyBhIG1vZHVsZSBhbHJlYWR5IGhhcyBpbnRvIHRoZSB0d28gc2hhcGVzIGEgbWV0aG9kIGNvbnRyYWN0IG5lZWRzOiBvbmUgdmFsdWUgKGFuIG91dHB1dCkgYW5kIG9uZVxuICogYXJndW1lbnQgbGlzdCAoYW4gaW5wdXQpLiB6b2QgLyB2YWxpYm90IC8gYXJrdHlwZSBzY2hlbWFzIHBsdWcgaW50byB0aGUgc2FtZSBzbG90cyB1bmNoYW5nZWQ7IHRoaXMgbW9kdWxlIGp1c3RcbiAqIGRvZXMgbm90IG1ha2UgZXZlcnkgcHJvdmlkZXIgYnVuZGxlIG9uZSB0byBkZXNjcmliZSB0d28gYXJndW1lbnRzLlxuICpcbiAqIFJ1bm5pbmcgdGhlIHNjaGVtYXMgaXMgbGVmdCB0byB3aG9ldmVyIG93bnMgdGhlIGNhbGwgcGF0aCwgc2luY2UgdGhhdCBpcyB3aGVyZSBhbiBpc3N1ZSBjYW4gYmUgcmVwb3J0ZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFuZGFyZFNjaGVtYVYxIH0gZnJvbSAnQHN0YW5kYXJkLXNjaGVtYS9zcGVjJztcblxuaW1wb3J0IHR5cGUge1xuICBHdWFyZGVkVHlwZSxcbiAgTGl0ZXJhbCxcbiAgVHlwZUd1YXJkXG59IGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuXG5pbXBvcnQgeyBMSUJSQVJZX05BTUUgfSBmcm9tICcuL2xpYnJhcnkudHMnO1xuaW1wb3J0IHsgY2FzdFRvIH0gZnJvbSAnLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHtcbiAgYXJyYXlUeXBlR3VhcmQsXG4gIGluc3RhbmNlT2ZUeXBlR3VhcmQsXG4gIGlzQm9vbGVhbixcbiAgaXNOdW1iZXIsXG4gIGlzU3RyaW5nLFxuICBpc1N0cmluZ0FycmF5LFxuICBpc1VuZGVmaW5lZCxcbiAgbGl0ZXJhbFR5cGVHdWFyZCxcbiAgdW5pb25UeXBlR3VhcmRcbn0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IGFuIEFQSSBkZWNsYXJlczogZXZlcnkga2V5IGlzIGEgbWV0aG9kIHRoZSBBUEkgcHJvbWlzZXMgdG8gZXhwb3NlLCBhbmQgaXRzIHZhbHVlIG9wdGlvbmFsbHlcbiAqIGNhcnJpZXMgdGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgdGhhdCBtZXRob2QuXG4gKlxuICogVHlwZWQgb3ZlciB0aGUgQVBJIHdoZW4gb25lIGlzIG5hbWVkOiBgQXBpQ29udHJhY3Q8TXlBcGk+YCBoYXMgZXhhY3RseSBvbmUgZW50cnkgcGVyIGZ1bmN0aW9uIG1lbWJlciBvZlxuICogYE15QXBpYCAoYSBtaXNzaW5nIG1ldGhvZCwgYW4gZXh0cmEgb25lIG9yIGEgbWlzc3BlbGxlZCBvbmUgZG9lcyBub3QgY29tcGlsZSksIGFuZCBlYWNoIGVudHJ5J3Mgc2NoZW1hcyBtdXN0XG4gKiBwcm9kdWNlIHRoYXQgbWV0aG9kJ3MgcGFyYW1ldGVycyBhbmQgYXdhaXRlZCByZXR1cm4gdmFsdWUuIFdpdGhvdXQgYSB0eXBlIGFyZ3VtZW50LCBvciBmb3IgYG9iamVjdGAsIGl0IGlzIHRoZVxuICogbG9vc2UgcmVjb3JkIGEgcmVhZGVyIHRoYXQga25vd3Mgbm90aGluZyBhYm91dCB0aGUgQVBJIHNlZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0aGUgY29udHJhY3QgZGVzY3JpYmVzLiBgb2JqZWN0YCwgdGhlIGRlZmF1bHQsIG1lYW5zIFwibm90IHR5cGVkXCIuXG4gKi9cbmV4cG9ydCB0eXBlIEFwaUNvbnRyYWN0PFRBcGkgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+ID0gb2JqZWN0IGV4dGVuZHMgVEFwaSA/IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIEFwaU1ldGhvZENvbnRyYWN0Pj5cbiAgOiBUeXBlZEFwaUNvbnRyYWN0PFRBcGk+O1xuXG4vKipcbiAqIFRoZSBzY2hlbWEgYnVpbGRlcnMgb2YgdGhpcyBtb2R1bGUgd2l0aCB0aGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIGFscmVhZHkgYm91bmQsIGFzXG4gKiB7QGxpbmsgY3JlYXRlQXBpQ29udHJhY3RTY2hlbWFCdWlsZGVyc30gcmV0dXJucyB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUNvbnRyYWN0U2NoZW1hQnVpbGRlcnMge1xuICAvKipcbiAgICoge0BsaW5rIGNyZWF0ZUFyZ3VtZW50c1NjaGVtYX0sIHJlcG9ydGluZyB0aGUgYm91bmQgdmVuZG9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRQYXJhbWV0ZXJzIC0gVGhlIG1ldGhvZCdzIHBhcmFtZXRlcnMsIGluZmVycmVkIGZyb20gdGhlIGd1YXJkcyBvciBmcm9tIHRoZSBjb250cmFjdCBlbnRyeS5cbiAgICogQHBhcmFtIHBhcmFtZXRlcnMgLSBPbmUgZ3VhcmQgcGVyIHBhcmFtZXRlciwgaW4gb3JkZXIuXG4gICAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVBcmd1bWVudHNTY2hlbWE6IDxjb25zdCBUUGFyYW1ldGVycyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4oXG4gICAgcGFyYW1ldGVyczogQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzPlxuICApID0+IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgTXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj47XG5cbiAgLyoqXG4gICAqIHtAbGluayBjcmVhdGVUeXBlR3VhcmRTY2hlbWF9LCByZXBvcnRpbmcgdGhlIGJvdW5kIHZlbmRvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gICAqIEBwYXJhbSBndWFyZCAtIFRoZSBndWFyZCBhbmQgd2hhdCBpdCBleHBlY3RzLlxuICAgKiBAcmV0dXJucyBUaGUgc2NoZW1hLlxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlVHlwZUd1YXJkU2NoZW1hOiA8VD4oZ3VhcmQ6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+KSA9PiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFQ+O1xufVxuXG4vKipcbiAqIFRoZSBwYXlsb2FkIHNjaGVtYXMgZm9yIGEgc2luZ2xlIEFQSSBtZXRob2QuIEJvdGggaGFsdmVzIGFyZSBvcHRpb25hbDogYSBtZXRob2QgbWF5IGRlY2xhcmUgb25seSBpdHMgaW5wdXQsXG4gKiBvbmx5IGl0cyBvdXRwdXQsIG5laXRoZXIgKHRoZSBlbnRyeSB0aGVuIGp1c3QgZGVjbGFyZXMgdGhhdCB0aGUgbWV0aG9kIG11c3QgZXhpc3QpLCBvciBib3RoLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBhcmFtZXRlcnMgLSBUaGUgbWV0aG9kJ3MgcGFyYW1ldGVycywgYXMgYSB0dXBsZSwgd2hpY2ggdGhlIGlucHV0IHNjaGVtYSBtdXN0IHByb2R1Y2UuXG4gKiBAdHlwZVBhcmFtIFRSZXR1cm5WYWx1ZSAtIFRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUsIGF3YWl0ZWQsIHdoaWNoIHRoZSBvdXRwdXQgc2NoZW1hIG11c3QgcHJvZHVjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlNZXRob2RDb250cmFjdDxUUGFyYW1ldGVycyA9IHVua25vd24sIFRSZXR1cm5WYWx1ZSA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzLCBhcyBhbiBhcnJheS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0PzogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBUUGFyYW1ldGVycz47XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLCBvciwgd2hlbiB0aGUgbWV0aG9kIHJldHVybnMgYSB0aGVuYWJsZSwgdGhlIHZhbHVlIGl0IHJlc29sdmVzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0PzogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBUUmV0dXJuVmFsdWU+O1xufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgZnVuY3Rpb24gbWVtYmVycyBvZiBhbiBBUEksIHdoaWNoIGFyZSBleGFjdGx5IHRoZSBrZXlzIGEgdHlwZWQge0BsaW5rIEFwaUNvbnRyYWN0fSBoYXMuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpTWV0aG9kTmFtZTxUQXBpIGV4dGVuZHMgb2JqZWN0PiA9IGtleW9mIEFwaU1ldGhvZHM8VEFwaT4gJiBzdHJpbmc7XG5cbi8qKlxuICogVGhlIGZ1bmN0aW9uIG1lbWJlcnMgb2YgYW4gQVBJLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkuXG4gKi9cbmV4cG9ydCB0eXBlIEFwaU1ldGhvZHM8VEFwaSBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtUS2V5IGluIGtleW9mIFRBcGkgYXMgVEFwaVtUS2V5XSBleHRlbmRzICguLi5hcmd1bWVudHNfOiBuZXZlcikgPT4gdW5rbm93biA/IFRLZXkgOiBuZXZlcl06IFRBcGlbVEtleV07XG59O1xuXG4vKipcbiAqIE9uZSB0eXBlIGd1YXJkIHBlciBwYXJhbWV0ZXIgb2YgYSBtZXRob2QsIGluIG9yZGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBhcmFtZXRlcnMgLSBUaGUgbWV0aG9kJ3MgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IHR5cGUgQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPiA9IHtcbiAgcmVhZG9ubHkgW1RJbmRleCBpbiBrZXlvZiBUUGFyYW1ldGVyc106IEV4cGVjdGVkVHlwZUd1YXJkPFRQYXJhbWV0ZXJzW1RJbmRleF0+O1xufTtcbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZUFyZ3VtZW50c1NjaGVtYX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQXJndW1lbnRzU2NoZW1hT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIHRoZSBzY2hlbWEgcmVwb3J0cy4gRGVmYXVsdHMgdG8gdGhpcyBsaWJyYXJ5J3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlbmRvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlVHlwZUd1YXJkU2NoZW1hfTogdGhlIGd1YXJkLCB3aGF0IGl0IGV4cGVjdHMsIGFuZCBvcHRpb25hbGx5IHRoZSBzY2hlbWEncyB2ZW5kb3IuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVHlwZUd1YXJkU2NoZW1hUGFyYW1zPFQ+IGV4dGVuZHMgRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICAvKipcbiAgICogVGhlIFN0YW5kYXJkIFNjaGVtYSBgdmVuZG9yYCB0aGUgc2NoZW1hIHJlcG9ydHMuIERlZmF1bHRzIHRvIHRoaXMgbGlicmFyeSdzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2ZW5kb3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIHZhbHVlIGEgc2NoZW1hIGFjY2VwdHMsIGRlc2NyaWJlZCBieSBhIHR5cGUgZ3VhcmQgYW5kIGJ5IHdoYXQgaXQgZXhwZWN0cywgZm9yIHRoZSBpc3N1ZSBtZXNzYWdlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cGVjdGVkVHlwZUd1YXJkPFQ+IHtcbiAgLyoqXG4gICAqIFdoYXQgdGhlIHZhbHVlIHNob3VsZCBoYXZlIGJlZW4sIHBocmFzZWQgdG8gZm9sbG93IFwiRXhwZWN0ZWRcIiwgZS5nLiBgJ2Egc3RyaW5nJ2AuXG4gICAqL1xuICByZWFkb25seSBleHBlY3RlZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgdGhlIHZhbHVlIGlzIGFjY2VwdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYSBgVGAuXG4gICAqL1xuICByZWFkb25seSB0eXBlR3VhcmQ6ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWUgaXMgVDtcbn1cblxuLyoqXG4gKiBUaGUge0BsaW5rIEFwaUNvbnRyYWN0fSBvZiBhIG5hbWVkIEFQSTogb25lIGVudHJ5IHBlciBmdW5jdGlvbiBtZW1iZXIsIGVhY2ggdHlwZWQgYWdhaW5zdCB0aGF0IG1lbWJlci4gQm90aFxuICogc2NoZW1hcyBhcmUgUkVRVUlSRUQgaGVyZSwgc28gYSB0eXBlZCBjb250cmFjdCBpcyBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgZXZlcnkgc2lnbmF0dXJlIGFuZCBhIGB7fWAgZW50cnkgZG9lc1xuICogbm90IGNvbXBpbGUuIE9ubHkgdGhlIGxvb3NlIGZvcm0gbGVhdmVzIHRoZW0gb3B0aW9uYWwuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0aGUgY29udHJhY3QgZGVzY3JpYmVzLlxuICovXG5leHBvcnQgdHlwZSBUeXBlZEFwaUNvbnRyYWN0PFRBcGkgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICByZWFkb25seSBbVEtleSBpbiBBcGlNZXRob2ROYW1lPFRBcGk+XS0/OiBUQXBpW1RLZXldIGV4dGVuZHMgKC4uLmFyZ3VtZW50c186IGluZmVyIFRQYXJhbWV0ZXJzKSA9PiBpbmZlciBUUmV0dXJuVmFsdWUgPyBSZXF1aXJlZDxBcGlNZXRob2RDb250cmFjdDxUUGFyYW1ldGVycywgQXdhaXRlZDxUUmV0dXJuVmFsdWU+Pj5cbiAgICA6IG5ldmVyO1xufTtcblxudHlwZSBNdXRhYmxlVHVwbGU8VFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPiA9IHsgLXJlYWRvbmx5IFtUSW5kZXggaW4ga2V5b2YgVFR1cGxlXTogVFR1cGxlW1RJbmRleF0gfTtcblxuLyoqXG4gKiBBY2NlcHRzIGEgYm9vbGVhbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEJPT0xFQU5fR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPGJvb2xlYW4+ID0geyBleHBlY3RlZDogJ2EgYm9vbGVhbicsIHR5cGVHdWFyZDogaXNCb29sZWFuIH07XG5cbi8qKlxuICogQWNjZXB0cyBhIG51bWJlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE5VTUJFUl9HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8bnVtYmVyPiA9IHsgZXhwZWN0ZWQ6ICdhIG51bWJlcicsIHR5cGVHdWFyZDogaXNOdW1iZXIgfTtcblxuLyoqXG4gKiBBY2NlcHRzIGEgc3RyaW5nLiBTcHJlYWQgaXQgdG8gc2F5IHdoYXQgdGhlIHN0cmluZyBpczogYHsgLi4uU1RSSU5HX0dVQVJELCBleHBlY3RlZDogJ2EgcGF0aCcgfWAuXG4gKi9cbmV4cG9ydCBjb25zdCBTVFJJTkdfR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPHN0cmluZz4gPSB7IGV4cGVjdGVkOiAnYSBzdHJpbmcnLCB0eXBlR3VhcmQ6IGlzU3RyaW5nIH07XG5cbi8qKlxuICogQWNjZXB0cyBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5leHBvcnQgY29uc3QgU1RSSU5HX0FSUkFZX0dVQVJEOiBFeHBlY3RlZFR5cGVHdWFyZDxzdHJpbmdbXT4gPSB7IGV4cGVjdGVkOiAnYW4gYXJyYXkgb2Ygc3RyaW5ncycsIHR5cGVHdWFyZDogaXNTdHJpbmdBcnJheSB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYHVuZGVmaW5lZGAsIHdoaWNoIGlzIHRoZSBvdXRwdXQgb2YgYSBtZXRob2QgcmV0dXJuaW5nIGB2b2lkYCBvciBgUHJvbWlzZTx2b2lkPmAuXG4gKi9cbmV4cG9ydCBjb25zdCBVTkRFRklORURfR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPHVuZGVmaW5lZD4gPSB7IGV4cGVjdGVkOiAndW5kZWZpbmVkJywgdHlwZUd1YXJkOiBpc1VuZGVmaW5lZCB9O1xuXG4vKipcbiAqIFdpZGVucyBhIGd1YXJkIHRvIGFuIGFycmF5IHdob3NlIGV2ZXJ5IGl0ZW0gYGl0ZW1HdWFyZGAgYWNjZXB0cy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBhbiBpdGVtLlxuICogQHBhcmFtIGl0ZW1HdWFyZCAtIFRoZSBndWFyZCBmb3Igb25lIGl0ZW0uXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUd1YXJkPFQ+KGl0ZW1HdWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4pOiBFeHBlY3RlZFR5cGVHdWFyZDxUW10+IHtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKGBhbiBhcnJheSB3aG9zZSBldmVyeSBpdGVtIGlzICR7aXRlbUd1YXJkLmV4cGVjdGVkfWAsIGFycmF5VHlwZUd1YXJkKGl0ZW1HdWFyZC50eXBlR3VhcmQpKTtcbn1cblxuLyoqXG4gKiBCaW5kcyB0aGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIG9uY2UsIHNvIGEgY29udHJhY3QgZG9lcyBub3QgcGFzcyBpdCB0byBldmVyeSBzY2hlbWEgYnVpbGRlci4gRGVzdHJ1Y3R1cmUgdGhlXG4gKiByZXN1bHQgdW5kZXIgdGhlIGJ1aWxkZXJzJyBvd24gbmFtZXMgYW5kIHRoZSBjYWxscyByZWFkIGV4YWN0bHkgYXMgdGhlIHVuYm91bmQgb25lcyBkbzpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgeyBjcmVhdGVBcmd1bWVudHNTY2hlbWEsIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYSB9ID0gY3JlYXRlQXBpQ29udHJhY3RTY2hlbWFCdWlsZGVycygnbXktcGx1Z2luJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmVuZG9yIC0gVGhlIHZlbmRvciBldmVyeSBzY2hlbWEgcmVwb3J0cy5cbiAqIEByZXR1cm5zIFRoZSBib3VuZCBidWlsZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaUNvbnRyYWN0U2NoZW1hQnVpbGRlcnModmVuZG9yOiBzdHJpbmcpOiBBcGlDb250cmFjdFNjaGVtYUJ1aWxkZXJzIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGVBcmd1bWVudHNTY2hlbWE6IDxjb25zdCBUUGFyYW1ldGVycyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4ocGFyYW1ldGVyczogQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzPikgPT4gY3JlYXRlQXJndW1lbnRzU2NoZW1hKHBhcmFtZXRlcnMsIHsgdmVuZG9yIH0pLFxuICAgIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYTogPFQ+KGd1YXJkOiBFeHBlY3RlZFR5cGVHdWFyZDxUPikgPT4gY3JlYXRlVHlwZUd1YXJkU2NoZW1hKHsgLi4uZ3VhcmQsIHZlbmRvciB9KVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgaW5wdXQgc2NoZW1hIG9mIGEgbWV0aG9kIGNvbnRyYWN0OiBhIHNjaGVtYSBvdmVyIHRoZSBtZXRob2QncyBBUkdVTUVOVCBMSVNULCBvbmUgdHlwZSBndWFyZCBwZXJcbiAqIHBhcmFtZXRlci4gQW4gYXJndW1lbnQgdGhhdCBmYWlscyBpdHMgZ3VhcmQgaXMgcmVwb3J0ZWQgd2l0aCBpdHMgaW5kZXggYXMgdGhlIGlzc3VlIHBhdGgsIGFuZCBhbiBhcmd1bWVudCBsaXN0XG4gKiBsb25nZXIgdGhhbiB0aGUgcGFyYW1ldGVyIGxpc3QgaXMgcmVmdXNlZC4gQSBtaXNzaW5nIGFyZ3VtZW50IHJlYWNoZXMgaXRzIGd1YXJkIGFzIGB1bmRlZmluZWRgLCBzbyBhbiBvcHRpb25hbFxuICogcGFyYW1ldGVyJ3MgZ3VhcmQgYWNjZXB0cyBgdW5kZWZpbmVkYCAoc2VlIHtAbGluayBvcHRpb25hbEd1YXJkfSkuXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLCBpbmZlcnJlZCBmcm9tIHRoZSBndWFyZHMgb3IgZnJvbSB0aGUgY29udHJhY3QgZW50cnkuXG4gKiBAcGFyYW0gcGFyYW1ldGVycyAtIE9uZSBndWFyZCBwZXIgcGFyYW1ldGVyLCBpbiBvcmRlci5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBzY2hlbWEuXG4gKiBAcmV0dXJucyBUaGUgc2NoZW1hLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJndW1lbnRzU2NoZW1hPGNvbnN0IFRQYXJhbWV0ZXJzIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPihcbiAgcGFyYW1ldGVyczogQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzPixcbiAgb3B0aW9ucz86IENyZWF0ZUFyZ3VtZW50c1NjaGVtYU9wdGlvbnNcbik6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgTXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj4ge1xuICBjb25zdCBwYXJhbWV0ZXJMaXN0ID0gY2FzdFRvPHJlYWRvbmx5IEV4cGVjdGVkVHlwZUd1YXJkPHVua25vd24+W10+KHBhcmFtZXRlcnMpO1xuICByZXR1cm4gY3JlYXRlU2NoZW1hKCh2YWx1ZTogdW5rbm93bik6IFN0YW5kYXJkU2NoZW1hVjEuUmVzdWx0PE11dGFibGVUdXBsZTxUUGFyYW1ldGVycz4+ID0+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBpc3N1ZXM6IFt7IG1lc3NhZ2U6ICdFeHBlY3RlZCBhbiBhcmd1bWVudCBsaXN0LicgfV0gfTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUubGVuZ3RoID4gcGFyYW1ldGVyTGlzdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IGlzc3VlczogW3sgbWVzc2FnZTogYEV4cGVjdGVkIGF0IG1vc3QgJHtTdHJpbmcocGFyYW1ldGVyTGlzdC5sZW5ndGgpfSBhcmd1bWVudChzKSwgZ290ICR7U3RyaW5nKHZhbHVlLmxlbmd0aCl9LmAgfV0gfTtcbiAgICB9XG5cbiAgICBjb25zdCBpc3N1ZXMgPSBwYXJhbWV0ZXJMaXN0LmZsYXRNYXAoKHBhcmFtZXRlciwgaW5kZXgpOiBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10gPT4gcGFyYW1ldGVyLnR5cGVHdWFyZCh2YWx1ZVtpbmRleF0pID8gW10gOiBbeyBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtwYXJhbWV0ZXIuZXhwZWN0ZWR9LmAsIHBhdGg6IFtpbmRleF0gfV0pO1xuICAgIHJldHVybiBpc3N1ZXMubGVuZ3RoID09PSAwID8geyB2YWx1ZTogY2FzdFRvPE11dGFibGVUdXBsZTxUUGFyYW1ldGVycz4+KHZhbHVlKSB9IDogeyBpc3N1ZXMgfTtcbiAgfSwgb3B0aW9ucz8udmVuZG9yKTtcbn1cblxuLyoqXG4gKiBQYWlycyBhIHR5cGUgZ3VhcmQgd2l0aCB3aGF0IGl0IGV4cGVjdHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZXhwZWN0ZWQgLSBXaGF0IHRoZSB2YWx1ZSBzaG91bGQgaGF2ZSBiZWVuLCBwaHJhc2VkIHRvIGZvbGxvdyBcIkV4cGVjdGVkXCIsIGUuZy4gYCdhIHN0cmluZydgLlxuICogQHBhcmFtIHR5cGVHdWFyZCAtIFRoZSBndWFyZC5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkPFQ+KGV4cGVjdGVkOiBzdHJpbmcsIHR5cGVHdWFyZDogVHlwZUd1YXJkPFQ+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICByZXR1cm4geyBleHBlY3RlZCwgdHlwZUd1YXJkIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgc2NoZW1hIG92ZXIgb25lIHZhbHVlIGZyb20gYSB0eXBlIGd1YXJkOiB0aGUgb3V0cHV0IHNjaGVtYSBvZiBhIG1ldGhvZCBjb250cmFjdCwgdHlwaWNhbGx5LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBndWFyZCwgd2hhdCBpdCBleHBlY3RzLCBhbmQgb3B0aW9uYWxseSB0aGUgc2NoZW1hJ3MgdmVuZG9yLlxuICogQHJldHVybnMgVGhlIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYTxUPihwYXJhbXM6IENyZWF0ZVR5cGVHdWFyZFNjaGVtYVBhcmFtczxUPik6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgVD4ge1xuICByZXR1cm4gY3JlYXRlU2NoZW1hKFxuICAgICh2YWx1ZTogdW5rbm93bik6IFN0YW5kYXJkU2NoZW1hVjEuUmVzdWx0PFQ+ID0+IHBhcmFtcy50eXBlR3VhcmQodmFsdWUpID8geyB2YWx1ZSB9IDogeyBpc3N1ZXM6IFt7IG1lc3NhZ2U6IGBFeHBlY3RlZCAke3BhcmFtcy5leHBlY3RlZH0uYCB9XSB9LFxuICAgIHBhcmFtcy52ZW5kb3JcbiAgKTtcbn1cblxuLyoqXG4gKiBTdGF0ZXMgYSBjb250cmFjdCBhZ2FpbnN0IGFuIEFQSSB0eXBlLCBzbyBldmVyeSBlbnRyeSBpcyBjaGVja2VkIGFnYWluc3QgaXRzIG1ldGhvZCBhbmQgdGhlIHNjaGVtYSBidWlsZGVyc1xuICogaW5zaWRlIGl0IGluZmVyIHRoZWlyIHR5cGVzIGZyb20gdGhlIG1ldGhvZCByYXRoZXIgdGhhbiBmcm9tIGEgcmVzdGF0ZWQgdHVwbGUuIEl0IHJldHVybnMgdGhlIGNvbnRyYWN0IGFzIGlzLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdGhlIGNvbnRyYWN0IGRlc2NyaWJlcy5cbiAqIEBwYXJhbSBjb250cmFjdCAtIFRoZSBjb250cmFjdC5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIGNvbnRyYWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQXBpQ29udHJhY3Q8VEFwaSBleHRlbmRzIG9iamVjdD4oY29udHJhY3Q6IFR5cGVkQXBpQ29udHJhY3Q8Tm9JbmZlcjxUQXBpPj4pOiBUeXBlZEFwaUNvbnRyYWN0PFRBcGk+IHtcbiAgcmV0dXJuIGNvbnRyYWN0O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzLCBvciBvZiBhIGNsYXNzIGRlcml2ZWQgZnJvbSBpdCwgZXhwZWN0aW5nIGBhbiBpbnN0YW5jZSBvZmAgdGhlXG4gKiBjbGFzcydzIG5hbWUuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgYW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29uc3RydWN0b3IgLSBUaGUgY2xhc3MuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YW5jZU9mR3VhcmQ8VD4oY29uc3RydWN0b3I6IGFic3RyYWN0IG5ldyAoLi4uYXJndW1lbnRzXzogbmV2ZXJbXSkgPT4gVCk6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+IHtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKGBhbiBpbnN0YW5jZSBvZiAke2NvbnN0cnVjdG9yLm5hbWV9YCwgaW5zdGFuY2VPZlR5cGVHdWFyZChjb25zdHJ1Y3RvcikpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBleGFjdGx5IHRoZSBrZXlzIG9mIGEgcmVjb3JkLCBleHBlY3RpbmcgYG9uZSBvZmAgdGhlbS4gVHlwaW5nIHRoZSByZWNvcmQgb3ZlciBhIHVuaW9uXG4gKiBtYWtlcyBhIG1lbWJlciBsYXRlciBhZGRlZCB0byB0aGUgdW5pb24gZmFpbCB0byBjb21waWxlIHVudGlsIGl0IGlzIGxpc3RlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgYWNjZXB0ZWQgc3RyaW5ncy5cbiAqIEBwYXJhbSBsaXRlcmFscyAtIEEgcmVjb3JkIHdob3NlIGtleXMgYXJlIHRoZSBhY2NlcHRlZCBzdHJpbmdzLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbEd1YXJkPFQgZXh0ZW5kcyBzdHJpbmc+KGxpdGVyYWxzOiBSZWFkb25seTxSZWNvcmQ8VCwgdHJ1ZT4+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VD47XG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBleGFjdGx5IHRoZSBsaXN0ZWQgdmFsdWVzLCBleHBlY3RpbmcgYG9uZSBvZmAgdGhlbS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgYWNjZXB0ZWQgdmFsdWVzLlxuICogQHBhcmFtIGxpdGVyYWxzIC0gVGhlIGFjY2VwdGVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdGVyYWxHdWFyZDxUIGV4dGVuZHMgTGl0ZXJhbD4obGl0ZXJhbHM6IHJlYWRvbmx5IFRbXSk6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+O1xuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgZXhhY3RseSB0aGUgbGlzdGVkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gbGl0ZXJhbHMgLSBUaGUgYWNjZXB0ZWQgdmFsdWVzLCBhcyBhIGxpc3Qgb3IgYXMgdGhlIGtleXMgb2YgYSByZWNvcmQuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsR3VhcmQobGl0ZXJhbHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHRydWU+PiB8IHJlYWRvbmx5IExpdGVyYWxbXSk6IEV4cGVjdGVkVHlwZUd1YXJkPExpdGVyYWw+IHtcbiAgY29uc3QgbGl0ZXJhbExpc3Q6IHJlYWRvbmx5IExpdGVyYWxbXSA9IGlzUmVhZG9ubHlBcnJheShsaXRlcmFscykgPyBsaXRlcmFscyA6IE9iamVjdC5rZXlzKGxpdGVyYWxzKTtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKGBvbmUgb2YgJHtsaXRlcmFsTGlzdC5tYXAoKGxpdGVyYWwpID0+IGZvcm1hdExpdGVyYWwobGl0ZXJhbCkpLmpvaW4oJywgJyl9YCwgbGl0ZXJhbFR5cGVHdWFyZChsaXRlcmFsTGlzdCkpO1xufVxuXG4vKipcbiAqIFdpZGVucyBhIGd1YXJkIHRvIGFsc28gYWNjZXB0IGBudWxsYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBndWFyZCAtIFRoZSBndWFyZCB0byB3aWRlbi5cbiAqIEByZXR1cm5zIEEgZ3VhcmQgYWNjZXB0aW5nIHdoYXQgYGd1YXJkYCBhY2NlcHRzLCBvciBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudWxsYWJsZUd1YXJkPFQ+KGd1YXJkOiBFeHBlY3RlZFR5cGVHdWFyZDxUPik6IEV4cGVjdGVkVHlwZUd1YXJkPG51bGwgfCBUPiB7XG4gIHJldHVybiB7XG4gICAgZXhwZWN0ZWQ6IGAke2d1YXJkLmV4cGVjdGVkfSBvciBudWxsYCxcbiAgICB0eXBlR3VhcmQ6ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCBUID0+IHZhbHVlID09PSBudWxsIHx8IGd1YXJkLnR5cGVHdWFyZCh2YWx1ZSlcbiAgfTtcbn1cblxuLyoqXG4gKiBXaWRlbnMgYSBndWFyZCB0byBhbHNvIGFjY2VwdCBgdW5kZWZpbmVkYCwgd2hpY2ggaXMgd2hhdCBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgcmVjZWl2ZXMgd2hlbiBpdCBpcyBsZWZ0IG91dC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBndWFyZCAtIFRoZSBndWFyZCB0byB3aWRlbi5cbiAqIEByZXR1cm5zIEEgZ3VhcmQgYWNjZXB0aW5nIHdoYXQgYGd1YXJkYCBhY2NlcHRzLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsR3VhcmQ8VD4oZ3VhcmQ6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VCB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4ge1xuICAgIGV4cGVjdGVkOiBgJHtndWFyZC5leHBlY3RlZH0gb3IgdW5kZWZpbmVkYCxcbiAgICB0eXBlR3VhcmQ6ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFQgfCB1bmRlZmluZWQgPT4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCBndWFyZC50eXBlR3VhcmQodmFsdWUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZ3VhcmQgYWNjZXB0aW5nIHdoYXQgYW55IG9mIHRoZSBnaXZlbiBndWFyZHMgYWNjZXB0cywgZXhwZWN0aW5nIHRoZWlyIGBleHBlY3RlZGAgdGV4dHMgam9pbmVkIGJ5IGBvcmAuXG4gKlxuICogQHR5cGVQYXJhbSBUR3VhcmRzIC0gVGhlIGd1YXJkcy5cbiAqIEBwYXJhbSBndWFyZHMgLSBUaGUgZ3VhcmRzLCB0cmllZCBpbiBvcmRlci5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uR3VhcmQ8Y29uc3QgVEd1YXJkcyBleHRlbmRzIHJlYWRvbmx5IEV4cGVjdGVkVHlwZUd1YXJkPHVua25vd24+W10+KFxuICAuLi5ndWFyZHM6IFRHdWFyZHNcbik6IEV4cGVjdGVkVHlwZUd1YXJkPEd1YXJkZWRUeXBlPFRHdWFyZHNbbnVtYmVyXVsndHlwZUd1YXJkJ10+PiB7XG4gIHJldHVybiBjcmVhdGVFeHBlY3RlZFR5cGVHdWFyZChcbiAgICBndWFyZHMubWFwKChndWFyZCkgPT4gZ3VhcmQuZXhwZWN0ZWQpLmpvaW4oJyBvciAnKSxcbiAgICB1bmlvblR5cGVHdWFyZCguLi5ndWFyZHMubWFwKChndWFyZCkgPT4gZ3VhcmQudHlwZUd1YXJkKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2NoZW1hPFQ+KHZhbGlkYXRlOiAodmFsdWU6IHVua25vd24pID0+IFN0YW5kYXJkU2NoZW1hVjEuUmVzdWx0PFQ+LCB2ZW5kb3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgVD4ge1xuICByZXR1cm4ge1xuICAgICd+c3RhbmRhcmQnOiB7XG4gICAgICB2YWxpZGF0ZSxcbiAgICAgIHZlbmRvcjogdmVuZG9yID8/IExJQlJBUllfTkFNRSxcbiAgICAgIHZlcnNpb246IDFcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdExpdGVyYWwobGl0ZXJhbDogTGl0ZXJhbCk6IHN0cmluZyB7XG4gIGlmIChpc1N0cmluZyhsaXRlcmFsKSkge1xuICAgIHJldHVybiBgJyR7bGl0ZXJhbH0nYDtcbiAgfVxuXG4gIHJldHVybiB0eXBlb2YgbGl0ZXJhbCA9PT0gJ2JpZ2ludCcgPyBgJHtTdHJpbmcobGl0ZXJhbCl9bmAgOiBTdHJpbmcobGl0ZXJhbCk7XG59XG5cbmZ1bmN0aW9uIGlzUmVhZG9ubHlBcnJheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHJlYWRvbmx5IHVua25vd25bXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* Running the schemas is left to whoever owns the call path, since that is where an issue can be reported.
|
|
15
15
|
*/
|
|
16
16
|
import type { StandardSchemaV1 } from '@standard-schema/spec' with { 'resolution-mode': 'import' };
|
|
17
|
+
import type { GuardedType, Literal, TypeGuard } from './type-guards.cjs';
|
|
17
18
|
/**
|
|
18
19
|
* The contract an API declares: every key is a method the API promises to expose, and its value optionally
|
|
19
20
|
* carries the payload schemas for that method.
|
|
@@ -26,6 +27,28 @@ import type { StandardSchemaV1 } from '@standard-schema/spec' with { 'resolution
|
|
|
26
27
|
* @typeParam TApi - The API the contract describes. `object`, the default, means "not typed".
|
|
27
28
|
*/
|
|
28
29
|
export type ApiContract<TApi extends object = object> = object extends TApi ? Readonly<Record<string, ApiMethodContract>> : TypedApiContract<TApi>;
|
|
30
|
+
/**
|
|
31
|
+
* The schema builders of this module with the Standard Schema `vendor` already bound, as
|
|
32
|
+
* {@link createApiContractSchemaBuilders} returns them.
|
|
33
|
+
*/
|
|
34
|
+
export interface ApiContractSchemaBuilders {
|
|
35
|
+
/**
|
|
36
|
+
* {@link createArgumentsSchema}, reporting the bound vendor.
|
|
37
|
+
*
|
|
38
|
+
* @typeParam TParameters - The method's parameters, inferred from the guards or from the contract entry.
|
|
39
|
+
* @param parameters - One guard per parameter, in order.
|
|
40
|
+
* @returns The schema.
|
|
41
|
+
*/
|
|
42
|
+
readonly createArgumentsSchema: <const TParameters extends readonly unknown[]>(parameters: ArgumentTypeGuards<TParameters>) => StandardSchemaV1<unknown, MutableTuple<TParameters>>;
|
|
43
|
+
/**
|
|
44
|
+
* {@link createTypeGuardSchema}, reporting the bound vendor.
|
|
45
|
+
*
|
|
46
|
+
* @typeParam T - The type the guard narrows to.
|
|
47
|
+
* @param guard - The guard and what it expects.
|
|
48
|
+
* @returns The schema.
|
|
49
|
+
*/
|
|
50
|
+
readonly createTypeGuardSchema: <T>(guard: ExpectedTypeGuard<T>) => StandardSchemaV1<unknown, T>;
|
|
51
|
+
}
|
|
29
52
|
/**
|
|
30
53
|
* The payload schemas for a single API method. Both halves are optional: a method may declare only its input,
|
|
31
54
|
* only its output, neither (the entry then just declares that the method must exist), or both.
|
|
@@ -136,6 +159,26 @@ export declare const STRING_ARRAY_GUARD: ExpectedTypeGuard<string[]>;
|
|
|
136
159
|
* Accepts `undefined`, which is the output of a method returning `void` or `Promise<void>`.
|
|
137
160
|
*/
|
|
138
161
|
export declare const UNDEFINED_GUARD: ExpectedTypeGuard<undefined>;
|
|
162
|
+
/**
|
|
163
|
+
* Widens a guard to an array whose every item `itemGuard` accepts.
|
|
164
|
+
*
|
|
165
|
+
* @typeParam T - The type of an item.
|
|
166
|
+
* @param itemGuard - The guard for one item.
|
|
167
|
+
* @returns The guard.
|
|
168
|
+
*/
|
|
169
|
+
export declare function arrayGuard<T>(itemGuard: ExpectedTypeGuard<T>): ExpectedTypeGuard<T[]>;
|
|
170
|
+
/**
|
|
171
|
+
* Binds the Standard Schema `vendor` once, so a contract does not pass it to every schema builder. Destructure the
|
|
172
|
+
* result under the builders' own names and the calls read exactly as the unbound ones do:
|
|
173
|
+
*
|
|
174
|
+
* ```ts
|
|
175
|
+
* const { createArgumentsSchema, createTypeGuardSchema } = createApiContractSchemaBuilders('my-plugin');
|
|
176
|
+
* ```
|
|
177
|
+
*
|
|
178
|
+
* @param vendor - The vendor every schema reports.
|
|
179
|
+
* @returns The bound builders.
|
|
180
|
+
*/
|
|
181
|
+
export declare function createApiContractSchemaBuilders(vendor: string): ApiContractSchemaBuilders;
|
|
139
182
|
/**
|
|
140
183
|
* Builds the input schema of a method contract: a schema over the method's ARGUMENT LIST, one type guard per
|
|
141
184
|
* parameter. An argument that fails its guard is reported with its index as the issue path, and an argument list
|
|
@@ -148,6 +191,15 @@ export declare const UNDEFINED_GUARD: ExpectedTypeGuard<undefined>;
|
|
|
148
191
|
* @returns The schema.
|
|
149
192
|
*/
|
|
150
193
|
export declare function createArgumentsSchema<const TParameters extends readonly unknown[]>(parameters: ArgumentTypeGuards<TParameters>, options?: CreateArgumentsSchemaOptions): StandardSchemaV1<unknown, MutableTuple<TParameters>>;
|
|
194
|
+
/**
|
|
195
|
+
* Pairs a type guard with what it expects.
|
|
196
|
+
*
|
|
197
|
+
* @typeParam T - The type the guard narrows to.
|
|
198
|
+
* @param expected - What the value should have been, phrased to follow "Expected", e.g. `'a string'`.
|
|
199
|
+
* @param typeGuard - The guard.
|
|
200
|
+
* @returns The guard.
|
|
201
|
+
*/
|
|
202
|
+
export declare function createExpectedTypeGuard<T>(expected: string, typeGuard: TypeGuard<T>): ExpectedTypeGuard<T>;
|
|
151
203
|
/**
|
|
152
204
|
* Builds a schema over one value from a type guard: the output schema of a method contract, typically.
|
|
153
205
|
*
|
|
@@ -165,6 +217,32 @@ export declare function createTypeGuardSchema<T>(params: CreateTypeGuardSchemaPa
|
|
|
165
217
|
* @returns The same contract.
|
|
166
218
|
*/
|
|
167
219
|
export declare function defineApiContract<TApi extends object>(contract: TypedApiContract<NoInfer<TApi>>): TypedApiContract<TApi>;
|
|
220
|
+
/**
|
|
221
|
+
* Builds a guard accepting an instance of a class, or of a class derived from it, expecting `an instance of` the
|
|
222
|
+
* class's name.
|
|
223
|
+
*
|
|
224
|
+
* @typeParam T - The type of an instance.
|
|
225
|
+
* @param constructor - The class.
|
|
226
|
+
* @returns The guard.
|
|
227
|
+
*/
|
|
228
|
+
export declare function instanceOfGuard<T>(constructor: abstract new (...arguments_: never[]) => T): ExpectedTypeGuard<T>;
|
|
229
|
+
/**
|
|
230
|
+
* Builds a guard accepting exactly the keys of a record, expecting `one of` them. Typing the record over a union
|
|
231
|
+
* makes a member later added to the union fail to compile until it is listed.
|
|
232
|
+
*
|
|
233
|
+
* @typeParam T - The accepted strings.
|
|
234
|
+
* @param literals - A record whose keys are the accepted strings.
|
|
235
|
+
* @returns The guard.
|
|
236
|
+
*/
|
|
237
|
+
export declare function literalGuard<T extends string>(literals: Readonly<Record<T, true>>): ExpectedTypeGuard<T>;
|
|
238
|
+
/**
|
|
239
|
+
* Builds a guard accepting exactly the listed values, expecting `one of` them.
|
|
240
|
+
*
|
|
241
|
+
* @typeParam T - The accepted values.
|
|
242
|
+
* @param literals - The accepted values.
|
|
243
|
+
* @returns The guard.
|
|
244
|
+
*/
|
|
245
|
+
export declare function literalGuard<T extends Literal>(literals: readonly T[]): ExpectedTypeGuard<T>;
|
|
168
246
|
/**
|
|
169
247
|
* Widens a guard to also accept `null`.
|
|
170
248
|
*
|
|
@@ -181,4 +259,12 @@ export declare function nullableGuard<T>(guard: ExpectedTypeGuard<T>): ExpectedT
|
|
|
181
259
|
* @returns A guard accepting what `guard` accepts, or `undefined`.
|
|
182
260
|
*/
|
|
183
261
|
export declare function optionalGuard<T>(guard: ExpectedTypeGuard<T>): ExpectedTypeGuard<T | undefined>;
|
|
262
|
+
/**
|
|
263
|
+
* Builds a guard accepting what any of the given guards accepts, expecting their `expected` texts joined by `or`.
|
|
264
|
+
*
|
|
265
|
+
* @typeParam TGuards - The guards.
|
|
266
|
+
* @param guards - The guards, tried in order.
|
|
267
|
+
* @returns The guard.
|
|
268
|
+
*/
|
|
269
|
+
export declare function unionGuard<const TGuards extends readonly ExpectedTypeGuard<unknown>[]>(...guards: TGuards): ExpectedTypeGuard<GuardedType<TGuards[number]['typeGuard']>>;
|
|
184
270
|
export {};
|