@mnaoumov/typescript-lib 1.4.0 → 1.6.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/abort-controller.cjs +1 -1
- package/dist/lib/cjs/abort-controller.d.cts +8 -7
- package/dist/lib/cjs/api-contract-verifier.cjs +88 -0
- package/dist/lib/cjs/api-contract-verifier.d.cts +81 -0
- package/dist/lib/cjs/api-contract.cjs +30 -1
- package/dist/lib/cjs/api-contract.d.cts +72 -1
- package/dist/lib/cjs/debug-controller.cjs +1 -1
- package/dist/lib/cjs/debug-controller.d.cts +2 -2
- package/dist/lib/cjs/debug.cjs +21 -2
- package/dist/lib/cjs/debug.d.cts +5 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/library.cjs +10 -1
- package/dist/lib/cjs/library.d.cts +13 -0
- package/dist/lib/cjs/type-guards.cjs +11 -3
- package/dist/lib/cjs/type-guards.d.cts +27 -3
- package/dist/lib/cjs/typescript-lib-state.cjs +1 -1
- package/dist/lib/cjs/typescript-lib-state.d.cts +1 -1
- package/dist/lib/esm/abort-controller.d.mts +8 -7
- package/dist/lib/esm/abort-controller.mjs +1 -1
- package/dist/lib/esm/api-contract-verifier.d.mts +81 -0
- package/dist/lib/esm/api-contract-verifier.mjs +63 -0
- package/dist/lib/esm/api-contract.d.mts +72 -1
- package/dist/lib/esm/api-contract.mjs +30 -1
- package/dist/lib/esm/debug-controller.d.mts +2 -2
- package/dist/lib/esm/debug.d.mts +5 -0
- package/dist/lib/esm/debug.mjs +21 -2
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/library.d.mts +13 -0
- package/dist/lib/esm/library.mjs +10 -1
- package/dist/lib/esm/type-guards.d.mts +27 -3
- package/dist/lib/esm/type-guards.mjs +11 -3
- package/dist/lib/esm/typescript-lib-state.d.mts +1 -1
- package/dist/lib/esm/typescript-lib-state.mjs +1 -1
- package/package.json +3 -3
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/)
|
|
@@ -141,4 +141,4 @@ function waitForAbort(abortSignal, shouldRejectOnAbort) {
|
|
|
141
141
|
onAbort,
|
|
142
142
|
waitForAbort
|
|
143
143
|
});
|
|
144
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Fib3J0LWNvbnRyb2xsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBYm9ydENvbnRyb2xsZXIgdXRpbGl0aWVzLlxuICovXG5cbmltcG9ydCB7XG4gIENhbGxiYWNrRGlzcG9zYWJsZSxcbiAgQ29tYmluZURpc3Bvc2FibGVcbn0gZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldFR5cGVzY3JpcHRMaWJTdGF0ZSB9IGZyb20gJy4vdHlwZXNjcmlwdC1saWItc3RhdGUudHMnO1xuXG4vKipcbiAqIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIHRpbWVvdXQuXG4gKi9cbmV4cG9ydCBjb25zdCBJTkZJTklURV9USU1FT1VUID0gSW5maW5pdHk7XG5cbi8qKlxuICogQW4ge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gdGhhdCBjYW4gYmUgYWJvcnRlZCBtb3JlIHRoYW4gb25jZS5cbiAqXG4gKiBBIHBsYWluIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IGlzIHNpbmdsZS11c2U6IG9uY2UgYWJvcnRlZCwgaXRzIHNpZ25hbCBzdGF5cyBhYm9ydGVkIGZvcmV2ZXIsIHNvIGl0XG4gKiBjYW5ub3QgYmFjayBhIGNhbmNlbCBidXR0b24gdGhhdCB0aGUgdXNlciBtYXkgcHJlc3MgbW9yZSB0aGFuIG9uY2UuIFRoaXMgb25lIGFib3J0cyB0aGUgY3VycmVudCBzaWduYWxcbiAqIGFuZCBpbW1lZGlhdGVseSByZXBsYWNlcyBpdCwgc28gdGhlIG5leHQgb3BlcmF0aW9uIHN0YXJ0cyB3aXRoIGEgZnJlc2gsIG5vbi1hYm9ydGVkIHNpZ25hbCB3aGlsZSB0aGUgd29ya1xuICogdGhhdCBjYXB0dXJlZCB0aGUgcHJldmlvdXMgc2lnbmFsIHN0aWxsIG9ic2VydmVzIHRoZSBhYm9ydC5cbiAqXG4gKiBSZWFkIHtAbGluayBSZXNldHRhYmxlQWJvcnRDb250cm9sbGVyLnNpZ25hbH0gYXQgdGhlIHN0YXJ0IG9mIGVhY2ggb3BlcmF0aW9uLiBOZXZlciBjYWNoZSBpdCwgb3IgdGhlXG4gKiBvcGVyYXRpb24gYWZ0ZXIgdGhlIGZpcnN0IGFib3J0IHN0YXJ0cyBhbHJlYWR5IGFib3J0ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc2V0dGFibGVBYm9ydENvbnRyb2xsZXIgPSBuZXcgUmVzZXR0YWJsZUFib3J0Q29udHJvbGxlcigpO1xuICpcbiAqIGF3YWl0IGxvb3Aoe1xuICogICBhYm9ydFNpZ25hbDogcmVzZXR0YWJsZUFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gKiAgIGJ1aWxkTm90aWNlTWVzc2FnZTogKGZpbGUpID0+IGBQcm9jZXNzaW5nICR7ZmlsZS5wYXRofWAsXG4gKiAgIGl0ZW1zOiBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLFxuICogICBwcm9jZXNzSXRlbTogYXN5bmMgKGZpbGUpID0+IHsgYXdhaXQgcHJvY2Vzc0ZpbGUoZmlsZSk7IH1cbiAqIH0pO1xuICpcbiAqIC8vIEZyb20gYSBjYW5jZWwgYnV0dG9uLCBhIGNvbW1hbmQsIG9yIHRoZSBkZXZ0b29scyBjb25zb2xlLlxuICogcmVzZXR0YWJsZUFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICogYGBgXG4gKlxuICogQHNlZSB7QGxpbmsgZ2V0U2hhcmVkQWJvcnRDb250cm9sbGVyfSBmb3IgdGhlIGFwcC13aWRlIGluc3RhbmNlLlxuICovXG5leHBvcnQgY2xhc3MgUmVzZXR0YWJsZUFib3J0Q29udHJvbGxlciB7XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBhYm9ydCBzaWduYWwuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgQWJvcnRTaWduYWx9IHRoYXQgYWJvcnRzIG9uIHRoZSBuZXh0IHtAbGluayBSZXNldHRhYmxlQWJvcnRDb250cm9sbGVyLmFib3J0fSBjYWxsLlxuICAgKi9cbiAgcHVibGljIGdldCBzaWduYWwoKTogQWJvcnRTaWduYWwge1xuICAgIHJldHVybiB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWw7XG4gIH1cblxuICBwcml2YXRlIGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAvKipcbiAgICogQWJvcnRzIHRoZSBjdXJyZW50IHNpZ25hbCBhbmQgcmVwbGFjZXMgaXQgd2l0aCBhIGZyZXNoLCBub24tYWJvcnRlZCBvbmUuXG4gICAqXG4gICAqIEBwYXJhbSByZWFzb24gLSBUaGUgcmVhc29uIHRvIGFib3J0IHdpdGguIFdoZW4gb21pdHRlZCwgdGhlIHNpZ25hbCBpcyBhYm9ydGVkIHdpdGggdGhlIG5hdGl2ZVxuICAgKiBgQWJvcnRFcnJvcmAge0BsaW5rIERPTUV4Y2VwdGlvbn0sIGV4YWN0bHkgYXMge0BsaW5rIEFib3J0Q29udHJvbGxlci5hYm9ydH0gZG9lcy5cbiAgICovXG4gIHB1YmxpYyBhYm9ydChyZWFzb24/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5hYm9ydENvbnRyb2xsZXIuYWJvcnQocmVhc29uKTtcbiAgICB0aGlzLmFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGFib3J0IHNpZ25hbCB0aGF0IGFib3J0cyB3aGVuIGFueSBvZiB0aGUgZ2l2ZW4gYWJvcnQgc2lnbmFscyBhYm9ydC5cbiAqXG4gKiBAcGFyYW0gbWF5YmVBYm9ydFNpZ25hbHMgLSBUaGUgYWJvcnQgc2lnbmFscyB0byBhYm9ydCB3aGVuIGFueSBvZiB0aGVtIGFib3J0LlxuICogQHJldHVybnMgVGhlIGFib3J0IHNpZ25hbCB0aGF0IGFib3J0cyB3aGVuIGFueSBvZiB0aGUgZ2l2ZW4gYWJvcnQgc2lnbmFscyBhYm9ydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFib3J0U2lnbmFsQW55KC4uLm1heWJlQWJvcnRTaWduYWxzOiAoQWJvcnRTaWduYWwgfCB1bmRlZmluZWQpW10pOiBBYm9ydFNpZ25hbCB7XG4gIGNvbnN0IGFib3J0U2lnbmFscyA9IG1heWJlQWJvcnRTaWduYWxzLmZpbHRlcigoYWJvcnRTaWduYWwpID0+ICEhYWJvcnRTaWduYWwpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gYEFib3J0U2lnbmFsLmFueWAgaXMgZmVhdHVyZS1kZXRlY3RlZCBoZXJlIHdpdGggYSBtYW51YWwgZmFsbGJhY2sgYmVsb3csIHNvIGl0IGlzIG5vdCByZXF1aXJlZCBvbiBvbGRlciBPYnNpZGlhbi9FbGVjdHJvbiAoQ2hyb21pdW0pIHZlcnNpb25zIHRoYXQgbGFjayBpdC5cbiAgaWYgKHR5cGVvZiBBYm9ydFNpZ25hbC5hbnkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zIC0tIGBBYm9ydFNpZ25hbC5hbnlgIGlzIGZlYXR1cmUtZGV0ZWN0ZWQgYnkgdGhlIGd1YXJkIGFib3ZlIHdpdGggYSBtYW51YWwgZmFsbGJhY2sgYmVsb3csIHNvIGl0IGlzIG5vdCByZXF1aXJlZCBvbiBvbGRlciBPYnNpZGlhbi9FbGVjdHJvbiAoQ2hyb21pdW0pIHZlcnNpb25zIHRoYXQgbGFjayBpdC5cbiAgICByZXR1cm4gQWJvcnRTaWduYWwuYW55KGFib3J0U2lnbmFscyk7XG4gIH1cblxuICBpZiAoYWJvcnRTaWduYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIH1cblxuICBpZiAoYWJvcnRTaWduYWxzLmxlbmd0aCA9PT0gMSAmJiBhYm9ydFNpZ25hbHNbMF0pIHtcbiAgICByZXR1cm4gYWJvcnRTaWduYWxzWzBdO1xuICB9XG5cbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGZvciAoY29uc3QgYWJvcnRTaWduYWwgb2YgYWJvcnRTaWduYWxzKSB7XG4gICAgaWYgKGFib3J0U2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybiBhYm9ydFNpZ25hbDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhYm9ydEhhbmRsZXJEaXNwb3NhYmxlczogRGlzcG9zYWJsZVtdID0gQXJyYXkuZnJvbShhYm9ydFNpZ25hbHMsIChhYm9ydFNpZ25hbCkgPT4gb25BYm9ydChhYm9ydFNpZ25hbCwgaGFuZGxlQWJvcnQpKTtcblxuICBjb25zdCBjb21iaW5lZEFib3J0SGFuZGxlckRpc3Bvc2FibGUgPSBuZXcgQ29tYmluZURpc3Bvc2FibGUoeyBkaXNwb3NhYmxlczogYWJvcnRIYW5kbGVyRGlzcG9zYWJsZXMgfSk7XG5cbiAgcmV0dXJuIGFib3J0Q29udHJvbGxlci5zaWduYWw7XG5cbiAgZnVuY3Rpb24gaGFuZGxlQWJvcnQoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogdm9pZCB7XG4gICAgY29tYmluZWRBYm9ydEhhbmRsZXJEaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoYWJvcnRTaWduYWwucmVhc29uKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGFib3J0IHNpZ25hbCB0aGF0IG5ldmVyIGFib3J0cy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJvcnQgc2lnbmFsIHRoYXQgbmV2ZXIgYWJvcnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWJvcnRTaWduYWxOZXZlcigpOiBBYm9ydFNpZ25hbCB7XG4gIHJldHVybiBuZXcgQWJvcnRDb250cm9sbGVyKCkuc2lnbmFsO1xufVxuXG4vKipcbiAqIEFuIGFib3J0IHNpZ25hbCB0aGF0IGFib3J0cyBhZnRlciBhIHRpbWVvdXQuXG4gKlxuICogQHBhcmFtIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIFRoZSBhYm9ydCBzaWduYWwgdGhhdCBhYm9ydHMgYWZ0ZXIgYSB0aW1lb3V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWJvcnRTaWduYWxUaW1lb3V0KHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogQWJvcnRTaWduYWwge1xuICBpZiAodGltZW91dEluTWlsbGlzZWNvbmRzID09PSBJTkZJTklURV9USU1FT1VUKSB7XG4gICAgcmV0dXJuIGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgfVxuXG4gIC8vIEludGVudGlvbmFsbHkgTk9UIHRoZSBuYXRpdmUgYEFib3J0U2lnbmFsLnRpbWVvdXRgLCB3aG9zZSBpbnRlcm5hbCB0aW1lciBjYW5ub3QgYmUgYWR2YW5jZWQgYnlcbiAgLy8gYHZpLnVzZUZha2VUaW1lcnMoKWAsIHNvIGBzbGVlcGAgKGl0cyBzb2xlIGNvbnN1bWVyKSB3b3VsZCBiZSB1bmNvbnRyb2xsYWJsZSBpbiB0ZXN0cy4gQnVpbGRpbmdcbiAgLy8gYHNsZWVwYCdzIHNpZ25hbCBvZmYgYGdsb2JhbFRoaXMuc2V0VGltZW91dGAga2VlcHMgaXQgZmFrZS10aW1lciBjb250cm9sbGFibGUgKGxpa2VcbiAgLy8gYHNldFRpbWVvdXRBc3luY2ApIGFuZCBhbHNvIHdvcmtzIGluIGEgTm9kZSBlbnZpcm9ubWVudCB3aGVyZSBgd2luZG93YCBpcyB1bmRlZmluZWQsIHNpbmNlXG4gIC8vIGBnbG9iYWxUaGlzYCBleGlzdHMgaW4gTm9kZSB0b28uIENvbnN1bWVyIGludGVncmF0aW9uLXRlc3QgcHJvamVjdHMgcnVuIHZpdGVzdCB1bmRlclxuICAvLyBgZW52aXJvbm1lbnQ6ICdub2RlJ2AsIGluIHdoaWNoIGEgYHdpbmRvd2AtYmFzZWQgcHJpbWl0aXZlIHRocm93cyBhIGBSZWZlcmVuY2VFcnJvcmAuXG4gIC8vIFRoZSBhYm9ydCByZWFzb24gbWlycm9ycyB0aGUgbmF0aXZlIG9uZSAtLSBhIGBET01FeGNlcHRpb25gIG5hbWVkIGBUaW1lb3V0RXJyb3JgIC0tIG1hdGNoaW5nXG4gIC8vIGBBYm9ydFNpZ25hbC50aW1lb3V0YCBmb3IgYHJlYXNvbi5uYW1lYCBjaGVja3MuXG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gYERPTUV4Y2VwdGlvbmAgaXMgYSBET00gZ2xvYmFsIGFsd2F5cyBwcmVzZW50IGluIHRoZSBPYnNpZGlhbi9FbGVjdHJvbiAoQ2hyb21pdW0pIHJ1bnRpbWUgdGhpcyBjb2RlIHRhcmdldHMsIGFuZCBpcyBhbHNvIGEgTm9kZSBnbG9iYWwgZnJvbSBOb2RlIDE3IG9ud2FyZC5cbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IERPTUV4Y2VwdGlvbihgVGltZWQgb3V0IGluICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kc2AsICdUaW1lb3V0RXJyb3InKSk7XG4gIH0sIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG4gIHJldHVybiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xufVxuXG4vKipcbiAqIFRoZSBhcHAtd2lkZSBzaGFyZWQge0BsaW5rIFJlc2V0dGFibGVBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIEV2ZXJ5IHBsdWdpbiBidWlsdCBvbiB0aGlzIGxpYnJhcnkgc2hhcmVzIG9uZSBpbnN0YW5jZSwgc28gYSBzaW5nbGUge0BsaW5rIFJlc2V0dGFibGVBYm9ydENvbnRyb2xsZXIuYWJvcnR9XG4gKiBjYWxsIGNhbmNlbHMgd2hhdGV2ZXIgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiBpcyBpbiBmbGlnaHQsIHdoaWNoZXZlciBwbHVnaW4gc3RhcnRlZCBpdC4gQSBwbHVnaW4gdGhhdCBuZWVkc1xuICogYSBjYW5jZWwgYnV0dG9uIG9mIGl0cyBvd24gc2NvcGUgY29uc3RydWN0cyBpdHMgb3duIHtAbGluayBSZXNldHRhYmxlQWJvcnRDb250cm9sbGVyfSBpbnN0ZWFkLlxuICpcbiAqIEl0IGxpdmVzIGluIHRoZSBzaGFyZWQgc3RhdGUsIHNvIGl0IGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBkZXZ0b29scyBjb25zb2xlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGdsb2JhbFRoaXNbU3ltYm9sLmZvcignQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0YXRlJyldLnZhbHVlcy5zaGFyZWRBYm9ydENvbnRyb2xsZXIudmFsdWUuYWJvcnQoKTtcbiAqIGBgYFxuICpcbiAqIEluIGFuIE9ic2lkaWFuIHBsdWdpbiB0aGUgc2FtZSBpbnN0YW5jZSBpcyBhbHNvIHJlYWNoYWJsZSBhcyBgX19vYnNpZGlhbkRldlV0aWxzLnNoYXJlZEFib3J0Q29udHJvbGxlci52YWx1ZWAuXG4gKlxuICogQHJldHVybnMgVGhlIHNoYXJlZCB7QGxpbmsgUmVzZXR0YWJsZUFib3J0Q29udHJvbGxlcn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaGFyZWRBYm9ydENvbnRyb2xsZXIoKTogUmVzZXR0YWJsZUFib3J0Q29udHJvbGxlciB7XG4gIHJldHVybiBnZXRUeXBlc2NyaXB0TGliU3RhdGUoJ3NoYXJlZEFib3J0Q29udHJvbGxlcicsIG5ldyBSZXNldHRhYmxlQWJvcnRDb250cm9sbGVyKCkpLnZhbHVlO1xufVxuXG4vKipcbiAqIFRoZSBzaWduYWwgb2YgdGhlIGFwcC13aWRlIHNoYXJlZCB7QGxpbmsgUmVzZXR0YWJsZUFib3J0Q29udHJvbGxlcn0uXG4gKlxuICogQ2FsbCBpdCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBvcGVyYXRpb24uIE5ldmVyIGNhY2hlIGl0LCBvciB0aGUgb3BlcmF0aW9uIGFmdGVyIHRoZSBmaXJzdCBhYm9ydCBzdGFydHNcbiAqIGFscmVhZHkgYWJvcnRlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogYXdhaXQgbG9vcCh7XG4gKiAgIGFib3J0U2lnbmFsOiBnZXRTaGFyZWRBYm9ydFNpZ25hbCgpLFxuICogICBidWlsZE5vdGljZU1lc3NhZ2U6IChmaWxlKSA9PiBgUHJvY2Vzc2luZyAke2ZpbGUucGF0aH1gLFxuICogICBpdGVtczogYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKSxcbiAqICAgcHJvY2Vzc0l0ZW06IGFzeW5jIChmaWxlKSA9PiB7IGF3YWl0IHByb2Nlc3NGaWxlKGZpbGUpOyB9XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgQWJvcnRTaWduYWx9IG9mIHRoZSBzaGFyZWQge0BsaW5rIFJlc2V0dGFibGVBYm9ydENvbnRyb2xsZXJ9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hhcmVkQWJvcnRTaWduYWwoKTogQWJvcnRTaWduYWwge1xuICByZXR1cm4gZ2V0U2hhcmVkQWJvcnRDb250cm9sbGVyKCkuc2lnbmFsO1xufVxuXG4vKipcbiAqIEFkZHMgYW4gYWJvcnQgbGlzdGVuZXIgdG8gYW4gYWJvcnQgc2lnbmFsIGFuZCBjYWxscyB0aGUgY2FsbGJhY2sgaWYgdGhlIGFib3J0IHNpZ25hbCBpcyBhbHJlYWR5IGFib3J0ZWQuXG4gKlxuICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgYWJvcnQgc2lnbmFsIGFib3J0cy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVtb3ZlcyB0aGUgYWJvcnQgbGlzdGVuZXIgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFib3J0KGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCwgY2FsbGJhY2s6IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IHZvaWQpOiBEaXNwb3NhYmxlIHtcbiAgaWYgKGFib3J0U2lnbmFsLmFib3J0ZWQpIHtcbiAgICBjYWxsYmFjayhhYm9ydFNpZ25hbCk7XG4gICAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoeyBjYWxsYmFjazogbm9vcCB9KTtcbiAgfVxuXG4gIGFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgd3JhcHBlZENhbGxiYWNrLCB7IG9uY2U6IHRydWUgfSk7XG4gIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgYWJvcnRTaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB3cmFwcGVkQ2FsbGJhY2spO1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gd3JhcHBlZENhbGxiYWNrKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjYWxsYmFjaygkZXZlbnQudGFyZ2V0IGFzIEFib3J0U2lnbmFsKTtcbiAgfVxufVxuXG4vKipcbiAqIFdhaXRzIGZvciBhbiBhYm9ydCBzaWduYWwgdG8gYWJvcnQgYW5kIHJlc29sdmVzIHdpdGggaXRzIHJlYXNvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFeHBlY3RlZCB0eXBlIG9mIGBhYm9ydFNpZ25hbC5yZWFzb25gLlxuICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byB3YWl0IGZvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVhc29uIG9mIHRoZSBhYm9ydCBzaWduYWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YWl0Rm9yQWJvcnQ8VCA9IHVua25vd24+KGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VD47XG4vKipcbiAqIFdhaXRzIGZvciBhbiBhYm9ydCBzaWduYWwgdG8gYWJvcnQgYW5kIHJlamVjdHMgd2l0aCBpdHMgcmVhc29uLlxuICpcbiAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIFRoZSBhYm9ydCBzaWduYWwgdG8gd2FpdCBmb3IuXG4gKiBAcGFyYW0gc2hvdWxkUmVqZWN0T25BYm9ydCAtIFdoZXRoZXIgdG8gcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBhYm9ydCBzaWduYWwgaXMgYWJvcnRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVqZWN0cyB3aXRoIHRoZSByZWFzb24gb2YgdGhlIGFib3J0IHNpZ25hbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhaXRGb3JBYm9ydChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwsIHNob3VsZFJlamVjdE9uQWJvcnQ6IHRydWUpOiBQcm9taXNlPG5ldmVyPjtcbi8qKlxuICogV2FpdHMgZm9yIGFuIGFib3J0IHNpZ25hbCB0byBhYm9ydCBhbmQgcmVzb2x2ZXMgd2l0aCBpdHMgcmVhc29uLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEV4cGVjdGVkIHR5cGUgb2YgYGFib3J0U2lnbmFsLnJlYXNvbmAuXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIHdhaXQgZm9yLlxuICogQHBhcmFtIHNob3VsZFJlamVjdE9uQWJvcnQgLSBXaGV0aGVyIHRvIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgYWJvcnQgc2lnbmFsIGlzIGFib3J0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlYXNvbiBvZiB0aGUgYWJvcnQgc2lnbmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FpdEZvckFib3J0PFQgPSB1bmtub3duPihhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwsIHNob3VsZFJlamVjdE9uQWJvcnQ/OiBib29sZWFuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgb25BYm9ydChhYm9ydFNpZ25hbCwgKCkgPT4ge1xuICAgICAgaWYgKHNob3VsZFJlamVjdE9uQWJvcnQpIHtcbiAgICAgICAgcmVqZWN0KGFib3J0U2lnbmFsLnJlYXNvbiBhcyBFcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKGFib3J0U2lnbmFsLnJlYXNvbiBhcyBUKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUEsd0JBR087QUFDUCxzQkFBcUI7QUFDckIsa0NBQXNDO0FBSy9CLE1BQU0sbUJBQW1CO0FBOEJ6QixNQUFNLDBCQUEwQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1yQyxJQUFXLFNBQXNCO0FBQy9CLFdBQU8sS0FBSyxnQkFBZ0I7QUFBQSxFQUM5QjtBQUFBLEVBRVEsa0JBQWtCLElBQUksZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRdkMsTUFBTSxRQUF3QjtBQUNuQyxTQUFLLGdCQUFnQixNQUFNLE1BQU07QUFDakMsU0FBSyxrQkFBa0IsSUFBSSxnQkFBZ0I7QUFBQSxFQUM3QztBQUNGO0FBUU8sU0FBUyxrQkFBa0IsbUJBQTZEO0FBQzdGLFFBQU0sZUFBZSxrQkFBa0IsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsV0FBVztBQUc1RSxNQUFJLE9BQU8sWUFBWSxRQUFRLFlBQVk7QUFFekMsV0FBTyxZQUFZLElBQUksWUFBWTtBQUFBLEVBQ3JDO0FBRUEsTUFBSSxhQUFhLFdBQVcsR0FBRztBQUM3QixXQUFPLGlCQUFpQjtBQUFBLEVBQzFCO0FBRUEsTUFBSSxhQUFhLFdBQVcsS0FBSyxhQUFhLENBQUMsR0FBRztBQUNoRCxXQUFPLGFBQWEsQ0FBQztBQUFBLEVBQ3ZCO0FBRUEsUUFBTSxrQkFBa0IsSUFBSSxnQkFBZ0I7QUFFNUMsYUFBVyxlQUFlLGNBQWM7QUFDdEMsUUFBSSxZQUFZLFNBQVM7QUFDdkIsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBRUEsUUFBTSwwQkFBd0MsTUFBTSxLQUFLLGNBQWMsQ0FBQyxnQkFBZ0IsUUFBUSxhQUFhLFdBQVcsQ0FBQztBQUV6SCxRQUFNLGlDQUFpQyxJQUFJLG9DQUFrQixFQUFFLGFBQWEsd0JBQXdCLENBQUM7QUFFckcsU0FBTyxnQkFBZ0I7QUFFdkIsV0FBUyxZQUFZLGFBQWdDO0FBQ25ELG1DQUErQixRQUFRO0FBQ3ZDLG9CQUFnQixNQUFNLFlBQVksTUFBTTtBQUFBLEVBQzFDO0FBQ0Y7QUFPTyxTQUFTLG1CQUFnQztBQUM5QyxTQUFPLElBQUksZ0JBQWdCLEVBQUU7QUFDL0I7QUFRTyxTQUFTLG1CQUFtQix1QkFBNEM7QUFDN0UsTUFBSSwwQkFBMEIsa0JBQWtCO0FBQzlDLFdBQU8saUJBQWlCO0FBQUEsRUFDMUI7QUFVQSxRQUFNLGtCQUFrQixJQUFJLGdCQUFnQjtBQUU1QyxhQUFXLFdBQVcsTUFBTTtBQUUxQixvQkFBZ0IsTUFBTSxJQUFJLGFBQWEsZ0JBQWdCLE9BQU8scUJBQXFCLENBQUMsaUJBQWlCLGNBQWMsQ0FBQztBQUFBLEVBQ3RILEdBQUcscUJBQXFCO0FBQ3hCLFNBQU8sZ0JBQWdCO0FBQ3pCO0FBbUJPLFNBQVMsMkJBQXNEO0FBQ3BFLGFBQU8sbURBQXNCLHlCQUF5QixJQUFJLDBCQUEwQixDQUFDLEVBQUU7QUFDekY7QUFvQk8sU0FBUyx1QkFBb0M7QUFDbEQsU0FBTyx5QkFBeUIsRUFBRTtBQUNwQztBQVNPLFNBQVMsUUFBUSxhQUEwQixVQUEwRDtBQUMxRyxNQUFJLFlBQVksU0FBUztBQUN2QixhQUFTLFdBQVc7QUFDcEIsV0FBTyxJQUFJLHFDQUFtQixFQUFFLFVBQVUscUJBQUssQ0FBQztBQUFBLEVBQ2xEO0FBRUEsY0FBWSxpQkFBaUIsU0FBUyxpQkFBaUIsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUNyRSxTQUFPLElBQUkscUNBQW1CO0FBQUEsSUFDNUIsVUFBVSxNQUFZO0FBQ3BCLGtCQUFZLG9CQUFvQixTQUFTLGVBQWU7QUFBQSxJQUMxRDtBQUFBLEVBQ0YsQ0FBQztBQUVELFdBQVMsZ0JBQWdCLFFBQXFCO0FBQzVDLGFBQVMsT0FBTyxNQUFxQjtBQUFBLEVBQ3ZDO0FBQ0Y7QUEwQk8sU0FBUyxhQUEwQixhQUEwQixxQkFBMkM7QUFDN0csU0FBTyxJQUFJLFFBQVcsQ0FBQyxTQUFTLFdBQVc7QUFDekMsWUFBUSxhQUFhLE1BQU07QUFDekIsVUFBSSxxQkFBcUI7QUFDdkIsZUFBTyxZQUFZLE1BQWU7QUFBQSxNQUNwQyxPQUFPO0FBQ0wsZ0JBQVEsWUFBWSxNQUFXO0FBQUEsTUFDakM7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNILENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFtdCn0K
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Fib3J0LWNvbnRyb2xsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBYm9ydENvbnRyb2xsZXIgdXRpbGl0aWVzLlxuICovXG5cbmltcG9ydCB7XG4gIENhbGxiYWNrRGlzcG9zYWJsZSxcbiAgQ29tYmluZURpc3Bvc2FibGVcbn0gZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldFR5cGVzY3JpcHRMaWJTdGF0ZSB9IGZyb20gJy4vdHlwZXNjcmlwdC1saWItc3RhdGUudHMnO1xuXG4vKipcbiAqIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIHRpbWVvdXQuXG4gKi9cbmV4cG9ydCBjb25zdCBJTkZJTklURV9USU1FT1VUID0gSW5maW5pdHk7XG5cbi8qKlxuICogQW4ge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gdGhhdCBjYW4gYmUgYWJvcnRlZCBtb3JlIHRoYW4gb25jZS5cbiAqXG4gKiBBIHBsYWluIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IGlzIHNpbmdsZS11c2U6IG9uY2UgYWJvcnRlZCwgaXRzIHNpZ25hbCBzdGF5cyBhYm9ydGVkIGZvcmV2ZXIsIHNvIGl0XG4gKiBjYW5ub3QgYmFjayBhIGNhbmNlbCBidXR0b24gdGhhdCB0aGUgdXNlciBtYXkgcHJlc3MgbW9yZSB0aGFuIG9uY2UuIFRoaXMgb25lIGFib3J0cyB0aGUgY3VycmVudCBzaWduYWxcbiAqIGFuZCBpbW1lZGlhdGVseSByZXBsYWNlcyBpdCwgc28gdGhlIG5leHQgb3BlcmF0aW9uIHN0YXJ0cyB3aXRoIGEgZnJlc2gsIG5vbi1hYm9ydGVkIHNpZ25hbCB3aGlsZSB0aGUgd29ya1xuICogdGhhdCBjYXB0dXJlZCB0aGUgcHJldmlvdXMgc2lnbmFsIHN0aWxsIG9ic2VydmVzIHRoZSBhYm9ydC5cbiAqXG4gKiBSZWFkIHtAbGluayBSZXNldHRhYmxlQWJvcnRDb250cm9sbGVyLnNpZ25hbH0gYXQgdGhlIHN0YXJ0IG9mIGVhY2ggb3BlcmF0aW9uLiBOZXZlciBjYWNoZSBpdCwgb3IgdGhlXG4gKiBvcGVyYXRpb24gYWZ0ZXIgdGhlIGZpcnN0IGFib3J0IHN0YXJ0cyBhbHJlYWR5IGFib3J0ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc2V0dGFibGVBYm9ydENvbnRyb2xsZXIgPSBuZXcgUmVzZXR0YWJsZUFib3J0Q29udHJvbGxlcigpO1xuICpcbiAqIGF3YWl0IGxvb3Aoe1xuICogICBhYm9ydFNpZ25hbDogcmVzZXR0YWJsZUFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gKiAgIGJ1aWxkTm90aWNlTWVzc2FnZTogKGZpbGUpID0+IGBQcm9jZXNzaW5nICR7ZmlsZS5wYXRofWAsXG4gKiAgIGl0ZW1zOiBhcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLFxuICogICBwcm9jZXNzSXRlbTogYXN5bmMgKGZpbGUpID0+IHsgYXdhaXQgcHJvY2Vzc0ZpbGUoZmlsZSk7IH1cbiAqIH0pO1xuICpcbiAqIC8vIEZyb20gYSBjYW5jZWwgYnV0dG9uLCBhIGNvbW1hbmQsIG9yIHRoZSBkZXZ0b29scyBjb25zb2xlLlxuICogcmVzZXR0YWJsZUFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICogYGBgXG4gKlxuICogQHNlZSB7QGxpbmsgZ2V0U2hhcmVkQWJvcnRDb250cm9sbGVyfSBmb3IgdGhlIGFwcC13aWRlIGluc3RhbmNlLlxuICovXG5leHBvcnQgY2xhc3MgUmVzZXR0YWJsZUFib3J0Q29udHJvbGxlciB7XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBhYm9ydCBzaWduYWwuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgQWJvcnRTaWduYWx9IHRoYXQgYWJvcnRzIG9uIHRoZSBuZXh0IHtAbGluayBSZXNldHRhYmxlQWJvcnRDb250cm9sbGVyLmFib3J0fSBjYWxsLlxuICAgKi9cbiAgcHVibGljIGdldCBzaWduYWwoKTogQWJvcnRTaWduYWwge1xuICAgIHJldHVybiB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWw7XG4gIH1cblxuICBwcml2YXRlIGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAvKipcbiAgICogQWJvcnRzIHRoZSBjdXJyZW50IHNpZ25hbCBhbmQgcmVwbGFjZXMgaXQgd2l0aCBhIGZyZXNoLCBub24tYWJvcnRlZCBvbmUuXG4gICAqXG4gICAqIEBwYXJhbSByZWFzb24gLSBUaGUgcmVhc29uIHRvIGFib3J0IHdpdGguIFdoZW4gb21pdHRlZCwgdGhlIHNpZ25hbCBpcyBhYm9ydGVkIHdpdGggdGhlIG5hdGl2ZVxuICAgKiBgQWJvcnRFcnJvcmAge0BsaW5rIERPTUV4Y2VwdGlvbn0sIGV4YWN0bHkgYXMge0BsaW5rIEFib3J0Q29udHJvbGxlci5hYm9ydH0gZG9lcy5cbiAgICovXG4gIHB1YmxpYyBhYm9ydChyZWFzb24/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5hYm9ydENvbnRyb2xsZXIuYWJvcnQocmVhc29uKTtcbiAgICB0aGlzLmFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGFib3J0IHNpZ25hbCB0aGF0IGFib3J0cyB3aGVuIGFueSBvZiB0aGUgZ2l2ZW4gYWJvcnQgc2lnbmFscyBhYm9ydC5cbiAqXG4gKiBAcGFyYW0gbWF5YmVBYm9ydFNpZ25hbHMgLSBUaGUgYWJvcnQgc2lnbmFscyB0byBhYm9ydCB3aGVuIGFueSBvZiB0aGVtIGFib3J0LlxuICogQHJldHVybnMgVGhlIGFib3J0IHNpZ25hbCB0aGF0IGFib3J0cyB3aGVuIGFueSBvZiB0aGUgZ2l2ZW4gYWJvcnQgc2lnbmFscyBhYm9ydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFib3J0U2lnbmFsQW55KC4uLm1heWJlQWJvcnRTaWduYWxzOiAoQWJvcnRTaWduYWwgfCB1bmRlZmluZWQpW10pOiBBYm9ydFNpZ25hbCB7XG4gIGNvbnN0IGFib3J0U2lnbmFscyA9IG1heWJlQWJvcnRTaWduYWxzLmZpbHRlcigoYWJvcnRTaWduYWwpID0+ICEhYWJvcnRTaWduYWwpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gYEFib3J0U2lnbmFsLmFueWAgaXMgZmVhdHVyZS1kZXRlY3RlZCBoZXJlIHdpdGggYSBtYW51YWwgZmFsbGJhY2sgYmVsb3csIHNvIGl0IGlzIG5vdCByZXF1aXJlZCBvbiBvbGRlciBPYnNpZGlhbi9FbGVjdHJvbiAoQ2hyb21pdW0pIHZlcnNpb25zIHRoYXQgbGFjayBpdC5cbiAgaWYgKHR5cGVvZiBBYm9ydFNpZ25hbC5hbnkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zIC0tIGBBYm9ydFNpZ25hbC5hbnlgIGlzIGZlYXR1cmUtZGV0ZWN0ZWQgYnkgdGhlIGd1YXJkIGFib3ZlIHdpdGggYSBtYW51YWwgZmFsbGJhY2sgYmVsb3csIHNvIGl0IGlzIG5vdCByZXF1aXJlZCBvbiBvbGRlciBPYnNpZGlhbi9FbGVjdHJvbiAoQ2hyb21pdW0pIHZlcnNpb25zIHRoYXQgbGFjayBpdC5cbiAgICByZXR1cm4gQWJvcnRTaWduYWwuYW55KGFib3J0U2lnbmFscyk7XG4gIH1cblxuICBpZiAoYWJvcnRTaWduYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIH1cblxuICBpZiAoYWJvcnRTaWduYWxzLmxlbmd0aCA9PT0gMSAmJiBhYm9ydFNpZ25hbHNbMF0pIHtcbiAgICByZXR1cm4gYWJvcnRTaWduYWxzWzBdO1xuICB9XG5cbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGZvciAoY29uc3QgYWJvcnRTaWduYWwgb2YgYWJvcnRTaWduYWxzKSB7XG4gICAgaWYgKGFib3J0U2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybiBhYm9ydFNpZ25hbDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhYm9ydEhhbmRsZXJEaXNwb3NhYmxlczogRGlzcG9zYWJsZVtdID0gQXJyYXkuZnJvbShhYm9ydFNpZ25hbHMsIChhYm9ydFNpZ25hbCkgPT4gb25BYm9ydChhYm9ydFNpZ25hbCwgaGFuZGxlQWJvcnQpKTtcblxuICBjb25zdCBjb21iaW5lZEFib3J0SGFuZGxlckRpc3Bvc2FibGUgPSBuZXcgQ29tYmluZURpc3Bvc2FibGUoeyBkaXNwb3NhYmxlczogYWJvcnRIYW5kbGVyRGlzcG9zYWJsZXMgfSk7XG5cbiAgcmV0dXJuIGFib3J0Q29udHJvbGxlci5zaWduYWw7XG5cbiAgZnVuY3Rpb24gaGFuZGxlQWJvcnQoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogdm9pZCB7XG4gICAgY29tYmluZWRBYm9ydEhhbmRsZXJEaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoYWJvcnRTaWduYWwucmVhc29uKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGFib3J0IHNpZ25hbCB0aGF0IG5ldmVyIGFib3J0cy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJvcnQgc2lnbmFsIHRoYXQgbmV2ZXIgYWJvcnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWJvcnRTaWduYWxOZXZlcigpOiBBYm9ydFNpZ25hbCB7XG4gIHJldHVybiBuZXcgQWJvcnRDb250cm9sbGVyKCkuc2lnbmFsO1xufVxuXG4vKipcbiAqIEFuIGFib3J0IHNpZ25hbCB0aGF0IGFib3J0cyBhZnRlciBhIHRpbWVvdXQuXG4gKlxuICogQHBhcmFtIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIFRoZSBhYm9ydCBzaWduYWwgdGhhdCBhYm9ydHMgYWZ0ZXIgYSB0aW1lb3V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWJvcnRTaWduYWxUaW1lb3V0KHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogQWJvcnRTaWduYWwge1xuICBpZiAodGltZW91dEluTWlsbGlzZWNvbmRzID09PSBJTkZJTklURV9USU1FT1VUKSB7XG4gICAgcmV0dXJuIGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgfVxuXG4gIC8vIEludGVudGlvbmFsbHkgTk9UIHRoZSBuYXRpdmUgYEFib3J0U2lnbmFsLnRpbWVvdXRgLCB3aG9zZSBpbnRlcm5hbCB0aW1lciBjYW5ub3QgYmUgYWR2YW5jZWQgYnlcbiAgLy8gYHZpLnVzZUZha2VUaW1lcnMoKWAsIHNvIGBzbGVlcGAgKGl0cyBzb2xlIGNvbnN1bWVyKSB3b3VsZCBiZSB1bmNvbnRyb2xsYWJsZSBpbiB0ZXN0cy4gQnVpbGRpbmdcbiAgLy8gYHNsZWVwYCdzIHNpZ25hbCBvZmYgYGdsb2JhbFRoaXMuc2V0VGltZW91dGAga2VlcHMgaXQgZmFrZS10aW1lciBjb250cm9sbGFibGUgKGxpa2VcbiAgLy8gYHNldFRpbWVvdXRBc3luY2ApIGFuZCBhbHNvIHdvcmtzIGluIGEgTm9kZSBlbnZpcm9ubWVudCB3aGVyZSBgd2luZG93YCBpcyB1bmRlZmluZWQsIHNpbmNlXG4gIC8vIGBnbG9iYWxUaGlzYCBleGlzdHMgaW4gTm9kZSB0b28uIENvbnN1bWVyIGludGVncmF0aW9uLXRlc3QgcHJvamVjdHMgcnVuIHZpdGVzdCB1bmRlclxuICAvLyBgZW52aXJvbm1lbnQ6ICdub2RlJ2AsIGluIHdoaWNoIGEgYHdpbmRvd2AtYmFzZWQgcHJpbWl0aXZlIHRocm93cyBhIGBSZWZlcmVuY2VFcnJvcmAuXG4gIC8vIFRoZSBhYm9ydCByZWFzb24gbWlycm9ycyB0aGUgbmF0aXZlIG9uZSAtLSBhIGBET01FeGNlcHRpb25gIG5hbWVkIGBUaW1lb3V0RXJyb3JgIC0tIG1hdGNoaW5nXG4gIC8vIGBBYm9ydFNpZ25hbC50aW1lb3V0YCBmb3IgYHJlYXNvbi5uYW1lYCBjaGVja3MuXG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gYERPTUV4Y2VwdGlvbmAgaXMgYSBET00gZ2xvYmFsIGFsd2F5cyBwcmVzZW50IGluIHRoZSBPYnNpZGlhbi9FbGVjdHJvbiAoQ2hyb21pdW0pIHJ1bnRpbWUgdGhpcyBjb2RlIHRhcmdldHMsIGFuZCBpcyBhbHNvIGEgTm9kZSBnbG9iYWwgZnJvbSBOb2RlIDE3IG9ud2FyZC5cbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IERPTUV4Y2VwdGlvbihgVGltZWQgb3V0IGluICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kc2AsICdUaW1lb3V0RXJyb3InKSk7XG4gIH0sIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG4gIHJldHVybiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xufVxuXG4vKipcbiAqIFRoZSBhcHAtd2lkZSBzaGFyZWQge0BsaW5rIFJlc2V0dGFibGVBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIEV2ZXJ5IHBsdWdpbiBidWlsdCBvbiB0aGlzIGxpYnJhcnkgc2hhcmVzIG9uZSBpbnN0YW5jZSwgc28gYSBzaW5nbGUge0BsaW5rIFJlc2V0dGFibGVBYm9ydENvbnRyb2xsZXIuYWJvcnR9XG4gKiBjYWxsIGNhbmNlbHMgd2hhdGV2ZXIgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiBpcyBpbiBmbGlnaHQsIHdoaWNoZXZlciBwbHVnaW4gc3RhcnRlZCBpdC4gQSBwbHVnaW4gdGhhdCBuZWVkc1xuICogYSBjYW5jZWwgYnV0dG9uIG9mIGl0cyBvd24gc2NvcGUgY29uc3RydWN0cyBpdHMgb3duIHtAbGluayBSZXNldHRhYmxlQWJvcnRDb250cm9sbGVyfSBpbnN0ZWFkLlxuICpcbiAqIEl0IGxpdmVzIGluIHRoZSBzaGFyZWQgc3RhdGUsIHNvIGl0IGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBkZXZ0b29scyBjb25zb2xlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGdsb2JhbFRoaXNbU3ltYm9sLmZvcignQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0YXRlJyldLnZhbHVlcy5zaGFyZWRBYm9ydENvbnRyb2xsZXIudmFsdWUuYWJvcnQoKTtcbiAqIGBgYFxuICpcbiAqIEZyb20gY29kZSwgY2FsbCB7QGxpbmsgZ2V0U2hhcmVkQWJvcnRDb250cm9sbGVyfSAob3Ige0BsaW5rIGdldFNoYXJlZEFib3J0U2lnbmFsfSkgcmF0aGVyIHRoYW4gcmVhZGluZyB0aGUgc2xvdC5cbiAqIGBAbW5hb3Vtb3Yvb2JzaWRpYW4tbGliYCBhbHNvIG1pcnJvcnMgdGhlIGluc3RhbmNlIHVuZGVyIHRoZSBsZWdhY3kgYF9fb2JzaWRpYW5EZXZVdGlsc2AgZ2xvYmFsLCBidXQgb25seSBzbyB0aGF0XG4gKiBwbHVnaW5zIGJ1bmRsaW5nIGFuIG9sZGVyIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGNvcHkgc2hhcmUgaXQ7IG5ldyBjb2RlIGFuZCBuZXcgY29uc29sZSByZWNpcGVzIHNob3VsZCBub3QgdXNlIGl0LlxuICpcbiAqIEByZXR1cm5zIFRoZSBzaGFyZWQge0BsaW5rIFJlc2V0dGFibGVBYm9ydENvbnRyb2xsZXJ9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hhcmVkQWJvcnRDb250cm9sbGVyKCk6IFJlc2V0dGFibGVBYm9ydENvbnRyb2xsZXIge1xuICByZXR1cm4gZ2V0VHlwZXNjcmlwdExpYlN0YXRlKCdzaGFyZWRBYm9ydENvbnRyb2xsZXInLCBuZXcgUmVzZXR0YWJsZUFib3J0Q29udHJvbGxlcigpKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBUaGUgc2lnbmFsIG9mIHRoZSBhcHAtd2lkZSBzaGFyZWQge0BsaW5rIFJlc2V0dGFibGVBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIENhbGwgaXQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggb3BlcmF0aW9uLiBOZXZlciBjYWNoZSBpdCwgb3IgdGhlIG9wZXJhdGlvbiBhZnRlciB0aGUgZmlyc3QgYWJvcnQgc3RhcnRzXG4gKiBhbHJlYWR5IGFib3J0ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGFib3J0U2lnbmFsID0gZ2V0U2hhcmVkQWJvcnRTaWduYWwoKTtcbiAqIGZvciAoY29uc3QgdXJsIG9mIHVybHMpIHtcbiAqICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAqICAgYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbDogYWJvcnRTaWduYWwgfSk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIEFib3J0U2lnbmFsfSBvZiB0aGUgc2hhcmVkIHtAbGluayBSZXNldHRhYmxlQWJvcnRDb250cm9sbGVyfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNoYXJlZEFib3J0U2lnbmFsKCk6IEFib3J0U2lnbmFsIHtcbiAgcmV0dXJuIGdldFNoYXJlZEFib3J0Q29udHJvbGxlcigpLnNpZ25hbDtcbn1cblxuLyoqXG4gKiBBZGRzIGFuIGFib3J0IGxpc3RlbmVyIHRvIGFuIGFib3J0IHNpZ25hbCBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIGlmIHRoZSBhYm9ydCBzaWduYWwgaXMgYWxyZWFkeSBhYm9ydGVkLlxuICpcbiAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIFRoZSBhYm9ydCBzaWduYWwgdG8gYWRkIHRoZSBsaXN0ZW5lciB0by5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGFib3J0IHNpZ25hbCBhYm9ydHMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbW92ZXMgdGhlIGFib3J0IGxpc3RlbmVyIHdoZW4gZGlzcG9zZWQsIGZvciB1c2Ugd2l0aCBgdXNpbmdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25BYm9ydChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwsIGNhbGxiYWNrOiAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiB2b2lkKTogRGlzcG9zYWJsZSB7XG4gIGlmIChhYm9ydFNpZ25hbC5hYm9ydGVkKSB7XG4gICAgY2FsbGJhY2soYWJvcnRTaWduYWwpO1xuICAgIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHsgY2FsbGJhY2s6IG5vb3AgfSk7XG4gIH1cblxuICBhYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIHdyYXBwZWRDYWxsYmFjaywgeyBvbmNlOiB0cnVlIH0pO1xuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgIGFib3J0U2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgd3JhcHBlZENhbGxiYWNrKTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHdyYXBwZWRDYWxsYmFjaygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY2FsbGJhY2soJGV2ZW50LnRhcmdldCBhcyBBYm9ydFNpZ25hbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBXYWl0cyBmb3IgYW4gYWJvcnQgc2lnbmFsIHRvIGFib3J0IGFuZCByZXNvbHZlcyB3aXRoIGl0cyByZWFzb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gRXhwZWN0ZWQgdHlwZSBvZiBgYWJvcnRTaWduYWwucmVhc29uYC5cbiAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIFRoZSBhYm9ydCBzaWduYWwgdG8gd2FpdCBmb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlYXNvbiBvZiB0aGUgYWJvcnQgc2lnbmFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FpdEZvckFib3J0PFQgPSB1bmtub3duPihhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPFQ+O1xuLyoqXG4gKiBXYWl0cyBmb3IgYW4gYWJvcnQgc2lnbmFsIHRvIGFib3J0IGFuZCByZWplY3RzIHdpdGggaXRzIHJlYXNvbi5cbiAqXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIHdhaXQgZm9yLlxuICogQHBhcmFtIHNob3VsZFJlamVjdE9uQWJvcnQgLSBXaGV0aGVyIHRvIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGUgYWJvcnQgc2lnbmFsIGlzIGFib3J0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlamVjdHMgd2l0aCB0aGUgcmVhc29uIG9mIHRoZSBhYm9ydCBzaWduYWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YWl0Rm9yQWJvcnQoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsLCBzaG91bGRSZWplY3RPbkFib3J0OiB0cnVlKTogUHJvbWlzZTxuZXZlcj47XG4vKipcbiAqIFdhaXRzIGZvciBhbiBhYm9ydCBzaWduYWwgdG8gYWJvcnQgYW5kIHJlc29sdmVzIHdpdGggaXRzIHJlYXNvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFeHBlY3RlZCB0eXBlIG9mIGBhYm9ydFNpZ25hbC5yZWFzb25gLlxuICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byB3YWl0IGZvci5cbiAqIEBwYXJhbSBzaG91bGRSZWplY3RPbkFib3J0IC0gV2hldGhlciB0byByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlIGFib3J0IHNpZ25hbCBpcyBhYm9ydGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZWFzb24gb2YgdGhlIGFib3J0IHNpZ25hbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhaXRGb3JBYm9ydDxUID0gdW5rbm93bj4oYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsLCBzaG91bGRSZWplY3RPbkFib3J0PzogYm9vbGVhbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIG9uQWJvcnQoYWJvcnRTaWduYWwsICgpID0+IHtcbiAgICAgIGlmIChzaG91bGRSZWplY3RPbkFib3J0KSB7XG4gICAgICAgIHJlamVjdChhYm9ydFNpZ25hbC5yZWFzb24gYXMgRXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShhYm9ydFNpZ25hbC5yZWFzb24gYXMgVCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BLHdCQUdPO0FBQ1Asc0JBQXFCO0FBQ3JCLGtDQUFzQztBQUsvQixNQUFNLG1CQUFtQjtBQThCekIsTUFBTSwwQkFBMEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNckMsSUFBVyxTQUFzQjtBQUMvQixXQUFPLEtBQUssZ0JBQWdCO0FBQUEsRUFDOUI7QUFBQSxFQUVRLGtCQUFrQixJQUFJLGdCQUFnQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUXZDLE1BQU0sUUFBd0I7QUFDbkMsU0FBSyxnQkFBZ0IsTUFBTSxNQUFNO0FBQ2pDLFNBQUssa0JBQWtCLElBQUksZ0JBQWdCO0FBQUEsRUFDN0M7QUFDRjtBQVFPLFNBQVMsa0JBQWtCLG1CQUE2RDtBQUM3RixRQUFNLGVBQWUsa0JBQWtCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFdBQVc7QUFHNUUsTUFBSSxPQUFPLFlBQVksUUFBUSxZQUFZO0FBRXpDLFdBQU8sWUFBWSxJQUFJLFlBQVk7QUFBQSxFQUNyQztBQUVBLE1BQUksYUFBYSxXQUFXLEdBQUc7QUFDN0IsV0FBTyxpQkFBaUI7QUFBQSxFQUMxQjtBQUVBLE1BQUksYUFBYSxXQUFXLEtBQUssYUFBYSxDQUFDLEdBQUc7QUFDaEQsV0FBTyxhQUFhLENBQUM7QUFBQSxFQUN2QjtBQUVBLFFBQU0sa0JBQWtCLElBQUksZ0JBQWdCO0FBRTVDLGFBQVcsZUFBZSxjQUFjO0FBQ3RDLFFBQUksWUFBWSxTQUFTO0FBQ3ZCLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFFBQU0sMEJBQXdDLE1BQU0sS0FBSyxjQUFjLENBQUMsZ0JBQWdCLFFBQVEsYUFBYSxXQUFXLENBQUM7QUFFekgsUUFBTSxpQ0FBaUMsSUFBSSxvQ0FBa0IsRUFBRSxhQUFhLHdCQUF3QixDQUFDO0FBRXJHLFNBQU8sZ0JBQWdCO0FBRXZCLFdBQVMsWUFBWSxhQUFnQztBQUNuRCxtQ0FBK0IsUUFBUTtBQUN2QyxvQkFBZ0IsTUFBTSxZQUFZLE1BQU07QUFBQSxFQUMxQztBQUNGO0FBT08sU0FBUyxtQkFBZ0M7QUFDOUMsU0FBTyxJQUFJLGdCQUFnQixFQUFFO0FBQy9CO0FBUU8sU0FBUyxtQkFBbUIsdUJBQTRDO0FBQzdFLE1BQUksMEJBQTBCLGtCQUFrQjtBQUM5QyxXQUFPLGlCQUFpQjtBQUFBLEVBQzFCO0FBVUEsUUFBTSxrQkFBa0IsSUFBSSxnQkFBZ0I7QUFFNUMsYUFBVyxXQUFXLE1BQU07QUFFMUIsb0JBQWdCLE1BQU0sSUFBSSxhQUFhLGdCQUFnQixPQUFPLHFCQUFxQixDQUFDLGlCQUFpQixjQUFjLENBQUM7QUFBQSxFQUN0SCxHQUFHLHFCQUFxQjtBQUN4QixTQUFPLGdCQUFnQjtBQUN6QjtBQXFCTyxTQUFTLDJCQUFzRDtBQUNwRSxhQUFPLG1EQUFzQix5QkFBeUIsSUFBSSwwQkFBMEIsQ0FBQyxFQUFFO0FBQ3pGO0FBbUJPLFNBQVMsdUJBQW9DO0FBQ2xELFNBQU8seUJBQXlCLEVBQUU7QUFDcEM7QUFTTyxTQUFTLFFBQVEsYUFBMEIsVUFBMEQ7QUFDMUcsTUFBSSxZQUFZLFNBQVM7QUFDdkIsYUFBUyxXQUFXO0FBQ3BCLFdBQU8sSUFBSSxxQ0FBbUIsRUFBRSxVQUFVLHFCQUFLLENBQUM7QUFBQSxFQUNsRDtBQUVBLGNBQVksaUJBQWlCLFNBQVMsaUJBQWlCLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDckUsU0FBTyxJQUFJLHFDQUFtQjtBQUFBLElBQzVCLFVBQVUsTUFBWTtBQUNwQixrQkFBWSxvQkFBb0IsU0FBUyxlQUFlO0FBQUEsSUFDMUQ7QUFBQSxFQUNGLENBQUM7QUFFRCxXQUFTLGdCQUFnQixRQUFxQjtBQUM1QyxhQUFTLE9BQU8sTUFBcUI7QUFBQSxFQUN2QztBQUNGO0FBMEJPLFNBQVMsYUFBMEIsYUFBMEIscUJBQTJDO0FBQzdHLFNBQU8sSUFBSSxRQUFXLENBQUMsU0FBUyxXQUFXO0FBQ3pDLFlBQVEsYUFBYSxNQUFNO0FBQ3pCLFVBQUkscUJBQXFCO0FBQ3ZCLGVBQU8sWUFBWSxNQUFlO0FBQUEsTUFDcEMsT0FBTztBQUNMLGdCQUFRLFlBQVksTUFBVztBQUFBLE1BQ2pDO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -86,7 +86,9 @@ export declare function abortSignalTimeout(timeoutInMilliseconds: number): Abort
|
|
|
86
86
|
* globalThis[Symbol.for('@mnaoumov/typescript-lib/state')].values.sharedAbortController.value.abort();
|
|
87
87
|
* ```
|
|
88
88
|
*
|
|
89
|
-
*
|
|
89
|
+
* From code, call {@link getSharedAbortController} (or {@link getSharedAbortSignal}) rather than reading the slot.
|
|
90
|
+
* `@mnaoumov/obsidian-lib` also mirrors the instance under the legacy `__obsidianDevUtils` global, but only so that
|
|
91
|
+
* plugins bundling an older `obsidian-dev-utils` copy share it; new code and new console recipes should not use it.
|
|
90
92
|
*
|
|
91
93
|
* @returns The shared {@link ResettableAbortController}.
|
|
92
94
|
*/
|
|
@@ -99,12 +101,11 @@ export declare function getSharedAbortController(): ResettableAbortController;
|
|
|
99
101
|
*
|
|
100
102
|
* @example
|
|
101
103
|
* ```typescript
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
* });
|
|
104
|
+
* const abortSignal = getSharedAbortSignal();
|
|
105
|
+
* for (const url of urls) {
|
|
106
|
+
* abortSignal.throwIfAborted();
|
|
107
|
+
* await fetch(url, { signal: abortSignal });
|
|
108
|
+
* }
|
|
108
109
|
* ```
|
|
109
110
|
*
|
|
110
111
|
* @returns The {@link AbortSignal} of the shared {@link ResettableAbortController}.
|
|
@@ -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/IExJQlJBUllfTkFNRSxcbiAgICAgIHZlcnNpb246IDFcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdExpdGVyYWwobGl0ZXJhbDogTGl0ZXJhbCk6IHN0cmluZyB7XG4gIGlmIChpc1N0cmluZyhsaXRlcmFsKSkge1xuICAgIHJldHVybiBgJyR7bGl0ZXJhbH0nYDtcbiAgfVxuXG4gIHJldHVybiB0eXBlb2YgbGl0ZXJhbCA9PT0gJ2JpZ2ludCcgPyBgJHtTdHJpbmcobGl0ZXJhbCl9bmAgOiBTdHJpbmcobGl0ZXJhbCk7XG59XG5cbmZ1bmN0aW9uIGlzUmVhZG9ubHlBcnJheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHJlYWRvbmx5IHVua25vd25bXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXVCQSxxQkFBNkI7QUFDN0IsMEJBQXVCO0FBQ3ZCLHlCQVVPO0FBZ0pBLE1BQU0sZ0JBQTRDLEVBQUUsVUFBVSxhQUFhLFdBQVcsNkJBQVU7QUFLaEcsTUFBTSxlQUEwQyxFQUFFLFVBQVUsWUFBWSxXQUFXLDRCQUFTO0FBSzVGLE1BQU0sZUFBMEMsRUFBRSxVQUFVLFlBQVksV0FBVyw0QkFBUztBQUs1RixNQUFNLHFCQUFrRCxFQUFFLFVBQVUsdUJBQXVCLFdBQVcsaUNBQWM7QUFLcEgsTUFBTSxrQkFBZ0QsRUFBRSxVQUFVLGFBQWEsV0FBVywrQkFBWTtBQVN0RyxTQUFTLFdBQWMsV0FBeUQ7QUFDckYsU0FBTyx3QkFBd0IsZ0NBQWdDLFVBQVUsUUFBUSxRQUFJLG1DQUFlLFVBQVUsU0FBUyxDQUFDO0FBQzFIO0FBYU8sU0FBUyxnQ0FBZ0MsUUFBMkM7QUFDekYsU0FBTztBQUFBLElBQ0wsdUJBQXVCLENBQStDLGVBQWdELHNCQUFzQixZQUFZLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFDbEssdUJBQXVCLENBQUksVUFBZ0Msc0JBQXNCLEVBQUUsR0FBRyxPQUFPLE9BQU8sQ0FBQztBQUFBLEVBQ3ZHO0FBQ0Y7QUFhTyxTQUFTLHNCQUNkLFlBQ0EsU0FDc0Q7QUFDdEQsUUFBTSxvQkFBZ0IsNEJBQThDLFVBQVU7QUFDOUUsU0FBTyxhQUFhLENBQUMsVUFBdUU7QUFDMUYsUUFBSSxDQUFDLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFDekIsYUFBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFNBQVMsNkJBQTZCLENBQUMsRUFBRTtBQUFBLElBQy9EO0FBRUEsUUFBSSxNQUFNLFNBQVMsY0FBYyxRQUFRO0FBQ3ZDLGFBQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLG9CQUFvQixPQUFPLGNBQWMsTUFBTSxDQUFDLHFCQUFxQixPQUFPLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQUEsSUFDL0g7QUFFQSxVQUFNLFNBQVMsY0FBYyxRQUFRLENBQUMsV0FBVyxVQUFvQyxVQUFVLFVBQVUsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsWUFBWSxVQUFVLFFBQVEsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUM3TCxXQUFPLE9BQU8sV0FBVyxJQUFJLEVBQUUsV0FBTyw0QkFBa0MsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPO0FBQUEsRUFDOUYsR0FBRyxTQUFTLE1BQU07QUFDcEI7QUFVTyxTQUFTLHdCQUEyQixVQUFrQixXQUErQztBQUMxRyxTQUFPLEVBQUUsVUFBVSxVQUFVO0FBQy9CO0FBU08sU0FBUyxzQkFBeUIsUUFBc0U7QUFDN0csU0FBTztBQUFBLElBQ0wsQ0FBQyxVQUErQyxPQUFPLFVBQVUsS0FBSyxJQUFJLEVBQUUsTUFBTSxJQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxZQUFZLE9BQU8sUUFBUSxJQUFJLENBQUMsRUFBRTtBQUFBLElBQzlJLE9BQU87QUFBQSxFQUNUO0FBQ0Y7QUFVTyxTQUFTLGtCQUF1QyxVQUFtRTtBQUN4SCxTQUFPO0FBQ1Q7QUFVTyxTQUFTLGdCQUFtQixhQUErRTtBQUNoSCxTQUFPLHdCQUF3QixrQkFBa0IsWUFBWSxJQUFJLFFBQUksd0NBQW9CLFdBQVcsQ0FBQztBQUN2RztBQXlCTyxTQUFTLGFBQWEsVUFBMkY7QUFDdEgsUUFBTSxjQUFrQyxnQkFBZ0IsUUFBUSxJQUFJLFdBQVcsT0FBTyxLQUFLLFFBQVE7QUFDbkcsU0FBTyx3QkFBd0IsVUFBVSxZQUFZLElBQUksQ0FBQyxZQUFZLGNBQWMsT0FBTyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBSSxxQ0FBaUIsV0FBVyxDQUFDO0FBQzNJO0FBU08sU0FBUyxjQUFpQixPQUEwRDtBQUN6RixTQUFPO0FBQUEsSUFDTCxVQUFVLEdBQUcsTUFBTSxRQUFRO0FBQUEsSUFDM0IsV0FBVyxDQUFDLFVBQXNDLFVBQVUsUUFBUSxNQUFNLFVBQVUsS0FBSztBQUFBLEVBQzNGO0FBQ0Y7QUFTTyxTQUFTLGNBQWlCLE9BQStEO0FBQzlGLFNBQU87QUFBQSxJQUNMLFVBQVUsR0FBRyxNQUFNLFFBQVE7QUFBQSxJQUMzQixXQUFXLENBQUMsVUFBMkMsVUFBVSxVQUFhLE1BQU0sVUFBVSxLQUFLO0FBQUEsRUFDckc7QUFDRjtBQVNPLFNBQVMsY0FDWCxRQUMyRDtBQUM5RCxTQUFPO0FBQUEsSUFDTCxPQUFPLElBQUksQ0FBQyxVQUFVLE1BQU0sUUFBUSxFQUFFLEtBQUssTUFBTTtBQUFBLFFBQ2pELG1DQUFlLEdBQUcsT0FBTyxJQUFJLENBQUMsVUFBVSxNQUFNLFNBQVMsQ0FBQztBQUFBLEVBQzFEO0FBQ0Y7QUFFQSxTQUFTLGFBQWdCLFVBQTBELFFBQTBEO0FBQzNJLFNBQU87QUFBQSxJQUNMLGFBQWE7QUFBQSxNQUNYO0FBQUEsTUFDQSxRQUFRLFVBQVU7QUFBQSxNQUNsQixTQUFTO0FBQUEsSUFDWDtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsY0FBYyxTQUEwQjtBQUMvQyxVQUFJLDZCQUFTLE9BQU8sR0FBRztBQUNyQixXQUFPLElBQUksT0FBTztBQUFBLEVBQ3BCO0FBRUEsU0FBTyxPQUFPLFlBQVksV0FBVyxHQUFHLE9BQU8sT0FBTyxDQUFDLE1BQU0sT0FBTyxPQUFPO0FBQzdFO0FBRUEsU0FBUyxnQkFBZ0IsT0FBNkM7QUFDcEUsU0FBTyxNQUFNLFFBQVEsS0FBSztBQUM1QjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
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
|
*
|