@mnaoumov/typescript-lib 1.3.0 → 1.5.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 CHANGED
@@ -49,12 +49,15 @@ export const COUNTER_API_CONTRACT = defineApiContract<CounterApi>({
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
+ - `objectGuard<T>({ ... }, { description })` builds an object guard from one such guard per property, expecting `description: { key: expected; ... }`. `optionsGuard<T>` does the same for an all-optional options bag: each guard describes a present option, and an absent or `undefined` one passes.
52
53
  - 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
 
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.
55
+ 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 `{ exactOptionalKeys: { ... } }`, listing every optional key, reads own keys only and refuses an optional key present as `undefined`), 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.
55
56
 
56
57
  Running the schemas belongs to whoever owns the call path. `@mnaoumov/obsidian-lib`'s plugin API registry runs them while its debugger is on.
57
58
 
59
+ A contract's own test can use `@mnaoumov/typescript-lib/api-contract-verifier`. `verifyApiContract(contract, { cases, vendor })` takes valid and invalid sample payloads for each half of each method and returns every violation it finds: a method the contract and the cases disagree on, a missing schema, a wrong vendor, a valid payload refused or an invalid one accepted. It returns a list rather than asserting, so it works under any test runner: `expect(await verifyApiContract(...)).toEqual([])`. `validateSync(schema, value)` runs a schema that must answer synchronously, and throws when it answers with a promise.
60
+
58
61
  ## License
59
62
 
60
63
  © [Michael Naumov](https://github.com/mnaoumov/)
@@ -0,0 +1,88 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ "use strict";
7
+ var __defProp = Object.defineProperty;
8
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
+ var __getOwnPropNames = Object.getOwnPropertyNames;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
+ var api_contract_verifier_exports = {};
25
+ __export(api_contract_verifier_exports, {
26
+ validateSync: () => validateSync,
27
+ verifyApiContract: () => verifyApiContract
28
+ });
29
+ module.exports = __toCommonJS(api_contract_verifier_exports);
30
+ function validateSync(schema, value) {
31
+ const result = schema["~standard"].validate(value);
32
+ if (result instanceof Promise) {
33
+ throw new TypeError("Expected a synchronous schema, got one that answers with a promise.");
34
+ }
35
+ return result;
36
+ }
37
+ async function verifyApiContract(contract, options) {
38
+ const violations = [];
39
+ const looseContract = contract;
40
+ const cases = options.cases;
41
+ for (const methodName of Object.keys(looseContract)) {
42
+ if (!Object.hasOwn(cases, methodName)) {
43
+ violations.push(`${methodName}: the contract has the method, but no cases are given for it.`);
44
+ }
45
+ }
46
+ for (const [methodName, methodCases] of Object.entries(cases)) {
47
+ const methodContract = looseContract[methodName];
48
+ if (methodContract === void 0) {
49
+ violations.push(`${methodName}: cases are given, but the contract has no such method.`);
50
+ continue;
51
+ }
52
+ for (const half of ["input", "output"]) {
53
+ const schema = methodContract[half];
54
+ if (schema === void 0) {
55
+ violations.push(`${methodName} ${half}: the contract has no schema.`);
56
+ continue;
57
+ }
58
+ const { vendor } = schema["~standard"];
59
+ const version = schema["~standard"].version;
60
+ if (vendor !== options.vendor || version !== 1) {
61
+ violations.push(`${methodName} ${half}: the schema reports vendor '${vendor}' and version ${String(version)}, expected '${options.vendor}' and 1.`);
62
+ }
63
+ const { invalid, valid } = methodCases[half];
64
+ for (const [index, value] of valid.entries()) {
65
+ const result = await schema["~standard"].validate(value);
66
+ if (result.issues !== void 0) {
67
+ violations.push(`${methodName} ${half}: valid case ${String(index)} was refused: ${formatIssues(result.issues)}`);
68
+ }
69
+ }
70
+ for (const [index, value] of invalid.entries()) {
71
+ const result = await schema["~standard"].validate(value);
72
+ if (result.issues === void 0 || result.issues.length === 0) {
73
+ violations.push(`${methodName} ${half}: invalid case ${String(index)} was accepted.`);
74
+ }
75
+ }
76
+ }
77
+ }
78
+ return violations;
79
+ }
80
+ function formatIssues(issues) {
81
+ return issues.map((issue) => issue.message).join(" ");
82
+ }
83
+ // Annotate the CommonJS export names for ESM import in node:
84
+ 0 && (module.exports = {
85
+ validateSync,
86
+ verifyApiContract
87
+ });
88
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwaS1jb250cmFjdC12ZXJpZmllci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENoZWNrcyBhbiB7QGxpbmsgQXBpQ29udHJhY3R9IGFnYWluc3Qgc2FtcGxlIHBheWxvYWRzLCBmb3IgYSBjb250cmFjdCdzIG93biB0ZXN0OiBldmVyeSBtZXRob2QgaGFzIGJvdGggc2NoZW1hcyxcbiAqIGV2ZXJ5IHNjaGVtYSByZXBvcnRzIHRoZSBleHBlY3RlZCB2ZW5kb3IsIGFuZCBlYWNoIHNjaGVtYSBhY2NlcHRzIGV2ZXJ5IHZhbGlkIHBheWxvYWQgYW5kIHJlZnVzZXMgZXZlcnkgaW52YWxpZCBvbmUuXG4gKlxuICogSXQgcmV0dXJucyB3aGF0IGl0IGZvdW5kIHJhdGhlciB0aGFuIGFzc2VydGluZywgc28gaXQgcnVucyB1bmRlciBhbnkgdGVzdCBmcmFtZXdvcms6XG4gKlxuICogYGBgdHNcbiAqIGV4cGVjdChhd2FpdCB2ZXJpZnlBcGlDb250cmFjdChNWV9BUElfQ09OVFJBQ1QsIHsgY2FzZXMsIHZlbmRvcjogJ215LXBsdWdpbicgfSkpLnRvRXF1YWwoW10pO1xuICogYGBgXG4gKlxuICogSXQgbGl2ZXMgYXBhcnQgZnJvbSBgYXBpLWNvbnRyYWN0LnRzYCBiZWNhdXNlIGEgY29udHJhY3QgYSBjb25zdW1lciBjb3BpZXMgaW1wb3J0cyB0aGF0IG1vZHVsZSBpbnRvIGl0cyBwbHVnaW4sXG4gKiBhbmQgbm90aGluZyBoZXJlIGlzIG5lZWRlZCBhdCBydW50aW1lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhbmRhcmRTY2hlbWFWMSB9IGZyb20gJ0BzdGFuZGFyZC1zY2hlbWEvc3BlYyc7XG5cbmltcG9ydCB0eXBlIHsgQXBpQ29udHJhY3QgfSBmcm9tICcuL2FwaS1jb250cmFjdC50cyc7XG5cbi8qKlxuICogVGhlIHNhbXBsZSBwYXlsb2FkcyBvZiBvbmUgbWV0aG9kLCBmb3IgZWFjaCBoYWxmIG9mIGl0cyBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlNZXRob2RDYXNlcyB7XG4gIC8qKlxuICAgKiBTYW1wbGUgYXJndW1lbnQgbGlzdHMuXG4gICAqL1xuICByZWFkb25seSBpbnB1dDogUGF5bG9hZENhc2VzO1xuXG4gIC8qKlxuICAgKiBTYW1wbGUgcmV0dXJuIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dDogUGF5bG9hZENhc2VzO1xufVxuXG4vKipcbiAqIFNhbXBsZSBwYXlsb2FkcyBmb3Igb25lIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ2FzZXMge1xuICAvKipcbiAgICogUGF5bG9hZHMgdGhlIHNjaGVtYSBtdXN0IHJlZnVzZS5cbiAgICovXG4gIHJlYWRvbmx5IGludmFsaWQ6IHJlYWRvbmx5IHVua25vd25bXTtcblxuICAvKipcbiAgICogUGF5bG9hZHMgdGhlIHNjaGVtYSBtdXN0IGFjY2VwdC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkOiByZWFkb25seSB1bmtub3duW107XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHZlcmlmeUFwaUNvbnRyYWN0fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRDb250cmFjdCAtIFRoZSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlBcGlDb250cmFjdE9wdGlvbnM8VENvbnRyYWN0IGV4dGVuZHMgQXBpQ29udHJhY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBzYW1wbGUgcGF5bG9hZHMsIG9uZSBlbnRyeSBwZXIgbWV0aG9kIG9mIHRoZSBjb250cmFjdC5cbiAgICovXG4gIHJlYWRvbmx5IGNhc2VzOiBSZWFkb25seTxSZWNvcmQ8a2V5b2YgVENvbnRyYWN0ICYgc3RyaW5nLCBBcGlNZXRob2RDYXNlcz4+O1xuXG4gIC8qKlxuICAgKiBUaGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIGV2ZXJ5IHNjaGVtYSBtdXN0IHJlcG9ydC5cbiAgICovXG4gIHJlYWRvbmx5IHZlbmRvcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJ1bnMgYSBTdGFuZGFyZCBTY2hlbWEgdGhhdCBtdXN0IGJlIHN5bmNocm9ub3VzLiBBIHNjaGVtYSBndWFyZGluZyBhIGNhbGwgaXQgY2Fubm90IGRlbGF5LCBhcyBhIGNvbnRyYWN0J3Mgc2NoZW1hc1xuICogZG8sIGhhcyB0byBhbnN3ZXIgYmVmb3JlIHRoYXQgY2FsbCByZXR1cm5zLlxuICpcbiAqIEB0eXBlUGFyYW0gVE91dHB1dCAtIFRoZSB0eXBlIHRoZSBzY2hlbWEgcHJvZHVjZXMuXG4gKiBAcGFyYW0gc2NoZW1hIC0gVGhlIHNjaGVtYS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZS5cbiAqIEByZXR1cm5zIFRoZSBzY2hlbWEncyByZXN1bHQuXG4gKiBAdGhyb3dzIElmIHRoZSBzY2hlbWEgYW5zd2VycyB3aXRoIGEgcHJvbWlzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU3luYzxUT3V0cHV0PihzY2hlbWE6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgVE91dHB1dD4sIHZhbHVlOiB1bmtub3duKTogU3RhbmRhcmRTY2hlbWFWMS5SZXN1bHQ8VE91dHB1dD4ge1xuICBjb25zdCByZXN1bHQgPSBzY2hlbWFbJ35zdGFuZGFyZCddLnZhbGlkYXRlKHZhbHVlKTtcbiAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN5bmNocm9ub3VzIHNjaGVtYSwgZ290IG9uZSB0aGF0IGFuc3dlcnMgd2l0aCBhIHByb21pc2UuJyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENoZWNrcyBhIGNvbnRyYWN0IGFnYWluc3Qgc2FtcGxlIHBheWxvYWRzOiB0aGUgY29udHJhY3QgaGFzIGV4YWN0bHkgdGhlIG1ldGhvZHMgdGhlIGNhc2VzIG5hbWUsIGVhY2ggd2l0aCBib3RoXG4gKiBzY2hlbWFzLCBldmVyeSBzY2hlbWEgcmVwb3J0cyB0aGUgZ2l2ZW4gdmVuZG9yIGFuZCBTdGFuZGFyZCBTY2hlbWEgdmVyc2lvbiAxLCBhbmQgZWFjaCBzY2hlbWEgYWNjZXB0cyBldmVyeSB2YWxpZFxuICogcGF5bG9hZCBhbmQgcmVmdXNlcyBldmVyeSBpbnZhbGlkIG9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRDb250cmFjdCAtIFRoZSBjb250cmFjdC5cbiAqIEBwYXJhbSBjb250cmFjdCAtIFRoZSBjb250cmFjdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHNhbXBsZSBwYXlsb2FkcyBhbmQgdGhlIGV4cGVjdGVkIHZlbmRvci5cbiAqIEByZXR1cm5zIE9uZSBtZXNzYWdlIHBlciB2aW9sYXRpb24sIGVtcHR5IHdoZW4gdGhlIGNvbnRyYWN0IHBhc3Nlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeUFwaUNvbnRyYWN0PFRDb250cmFjdCBleHRlbmRzIEFwaUNvbnRyYWN0Pihjb250cmFjdDogVENvbnRyYWN0LCBvcHRpb25zOiBWZXJpZnlBcGlDb250cmFjdE9wdGlvbnM8VENvbnRyYWN0Pik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgdmlvbGF0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgbG9vc2VDb250cmFjdDogQXBpQ29udHJhY3QgPSBjb250cmFjdDtcbiAgY29uc3QgY2FzZXM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIEFwaU1ldGhvZENhc2VzPj4gPSBvcHRpb25zLmNhc2VzO1xuXG4gIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBPYmplY3Qua2V5cyhsb29zZUNvbnRyYWN0KSkge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihjYXNlcywgbWV0aG9kTmFtZSkpIHtcbiAgICAgIHZpb2xhdGlvbnMucHVzaChgJHttZXRob2ROYW1lfTogdGhlIGNvbnRyYWN0IGhhcyB0aGUgbWV0aG9kLCBidXQgbm8gY2FzZXMgYXJlIGdpdmVuIGZvciBpdC5gKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBtZXRob2RDYXNlc10gb2YgT2JqZWN0LmVudHJpZXMoY2FzZXMpKSB7XG4gICAgY29uc3QgbWV0aG9kQ29udHJhY3QgPSBsb29zZUNvbnRyYWN0W21ldGhvZE5hbWVdO1xuICAgIGlmIChtZXRob2RDb250cmFjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2aW9sYXRpb25zLnB1c2goYCR7bWV0aG9kTmFtZX06IGNhc2VzIGFyZSBnaXZlbiwgYnV0IHRoZSBjb250cmFjdCBoYXMgbm8gc3VjaCBtZXRob2QuYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGhhbGYgb2YgWydpbnB1dCcsICdvdXRwdXQnXSBhcyBjb25zdCkge1xuICAgICAgY29uc3Qgc2NoZW1hID0gbWV0aG9kQ29udHJhY3RbaGFsZl07XG4gICAgICBpZiAoc2NoZW1hID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmlvbGF0aW9ucy5wdXNoKGAke21ldGhvZE5hbWV9ICR7aGFsZn06IHRoZSBjb250cmFjdCBoYXMgbm8gc2NoZW1hLmApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCBhcyBhIG51bWJlcjogdGhlIHR5cGUgc2F5cyAxLCBidXQgYSBzY2hlbWEgZnJvbSBhbm90aGVyIGxpYnJhcnkgbWF5IHNwZWFrIGEgbGF0ZXIgdmVyc2lvbi5cbiAgICAgIGNvbnN0IHsgdmVuZG9yIH0gPSBzY2hlbWFbJ35zdGFuZGFyZCddO1xuICAgICAgY29uc3QgdmVyc2lvbjogbnVtYmVyID0gc2NoZW1hWyd+c3RhbmRhcmQnXS52ZXJzaW9uO1xuICAgICAgaWYgKHZlbmRvciAhPT0gb3B0aW9ucy52ZW5kb3IgfHwgdmVyc2lvbiAhPT0gMSkge1xuICAgICAgICB2aW9sYXRpb25zLnB1c2goYCR7bWV0aG9kTmFtZX0gJHtoYWxmfTogdGhlIHNjaGVtYSByZXBvcnRzIHZlbmRvciAnJHt2ZW5kb3J9JyBhbmQgdmVyc2lvbiAke1N0cmluZyh2ZXJzaW9uKX0sIGV4cGVjdGVkICcke29wdGlvbnMudmVuZG9yfScgYW5kIDEuYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgaW52YWxpZCwgdmFsaWQgfSA9IG1ldGhvZENhc2VzW2hhbGZdO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHZhbHVlXSBvZiB2YWxpZC5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2NoZW1hWyd+c3RhbmRhcmQnXS52YWxpZGF0ZSh2YWx1ZSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNzdWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2aW9sYXRpb25zLnB1c2goYCR7bWV0aG9kTmFtZX0gJHtoYWxmfTogdmFsaWQgY2FzZSAke1N0cmluZyhpbmRleCl9IHdhcyByZWZ1c2VkOiAke2Zvcm1hdElzc3VlcyhyZXN1bHQuaXNzdWVzKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgdmFsdWVdIG9mIGludmFsaWQuZW50cmllcygpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNjaGVtYVsnfnN0YW5kYXJkJ10udmFsaWRhdGUodmFsdWUpO1xuICAgICAgICBpZiAocmVzdWx0Lmlzc3VlcyA9PT0gdW5kZWZpbmVkIHx8IHJlc3VsdC5pc3N1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKGAke21ldGhvZE5hbWV9ICR7aGFsZn06IGludmFsaWQgY2FzZSAke1N0cmluZyhpbmRleCl9IHdhcyBhY2NlcHRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2aW9sYXRpb25zO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRJc3N1ZXMoaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXNzdWVzLm1hcCgoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpLmpvaW4oJyAnKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNkVPLFNBQVMsYUFBc0IsUUFBNEMsT0FBa0Q7QUFDbEksUUFBTSxTQUFTLE9BQU8sV0FBVyxFQUFFLFNBQVMsS0FBSztBQUNqRCxNQUFJLGtCQUFrQixTQUFTO0FBQzdCLFVBQU0sSUFBSSxVQUFVLHFFQUFxRTtBQUFBLEVBQzNGO0FBRUEsU0FBTztBQUNUO0FBWUEsZUFBc0Isa0JBQWlELFVBQXFCLFNBQWlFO0FBQzNKLFFBQU0sYUFBdUIsQ0FBQztBQUM5QixRQUFNLGdCQUE2QjtBQUNuQyxRQUFNLFFBQWtELFFBQVE7QUFFaEUsYUFBVyxjQUFjLE9BQU8sS0FBSyxhQUFhLEdBQUc7QUFDbkQsUUFBSSxDQUFDLE9BQU8sT0FBTyxPQUFPLFVBQVUsR0FBRztBQUNyQyxpQkFBVyxLQUFLLEdBQUcsVUFBVSwrREFBK0Q7QUFBQSxJQUM5RjtBQUFBLEVBQ0Y7QUFFQSxhQUFXLENBQUMsWUFBWSxXQUFXLEtBQUssT0FBTyxRQUFRLEtBQUssR0FBRztBQUM3RCxVQUFNLGlCQUFpQixjQUFjLFVBQVU7QUFDL0MsUUFBSSxtQkFBbUIsUUFBVztBQUNoQyxpQkFBVyxLQUFLLEdBQUcsVUFBVSx5REFBeUQ7QUFDdEY7QUFBQSxJQUNGO0FBRUEsZUFBVyxRQUFRLENBQUMsU0FBUyxRQUFRLEdBQVk7QUFDL0MsWUFBTSxTQUFTLGVBQWUsSUFBSTtBQUNsQyxVQUFJLFdBQVcsUUFBVztBQUN4QixtQkFBVyxLQUFLLEdBQUcsVUFBVSxJQUFJLElBQUksK0JBQStCO0FBQ3BFO0FBQUEsTUFDRjtBQUdBLFlBQU0sRUFBRSxPQUFPLElBQUksT0FBTyxXQUFXO0FBQ3JDLFlBQU0sVUFBa0IsT0FBTyxXQUFXLEVBQUU7QUFDNUMsVUFBSSxXQUFXLFFBQVEsVUFBVSxZQUFZLEdBQUc7QUFDOUMsbUJBQVcsS0FBSyxHQUFHLFVBQVUsSUFBSSxJQUFJLGdDQUFnQyxNQUFNLGlCQUFpQixPQUFPLE9BQU8sQ0FBQyxlQUFlLFFBQVEsTUFBTSxVQUFVO0FBQUEsTUFDcEo7QUFFQSxZQUFNLEVBQUUsU0FBUyxNQUFNLElBQUksWUFBWSxJQUFJO0FBQzNDLGlCQUFXLENBQUMsT0FBTyxLQUFLLEtBQUssTUFBTSxRQUFRLEdBQUc7QUFDNUMsY0FBTSxTQUFTLE1BQU0sT0FBTyxXQUFXLEVBQUUsU0FBUyxLQUFLO0FBQ3ZELFlBQUksT0FBTyxXQUFXLFFBQVc7QUFDL0IscUJBQVcsS0FBSyxHQUFHLFVBQVUsSUFBSSxJQUFJLGdCQUFnQixPQUFPLEtBQUssQ0FBQyxpQkFBaUIsYUFBYSxPQUFPLE1BQU0sQ0FBQyxFQUFFO0FBQUEsUUFDbEg7QUFBQSxNQUNGO0FBRUEsaUJBQVcsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLFFBQVEsR0FBRztBQUM5QyxjQUFNLFNBQVMsTUFBTSxPQUFPLFdBQVcsRUFBRSxTQUFTLEtBQUs7QUFDdkQsWUFBSSxPQUFPLFdBQVcsVUFBYSxPQUFPLE9BQU8sV0FBVyxHQUFHO0FBQzdELHFCQUFXLEtBQUssR0FBRyxVQUFVLElBQUksSUFBSSxrQkFBa0IsT0FBTyxLQUFLLENBQUMsZ0JBQWdCO0FBQUEsUUFDdEY7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGFBQWEsUUFBbUQ7QUFDdkUsU0FBTyxPQUFPLElBQUksQ0FBQyxVQUFVLE1BQU0sT0FBTyxFQUFFLEtBQUssR0FBRztBQUN0RDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,81 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Checks an {@link ApiContract} against sample payloads, for a contract's own test: every method has both schemas,
6
+ * every schema reports the expected vendor, and each schema accepts every valid payload and refuses every invalid one.
7
+ *
8
+ * It returns what it found rather than asserting, so it runs under any test framework:
9
+ *
10
+ * ```ts
11
+ * expect(await verifyApiContract(MY_API_CONTRACT, { cases, vendor: 'my-plugin' })).toEqual([]);
12
+ * ```
13
+ *
14
+ * It lives apart from `api-contract.ts` because a contract a consumer copies imports that module into its plugin,
15
+ * and nothing here is needed at runtime.
16
+ */
17
+ import type { StandardSchemaV1 } from '@standard-schema/spec' with { 'resolution-mode': 'import' };
18
+ import type { ApiContract } from './api-contract.cjs';
19
+ /**
20
+ * The sample payloads of one method, for each half of its contract.
21
+ */
22
+ export interface ApiMethodCases {
23
+ /**
24
+ * Sample argument lists.
25
+ */
26
+ readonly input: PayloadCases;
27
+ /**
28
+ * Sample return values.
29
+ */
30
+ readonly output: PayloadCases;
31
+ }
32
+ /**
33
+ * Sample payloads for one schema.
34
+ */
35
+ export interface PayloadCases {
36
+ /**
37
+ * Payloads the schema must refuse.
38
+ */
39
+ readonly invalid: readonly unknown[];
40
+ /**
41
+ * Payloads the schema must accept.
42
+ */
43
+ readonly valid: readonly unknown[];
44
+ }
45
+ /**
46
+ * Options for {@link verifyApiContract}.
47
+ *
48
+ * @typeParam TContract - The contract.
49
+ */
50
+ export interface VerifyApiContractOptions<TContract extends ApiContract> {
51
+ /**
52
+ * The sample payloads, one entry per method of the contract.
53
+ */
54
+ readonly cases: Readonly<Record<keyof TContract & string, ApiMethodCases>>;
55
+ /**
56
+ * The Standard Schema `vendor` every schema must report.
57
+ */
58
+ readonly vendor: string;
59
+ }
60
+ /**
61
+ * Runs a Standard Schema that must be synchronous. A schema guarding a call it cannot delay, as a contract's schemas
62
+ * do, has to answer before that call returns.
63
+ *
64
+ * @typeParam TOutput - The type the schema produces.
65
+ * @param schema - The schema.
66
+ * @param value - The value to validate.
67
+ * @returns The schema's result.
68
+ * @throws If the schema answers with a promise.
69
+ */
70
+ export declare function validateSync<TOutput>(schema: StandardSchemaV1<unknown, TOutput>, value: unknown): StandardSchemaV1.Result<TOutput>;
71
+ /**
72
+ * Checks a contract against sample payloads: the contract has exactly the methods the cases name, each with both
73
+ * schemas, every schema reports the given vendor and Standard Schema version 1, and each schema accepts every valid
74
+ * payload and refuses every invalid one.
75
+ *
76
+ * @typeParam TContract - The contract.
77
+ * @param contract - The contract.
78
+ * @param options - The sample payloads and the expected vendor.
79
+ * @returns One message per violation, empty when the contract passes.
80
+ */
81
+ export declare function verifyApiContract<TContract extends ApiContract>(contract: TContract, options: VerifyApiContractOptions<TContract>): Promise<string[]>;
@@ -37,7 +37,9 @@ __export(api_contract_exports, {
37
37
  instanceOfGuard: () => instanceOfGuard,
38
38
  literalGuard: () => literalGuard,
39
39
  nullableGuard: () => nullableGuard,
40
+ objectGuard: () => objectGuard,
40
41
  optionalGuard: () => optionalGuard,
42
+ optionsGuard: () => optionsGuard,
41
43
  unionGuard: () => unionGuard
42
44
  });
43
45
  module.exports = __toCommonJS(api_contract_exports);
@@ -96,12 +98,29 @@ function nullableGuard(guard) {
96
98
  typeGuard: (value) => value === null || guard.typeGuard(value)
97
99
  };
98
100
  }
101
+ function objectGuard(propertyGuards, options) {
102
+ const guards = (0, import_object_utils.castTo)(propertyGuards);
103
+ const exactOptionalKeys = options?.exactOptionalKeys ?? {};
104
+ return createExpectedTypeGuard(
105
+ describeObject(options?.description, guards, (key) => Object.hasOwn(exactOptionalKeys, key)),
106
+ (0, import_type_guards.objectTypeGuard)((0, import_object_utils.castTo)(mapGuards(guards, (guard) => guard.typeGuard)), options)
107
+ );
108
+ }
99
109
  function optionalGuard(guard) {
100
110
  return {
101
111
  expected: `${guard.expected} or undefined`,
102
112
  typeGuard: (value) => value === void 0 || guard.typeGuard(value)
103
113
  };
104
114
  }
115
+ function optionsGuard(optionGuards, options) {
116
+ const guards = (0, import_object_utils.castTo)(optionGuards);
117
+ return createExpectedTypeGuard(
118
+ describeObject(options?.description, guards, () => true),
119
+ (0, import_type_guards.objectTypeGuard)((0, import_object_utils.castTo)(mapGuards(guards, (guard) => (0, import_type_guards.optionalTypeGuard)(guard.typeGuard))), {
120
+ shouldRejectUnknownKeys: options?.shouldRejectUnknownKeys ?? false
121
+ })
122
+ );
123
+ }
105
124
  function unionGuard(...guards) {
106
125
  return createExpectedTypeGuard(
107
126
  guards.map((guard) => guard.expected).join(" or "),
@@ -117,6 +136,11 @@ function createSchema(validate, vendor) {
117
136
  }
118
137
  };
119
138
  }
139
+ function describeObject(description, guards, isOptional) {
140
+ const entries = Object.entries(guards);
141
+ const properties = entries.length === 0 ? "{}" : `{ ${entries.map(([key, guard]) => `${key}${isOptional(key) ? "?" : ""}: ${guard.expected}`).join("; ")} }`;
142
+ return description === void 0 ? properties : `${description}: ${properties}`;
143
+ }
120
144
  function formatLiteral(literal) {
121
145
  if ((0, import_type_guards.isString)(literal)) {
122
146
  return `'${literal}'`;
@@ -126,6 +150,9 @@ function formatLiteral(literal) {
126
150
  function isReadonlyArray(value) {
127
151
  return Array.isArray(value);
128
152
  }
153
+ function mapGuards(guards, toTypeGuard) {
154
+ return Object.fromEntries(Object.entries(guards).map(([key, guard]) => [key, toTypeGuard(guard)]));
155
+ }
129
156
  // Annotate the CommonJS export names for ESM import in node:
130
157
  0 && (module.exports = {
131
158
  BOOLEAN_GUARD,
@@ -142,7 +169,9 @@ function isReadonlyArray(value) {
142
169
  instanceOfGuard,
143
170
  literalGuard,
144
171
  nullableGuard,
172
+ objectGuard,
145
173
  optionalGuard,
174
+ optionsGuard,
146
175
  unionGuard
147
176
  });
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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
177
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwaS1jb250cmFjdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBjb250cmFjdCBvZiBhbiBBUEkgb25lIG1vZHVsZSBleHBvc2VzIHRvIGFub3RoZXI6IHdoaWNoIG1ldGhvZHMgaXQgcHJvbWlzZXMsIGFuZCBhXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdGFuZGFyZHNjaGVtYS5kZXYgfCBTdGFuZGFyZCBTY2hlbWF9IG92ZXIgZWFjaCBtZXRob2QncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS5cbiAqXG4gKiBUaGUgc2NoZW1hcyBhcmUgcGxhaW4gb2JqZWN0cyBvdmVyIHBsYWluIGZ1bmN0aW9ucywgd2hpY2ggYSB0eXBlIGd1YXJkIGFscmVhZHkgaXMsIHNvIGEgY29udHJhY3QgY2FuIGNyb3NzIGFcbiAqIGJvdW5kYXJ5IGJldHdlZW4gdHdvIGNvcGllcyBvZiBhIGxpYnJhcnkgYW5kIHN0aWxsIGJlIHJ1biBieSB3aGljaGV2ZXIgY29weSByZWFkcyBpdC4gVGhlIGJ1aWxkZXJzIGhlcmUgdHVyblxuICogdGhlIGd1YXJkcyBhIG1vZHVsZSBhbHJlYWR5IGhhcyBpbnRvIHRoZSB0d28gc2hhcGVzIGEgbWV0aG9kIGNvbnRyYWN0IG5lZWRzOiBvbmUgdmFsdWUgKGFuIG91dHB1dCkgYW5kIG9uZVxuICogYXJndW1lbnQgbGlzdCAoYW4gaW5wdXQpLiB6b2QgLyB2YWxpYm90IC8gYXJrdHlwZSBzY2hlbWFzIHBsdWcgaW50byB0aGUgc2FtZSBzbG90cyB1bmNoYW5nZWQ7IHRoaXMgbW9kdWxlIGp1c3RcbiAqIGRvZXMgbm90IG1ha2UgZXZlcnkgcHJvdmlkZXIgYnVuZGxlIG9uZSB0byBkZXNjcmliZSB0d28gYXJndW1lbnRzLlxuICpcbiAqIFJ1bm5pbmcgdGhlIHNjaGVtYXMgaXMgbGVmdCB0byB3aG9ldmVyIG93bnMgdGhlIGNhbGwgcGF0aCwgc2luY2UgdGhhdCBpcyB3aGVyZSBhbiBpc3N1ZSBjYW4gYmUgcmVwb3J0ZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFuZGFyZFNjaGVtYVYxIH0gZnJvbSAnQHN0YW5kYXJkLXNjaGVtYS9zcGVjJztcblxuaW1wb3J0IHR5cGUge1xuICBHdWFyZGVkVHlwZSxcbiAgTGl0ZXJhbCxcbiAgT2JqZWN0VHlwZUd1YXJkT3B0aW9ucyxcbiAgUHJvcGVydHlUeXBlR3VhcmRzLFxuICBUeXBlR3VhcmRcbn0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbmltcG9ydCB7IExJQlJBUllfTkFNRSB9IGZyb20gJy4vbGlicmFyeS50cyc7XG5pbXBvcnQgeyBjYXN0VG8gfSBmcm9tICcuL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQge1xuICBhcnJheVR5cGVHdWFyZCxcbiAgaW5zdGFuY2VPZlR5cGVHdWFyZCxcbiAgaXNCb29sZWFuLFxuICBpc051bWJlcixcbiAgaXNTdHJpbmcsXG4gIGlzU3RyaW5nQXJyYXksXG4gIGlzVW5kZWZpbmVkLFxuICBsaXRlcmFsVHlwZUd1YXJkLFxuICBvYmplY3RUeXBlR3VhcmQsXG4gIG9wdGlvbmFsVHlwZUd1YXJkLFxuICB1bmlvblR5cGVHdWFyZFxufSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcblxuLyoqXG4gKiBUaGUgY29udHJhY3QgYW4gQVBJIGRlY2xhcmVzOiBldmVyeSBrZXkgaXMgYSBtZXRob2QgdGhlIEFQSSBwcm9taXNlcyB0byBleHBvc2UsIGFuZCBpdHMgdmFsdWUgb3B0aW9uYWxseVxuICogY2FycmllcyB0aGUgcGF5bG9hZCBzY2hlbWFzIGZvciB0aGF0IG1ldGhvZC5cbiAqXG4gKiBUeXBlZCBvdmVyIHRoZSBBUEkgd2hlbiBvbmUgaXMgbmFtZWQ6IGBBcGlDb250cmFjdDxNeUFwaT5gIGhhcyBleGFjdGx5IG9uZSBlbnRyeSBwZXIgZnVuY3Rpb24gbWVtYmVyIG9mXG4gKiBgTXlBcGlgIChhIG1pc3NpbmcgbWV0aG9kLCBhbiBleHRyYSBvbmUgb3IgYSBtaXNzcGVsbGVkIG9uZSBkb2VzIG5vdCBjb21waWxlKSwgYW5kIGVhY2ggZW50cnkncyBzY2hlbWFzIG11c3RcbiAqIHByb2R1Y2UgdGhhdCBtZXRob2QncyBwYXJhbWV0ZXJzIGFuZCBhd2FpdGVkIHJldHVybiB2YWx1ZS4gV2l0aG91dCBhIHR5cGUgYXJndW1lbnQsIG9yIGZvciBgb2JqZWN0YCwgaXQgaXMgdGhlXG4gKiBsb29zZSByZWNvcmQgYSByZWFkZXIgdGhhdCBrbm93cyBub3RoaW5nIGFib3V0IHRoZSBBUEkgc2Vlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHRoZSBjb250cmFjdCBkZXNjcmliZXMuIGBvYmplY3RgLCB0aGUgZGVmYXVsdCwgbWVhbnMgXCJub3QgdHlwZWRcIi5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpQ29udHJhY3Q8VEFwaSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4gPSBvYmplY3QgZXh0ZW5kcyBUQXBpID8gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQXBpTWV0aG9kQ29udHJhY3Q+PlxuICA6IFR5cGVkQXBpQ29udHJhY3Q8VEFwaT47XG5cbi8qKlxuICogVGhlIHNjaGVtYSBidWlsZGVycyBvZiB0aGlzIG1vZHVsZSB3aXRoIHRoZSBTdGFuZGFyZCBTY2hlbWEgYHZlbmRvcmAgYWxyZWFkeSBib3VuZCwgYXNcbiAqIHtAbGluayBjcmVhdGVBcGlDb250cmFjdFNjaGVtYUJ1aWxkZXJzfSByZXR1cm5zIHRoZW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpQ29udHJhY3RTY2hlbWFCdWlsZGVycyB7XG4gIC8qKlxuICAgKiB7QGxpbmsgY3JlYXRlQXJndW1lbnRzU2NoZW1hfSwgcmVwb3J0aW5nIHRoZSBib3VuZCB2ZW5kb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVFBhcmFtZXRlcnMgLSBUaGUgbWV0aG9kJ3MgcGFyYW1ldGVycywgaW5mZXJyZWQgZnJvbSB0aGUgZ3VhcmRzIG9yIGZyb20gdGhlIGNvbnRyYWN0IGVudHJ5LlxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyAtIE9uZSBndWFyZCBwZXIgcGFyYW1ldGVyLCBpbiBvcmRlci5cbiAgICogQHJldHVybnMgVGhlIHNjaGVtYS5cbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZUFyZ3VtZW50c1NjaGVtYTogPGNvbnN0IFRQYXJhbWV0ZXJzIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPihcbiAgICBwYXJhbWV0ZXJzOiBBcmd1bWVudFR5cGVHdWFyZHM8VFBhcmFtZXRlcnM+XG4gICkgPT4gU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBNdXRhYmxlVHVwbGU8VFBhcmFtZXRlcnM+PjtcblxuICAvKipcbiAgICoge0BsaW5rIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYX0sIHJlcG9ydGluZyB0aGUgYm91bmQgdmVuZG9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAgICogQHBhcmFtIGd1YXJkIC0gVGhlIGd1YXJkIGFuZCB3aGF0IGl0IGV4cGVjdHMuXG4gICAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVUeXBlR3VhcmRTY2hlbWE6IDxUPihndWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4pID0+IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgVD47XG59XG5cbi8qKlxuICogVGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgYSBzaW5nbGUgQVBJIG1ldGhvZC4gQm90aCBoYWx2ZXMgYXJlIG9wdGlvbmFsOiBhIG1ldGhvZCBtYXkgZGVjbGFyZSBvbmx5IGl0cyBpbnB1dCxcbiAqIG9ubHkgaXRzIG91dHB1dCwgbmVpdGhlciAodGhlIGVudHJ5IHRoZW4ganVzdCBkZWNsYXJlcyB0aGF0IHRoZSBtZXRob2QgbXVzdCBleGlzdCksIG9yIGJvdGguXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLCBhcyBhIHR1cGxlLCB3aGljaCB0aGUgaW5wdXQgc2NoZW1hIG11c3QgcHJvZHVjZS5cbiAqIEB0eXBlUGFyYW0gVFJldHVyblZhbHVlIC0gVGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSwgYXdhaXRlZCwgd2hpY2ggdGhlIG91dHB1dCBzY2hlbWEgbXVzdCBwcm9kdWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaU1ldGhvZENvbnRyYWN0PFRQYXJhbWV0ZXJzID0gdW5rbm93biwgVFJldHVyblZhbHVlID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyBhcmd1bWVudHMsIGFzIGFuIGFycmF5LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ/OiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFRQYXJhbWV0ZXJzPjtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUsIG9yLCB3aGVuIHRoZSBtZXRob2QgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgdmFsdWUgaXQgcmVzb2x2ZXMgdG8uXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ/OiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFRSZXR1cm5WYWx1ZT47XG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbiBtZW1iZXJzIG9mIGFuIEFQSSwgd2hpY2ggYXJlIGV4YWN0bHkgdGhlIGtleXMgYSB0eXBlZCB7QGxpbmsgQXBpQ29udHJhY3R9IGhhcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJLlxuICovXG5leHBvcnQgdHlwZSBBcGlNZXRob2ROYW1lPFRBcGkgZXh0ZW5kcyBvYmplY3Q+ID0ga2V5b2YgQXBpTWV0aG9kczxUQXBpPiAmIHN0cmluZztcblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gbWVtYmVycyBvZiBhbiBBUEkuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpTWV0aG9kczxUQXBpIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW1RLZXkgaW4ga2V5b2YgVEFwaSBhcyBUQXBpW1RLZXldIGV4dGVuZHMgKC4uLmFyZ3VtZW50c186IG5ldmVyKSA9PiB1bmtub3duID8gVEtleSA6IG5ldmVyXTogVEFwaVtUS2V5XTtcbn07XG5cbi8qKlxuICogT25lIHR5cGUgZ3VhcmQgcGVyIHBhcmFtZXRlciBvZiBhIG1ldGhvZCwgaW4gb3JkZXIuXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgdHlwZSBBcmd1bWVudFR5cGVHdWFyZHM8VFBhcmFtZXRlcnMgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+ID0ge1xuICByZWFkb25seSBbVEluZGV4IGluIGtleW9mIFRQYXJhbWV0ZXJzXTogRXhwZWN0ZWRUeXBlR3VhcmQ8VFBhcmFtZXRlcnNbVEluZGV4XT47XG59O1xuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlQXJndW1lbnRzU2NoZW1hfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcmd1bWVudHNTY2hlbWFPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBTdGFuZGFyZCBTY2hlbWEgYHZlbmRvcmAgdGhlIHNjaGVtYSByZXBvcnRzLiBEZWZhdWx0cyB0byB0aGlzIGxpYnJhcnkncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVuZG9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVUeXBlR3VhcmRTY2hlbWF9OiB0aGUgZ3VhcmQsIHdoYXQgaXQgZXhwZWN0cywgYW5kIG9wdGlvbmFsbHkgdGhlIHNjaGVtYSdzIHZlbmRvci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVUeXBlR3VhcmRTY2hlbWFQYXJhbXM8VD4gZXh0ZW5kcyBFeHBlY3RlZFR5cGVHdWFyZDxUPiB7XG4gIC8qKlxuICAgKiBUaGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIHRoZSBzY2hlbWEgcmVwb3J0cy4gRGVmYXVsdHMgdG8gdGhpcyBsaWJyYXJ5J3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlbmRvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPbmUgdmFsdWUgYSBzY2hlbWEgYWNjZXB0cywgZGVzY3JpYmVkIGJ5IGEgdHlwZSBndWFyZCBhbmQgYnkgd2hhdCBpdCBleHBlY3RzLCBmb3IgdGhlIGlzc3VlIG1lc3NhZ2UuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICAvKipcbiAgICogV2hhdCB0aGUgdmFsdWUgc2hvdWxkIGhhdmUgYmVlbiwgcGhyYXNlZCB0byBmb2xsb3cgXCJFeHBlY3RlZFwiLCBlLmcuIGAnYSBzdHJpbmcnYC5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdGVkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciB0aGUgdmFsdWUgaXMgYWNjZXB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIGBUYC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGVHdWFyZDogKHZhbHVlOiB1bmtub3duKSA9PiB2YWx1ZSBpcyBUO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBvYmplY3RHdWFyZH0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIG9iamVjdCB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdEd1YXJkT3B0aW9uczxUIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIE9iamVjdFR5cGVHdWFyZE9wdGlvbnM8VD4ge1xuICAvKipcbiAgICogV2hhdCB0aGUgb2JqZWN0IGlzLCBwdXQgYmVmb3JlIGl0cyBwcm9wZXJ0aWVzIGluIGBleHBlY3RlZGAsIGUuZy4gYCd0aGUgb3B0aW9ucyBvZiB0aGUgbGluaydgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIGd1YXJkIHBlciBvcHRpb24gb2YgYW4gYWxsLW9wdGlvbmFsIG9iamVjdCB0eXBlLCBhcyB7QGxpbmsgb3B0aW9uc0d1YXJkfSB0YWtlcyB0aGVtOiBlYWNoIGRlc2NyaWJlcyBhXG4gKiBQUkVTRU5UIG9wdGlvbiwgc28gaXQgZG9lcyBub3QgYWNjZXB0IGB1bmRlZmluZWRgLiBBIHJlcXVpcmVkIHByb3BlcnR5IG9mIGBUYCB0YWtlcyBgbmV2ZXJgLCBzbyBhIHR5cGUgdGhhdCBpc1xuICogbm90IGFsbC1vcHRpb25hbCBkb2VzIG5vdCBjb21waWxlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSBvYmplY3QgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9uR3VhcmRzPFQgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICByZWFkb25seSBbVEtleSBpbiBrZXlvZiBUXS0/OiBQYXJ0aWFsPFBpY2s8VCwgVEtleT4+IGV4dGVuZHMgUGljazxULCBUS2V5PiA/IEV4cGVjdGVkVHlwZUd1YXJkPEV4Y2x1ZGU8VFtUS2V5XSwgdW5kZWZpbmVkPj4gOiBuZXZlcjtcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIG9wdGlvbnNHdWFyZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uc0d1YXJkT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGF0IHRoZSBvcHRpb25zIGFyZSwgcHV0IGJlZm9yZSB0aGVtIGluIGBleHBlY3RlZGAsIGUuZy4gYCdzZWxlY3Qgb3B0aW9ucydgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB2YWx1ZSBjYXJyeWluZyBhbiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5IHRoYXQgbm8gb3B0aW9uIGd1YXJkIG5hbWVzIGlzIHJlZnVzZWQuIExldHRpbmcgaXQgdGhyb3VnaCxcbiAgICogdGhlIGRlZmF1bHQsIGxldHMgYSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0IGEgbGF0ZXIgdmVyc2lvbiBvZiB0aGUgb3B0aW9ucyBwYXNzIG9uZSB0aGlzIHZlcnNpb24gZG9lcyBub3Qga25vdy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVqZWN0VW5rbm93bktleXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9uZSBndWFyZCBwZXIgcHJvcGVydHkgb2YgYW4gb2JqZWN0IHR5cGUsIGFzIHtAbGluayBvYmplY3RHdWFyZH0gdGFrZXMgdGhlbSwgdHlwZWQgYXMge0BsaW5rIFByb3BlcnR5VHlwZUd1YXJkc31cbiAqIHR5cGVzIHRoZSBiYXJlIGd1YXJkcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgb2JqZWN0IHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFByb3BlcnR5R3VhcmRzPFQgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICByZWFkb25seSBbVEtleSBpbiBrZXlvZiBUXS0/OiBFeHBlY3RlZFR5cGVHdWFyZDxQYXJ0aWFsPFBpY2s8VCwgVEtleT4+IGV4dGVuZHMgUGljazxULCBUS2V5PiA/IFRbVEtleV0gfCB1bmRlZmluZWQgOiBUW1RLZXldPjtcbn07XG5cbi8qKlxuICogVGhlIHtAbGluayBBcGlDb250cmFjdH0gb2YgYSBuYW1lZCBBUEk6IG9uZSBlbnRyeSBwZXIgZnVuY3Rpb24gbWVtYmVyLCBlYWNoIHR5cGVkIGFnYWluc3QgdGhhdCBtZW1iZXIuIEJvdGhcbiAqIHNjaGVtYXMgYXJlIFJFUVVJUkVEIGhlcmUsIHNvIGEgdHlwZWQgY29udHJhY3QgaXMgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIGV2ZXJ5IHNpZ25hdHVyZSBhbmQgYSBge31gIGVudHJ5IGRvZXNcbiAqIG5vdCBjb21waWxlLiBPbmx5IHRoZSBsb29zZSBmb3JtIGxlYXZlcyB0aGVtIG9wdGlvbmFsLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdGhlIGNvbnRyYWN0IGRlc2NyaWJlcy5cbiAqL1xuZXhwb3J0IHR5cGUgVHlwZWRBcGlDb250cmFjdDxUQXBpIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgcmVhZG9ubHkgW1RLZXkgaW4gQXBpTWV0aG9kTmFtZTxUQXBpPl0tPzogVEFwaVtUS2V5XSBleHRlbmRzICguLi5hcmd1bWVudHNfOiBpbmZlciBUUGFyYW1ldGVycykgPT4gaW5mZXIgVFJldHVyblZhbHVlID8gUmVxdWlyZWQ8QXBpTWV0aG9kQ29udHJhY3Q8VFBhcmFtZXRlcnMsIEF3YWl0ZWQ8VFJldHVyblZhbHVlPj4+XG4gICAgOiBuZXZlcjtcbn07XG5cbnR5cGUgTXV0YWJsZVR1cGxlPFRUdXBsZSBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4gPSB7IC1yZWFkb25seSBbVEluZGV4IGluIGtleW9mIFRUdXBsZV06IFRUdXBsZVtUSW5kZXhdIH07XG5cbi8qKlxuICogQWNjZXB0cyBhIGJvb2xlYW4uXG4gKi9cbmV4cG9ydCBjb25zdCBCT09MRUFOX0dVQVJEOiBFeHBlY3RlZFR5cGVHdWFyZDxib29sZWFuPiA9IHsgZXhwZWN0ZWQ6ICdhIGJvb2xlYW4nLCB0eXBlR3VhcmQ6IGlzQm9vbGVhbiB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYSBudW1iZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBOVU1CRVJfR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPG51bWJlcj4gPSB7IGV4cGVjdGVkOiAnYSBudW1iZXInLCB0eXBlR3VhcmQ6IGlzTnVtYmVyIH07XG5cbi8qKlxuICogQWNjZXB0cyBhIHN0cmluZy4gU3ByZWFkIGl0IHRvIHNheSB3aGF0IHRoZSBzdHJpbmcgaXM6IGB7IC4uLlNUUklOR19HVUFSRCwgZXhwZWN0ZWQ6ICdhIHBhdGgnIH1gLlxuICovXG5leHBvcnQgY29uc3QgU1RSSU5HX0dVQVJEOiBFeHBlY3RlZFR5cGVHdWFyZDxzdHJpbmc+ID0geyBleHBlY3RlZDogJ2Egc3RyaW5nJywgdHlwZUd1YXJkOiBpc1N0cmluZyB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUUklOR19BUlJBWV9HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8c3RyaW5nW10+ID0geyBleHBlY3RlZDogJ2FuIGFycmF5IG9mIHN0cmluZ3MnLCB0eXBlR3VhcmQ6IGlzU3RyaW5nQXJyYXkgfTtcblxuLyoqXG4gKiBBY2NlcHRzIGB1bmRlZmluZWRgLCB3aGljaCBpcyB0aGUgb3V0cHV0IG9mIGEgbWV0aG9kIHJldHVybmluZyBgdm9pZGAgb3IgYFByb21pc2U8dm9pZD5gLlxuICovXG5leHBvcnQgY29uc3QgVU5ERUZJTkVEX0dVQVJEOiBFeHBlY3RlZFR5cGVHdWFyZDx1bmRlZmluZWQ+ID0geyBleHBlY3RlZDogJ3VuZGVmaW5lZCcsIHR5cGVHdWFyZDogaXNVbmRlZmluZWQgfTtcblxuLyoqXG4gKiBXaWRlbnMgYSBndWFyZCB0byBhbiBhcnJheSB3aG9zZSBldmVyeSBpdGVtIGBpdGVtR3VhcmRgIGFjY2VwdHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgYW4gaXRlbS5cbiAqIEBwYXJhbSBpdGVtR3VhcmQgLSBUaGUgZ3VhcmQgZm9yIG9uZSBpdGVtLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlHdWFyZDxUPihpdGVtR3VhcmQ6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VFtdPiB7XG4gIHJldHVybiBjcmVhdGVFeHBlY3RlZFR5cGVHdWFyZChgYW4gYXJyYXkgd2hvc2UgZXZlcnkgaXRlbSBpcyAke2l0ZW1HdWFyZC5leHBlY3RlZH1gLCBhcnJheVR5cGVHdWFyZChpdGVtR3VhcmQudHlwZUd1YXJkKSk7XG59XG5cbi8qKlxuICogQmluZHMgdGhlIFN0YW5kYXJkIFNjaGVtYSBgdmVuZG9yYCBvbmNlLCBzbyBhIGNvbnRyYWN0IGRvZXMgbm90IHBhc3MgaXQgdG8gZXZlcnkgc2NoZW1hIGJ1aWxkZXIuIERlc3RydWN0dXJlIHRoZVxuICogcmVzdWx0IHVuZGVyIHRoZSBidWlsZGVycycgb3duIG5hbWVzIGFuZCB0aGUgY2FsbHMgcmVhZCBleGFjdGx5IGFzIHRoZSB1bmJvdW5kIG9uZXMgZG86XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHsgY3JlYXRlQXJndW1lbnRzU2NoZW1hLCBjcmVhdGVUeXBlR3VhcmRTY2hlbWEgfSA9IGNyZWF0ZUFwaUNvbnRyYWN0U2NoZW1hQnVpbGRlcnMoJ215LXBsdWdpbicpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZlbmRvciAtIFRoZSB2ZW5kb3IgZXZlcnkgc2NoZW1hIHJlcG9ydHMuXG4gKiBAcmV0dXJucyBUaGUgYm91bmQgYnVpbGRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcGlDb250cmFjdFNjaGVtYUJ1aWxkZXJzKHZlbmRvcjogc3RyaW5nKTogQXBpQ29udHJhY3RTY2hlbWFCdWlsZGVycyB7XG4gIHJldHVybiB7XG4gICAgY3JlYXRlQXJndW1lbnRzU2NoZW1hOiA8Y29uc3QgVFBhcmFtZXRlcnMgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+KHBhcmFtZXRlcnM6IEFyZ3VtZW50VHlwZUd1YXJkczxUUGFyYW1ldGVycz4pID0+IGNyZWF0ZUFyZ3VtZW50c1NjaGVtYShwYXJhbWV0ZXJzLCB7IHZlbmRvciB9KSxcbiAgICBjcmVhdGVUeXBlR3VhcmRTY2hlbWE6IDxUPihndWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4pID0+IGNyZWF0ZVR5cGVHdWFyZFNjaGVtYSh7IC4uLmd1YXJkLCB2ZW5kb3IgfSlcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGlucHV0IHNjaGVtYSBvZiBhIG1ldGhvZCBjb250cmFjdDogYSBzY2hlbWEgb3ZlciB0aGUgbWV0aG9kJ3MgQVJHVU1FTlQgTElTVCwgb25lIHR5cGUgZ3VhcmQgcGVyXG4gKiBwYXJhbWV0ZXIuIEFuIGFyZ3VtZW50IHRoYXQgZmFpbHMgaXRzIGd1YXJkIGlzIHJlcG9ydGVkIHdpdGggaXRzIGluZGV4IGFzIHRoZSBpc3N1ZSBwYXRoLCBhbmQgYW4gYXJndW1lbnQgbGlzdFxuICogbG9uZ2VyIHRoYW4gdGhlIHBhcmFtZXRlciBsaXN0IGlzIHJlZnVzZWQuIEEgbWlzc2luZyBhcmd1bWVudCByZWFjaGVzIGl0cyBndWFyZCBhcyBgdW5kZWZpbmVkYCwgc28gYW4gb3B0aW9uYWxcbiAqIHBhcmFtZXRlcidzIGd1YXJkIGFjY2VwdHMgYHVuZGVmaW5lZGAgKHNlZSB7QGxpbmsgb3B0aW9uYWxHdWFyZH0pLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBhcmFtZXRlcnMgLSBUaGUgbWV0aG9kJ3MgcGFyYW1ldGVycywgaW5mZXJyZWQgZnJvbSB0aGUgZ3VhcmRzIG9yIGZyb20gdGhlIGNvbnRyYWN0IGVudHJ5LlxuICogQHBhcmFtIHBhcmFtZXRlcnMgLSBPbmUgZ3VhcmQgcGVyIHBhcmFtZXRlciwgaW4gb3JkZXIuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgc2NoZW1hLlxuICogQHJldHVybnMgVGhlIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFyZ3VtZW50c1NjaGVtYTxjb25zdCBUUGFyYW1ldGVycyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4oXG4gIHBhcmFtZXRlcnM6IEFyZ3VtZW50VHlwZUd1YXJkczxUUGFyYW1ldGVycz4sXG4gIG9wdGlvbnM/OiBDcmVhdGVBcmd1bWVudHNTY2hlbWFPcHRpb25zXG4pOiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIE11dGFibGVUdXBsZTxUUGFyYW1ldGVycz4+IHtcbiAgY29uc3QgcGFyYW1ldGVyTGlzdCA9IGNhc3RUbzxyZWFkb25seSBFeHBlY3RlZFR5cGVHdWFyZDx1bmtub3duPltdPihwYXJhbWV0ZXJzKTtcbiAgcmV0dXJuIGNyZWF0ZVNjaGVtYSgodmFsdWU6IHVua25vd24pOiBTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDxNdXRhYmxlVHVwbGU8VFBhcmFtZXRlcnM+PiA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgaXNzdWVzOiBbeyBtZXNzYWdlOiAnRXhwZWN0ZWQgYW4gYXJndW1lbnQgbGlzdC4nIH1dIH07XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA+IHBhcmFtZXRlckxpc3QubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyBpc3N1ZXM6IFt7IG1lc3NhZ2U6IGBFeHBlY3RlZCBhdCBtb3N0ICR7U3RyaW5nKHBhcmFtZXRlckxpc3QubGVuZ3RoKX0gYXJndW1lbnQocyksIGdvdCAke1N0cmluZyh2YWx1ZS5sZW5ndGgpfS5gIH1dIH07XG4gICAgfVxuXG4gICAgY29uc3QgaXNzdWVzID0gcGFyYW1ldGVyTGlzdC5mbGF0TWFwKChwYXJhbWV0ZXIsIGluZGV4KTogU3RhbmRhcmRTY2hlbWFWMS5Jc3N1ZVtdID0+IHBhcmFtZXRlci50eXBlR3VhcmQodmFsdWVbaW5kZXhdKSA/IFtdIDogW3sgbWVzc2FnZTogYEV4cGVjdGVkICR7cGFyYW1ldGVyLmV4cGVjdGVkfS5gLCBwYXRoOiBbaW5kZXhdIH1dKTtcbiAgICByZXR1cm4gaXNzdWVzLmxlbmd0aCA9PT0gMCA/IHsgdmFsdWU6IGNhc3RUbzxNdXRhYmxlVHVwbGU8VFBhcmFtZXRlcnM+Pih2YWx1ZSkgfSA6IHsgaXNzdWVzIH07XG4gIH0sIG9wdGlvbnM/LnZlbmRvcik7XG59XG5cbi8qKlxuICogUGFpcnMgYSB0eXBlIGd1YXJkIHdpdGggd2hhdCBpdCBleHBlY3RzLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICogQHBhcmFtIGV4cGVjdGVkIC0gV2hhdCB0aGUgdmFsdWUgc2hvdWxkIGhhdmUgYmVlbiwgcGhyYXNlZCB0byBmb2xsb3cgXCJFeHBlY3RlZFwiLCBlLmcuIGAnYSBzdHJpbmcnYC5cbiAqIEBwYXJhbSB0eXBlR3VhcmQgLSBUaGUgZ3VhcmQuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeHBlY3RlZFR5cGVHdWFyZDxUPihleHBlY3RlZDogc3RyaW5nLCB0eXBlR3VhcmQ6IFR5cGVHdWFyZDxUPik6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+IHtcbiAgcmV0dXJuIHsgZXhwZWN0ZWQsIHR5cGVHdWFyZCB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHNjaGVtYSBvdmVyIG9uZSB2YWx1ZSBmcm9tIGEgdHlwZSBndWFyZDogdGhlIG91dHB1dCBzY2hlbWEgb2YgYSBtZXRob2QgY29udHJhY3QsIHR5cGljYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZ3VhcmQsIHdoYXQgaXQgZXhwZWN0cywgYW5kIG9wdGlvbmFsbHkgdGhlIHNjaGVtYSdzIHZlbmRvci5cbiAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUeXBlR3VhcmRTY2hlbWE8VD4ocGFyYW1zOiBDcmVhdGVUeXBlR3VhcmRTY2hlbWFQYXJhbXM8VD4pOiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFQ+IHtcbiAgcmV0dXJuIGNyZWF0ZVNjaGVtYShcbiAgICAodmFsdWU6IHVua25vd24pOiBTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDxUPiA9PiBwYXJhbXMudHlwZUd1YXJkKHZhbHVlKSA/IHsgdmFsdWUgfSA6IHsgaXNzdWVzOiBbeyBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtwYXJhbXMuZXhwZWN0ZWR9LmAgfV0gfSxcbiAgICBwYXJhbXMudmVuZG9yXG4gICk7XG59XG5cbi8qKlxuICogU3RhdGVzIGEgY29udHJhY3QgYWdhaW5zdCBhbiBBUEkgdHlwZSwgc28gZXZlcnkgZW50cnkgaXMgY2hlY2tlZCBhZ2FpbnN0IGl0cyBtZXRob2QgYW5kIHRoZSBzY2hlbWEgYnVpbGRlcnNcbiAqIGluc2lkZSBpdCBpbmZlciB0aGVpciB0eXBlcyBmcm9tIHRoZSBtZXRob2QgcmF0aGVyIHRoYW4gZnJvbSBhIHJlc3RhdGVkIHR1cGxlLiBJdCByZXR1cm5zIHRoZSBjb250cmFjdCBhcyBpcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHRoZSBjb250cmFjdCBkZXNjcmliZXMuXG4gKiBAcGFyYW0gY29udHJhY3QgLSBUaGUgY29udHJhY3QuXG4gKiBAcmV0dXJucyBUaGUgc2FtZSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUFwaUNvbnRyYWN0PFRBcGkgZXh0ZW5kcyBvYmplY3Q+KGNvbnRyYWN0OiBUeXBlZEFwaUNvbnRyYWN0PE5vSW5mZXI8VEFwaT4+KTogVHlwZWRBcGlDb250cmFjdDxUQXBpPiB7XG4gIHJldHVybiBjb250cmFjdDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcywgb3Igb2YgYSBjbGFzcyBkZXJpdmVkIGZyb20gaXQsIGV4cGVjdGluZyBgYW4gaW5zdGFuY2Ugb2ZgIHRoZVxuICogY2xhc3MncyBuYW1lLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIGFuIGluc3RhbmNlLlxuICogQHBhcmFtIGNvbnN0cnVjdG9yIC0gVGhlIGNsYXNzLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFuY2VPZkd1YXJkPFQ+KGNvbnN0cnVjdG9yOiBhYnN0cmFjdCBuZXcgKC4uLmFyZ3VtZW50c186IG5ldmVyW10pID0+IFQpOiBFeHBlY3RlZFR5cGVHdWFyZDxUPiB7XG4gIHJldHVybiBjcmVhdGVFeHBlY3RlZFR5cGVHdWFyZChgYW4gaW5zdGFuY2Ugb2YgJHtjb25zdHJ1Y3Rvci5uYW1lfWAsIGluc3RhbmNlT2ZUeXBlR3VhcmQoY29uc3RydWN0b3IpKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgZXhhY3RseSB0aGUga2V5cyBvZiBhIHJlY29yZCwgZXhwZWN0aW5nIGBvbmUgb2ZgIHRoZW0uIFR5cGluZyB0aGUgcmVjb3JkIG92ZXIgYSB1bmlvblxuICogbWFrZXMgYSBtZW1iZXIgbGF0ZXIgYWRkZWQgdG8gdGhlIHVuaW9uIGZhaWwgdG8gY29tcGlsZSB1bnRpbCBpdCBpcyBsaXN0ZWQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIGFjY2VwdGVkIHN0cmluZ3MuXG4gKiBAcGFyYW0gbGl0ZXJhbHMgLSBBIHJlY29yZCB3aG9zZSBrZXlzIGFyZSB0aGUgYWNjZXB0ZWQgc3RyaW5ncy5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdGVyYWxHdWFyZDxUIGV4dGVuZHMgc3RyaW5nPihsaXRlcmFsczogUmVhZG9ubHk8UmVjb3JkPFQsIHRydWU+Pik6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+O1xuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgZXhhY3RseSB0aGUgbGlzdGVkIHZhbHVlcywgZXhwZWN0aW5nIGBvbmUgb2ZgIHRoZW0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIGFjY2VwdGVkIHZhbHVlcy5cbiAqIEBwYXJhbSBsaXRlcmFscyAtIFRoZSBhY2NlcHRlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsR3VhcmQ8VCBleHRlbmRzIExpdGVyYWw+KGxpdGVyYWxzOiByZWFkb25seSBUW10pOiBFeHBlY3RlZFR5cGVHdWFyZDxUPjtcbi8qKlxuICogQnVpbGRzIGEgZ3VhcmQgYWNjZXB0aW5nIGV4YWN0bHkgdGhlIGxpc3RlZCB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIGxpdGVyYWxzIC0gVGhlIGFjY2VwdGVkIHZhbHVlcywgYXMgYSBsaXN0IG9yIGFzIHRoZSBrZXlzIG9mIGEgcmVjb3JkLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbEd1YXJkKGxpdGVyYWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB0cnVlPj4gfCByZWFkb25seSBMaXRlcmFsW10pOiBFeHBlY3RlZFR5cGVHdWFyZDxMaXRlcmFsPiB7XG4gIGNvbnN0IGxpdGVyYWxMaXN0OiByZWFkb25seSBMaXRlcmFsW10gPSBpc1JlYWRvbmx5QXJyYXkobGl0ZXJhbHMpID8gbGl0ZXJhbHMgOiBPYmplY3Qua2V5cyhsaXRlcmFscyk7XG4gIHJldHVybiBjcmVhdGVFeHBlY3RlZFR5cGVHdWFyZChgb25lIG9mICR7bGl0ZXJhbExpc3QubWFwKChsaXRlcmFsKSA9PiBmb3JtYXRMaXRlcmFsKGxpdGVyYWwpKS5qb2luKCcsICcpfWAsIGxpdGVyYWxUeXBlR3VhcmQobGl0ZXJhbExpc3QpKTtcbn1cblxuLyoqXG4gKiBXaWRlbnMgYSBndWFyZCB0byBhbHNvIGFjY2VwdCBgbnVsbGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZ3VhcmQgLSBUaGUgZ3VhcmQgdG8gd2lkZW4uXG4gKiBAcmV0dXJucyBBIGd1YXJkIGFjY2VwdGluZyB3aGF0IGBndWFyZGAgYWNjZXB0cywgb3IgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbnVsbGFibGVHdWFyZDxUPihndWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4pOiBFeHBlY3RlZFR5cGVHdWFyZDxudWxsIHwgVD4ge1xuICByZXR1cm4ge1xuICAgIGV4cGVjdGVkOiBgJHtndWFyZC5leHBlY3RlZH0gb3IgbnVsbGAsXG4gICAgdHlwZUd1YXJkOiAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHwgVCA9PiB2YWx1ZSA9PT0gbnVsbCB8fCBndWFyZC50eXBlR3VhcmQodmFsdWUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZ3VhcmQgYWNjZXB0aW5nIGFuIG9iamVjdCB3aG9zZSBldmVyeSBsaXN0ZWQgcHJvcGVydHkgaXRzIGd1YXJkIGFjY2VwdHMsIGFzIHtAbGluayBvYmplY3RUeXBlR3VhcmR9IGRvZXMsXG4gKiBleHBlY3RpbmcgdGhlIHByb3BlcnRpZXMgYW5kIHdoYXQgZWFjaCBleHBlY3RzOiBgeyBhbGlhcz86IGEgc3RyaW5nOyBwYXRoOiBhIHN0cmluZyB9YCwgYWZ0ZXIgdGhlXG4gKiB7QGxpbmsgT2JqZWN0R3VhcmRPcHRpb25zLmRlc2NyaXB0aW9ufSB3aGVuIG9uZSBpcyBnaXZlbi4gQSBrZXkgaXMgbWFya2VkIG9wdGlvbmFsIHdoZW4gaXQgaXMgbGlzdGVkIGluXG4gKiB7QGxpbmsgT2JqZWN0VHlwZUd1YXJkT3B0aW9ucy5leGFjdE9wdGlvbmFsS2V5c307IHdpdGhvdXQgdGhhdCBsaXN0LCBhbiBvcHRpb25hbCBwcm9wZXJ0eSdzIGd1YXJkIHNheXNcbiAqIGBvciB1bmRlZmluZWRgIGl0c2VsZi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gcHJvcGVydHlHdWFyZHMgLSBPbmUgZ3VhcmQgcGVyIHByb3BlcnR5IG9mIGBUYC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBndWFyZC5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdEd1YXJkPFQgZXh0ZW5kcyBvYmplY3Q+KHByb3BlcnR5R3VhcmRzOiBQcm9wZXJ0eUd1YXJkczxUPiwgb3B0aW9ucz86IE9iamVjdEd1YXJkT3B0aW9uczxUPik6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+IHtcbiAgY29uc3QgZ3VhcmRzID0gY2FzdFRvPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIEV4cGVjdGVkVHlwZUd1YXJkPHVua25vd24+Pj4+KHByb3BlcnR5R3VhcmRzKTtcbiAgY29uc3QgZXhhY3RPcHRpb25hbEtleXM6IG9iamVjdCA9IG9wdGlvbnM/LmV4YWN0T3B0aW9uYWxLZXlzID8/IHt9O1xuICByZXR1cm4gY3JlYXRlRXhwZWN0ZWRUeXBlR3VhcmQoXG4gICAgZGVzY3JpYmVPYmplY3Qob3B0aW9ucz8uZGVzY3JpcHRpb24sIGd1YXJkcywgKGtleSkgPT4gT2JqZWN0Lmhhc093bihleGFjdE9wdGlvbmFsS2V5cywga2V5KSksXG4gICAgb2JqZWN0VHlwZUd1YXJkPFQ+KGNhc3RUbzxQcm9wZXJ0eVR5cGVHdWFyZHM8VD4+KG1hcEd1YXJkcyhndWFyZHMsIChndWFyZCkgPT4gZ3VhcmQudHlwZUd1YXJkKSksIG9wdGlvbnMpXG4gICk7XG59XG5cbi8qKlxuICogV2lkZW5zIGEgZ3VhcmQgdG8gYWxzbyBhY2NlcHQgYHVuZGVmaW5lZGAsIHdoaWNoIGlzIHdoYXQgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHJlY2VpdmVzIHdoZW4gaXQgaXMgbGVmdCBvdXQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZ3VhcmQgLSBUaGUgZ3VhcmQgdG8gd2lkZW4uXG4gKiBAcmV0dXJucyBBIGd1YXJkIGFjY2VwdGluZyB3aGF0IGBndWFyZGAgYWNjZXB0cywgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbEd1YXJkPFQ+KGd1YXJkOiBFeHBlY3RlZFR5cGVHdWFyZDxUPik6IEV4cGVjdGVkVHlwZUd1YXJkPFQgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHtcbiAgICBleHBlY3RlZDogYCR7Z3VhcmQuZXhwZWN0ZWR9IG9yIHVuZGVmaW5lZGAsXG4gICAgdHlwZUd1YXJkOiAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUIHwgdW5kZWZpbmVkID0+IHZhbHVlID09PSB1bmRlZmluZWQgfHwgZ3VhcmQudHlwZUd1YXJkKHZhbHVlKVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBhbiBvcHRpb25zIGJhZzogYW4gb2JqZWN0IHdob3NlIGV2ZXJ5IG9wdGlvbiBtYXkgYmUgYWJzZW50LCBvciBgdW5kZWZpbmVkYCwgYW5kIG11c3RcbiAqIG90aGVyd2lzZSBwYXNzIGl0cyBndWFyZC4gQSBrZXkgbm8gZ3VhcmQgbmFtZXMgaXMgbGV0IHRocm91Z2ggdW5sZXNzXG4gKiB7QGxpbmsgT3B0aW9uc0d1YXJkT3B0aW9ucy5zaG91bGRSZWplY3RVbmtub3duS2V5c30gaXMgc2V0LiBJdCBleHBlY3RzIHRoZSBvcHRpb25zIGFuZCB3aGF0IGVhY2ggZXhwZWN0czpcbiAqIGB7IHByZWZpeD86IGEgc3RyaW5nOyBpc0hpZGRlbj86IGEgYm9vbGVhbiB9YCwgYWZ0ZXIgdGhlIHtAbGluayBPcHRpb25zR3VhcmRPcHRpb25zLmRlc2NyaXB0aW9ufSB3aGVuIG9uZSBpcyBnaXZlbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgb3B0aW9ucyB0eXBlLCBldmVyeSBwcm9wZXJ0eSBvZiB3aGljaCBpcyBvcHRpb25hbC5cbiAqIEBwYXJhbSBvcHRpb25HdWFyZHMgLSBPbmUgZ3VhcmQgcGVyIG9wdGlvbiBvZiBgVGAsIGZvciBhIHByZXNlbnQgdmFsdWUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZ3VhcmQuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25zR3VhcmQ8VCBleHRlbmRzIG9iamVjdD4ob3B0aW9uR3VhcmRzOiBPcHRpb25HdWFyZHM8VD4sIG9wdGlvbnM/OiBPcHRpb25zR3VhcmRPcHRpb25zKTogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICBjb25zdCBndWFyZHMgPSBjYXN0VG88UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgRXhwZWN0ZWRUeXBlR3VhcmQ8dW5rbm93bj4+Pj4ob3B0aW9uR3VhcmRzKTtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKFxuICAgIGRlc2NyaWJlT2JqZWN0KG9wdGlvbnM/LmRlc2NyaXB0aW9uLCBndWFyZHMsICgpID0+IHRydWUpLFxuICAgIG9iamVjdFR5cGVHdWFyZDxUPihjYXN0VG88UHJvcGVydHlUeXBlR3VhcmRzPFQ+PihtYXBHdWFyZHMoZ3VhcmRzLCAoZ3VhcmQpID0+IG9wdGlvbmFsVHlwZUd1YXJkKGd1YXJkLnR5cGVHdWFyZCkpKSwge1xuICAgICAgc2hvdWxkUmVqZWN0VW5rbm93bktleXM6IG9wdGlvbnM/LnNob3VsZFJlamVjdFVua25vd25LZXlzID8/IGZhbHNlXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgd2hhdCBhbnkgb2YgdGhlIGdpdmVuIGd1YXJkcyBhY2NlcHRzLCBleHBlY3RpbmcgdGhlaXIgYGV4cGVjdGVkYCB0ZXh0cyBqb2luZWQgYnkgYG9yYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRHdWFyZHMgLSBUaGUgZ3VhcmRzLlxuICogQHBhcmFtIGd1YXJkcyAtIFRoZSBndWFyZHMsIHRyaWVkIGluIG9yZGVyLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pb25HdWFyZDxjb25zdCBUR3VhcmRzIGV4dGVuZHMgcmVhZG9ubHkgRXhwZWN0ZWRUeXBlR3VhcmQ8dW5rbm93bj5bXT4oXG4gIC4uLmd1YXJkczogVEd1YXJkc1xuKTogRXhwZWN0ZWRUeXBlR3VhcmQ8R3VhcmRlZFR5cGU8VEd1YXJkc1tudW1iZXJdWyd0eXBlR3VhcmQnXT4+IHtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKFxuICAgIGd1YXJkcy5tYXAoKGd1YXJkKSA9PiBndWFyZC5leHBlY3RlZCkuam9pbignIG9yICcpLFxuICAgIHVuaW9uVHlwZUd1YXJkKC4uLmd1YXJkcy5tYXAoKGd1YXJkKSA9PiBndWFyZC50eXBlR3VhcmQpKVxuICApO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTY2hlbWE8VD4odmFsaWRhdGU6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RhbmRhcmRTY2hlbWFWMS5SZXN1bHQ8VD4sIHZlbmRvcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBUPiB7XG4gIHJldHVybiB7XG4gICAgJ35zdGFuZGFyZCc6IHtcbiAgICAgIHZhbGlkYXRlLFxuICAgICAgdmVuZG9yOiB2ZW5kb3IgPz8gTElCUkFSWV9OQU1FLFxuICAgICAgdmVyc2lvbjogMVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVPYmplY3QoXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGd1YXJkczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgRXhwZWN0ZWRUeXBlR3VhcmQ8dW5rbm93bj4+PixcbiAgaXNPcHRpb25hbDogKGtleTogc3RyaW5nKSA9PiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZ3VhcmRzKTtcbiAgY29uc3QgcHJvcGVydGllcyA9IGVudHJpZXMubGVuZ3RoID09PSAwXG4gICAgPyAne30nXG4gICAgOiBgeyAke2VudHJpZXMubWFwKChba2V5LCBndWFyZF0pID0+IGAke2tleX0ke2lzT3B0aW9uYWwoa2V5KSA/ICc/JyA6ICcnfTogJHtndWFyZC5leHBlY3RlZH1gKS5qb2luKCc7ICcpfSB9YDtcbiAgcmV0dXJuIGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgPyBwcm9wZXJ0aWVzIDogYCR7ZGVzY3JpcHRpb259OiAke3Byb3BlcnRpZXN9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGl0ZXJhbChsaXRlcmFsOiBMaXRlcmFsKTogc3RyaW5nIHtcbiAgaWYgKGlzU3RyaW5nKGxpdGVyYWwpKSB7XG4gICAgcmV0dXJuIGAnJHtsaXRlcmFsfSdgO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVvZiBsaXRlcmFsID09PSAnYmlnaW50JyA/IGAke1N0cmluZyhsaXRlcmFsKX1uYCA6IFN0cmluZyhsaXRlcmFsKTtcbn1cblxuZnVuY3Rpb24gaXNSZWFkb25seUFycmF5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgcmVhZG9ubHkgdW5rbm93bltdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBtYXBHdWFyZHMoXG4gIGd1YXJkczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgRXhwZWN0ZWRUeXBlR3VhcmQ8dW5rbm93bj4+PixcbiAgdG9UeXBlR3VhcmQ6IChndWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8dW5rbm93bj4pID0+IFR5cGVHdWFyZDx1bmtub3duPlxuKTogUmVjb3JkPHN0cmluZywgVHlwZUd1YXJkPHVua25vd24+PiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoZ3VhcmRzKS5tYXAoKFtrZXksIGd1YXJkXSkgPT4gW2tleSwgdG9UeXBlR3VhcmQoZ3VhcmQpXSkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXlCQSxxQkFBNkI7QUFDN0IsMEJBQXVCO0FBQ3ZCLHlCQVlPO0FBbU1BLE1BQU0sZ0JBQTRDLEVBQUUsVUFBVSxhQUFhLFdBQVcsNkJBQVU7QUFLaEcsTUFBTSxlQUEwQyxFQUFFLFVBQVUsWUFBWSxXQUFXLDRCQUFTO0FBSzVGLE1BQU0sZUFBMEMsRUFBRSxVQUFVLFlBQVksV0FBVyw0QkFBUztBQUs1RixNQUFNLHFCQUFrRCxFQUFFLFVBQVUsdUJBQXVCLFdBQVcsaUNBQWM7QUFLcEgsTUFBTSxrQkFBZ0QsRUFBRSxVQUFVLGFBQWEsV0FBVywrQkFBWTtBQVN0RyxTQUFTLFdBQWMs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
@@ -14,7 +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
+ import type { GuardedType, Literal, ObjectTypeGuardOptions, TypeGuard } from './type-guards.cjs';
18
18
  /**
19
19
  * The contract an API declares: every key is a method the API promises to expose, and its value optionally
20
20
  * carries the payload schemas for that method.
@@ -126,6 +126,52 @@ export interface ExpectedTypeGuard<T> {
126
126
  */
127
127
  readonly typeGuard: (value: unknown) => value is T;
128
128
  }
129
+ /**
130
+ * Options for {@link objectGuard}.
131
+ *
132
+ * @typeParam T - The object type the guard narrows to.
133
+ */
134
+ export interface ObjectGuardOptions<T extends object> extends ObjectTypeGuardOptions<T> {
135
+ /**
136
+ * What the object is, put before its properties in `expected`, e.g. `'the options of the link'`.
137
+ */
138
+ readonly description?: string;
139
+ }
140
+ /**
141
+ * One guard per option of an all-optional object type, as {@link optionsGuard} takes them: each describes a
142
+ * PRESENT option, so it does not accept `undefined`. A required property of `T` takes `never`, so a type that is
143
+ * not all-optional does not compile.
144
+ *
145
+ * @typeParam T - The object type.
146
+ */
147
+ export type OptionGuards<T extends object> = {
148
+ readonly [TKey in keyof T]-?: Partial<Pick<T, TKey>> extends Pick<T, TKey> ? ExpectedTypeGuard<Exclude<T[TKey], undefined>> : never;
149
+ };
150
+ /**
151
+ * Options for {@link optionsGuard}.
152
+ */
153
+ export interface OptionsGuardOptions {
154
+ /**
155
+ * What the options are, put before them in `expected`, e.g. `'select options'`.
156
+ */
157
+ readonly description?: string;
158
+ /**
159
+ * Whether a value carrying an own enumerable string key that no option guard names is refused. Letting it through,
160
+ * the default, lets a consumer compiled against a later version of the options pass one this version does not know.
161
+ *
162
+ * @default `false`
163
+ */
164
+ readonly shouldRejectUnknownKeys?: boolean;
165
+ }
166
+ /**
167
+ * One guard per property of an object type, as {@link objectGuard} takes them, typed as {@link PropertyTypeGuards}
168
+ * types the bare guards.
169
+ *
170
+ * @typeParam T - The object type.
171
+ */
172
+ export type PropertyGuards<T extends object> = {
173
+ readonly [TKey in keyof T]-?: ExpectedTypeGuard<Partial<Pick<T, TKey>> extends Pick<T, TKey> ? T[TKey] | undefined : T[TKey]>;
174
+ };
129
175
  /**
130
176
  * The {@link ApiContract} of a named API: one entry per function member, each typed against that member. Both
131
177
  * schemas are REQUIRED here, so a typed contract is a full description of every signature and a `{}` entry does
@@ -251,6 +297,19 @@ export declare function literalGuard<T extends Literal>(literals: readonly T[]):
251
297
  * @returns A guard accepting what `guard` accepts, or `null`.
252
298
  */
253
299
  export declare function nullableGuard<T>(guard: ExpectedTypeGuard<T>): ExpectedTypeGuard<null | T>;
300
+ /**
301
+ * Builds a guard accepting an object whose every listed property its guard accepts, as {@link objectTypeGuard} does,
302
+ * expecting the properties and what each expects: `{ alias?: a string; path: a string }`, after the
303
+ * {@link ObjectGuardOptions.description} when one is given. A key is marked optional when it is listed in
304
+ * {@link ObjectTypeGuardOptions.exactOptionalKeys}; without that list, an optional property's guard says
305
+ * `or undefined` itself.
306
+ *
307
+ * @typeParam T - The object type.
308
+ * @param propertyGuards - One guard per property of `T`.
309
+ * @param options - The options for the guard.
310
+ * @returns The guard.
311
+ */
312
+ export declare function objectGuard<T extends object>(propertyGuards: PropertyGuards<T>, options?: ObjectGuardOptions<T>): ExpectedTypeGuard<T>;
254
313
  /**
255
314
  * Widens a guard to also accept `undefined`, which is what an optional parameter receives when it is left out.
256
315
  *
@@ -259,6 +318,18 @@ export declare function nullableGuard<T>(guard: ExpectedTypeGuard<T>): ExpectedT
259
318
  * @returns A guard accepting what `guard` accepts, or `undefined`.
260
319
  */
261
320
  export declare function optionalGuard<T>(guard: ExpectedTypeGuard<T>): ExpectedTypeGuard<T | undefined>;
321
+ /**
322
+ * Builds a guard accepting an options bag: an object whose every option may be absent, or `undefined`, and must
323
+ * otherwise pass its guard. A key no guard names is let through unless
324
+ * {@link OptionsGuardOptions.shouldRejectUnknownKeys} is set. It expects the options and what each expects:
325
+ * `{ prefix?: a string; isHidden?: a boolean }`, after the {@link OptionsGuardOptions.description} when one is given.
326
+ *
327
+ * @typeParam T - The options type, every property of which is optional.
328
+ * @param optionGuards - One guard per option of `T`, for a present value.
329
+ * @param options - The options for the guard.
330
+ * @returns The guard.
331
+ */
332
+ export declare function optionsGuard<T extends object>(optionGuards: OptionGuards<T>, options?: OptionsGuardOptions): ExpectedTypeGuard<T>;
262
333
  /**
263
334
  * Builds a guard accepting what any of the given guards accepts, expecting their `expected` texts joined by `or`.
264
335
  *