cdk-nextjs 0.7.10 → 0.7.11
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/.jsii +3 -3
- package/README.md +1 -1
- package/docs/harness-coverage.md +1 -1
- package/docs/nextjs-private-apis.md +128 -0
- package/lib/adapter/adapter.mjs +276 -24
- package/lib/adapter/build-outputs.d.ts +1 -1
- package/lib/adapter/build-outputs.js +29 -13
- package/lib/adapter/build-outputs.test.js +35 -7
- package/lib/adapter/cache-handler.d.ts +1 -1
- package/lib/adapter/cache-handler.js +1 -1
- package/lib/adapter/cache-kinds.d.ts +12 -1
- package/lib/adapter/cache-kinds.js +16 -4
- package/lib/adapter/init-cache.js +7 -7
- package/lib/adapter/local-file-cache-handler.d.ts +1 -1
- package/lib/adapter/local-file-cache-handler.js +1 -1
- package/lib/adapter/memory-cache-handler.d.ts +2 -2
- package/lib/adapter/memory-cache-handler.js +1 -1
- package/lib/adapter/s3-cache-handler.d.ts +2 -2
- package/lib/adapter/s3-cache-handler.js +1 -1
- package/lib/adapter/use-cache-common.d.ts +1 -1
- package/lib/adapter/use-cache-common.js +1 -1
- package/lib/adapter/use-cache-common.test.js +1 -1
- package/lib/adapter/use-cache-default-handler.d.ts +1 -1
- package/lib/adapter/use-cache-default-handler.js +1 -1
- package/lib/adapter/use-cache-handlers.test.js +1 -1
- package/lib/adapter/use-cache-remote-handler.d.ts +1 -1
- package/lib/adapter/use-cache-remote-handler.js +1 -1
- package/lib/cdk-nextjs-version.d.ts +10 -0
- package/lib/cdk-nextjs-version.js +15 -0
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.js +7 -6
- package/lib/nextjs-build/nextjs-build.test.js +16 -3
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.js +5 -5
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.js +1 -1
- package/lib/root-constructs/nextjs-global-functions.js +1 -1
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +1 -1
- package/lib/runtime/core.test.js +17 -8
- package/lib/runtime/dispatch.js +4 -5
- package/lib/runtime/image.js +43 -32
- package/lib/runtime/image.test.js +27 -26
- package/lib/runtime/lambda.mjs +276 -36
- package/lib/runtime/manifest.d.ts +34 -8
- package/lib/runtime/manifest.js +7 -5
- package/lib/runtime/server.mjs +276 -36
- package/package.json +1 -1
- package/scripts/capture-adapter-fixture.mjs +13 -1
- package/scripts/zero-config-build.mjs +5 -1
package/lib/runtime/dispatch.js
CHANGED
|
@@ -734,8 +734,8 @@ function statusTargets(manifest, status) {
|
|
|
734
734
|
}
|
|
735
735
|
/**
|
|
736
736
|
* The locale a request's status page renders in, the way `next start` picks it:
|
|
737
|
-
* the locale the URL's first segment names (
|
|
738
|
-
*
|
|
737
|
+
* the locale the URL's first segment names (`normalizeLocalePath`, which
|
|
738
|
+
* matches it case-insensitively), and otherwise the domain's default locale,
|
|
739
739
|
* then the app's. `undefined` without i18n.
|
|
740
740
|
*/
|
|
741
741
|
function requestLocale(manifest, url) {
|
|
@@ -743,9 +743,8 @@ function requestLocale(manifest, url) {
|
|
|
743
743
|
if (!i18n)
|
|
744
744
|
return undefined;
|
|
745
745
|
const pathname = (0, util_1.withoutPathPrefix)(url.pathname, manifest.config.basePath);
|
|
746
|
-
|
|
747
|
-
return (i18n.locales.find((candidate) => candidate.toLowerCase() === segment) ??
|
|
746
|
+
return ((0, routing_1.normalizeLocalePath)(pathname, i18n.locales).detectedLocale ??
|
|
748
747
|
(0, routing_1.detectDomainLocale)(i18n.domains, url.hostname)?.defaultLocale ??
|
|
749
748
|
i18n.defaultLocale);
|
|
750
749
|
}
|
|
751
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9kaXNwYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzc0JBLGdDQW9CQztBQTJFRCxzREFrQkM7QUFxQ0Qsb0RBMkNDO0FBNkVELHNDQWdCQztBQXArQkQsc0RBQXNEO0FBQ3REOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCwyQ0FXdUI7QUFDdkIseUNBSW9CO0FBQ3BCLGlEQUE4QztBQUM5QyxpQ0FBaUU7QUFpS2pFOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxRQUFRLENBQUMsT0FBZ0I7SUFDaEMsT0FBTyxPQUF3QyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxNQUFNLENBQUMsSUFBb0I7SUFDbEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFFLElBQW9DLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsTUFBYSxVQUFVO0lBVWU7SUFUcEMsMkVBQTJFO0lBQzNELFdBQVcsQ0FBNkI7SUFFdkMsTUFBTSxDQUFnQztJQUN0QyxJQUFJLENBQTBDO0lBQzlDLEtBQUssQ0FBZTtJQUNwQixhQUFhLENBQVM7SUFDdEIsYUFBYSxDQUFVO0lBRXhDLFlBQW9DLE9BQTBCO1FBQTFCLFlBQU8sR0FBUCxPQUFPLENBQW1CO1FBQzVELE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUNuRCxJQUFJLENBQUMsS0FBSyxHQUFHLGlCQUFpQixDQUFDLFFBQVEs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QUFTLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQztJQUNwRSxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGFBQWEsQ0FDcEIsUUFBeUIsRUFDekIsR0FBUTtJQUVSLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBQSx3QkFBaUIsRUFBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0UsTUFBTSxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdELE9BQU8sQ0FDTCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sQ0FBQztRQUNyRSxJQUFBLDRCQUFrQixFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLGFBQWE7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FDbkIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbi8qKlxuICogUmVxdWVzdCBkaXNwYXRjaDogVVJMIGluLCByb3V0aW5nIGRlY2lzaW9uIG91dC5cbiAqXG4gKiBBbGwgcm91dGUgbWF0Y2hpbmcgaXMgZGVsZWdhdGVkIHRvIGBAbmV4dC9yb3V0aW5nYCdzIGByZXNvbHZlUm91dGVzYCwgdGhlXG4gKiBmaXJzdC1wYXJ0eSBwYWNrYWdlIGBuZXh0IHN0YXJ0YCB3YXMgcmVmYWN0b3JlZCB0byBleHBvc2UuIFJlaW1wbGVtZW50aW5nXG4gKiByZWRpcmVjdHMvcmV3cml0ZXMvaTE4bi9keW5hbWljLXJvdXRlIG1hdGNoaW5nIGlzIHdoYXQgcHJldmlvdXMgdmVyc2lvbnMgb2ZcbiAqIHRoaXMgY29uc3RydWN0IGRpZCwgYW5kIGl0IGlzIHRoZSB0aGluZyB0aGlzIHJld3JpdGUgZXhpc3RzIHRvIGRlbGV0ZS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyBwdXJlIGRlY2lzaW9uLW1ha2luZzogaXQgbmV2ZXIgdG91Y2hlcyB0aGUgZmlsZXN5c3RlbSwgbmV2ZXJcbiAqIHJlcXVpcmVzIGFuIGVudHJ5cG9pbnQsIGFuZCBuZXZlciBidWlsZHMgYSBgUmVzcG9uc2VgLiBJdCByZXR1cm5zIGFcbiAqIHtAbGluayBEaXNwYXRjaFJlc3VsdH0gYW5kIHRoZSBjYWxsZXIgKHRoZSBydW50aW1lIGNvcmUsIHN0ZXAgNCkgYWN0cyBvbiBpdC5cbiAqIFRoYXQgc3BsaXQgaXMgd2hhdCBtYWtlcyBpdCB1bml0LXRlc3RhYmxlIGFnYWluc3QgdGhlIGNvbW1pdHRlZFxuICogYG9uQnVpbGRDb21wbGV0ZWAgZml4dHVyZXMgd2l0aCBubyBBV1MgYW5kIG5vIE5leHQuanMgc2VydmVyLlxuICovXG5pbXBvcnQge1xuICBNaWRkbGV3YXJlQ29udGV4dCxcbiAgTWlkZGxld2FyZVJlc3VsdCxcbiAgUmVzb2x2ZVJvdXRlc1BhcmFtcyxcbiAgUmVzb2x2ZVJvdXRlc1F1ZXJ5LFxuICBSZXNvbHZlUm91dGVzUXVlcnlWYWx1ZSxcbiAgUmVzb2x2ZVJvdXRlc1Jlc3VsdCxcbiAgUm91dGVJbnZvY2F0aW9uVGFyZ2V0LFxuICBkZXRlY3REb21haW5Mb2NhbGUsXG4gIGRldGVjdExvY2FsZSxcbiAgcmVzb2x2ZVJvdXRlcyxcbn0gZnJvbSBcIkBuZXh0L3JvdXRpbmdcIjtcbmltcG9ydCB7XG4gIEFkYXB0ZXJFbnRyeXBvaW50LFxuICBBZGFwdGVyTWFuaWZlc3QsXG4gIFNUQVRVU19QQUdFX1NVRkZJWEVTLFxufSBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuaW1wb3J0IHsgcHVibGljRGlyS2V5IH0gZnJvbSBcIi4vcHVibGljLWZpbGVzXCI7XG5pbXBvcnQgeyBzYWZlRGVjb2RlLCB0b1NlYXJjaCwgd2l0aG91dFBhdGhQcmVmaXggfSBmcm9tIFwiLi91dGlsXCI7XG5cbi8qKlxuICogUnVucyB0aGUgYXBwJ3MgbWlkZGxld2FyZSBmb3Igb25lIHJlcXVlc3QuIFN1cHBsaWVkIGJ5IGBNaWRkbGV3YXJlUnVubmVyYCBpblxuICogYC4vbWlkZGxld2FyZWAuXG4gKlxuICogYE1pZGRsZXdhcmVDb250ZXh0YCBjYXJyaWVzIG5vIG1ldGhvZCDigJQgYHJlc29sdmVSb3V0ZXNgIG5ldmVyIG5lZWRzIG9uZSDigJQgYnV0XG4gKiBtaWRkbGV3YXJlIHZlcnkgbXVjaCBkb2VzIChgaWYgKHJlcXVlc3QubWV0aG9kID09PSBcIlBPU1RcIilgKSwgc28gZGlzcGF0Y2ggYWRkc1xuICogaXQgZnJvbSB0aGUgcmVxdWVzdCBpdCB3YXMgZ2l2ZW4uIFRoZSBgUmVzcG9uc2VgIG1pZGRsZXdhcmUgcmV0dXJuZWQgY29tZXNcbiAqIGJhY2sgYmVzaWRlIHRoZSByZXN1bHQsIGJlY2F1c2UgYHJlc29sdmVSb3V0ZXNgIHJlcG9ydHMgYG1pZGRsZXdhcmVSZXNwb25kZWRgXG4gKiB3aXRob3V0IGl0LlxuICovXG5leHBvcnQgdHlwZSBNaWRkbGV3YXJlSW52b2tlciA9IChcbiAgY3R4OiBNaWRkbGV3YXJlQ29udGV4dCAmIHsgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmcgfSxcbikgPT4gUHJvbWlzZTxNaWRkbGV3YXJlUmVzdWx0ICYgeyByZWFkb25seSByZXNwb25zZTogUmVzcG9uc2UgfT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGF0Y2hlck9wdGlvbnMge1xuICByZWFkb25seSBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0O1xuICAvKipcbiAgICogVGhlIGZpbGVzIHVuZGVyIGBwdWJsaWMvYCwgZnJvbSBgcmVhZFB1YmxpY0ZpbGVzYDogdW5lbmNvZGVkIHBhdGhzIHJlbGF0aXZlXG4gICAqIHRvIGl0LiBTZXJ2ZWQgYWhlYWQgb2YgZXZlcnkgcm91dGUsIGFzIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgdGhlbS5cbiAgICogQGRlZmF1bHQgLSBubyBgcHVibGljL2AgZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpY0ZpbGVzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGF0Y2hSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVybDogVVJMO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICAvKipcbiAgICogQWx3YXlzIGEgc3RyZWFtIOKAlCBgcmVzb2x2ZVJvdXRlc2AgcmVxdWlyZXMgb25lIGJlY2F1c2UgbWlkZGxld2FyZSBtYXkgcmVhZFxuICAgKiB0aGUgYm9keS4gVXNlIGFuIGFscmVhZHktY2xvc2VkIHN0cmVhbSBmb3IgR0VUL0hFQUQuXG4gICAqL1xuICByZWFkb25seSBib2R5OiBSZWFkYWJsZVN0cmVhbTtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIHdoZW5ldmVyIGBtYW5pZmVzdC5taWRkbGV3YXJlYCBpcyBub24tbnVsbC4gYHJlc29sdmVSb3V0ZXNgIGRlY2lkZXNcbiAgICogKndoZXRoZXIqIHRvIGNhbGwgaXQgZnJvbSBgcm91dGluZy5taWRkbGV3YXJlTWF0Y2hlcnNgOyB3ZSBvbmx5IHN1cHBseSB0aGVcbiAgICogaG93LlxuICAgKi9cbiAgcmVhZG9ubHkgaW52b2tlTWlkZGxld2FyZT86IE1pZGRsZXdhcmVJbnZva2VyO1xufVxuXG5pbnRlcmZhY2UgRGlzcGF0Y2hSZXN1bHRCYXNlIHtcbiAgLyoqXG4gICAqIEhlYWRlcnMgdG8gbWVyZ2UgaW50byB0aGUgcmVzcG9uc2U6IGBoZWFkZXJzKClgIHJ1bGVzLCB0aGUgaW1tdXRhYmxlXG4gICAqIGBjYWNoZS1jb250cm9sYCBmb3IgYF9uZXh0L3N0YXRpY2AsIGFuZCBhbnl0aGluZyBtaWRkbGV3YXJlIHNldCB2aWFcbiAgICogYE5leHRSZXNwb25zZS5uZXh0KHsgaGVhZGVycyB9KWAuIE5ldmVyIHJlcXVlc3QgaGVhZGVycy5cbiAgICovXG4gIHJlYWRvbmx5IHJlc3BvbnNlSGVhZGVyczogSGVhZGVycztcbiAgLyoqIFN0YXR1cyBmb3JjZWQgYnkgYSBtYXRjaGVkIHJvdXRlLCBpZiBhbnkuICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IG51bWJlcjtcbn1cblxuLyoqIEEgcm91dGUgd2UgbXVzdCBpbnZva2UuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3BhdGNoRW50cnlwb2ludFJlc3VsdCBleHRlbmRzIERpc3BhdGNoUmVzdWx0QmFzZSB7XG4gIHJlYWRvbmx5IGtpbmQ6IFwiZW50cnlwb2ludFwiO1xuICByZWFkb25seSBlbnRyeXBvaW50OiBBZGFwdGVyRW50cnlwb2ludDtcbiAgLyoqIFRoZSBtYXRjaGVkIHRlbXBsYXRlLCBpLmUuIHRoZSBgbWFuaWZlc3QuZW50cnlwb2ludHNgIGtleS4gKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZWRQYXRobmFtZTogc3RyaW5nO1xuICAvKiogVGhlICpjb25jcmV0ZSogcGF0aG5hbWUgKyBxdWVyeSB0byBpbnZva2UgdGhlIHJvdXRlIHdpdGguICovXG4gIHJlYWRvbmx5IGludm9jYXRpb25UYXJnZXQ6IFJvdXRlSW52b2NhdGlvblRhcmdldDtcbiAgLyoqIFJlcXVlc3QgaGVhZGVycyBhcyBtaWRkbGV3YXJlIGxlZnQgdGhlbS4gKi9cbiAgcmVhZG9ubHkgcmVxdWVzdEhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8qKiBBIGZpbGUgaW4gYG1hbmlmZXN0LnN0YXRpY0ZpbGVzYCBvciBgcHVibGljL2A6IHJlYWQgb2ZmIGRpc2ssIG5vdCBpbnZva2VkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXNwYXRjaFN0YXRpY0ZpbGVSZXN1bHQgZXh0ZW5kcyBEaXNwYXRjaFJlc3VsdEJhc2Uge1xuICByZWFkb25seSBraW5kOiBcInN0YXRpYy1maWxlXCI7XG4gIHJlYWRvbmx5IHBhdGhuYW1lOiBzdHJpbmc7XG4gIC8qKiBSZXBvLXJvb3QtcmVsYXRpdmUga2V5IGluc2lkZSB0aGUgZGVwbG95bWVudCByb290LiAqL1xuICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2U6IFN0YXRpY0ZpbGVTb3VyY2U7XG4gIC8qKlxuICAgKiBSZXF1ZXN0IGhlYWRlcnMgYXMgbWlkZGxld2FyZSBsZWZ0IHRoZW0sIGZvciB0aGUgNDA0IHRoZSBydW50aW1lIHJlbmRlcnNcbiAgICogd2hlbiB0aGUgZmlsZSBpcyBub3QgaW4gdGhlIHBhY2thZ2UgYWZ0ZXIgYWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdEhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8qKlxuICogV2hlcmUgYSBzdGF0aWMgZmlsZSBjYW1lIGZyb20sIHdoaWNoIGRlY2lkZXMgd2hhdCBlbHNlIGl0IGlzIGFsbG93ZWQgdG8gZG8uXG4gKlxuICogLSBgcHVibGljYCDigJQgYSBmaWxlIGluIGBwdWJsaWMvYC5cbiAqIC0gYG5leHQtc3RhdGljYCDigJQgYDxkaXN0RGlyPi9zdGF0aWNgLCB0aGUgY2xpZW50IGJ1bmRsZXMuXG4gKiAtIGBzZXJ2ZXJgIOKAlCBhIGJ1aWxkIG91dHB1dCB1bmRlciBgPGRpc3REaXI+L3NlcnZlcmA6IHByZXJlbmRlcmVkIEhUTUwsIGFcbiAqICAgc3RhdGljIG1ldGFkYXRhIHJvdXRlJ3MgYC5ib2R5YC5cbiAqXG4gKiBUaGUgZmlyc3QgdHdvIGFyZSB3aGF0IGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgYXMgcGxhaW4gZmlsZXMsIHdpdGggYHNlbmRgLCBhbmRcbiAqIG9ubHkgdG8gR0VUIGFuZCBIRUFEIChgcm91dGVyLXNlcnZlci5qc2AsIHRoZSBgZnNQYXRoYCBicmFuY2gpOyB0aGUgdGhpcmQgaXRcbiAqIHNlcnZlcyBieSBpbnZva2luZyB0aGUgcm91dGUgaXQgY2FtZSBmcm9tLlxuICovXG5leHBvcnQgdHlwZSBTdGF0aWNGaWxlU291cmNlID0gXCJwdWJsaWNcIiB8IFwibmV4dC1zdGF0aWNcIiB8IFwic2VydmVyXCI7XG5cbi8qKiBgL19uZXh0L2ltYWdlYDogb3VyIG93biBvcHRpbWl6ZXIsIGRlbGliZXJhdGVseSByZWFjaGVkIGFmdGVyIG1pZGRsZXdhcmUuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3BhdGNoSW1hZ2VPcHRpbWl6YXRpb25SZXN1bHQgZXh0ZW5kcyBEaXNwYXRjaFJlc3VsdEJhc2Uge1xuICByZWFkb25seSBraW5kOiBcImltYWdlLW9wdGltaXphdGlvblwiO1xuICByZWFkb25seSB1cmw6IFVSTDtcbiAgcmVhZG9ubHkgcmVxdWVzdEhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGF0Y2hSZWRpcmVjdFJlc3VsdCBleHRlbmRzIERpc3BhdGNoUmVzdWx0QmFzZSB7XG4gIHJlYWRvbmx5IGtpbmQ6IFwicmVkaXJlY3RcIjtcbiAgcmVhZG9ubHkgbG9jYXRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXI7XG59XG5cbi8qKiBBIHJld3JpdGUgdG8gYW5vdGhlciBvcmlnaW46IHByb3h5IHRoZSByZXF1ZXN0IHRocm91Z2guICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3BhdGNoRXh0ZXJuYWxSZXdyaXRlUmVzdWx0IGV4dGVuZHMgRGlzcGF0Y2hSZXN1bHRCYXNlIHtcbiAgcmVhZG9ubHkga2luZDogXCJleHRlcm5hbC1yZXdyaXRlXCI7XG4gIHJlYWRvbmx5IHVybDogVVJMO1xuICByZWFkb25seSByZXF1ZXN0SGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqIE1pZGRsZXdhcmUgcmV0dXJuZWQgaXRzIG93biByZXNwb25zZTogc2VuZCBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGF0Y2hNaWRkbGV3YXJlUmVzcG9uZGVkUmVzdWx0IGV4dGVuZHMgRGlzcGF0Y2hSZXN1bHRCYXNlIHtcbiAgcmVhZG9ubHkga2luZDogXCJtaWRkbGV3YXJlLXJlc3BvbmRlZFwiO1xuICByZWFkb25seSByZXNwb25zZTogUmVzcG9uc2U7XG59XG5cbi8qKiBBIG1hdGNoZWQgcm91dGUgZm9yY2VkIGEgc3RhdHVzIHdpdGggbm90aGluZyB0byBpbnZva2UuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3BhdGNoRGlyZWN0UmVzcG9uc2VSZXN1bHQgZXh0ZW5kcyBEaXNwYXRjaFJlc3VsdEJhc2Uge1xuICByZWFkb25seSBraW5kOiBcInJlc3BvbnNlXCI7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc3BhdGNoTm90Rm91bmRSZXN1bHQgZXh0ZW5kcyBEaXNwYXRjaFJlc3VsdEJhc2Uge1xuICByZWFkb25seSBraW5kOiBcIm5vdC1mb3VuZFwiO1xuICAvKiogV2hhdCBmYWlsZWQgdG8gcmVzb2x2ZS4gRm9yIGxvZ2dpbmcuICovXG4gIHJlYWRvbmx5IHBhdGhuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlcXVlc3RIZWFkZXJzOiBIZWFkZXJzO1xufVxuXG5leHBvcnQgdHlwZSBEaXNwYXRjaFJlc3VsdCA9XG4gIHwgRGlzcGF0Y2hFbnRyeXBvaW50UmVzdWx0XG4gIHwgRGlzcGF0Y2hTdGF0aWNGaWxlUmVzdWx0XG4gIHwgRGlzcGF0Y2hJbWFnZU9wdGltaXphdGlvblJlc3VsdFxuICB8IERpc3BhdGNoUmVkaXJlY3RSZXN1bHRcbiAgfCBEaXNwYXRjaEV4dGVybmFsUmV3cml0ZVJlc3VsdFxuICB8IERpc3BhdGNoTWlkZGxld2FyZVJlc3BvbmRlZFJlc3VsdFxuICB8IERpc3BhdGNoRGlyZWN0UmVzcG9uc2VSZXN1bHRcbiAgfCBEaXNwYXRjaE5vdEZvdW5kUmVzdWx0O1xuXG4vKipcbiAqIEhvdyB0byBwcm9kdWNlIGEgNDA0IG9yIDUwMCBib2R5LiBSZXNvbHZlZCBvbmNlIHBlciBsb2NhbGUgZnJvbSB0aGUgbWFuaWZlc3RcbiAqIChzZWUge0BsaW5rIHN0YXR1c1RhcmdldHN9KTsgaG9ub3JpbmcgYG5vdEZvdW5kKClgIGZyb20gYSByb3V0ZSBpcyB0aGVcbiAqIHJ1bnRpbWUgY29yZSdzIGpvYiwgbm90IGRpc3BhdGNoJ3MuXG4gKi9cbmV4cG9ydCB0eXBlIFN0YXR1c1RhcmdldCA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkga2luZDogXCJlbnRyeXBvaW50XCI7XG4gICAgICByZWFkb25seSBwYXRobmFtZTogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgZW50cnlwb2ludDogQWRhcHRlckVudHJ5cG9pbnQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IGtpbmQ6IFwic3RhdGljLWZpbGVcIjtcbiAgICAgIHJlYWRvbmx5IHBhdGhuYW1lOiBzdHJpbmc7XG4gICAgICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuICAgIH1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6IFwibm9uZVwiIH07XG5cbi8qKlxuICogYGN0eC5yb3V0aW5nYCBpcyBwZXJzaXN0ZWQgaW50byB0aGUgbWFuaWZlc3QgdmVyYmF0aW0gYW5kIHR5cGVkIGB1bmtub3duYFxuICogdGhlcmUsIGJlY2F1c2UgdGhlIG1hbmlmZXN0IG11c3Qgbm90IGRlcGVuZCBvbiBgQG5leHQvcm91dGluZ2AgKGl0IGlzIGFsc29cbiAqIHJlYWQgYXQgc3ludGggYnkgdGhlIENESyBjb25zdHJ1Y3RzKS4gRGlzcGF0Y2ggaXMgdGhlIG9uZSBwbGFjZSB0aGF0IGtub3dzXG4gKiB0aGUgcmVhbCBzaGFwZSwgc28gdGhlIGNhc3QgbGl2ZXMgaGVyZS5cbiAqXG4gKiBgY3R4LnJvdXRpbmdgIGlzIGEgc3VwZXJzZXQgb2YgYFJlc29sdmVSb3V0ZXNQYXJhbXNbXCJyb3V0ZXNcIl1gIOKAlCBpdCBhbHNvXG4gKiBjYXJyaWVzIGByc2NgIOKAlCB3aGljaCBpcyB3aHkgdGhpcyBpcyBhIGNhc3QgYW5kIG5vdCBhbiBhc3NpZ25tZW50LlxuICovXG5mdW5jdGlvbiBhc1JvdXRlcyhyb3V0aW5nOiB1bmtub3duKTogUmVzb2x2ZVJvdXRlc1BhcmFtc1tcInJvdXRlc1wiXSB7XG4gIHJldHVybiByb3V0aW5nIGFzIFJlc29sdmVSb3V0ZXNQYXJhbXNbXCJyb3V0ZXNcIl07XG59XG5cbi8qKlxuICogTGlrZXdpc2UgZm9yIGBpMThuYDogYE5leHRDb25maWdDb21wbGV0ZVtcImkxOG5cIl1gIGlzIHdpZGVyIHRoYW5cbiAqIGBSZXNvbHZlUm91dGVzUGFyYW1zW1wiaTE4blwiXWAgKGV4dHJhIGZpZWxkcywgYW5kIGBsb2NhbGVEZXRlY3Rpb24/OiBib29sZWFuYFxuICogYWdhaW5zdCBgZmFsc2VgKSwgYW5kIHRoZSBtYW5pZmVzdCBzdG9yZXMgdGhlIGNvbmZpZyB2YWx1ZSBhcy1pcy5cbiAqL1xuZnVuY3Rpb24gYXNJMThuKGkxOG46IHVua25vd24gfCBudWxsKTogUmVzb2x2ZVJvdXRlc1BhcmFtc1tcImkxOG5cIl0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gaTE4biA/IChpMThuIGFzIFJlc29sdmVSb3V0ZXNQYXJhbXNbXCJpMThuXCJdKSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIERpc3BhdGNoZXIge1xuICAvKiogVGhlIDQwNCB0byByZW5kZXIgZm9yIGEgcmVxdWVzdCB0byBhIFVSTDsgc2VlIHtAbGluayBzdGF0dXNUYXJnZXRzfS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IG5vdEZvdW5kRm9yOiAodXJsOiBVUkwpID0+IFN0YXR1c1RhcmdldDtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlczogUmVzb2x2ZVJvdXRlc1BhcmFtc1tcInJvdXRlc1wiXTtcbiAgcHJpdmF0ZSByZWFkb25seSBpMThuOiBSZXNvbHZlUm91dGVzUGFyYW1zW1wiaTE4blwiXSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSB0YWJsZTogUm91dGluZ1RhYmxlO1xuICBwcml2YXRlIHJlYWRvbmx5IGltYWdlUGF0aG5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFpbGluZ1NsYXNoOiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IERpc3BhdGNoZXJPcHRpb25zKSB7XG4gICAgY29uc3QgeyBtYW5pZmVzdCB9ID0gb3B0aW9ucztcbiAgICB0aGlzLnJvdXRlcyA9IGFzUm91dGVzKG1hbmlmZXN0LnJvdXRpbmcpO1xuICAgIHRoaXMuaTE4biA9IGFzSTE4bihtYW5pZmVzdC5jb25maWcuaTE4bik7XG4gICAgdGhpcy50cmFpbGluZ1NsYXNoID0gbWFuaWZlc3QuY29uZmlnLnRyYWlsaW5nU2xhc2g7XG4gICAgdGhpcy50YWJsZSA9IGJ1aWxkUm91dGluZ1RhYmxlKG1hbmlmZXN0LCBvcHRpb25zLnB1YmxpY0ZpbGVzID8/IFtdKTtcbiAgICB0aGlzLmltYWdlUGF0aG5hbWUgPSBgJHttYW5pZmVzdC5jb25maWcuYmFzZVBhdGh9L19uZXh0L2ltYWdlYDtcbiAgICB0aGlzLm5vdEZvdW5kRm9yID0gc3RhdHVzVGFyZ2V0cyhtYW5pZmVzdCwgNDA0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWFuaWZlc3QoKTogQWRhcHRlck1hbmlmZXN0IHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1hbmlmZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIERyb3AgdGhlIGB0cmFpbGluZ1NsYXNoYCBzbGFzaCBhIHJlc29sdmVkIHBhdGhuYW1lIG1heSBjYXJyeSwgc28gaXQgY2FuIGJlXG4gICAqIGxvb2tlZCB1cCBpbiBgZW50cnlwb2ludHNgL2BzdGF0aWNGaWxlc2AgYW5kIHJlbmRlcmVkIHVuZGVyIHRoZSBzYW1lIGNhY2hlXG4gICAqIGtleSBhcyBpdHMgcHJlcmVuZGVyLiBBIG5vLW9wIHVubGVzcyB0aGUgYXBwIHNldHMgYHRyYWlsaW5nU2xhc2hgLlxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVQYXRobmFtZShwYXRobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMudHJhaWxpbmdTbGFzaCB8fCBwYXRobmFtZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gcGF0aG5hbWU7XG4gICAgcmV0dXJuIHBhdGhuYW1lLmxlbmd0aCA+IDEgJiYgcGF0aG5hbWUuZW5kc1dpdGgoXCIvXCIpXG4gICAgICA/IHBhdGhuYW1lLnNsaWNlKDAsIC0xKVxuICAgICAgOiBwYXRobmFtZTtcbiAgfVxuXG4gIC8qKiBUaGUgcmVxdWVzdCBwYXRoIHdpdGggYGJhc2VQYXRoYCByZW1vdmVkLCB3aGljaCBpcyB3aGF0IGkxOG4gYXBwbGllcyB0by4gKi9cbiAgcHJpdmF0ZSB3aXRob3V0QmFzZVBhdGgocGF0aG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHdpdGhvdXRQYXRoUHJlZml4KHBhdGhuYW1lLCB0aGlzLm1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUHV0IHRoZSBsb2NhbGUgaW4gZnJvbnQgb2YgYSByZXF1ZXN0IGZvciB0aGUgYXBwJ3Mgcm9vdCAqaGVyZSosIHdoZW4gdGhlXG4gICAqIGxvY2FsZSBpcyB0aGUgb25lIHRoZSByZXF1ZXN0IGlzIGFscmVhZHkgaW4uXG4gICAqXG4gICAqIGByZXNvbHZlUm91dGVzYCBwcmVmaXhlcyB0aGUgbG9jYWxlIGl0c2VsZiwgYXMgYCR7YmFzZVBhdGh9LyR7bG9jYWxlfSR7cGF0aG5hbWV9YFxuICAgKiDigJQgd2hpY2ggZm9yIHRoZSByb290IHR1cm5zIGAvYCBpbnRvIGAvZW4tVVMvYC4gVGhlIHNsYXNoLXN0cmlwcGluZyAzMDggdGhhdFxuICAgKiBgbmV4dCBidWlsZGAgYWx3YXlzIGNvbXBpbGVzIGludG8gYHJvdXRpbmcuYmVmb3JlTWlkZGxld2FyZWAgdGhlbiBtYXRjaGVzIGl0LFxuICAgKiBzbyBgR0VUIC9gIGNhbWUgYmFjayBhcyBhIHJlZGlyZWN0IG5vIGBuZXh0IHN0YXJ0YCBzZW5kczogbWVhc3VyZWQgYWdhaW5zdFxuICAgKiBgdGVzdC9lMmUvaTE4bi1zdXBwb3J0LWNhdGNoYWxsYCwgd2hlcmUgYC9gIGFuc3dlcnMgMjAwLiBOZXh0LmpzJ3Mgb3duIHJvdXRlclxuICAgKiBzcGVjaWFsLWNhc2VzIGV4YWN0bHkgdGhpcyAoYHJlc29sdmUtcm91dGVzLnRzYDogYHBhdGhuYW1lID09PSAnLycgP1xuICAgKiBgLyR7ZGVmYXVsdExvY2FsZX1gIDog4oCmYCkuXG4gICAqXG4gICAqIFdpdGggYHRyYWlsaW5nU2xhc2hgLCB0aGUgcHJlZml4ZWQgcm9vdCBrZWVwcyBpdHMgc2xhc2ggKGAvZW4tVVMvYCk6IHRoZVxuICAgKiBzbGFzaC0qYWRkaW5nKiAzMDggdGhhdCBidWlsZCBjb21waWxlcyBpbnN0ZWFkIG1hdGNoZXMgYC9lbi1VU2AgdGhlIHNhbWVcbiAgICogd2F5LCBhbmQgYC9lbi1VUy9gIGlzIHRoZSBjYW5vbmljYWwgVVJMIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgd2l0aCBhIDIwMC5cbiAgICpcbiAgICogT25seSB0aGUgcm9vdCwgYW5kIG9ubHkgd2hlbiBubyByZWRpcmVjdCBpcyBvd2VkOiBhIHJlcXVlc3Qgd2hvc2UgZGV0ZWN0ZWRcbiAgICogbG9jYWxlIGlzICpub3QqIHRoZSBkZWZhdWx0IGhhcyB0byByZWFjaCBgcmVzb2x2ZVJvdXRlc2AsIHdoaWNoIGFuc3dlcnMgaXRcbiAgICogd2l0aCB0aGUgMzA3IE5leHQuanMgc2VuZHMg4oCUIGFmdGVyIG1pZGRsZXdhcmUgaGFzIGhhZCB0aGUgcmVxdWVzdCwgd2hpY2ggaXNcbiAgICogdGhlIG9yZGVyaW5nIHRoYXQgbWF0dGVycyBhbmQgdGhlIHJlYXNvbiB0aGlzIGRvZXMgbm90IHJlZGlyZWN0IGl0c2VsZi5cbiAgICovXG4gIHByaXZhdGUgd2l0aFJvb3RMb2NhbGUodXJsOiBVUkwsIGhlYWRlcnM6IEhlYWRlcnMpOiBVUkwge1xuICAgIGNvbnN0IGkxOG4gPSB0aGlzLmkxOG47XG4gICAgaWYgKCFpMThuKSByZXR1cm4gdXJsO1xuICAgIGNvbnN0IHBhdGhuYW1lID0gdGhpcy53aXRob3V0QmFzZVBhdGgodXJsLnBhdGhuYW1lKTtcbiAgICBpZiAocGF0aG5hbWUgIT09IFwiL1wiKSByZXR1cm4gdXJsO1xuXG4gICAgY29uc3QgZGVmYXVsdExvY2FsZSA9XG4gICAgICBkZXRlY3REb21haW5Mb2NhbGUoaTE4bi5kb21haW5zLCB1cmwuaG9zdG5hbWUpPy5kZWZhdWx0TG9jYWxlID8/XG4gICAgICBpMThuLmRlZmF1bHRMb2NhbGU7XG4gICAgY29uc3QgZGV0ZWN0ZWQgPSBkZXRlY3RMb2NhbGUoe1xuICAgICAgcGF0aG5hbWUsXG4gICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgICAgY29va2llSGVhZGVyOiBoZWFkZXJzLmdldChcImNvb2tpZVwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBhY2NlcHRMYW5ndWFnZUhlYWRlcjogaGVhZGVycy5nZXQoXCJhY2NlcHQtbGFuZ3VhZ2VcIikgPz8gdW5kZWZpbmVkLFxuICAgICAgaTE4bixcbiAgICB9KTtcbiAgICBpZiAoZGV0ZWN0ZWQubG9jYWxlICE9PSBkZWZhdWx0TG9jYWxlKSByZXR1cm4gdXJsO1xuXG4gICAgY29uc3QgcHJlZml4ZWQgPSBuZXcgVVJMKHVybC50b1N0cmluZygpKTtcbiAgICBwcmVmaXhlZC5wYXRobmFtZSA9IGAke3RoaXMubWFuaWZlc3QuY29uZmlnLmJhc2VQYXRofS8ke2RlZmF1bHRMb2NhbGV9JHtcbiAgICAgIHRoaXMudHJhaWxpbmdTbGFzaCA/IFwiL1wiIDogXCJcIlxuICAgIH1gO1xuICAgIHJldHVybiBwcmVmaXhlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBhaXIgdGhlIHR3byB0aGluZ3MgYHJlc29sdmVSb3V0ZXNgIGdldHMgd3JvbmcgYWJvdXQgYSByZWRpcmVjdCBpdCBidWlsdFxuICAgKiBmcm9tIHRoZSBsb2NhbGUtcHJlZml4ZWQgcm9vdCDigJQgdGhlIHNhbWUgYCR7YmFzZVBhdGh9LyR7bG9jYWxlfSR7cGF0aG5hbWV9YFxuICAgKiBjb25jYXRlbmF0aW9uIGFzIGluIHtAbGluayB3aXRoUm9vdExvY2FsZX0sIHRoaXMgdGltZSByZXBvcnRlZCBhcyBhIGxvY2F0aW9uOlxuICAgKlxuICAgKiAtIHRoZSBzdHJheSB0cmFpbGluZyBzbGFzaCAoYC9ubC9gLCB3aGVyZSBOZXh0LmpzIHNlbmRzIGAvbmxgKSwgd2hpY2hcbiAgICogICBvdGhlcndpc2UgY29zdHMgYSBzZWNvbmQgcm91bmQgdHJpcCB0byB0aGUgMzA4IHRoYXQgc3RyaXBzIGl0LCBhbmRcbiAgICogLSB0aGUgYWJzb2x1dGUgVVJMLCB3aGVyZSBOZXh0LmpzIHNlbmRzIGEgcGF0aC4gQm90aCBhcmUgbGVnYWwsIGJ1dCBhIHRlc3RcbiAgICogICBhc3NlcnRpbmcgYGhlYWRlcnMubG9jYXRpb25gIHNlZXMgdGhlIGRpZmZlcmVuY2UsIGFuZCBzbyBkb2VzIGFueSBjbGllbnRcbiAgICogICBjb21wYXJpbmcgaXQgdG8gYSBsaW5rLlxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVSZWRpcmVjdExvY2F0aW9uKGxvY2F0aW9uOiBzdHJpbmcsIHJlcXVlc3Q6IFVSTCk6IHN0cmluZyB7XG4gICAgbGV0IHJlc29sdmVkOiBVUkw7XG4gICAgdHJ5IHtcbiAgICAgIHJlc29sdmVkID0gbmV3IFVSTChsb2NhdGlvbiwgcmVxdWVzdCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgfVxuICAgIGlmIChyZXNvbHZlZC5vcmlnaW4gIT09IHJlcXVlc3Qub3JpZ2luKSByZXR1cm4gbG9jYXRpb247XG5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLndpdGhvdXRCYXNlUGF0aChyZXNvbHZlZC5wYXRobmFtZSk7XG4gICAgY29uc3QgaXNMb2NhbGVSb290ID1cbiAgICAgIHRoaXMuaTE4biAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhdGhpcy50cmFpbGluZ1NsYXNoICYmXG4gICAgICB0aGlzLndpdGhvdXRCYXNlUGF0aChyZXF1ZXN0LnBhdGhuYW1lKSA9PT0gXCIvXCIgJiZcbiAgICAgIHRoaXMuaTE4bi5sb2NhbGVzLnNvbWUoKGxvY2FsZSkgPT4gdGFyZ2V0ID09PSBgLyR7bG9jYWxlfS9gKTtcbiAgICBpZiAoaXNMb2NhbGVSb290KSB7XG4gICAgICByZXNvbHZlZC5wYXRobmFtZSA9IHJlc29sdmVkLnBhdGhuYW1lLnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke3Jlc29sdmVkLnBhdGhuYW1lfSR7cmVzb2x2ZWQuc2VhcmNofSR7cmVzb2x2ZWQuaGFzaH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgaGVhZGVycygpYCBydWxlcyBhIHJlcXVlc3QgbWF0Y2hlZCwgZm9yIGEgcmVzcG9uc2UgbWlkZGxld2FyZSB3cm90ZVxuICAgKiBpdHNlbGYuXG4gICAqXG4gICAqIFRoZXkgY29tcGlsZSBpbnRvIGByb3V0aW5nLmJlZm9yZU1pZGRsZXdhcmVgLCBhbmQgYHJlc29sdmVSb3V0ZXNgIGFwcGxpZXNcbiAgICogdGhlbSB0aGVyZSwgYnV0IHdoZW4gbWlkZGxld2FyZSBhbnN3ZXJzIGl0IHJldHVybnMgYHsgbWlkZGxld2FyZVJlc3BvbmRlZDpcbiAgICogdHJ1ZSB9YCBhbmQgbm90aGluZyBlbHNlLCBzbyB0aGV5IHdlcmUgbG9zdDogYSBtaWRkbGV3YXJlIDQwMSB3ZW50IG91dFxuICAgKiB3aXRob3V0IHRoZSBhcHAncyBIU1RTIGFuZCBDU1AuIGBuZXh0IHN0YXJ0YCBzZW5kcyB0aGVtIHdpdGggaXQgKGl0c1xuICAgKiBgcmVzb2x2ZS1yb3V0ZXMuanNgIHNldHMgdGhlbSBvbiB0aGUgcmVzcG9uc2UgYmVmb3JlIG1pZGRsZXdhcmUgcnVucykuIFNvXG4gICAqIHRoYXQgb25lIHBoYXNlIGlzIHJ1biBhZ2FpbiBvbiBpdHMgb3duIOKAlCBubyBtaWRkbGV3YXJlLCBubyBmaWxlcywgbm90aGluZ1xuICAgKiBhZnRlciBpdCDigJQgd2hpY2ggbGVhdmVzIGV4YWN0bHkgdGhlIGhlYWRlcnMgaXQgc2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBiZWZvcmVNaWRkbGV3YXJlSGVhZGVycyhcbiAgICB1cmw6IFVSTCxcbiAgICBoZWFkZXJzOiBIZWFkZXJzLFxuICApOiBQcm9taXNlPEhlYWRlcnM+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlUm91dGVzKHtcbiAgICAgIHVybCxcbiAgICAgIGJ1aWxkSWQ6IHRoaXMubWFuaWZlc3QuYnVpbGRJZCxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLm1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCxcbiAgICAgIGhlYWRlcnMsXG4gICAgICByZXF1ZXN0Qm9keTogbmV3IEJsb2IoW10pLnN0cmVhbSgpLFxuICAgICAgcGF0aG5hbWVzOiBbXSxcbiAgICAgIHJvdXRlczoge1xuICAgICAgICAuLi50aGlzLnJvdXRlcyxcbiAgICAgICAgbWlkZGxld2FyZU1hdGNoZXJzOiBbXSxcbiAgICAgICAgYmVmb3JlRmlsZXM6IFtdLFxuICAgICAgICBhZnRlckZpbGVzOiBbXSxcbiAgICAgICAgZHluYW1pY1JvdXRlczogW10sXG4gICAgICAgIG9uTWF0Y2g6IFtdLFxuICAgICAgICBmYWxsYmFjazogW10sXG4gICAgICB9LFxuICAgICAgaTE4bjogdGhpcy5pMThuLFxuICAgICAgaW52b2tlTWlkZGxld2FyZTogYXN5bmMgKCkgPT4gKHt9KSxcbiAgICB9KTtcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXN1bHQucmVzb2x2ZWRIZWFkZXJzID8/IHVuZGVmaW5lZCk7XG4gICAgLy8gQSBsb2NhbGUtZGV0ZWN0aW9uIHJlZGlyZWN0IGlzIGRlY2lkZWQgYWZ0ZXIgbWlkZGxld2FyZSwgYW5kIG1pZGRsZXdhcmVcbiAgICAvLyBhbHJlYWR5IGFuc3dlcmVkLCBzbyBpdHMgYGxvY2F0aW9uYCBpcyBub3Qgb3dlZC5cbiAgICBpZiAocmVzdWx0LnJlZGlyZWN0KSB7XG4gICAgICByZXNwb25zZUhlYWRlcnMuZGVsZXRlKFwibG9jYXRpb25cIik7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZUhlYWRlcnM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFVSTCB0byBvcHRpbWl6ZSwgb25jZSBgL19uZXh0L2ltYWdlYCBoYXMgcmVzb2x2ZWQ6IGFzIG1pZGRsZXdhcmVcbiAgICogcmV3cm90ZSBpdCwgb3IgYXMgcmVjZWl2ZWQg4oCUIG9yLCB3aGVuIGEgYG5leHQuY29uZmlnYCByZXdyaXRlIGlzIHdoYXQgcHV0XG4gICAqIHRoZSByZXF1ZXN0IG9uIHRoZSBpbWFnZSBwYXRoLCByZWJ1aWx0IGZyb20gdGhlIHF1ZXJ5IGByZXNvbHZlUm91dGVzYFxuICAgKiByZXNvbHZlZCwgd2hpY2ggaXMgdGhlIG9ubHkgcGxhY2UgdGhhdCByZXdyaXRlJ3MgZGVzdGluYXRpb24gcXVlcnkgaXMuXG4gICAqL1xuICBwcml2YXRlIGltYWdlVXJsKHJlc3VsdDogUmVzb2x2ZVJvdXRlc1Jlc3VsdCwgcmVjZWl2ZWQ6IFVSTCk6IFVSTCB7XG4gICAgaWYgKHJlY2VpdmVkLnBhdGhuYW1lID09PSB0aGlzLmltYWdlUGF0aG5hbWUpIHJldHVybiByZWNlaXZlZDtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlY2VpdmVkLnRvU3RyaW5nKCkpO1xuICAgIHVybC5wYXRobmFtZSA9IHRoaXMuaW1hZ2VQYXRobmFtZTtcbiAgICBpZiAocmVzdWx0LnJlc29sdmVkUXVlcnkpIHtcbiAgICAgIHVybC5zZWFyY2ggPSB0b1NlYXJjaChyZXN1bHQucmVzb2x2ZWRRdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGlzcGF0Y2gocmVxdWVzdDogRGlzcGF0Y2hSZXF1ZXN0KTogUHJvbWlzZTxEaXNwYXRjaFJlc3VsdD4ge1xuICAgIC8vIENvcGllZCBiZWNhdXNlIGByZXNvbHZlUm91dGVzYCBpcyBmcmVlIHRvIG11dGF0ZSB3aGF0IGl0IGlzIGhhbmRlZCwgYW5kXG4gICAgLy8gdGhlIGNhbGxlcidzIGhlYWRlcnMgb2JqZWN0IG91dGxpdmVzIHRoaXMgY2FsbC5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgLy8gQSBzZWNvbmQgY29weSwgYXMgdGhlIHJlcXVlc3QgcmVhY2hlZCBgYmVmb3JlTWlkZGxld2FyZWAsIGZvclxuICAgIC8vIHtAbGluayBiZWZvcmVNaWRkbGV3YXJlSGVhZGVyc30uXG4gICAgY29uc3QgcmVjZWl2ZWRIZWFkZXJzID0gbmV3IEhlYWRlcnMocmVxdWVzdC5oZWFkZXJzKTtcbiAgICBjb25zdCB1cmwgPSB0aGlzLndpdGhSb290TG9jYWxlKHJlcXVlc3QudXJsLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgbGV0IG1pZGRsZXdhcmVSZXF1ZXN0SGVhZGVyczogSGVhZGVycyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbWlkZGxld2FyZVJld3JpdGU6IFVSTCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbWlkZGxld2FyZVJlc3BvbnNlOiBSZXNwb25zZSB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc29sdmVSb3V0ZXMoe1xuICAgICAgdXJsLFxuICAgICAgYnVpbGRJZDogdGhpcy5tYW5pZmVzdC5idWlsZElkLFxuICAgICAgYmFzZVBhdGg6IHRoaXMubWFuaWZlc3QuY29uZmlnLmJhc2VQYXRoLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICByZXF1ZXN0Qm9keTogcmVxdWVzdC5ib2R5LFxuICAgICAgcGF0aG5hbWVzOiB0aGlzLnRhYmxlLnBhdGhuYW1lcyxcbiAgICAgIHJvdXRlczogdGhpcy5yb3V0ZXMsXG4gICAgICBpMThuOiB0aGlzLmkxOG4sXG4gICAgICAvLyBPbmx5IGNhbGxlZCB3aGVuIGEgYG1pZGRsZXdhcmVNYXRjaGVyc2AgZW50cnkgbWF0Y2hlcywgd2hpY2ggb25seSBhXG4gICAgICAvLyBidWlsZCB3aXRoIG1pZGRsZXdhcmUgaGFzLlxuICAgICAgaW52b2tlTWlkZGxld2FyZTogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICBjb25zdCB7IHJlc3BvbnNlLCAuLi5taWRkbGV3YXJlIH0gPSBhd2FpdCByZXF1ZXN0Lmludm9rZU1pZGRsZXdhcmUhKHtcbiAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgfSk7XG4gICAgICAgIG1pZGRsZXdhcmVSZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICAvLyBgcmVzb2x2ZVJvdXRlc2AgZHJvcHMgYE1pZGRsZXdhcmVSZXN1bHQucmVxdWVzdEhlYWRlcnNgIGVudGlyZWx5OiBpdFxuICAgICAgICAvLyBuZWl0aGVyIHJldHVybnMgdGhlbSBub3IgbXV0YXRlcyB0aGUgYGhlYWRlcnNgIHBhc3NlZCBpbi4gQ2FwdHVyaW5nXG4gICAgICAgIC8vIHRoZW0gaGVyZSBpcyB3aGF0IGtlZXBzIGBOZXh0UmVzcG9uc2UubmV4dCh7IHJlcXVlc3Q6IHsgaGVhZGVycyB9IH0pYFxuICAgICAgICAvLyB3b3JraW5nLlxuICAgICAgICBpZiAobWlkZGxld2FyZS5yZXF1ZXN0SGVhZGVycykge1xuICAgICAgICAgIG1pZGRsZXdhcmVSZXF1ZXN0SGVhZGVycyA9IG1pZGRsZXdhcmUucmVxdWVzdEhlYWRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FwdHVyZWQgZm9yIHRoZSBzYW1lIHJlYXNvbjogYHJlc29sdmVSb3V0ZXNgIHJvdXRlcyB0aGUgcmV3cml0dGVuIFVSTFxuICAgICAgICAvLyBpbnRlcm5hbGx5IGJ1dCBuZXZlciByZXBvcnRzIGl0IGJhY2ssIGFuZCBgL19uZXh0L2ltYWdlYCBpcyBtYXRjaGVkXG4gICAgICAgIC8vIGhlcmUgcmF0aGVyIHRoYW4gYnkgYHJlc29sdmVSb3V0ZXNgIChzZWUgYmVsb3cpLCBzbyB0aGlzIGlzIHRoZSBvbmx5XG4gICAgICAgIC8vIHdheSB0byBzZWUgdGhlIHBhdGggbWlkZGxld2FyZSBhY3R1YWxseSBhc2tlZCBmb3IuXG4gICAgICAgIGlmIChtaWRkbGV3YXJlLnJld3JpdGUpIHtcbiAgICAgICAgICBtaWRkbGV3YXJlUmV3cml0ZSA9IG1pZGRsZXdhcmUucmV3cml0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlkZGxld2FyZTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXN1bHQucmVzb2x2ZWRIZWFkZXJzID8/IHVuZGVmaW5lZCk7XG4gICAgLy8gYEBuZXh0L3JvdXRpbmdgIGVjaG9lcyB0aGUgcmV3cml0ZSBpdCBmb2xsb3dlZCBpbnRvIGByZXNvbHZlZEhlYWRlcnNgO1xuICAgIC8vIE5leHQuanMncyBvd24gcm91dGVyIGNvbnN1bWVzIHRoYXQgaGVhZGVyIHJhdGhlciB0aGFuIHNlbmRpbmcgaXQsIGFuZCBzbyBkb1xuICAgIC8vIHdlIOKAlCBpdCBpcyBhbiBpbnRlcm5hbCByb3V0aW5nIHNpZ25hbCwgYW5kIGZvcndhcmRpbmcgaXQgd291bGQgZXhwb3NlIHRoZVxuICAgIC8vIGFwcCdzIHBvc3QtbWlkZGxld2FyZSBwYXRocyB0byBjbGllbnRzLlxuICAgIHJlc3BvbnNlSGVhZGVycy5kZWxldGUoXCJ4LW1pZGRsZXdhcmUtcmV3cml0ZVwiKTtcbiAgICBjb25zdCBmb3J3YXJkZWRIZWFkZXJzID0gbWlkZGxld2FyZVJlcXVlc3RIZWFkZXJzID8/IHJlcXVlc3RIZWFkZXJzO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJlc3VsdC5zdGF0dXM7XG5cbiAgICBpZiAocmVzdWx0Lm1pZGRsZXdhcmVSZXNwb25kZWQgJiYgbWlkZGxld2FyZVJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBcIm1pZGRsZXdhcmUtcmVzcG9uZGVkXCIsXG4gICAgICAgIHJlc3BvbnNlOiBtaWRkbGV3YXJlUmVzcG9uc2UsXG4gICAgICAgIHJlc3BvbnNlSGVhZGVyczogYXdhaXQgdGhpcy5iZWZvcmVNaWRkbGV3YXJlSGVhZGVycyhcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgcmVjZWl2ZWRIZWFkZXJzLFxuICAgICAgICApLFxuICAgICAgICBzdGF0dXMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuZXh0ZXJuYWxSZXdyaXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBcImV4dGVybmFsLXJld3JpdGVcIixcbiAgICAgICAgdXJsOiByZXN1bHQuZXh0ZXJuYWxSZXdyaXRlLFxuICAgICAgICByZXF1ZXN0SGVhZGVyczogZm9yd2FyZGVkSGVhZGVycyxcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBzdGF0dXMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlZGlyZWN0ID0gdG9SZWRpcmVjdChyZXN1bHQsIHJlc3BvbnNlSGVhZGVycyk7XG4gICAgaWYgKHJlZGlyZWN0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBcInJlZGlyZWN0XCIsXG4gICAgICAgIC4uLnJlZGlyZWN0LFxuICAgICAgICBsb2NhdGlvbjogdGhpcy5ub3JtYWxpemVSZWRpcmVjdExvY2F0aW9uKFxuICAgICAgICAgIHJlZGlyZWN0LmxvY2F0aW9uLFxuICAgICAgICAgIHJlcXVlc3QudXJsLFxuICAgICAgICApLFxuICAgICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJvdGggYXJlIGtleXMgaW50byBgZW50cnlwb2ludHNgL2BzdGF0aWNGaWxlc2AsIHdoaWNoIG5ldmVyIGNhcnJ5IGFcbiAgICAvLyB0cmFpbGluZyBzbGFzaDsgc2VlIHtAbGluayB3aXRoVHJhaWxpbmdTbGFzaFZhcmlhbnRzfS5cbiAgICBjb25zdCByZXNvbHZlZFBhdGhuYW1lID0gdGhpcy5ub3JtYWxpemVQYXRobmFtZShyZXN1bHQucmVzb2x2ZWRQYXRobmFtZSk7XG4gICAgLy8gSW4gYHBhdGhuYW1lc2AgKHNlZSB7QGxpbmsgYnVpbGRSb3V0aW5nVGFibGV9KSwgc28gaXQgcmVzb2x2ZXMgaW4gdGhlXG4gICAgLy8gZmlsZXN5c3RlbSBwaGFzZTogYWZ0ZXIgbWlkZGxld2FyZSBhbmQgYGJlZm9yZUZpbGVzYCwgYW5kIGJlZm9yZSBhbnlcbiAgICAvLyBkeW5hbWljIHJvdXRlLCB3aGljaCBpcyBgbmV4dCBzdGFydGAncyBvcmRlci4gVW5saXN0ZWQsIGEgcm9vdCBjYXRjaC1hbGxcbiAgICAvLyAoYGFwcC9bLi4uc2x1Z11gKSBvciBhbnkgdHdvLXNlZ21lbnQgZHluYW1pYyByb3V0ZSB0b29rIGV2ZXJ5IGltYWdlXG4gICAgLy8gcmVxdWVzdCBhcyBgc2x1ZzogW1wiX25leHRcIiwgXCJpbWFnZVwiXWAuXG4gICAgaWYgKHJlc29sdmVkUGF0aG5hbWUgPT09IHRoaXMuaW1hZ2VQYXRobmFtZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogXCJpbWFnZS1vcHRpbWl6YXRpb25cIixcbiAgICAgICAgdXJsOiB0aGlzLmltYWdlVXJsKHJlc3VsdCwgbWlkZGxld2FyZVJld3JpdGUgPz8gcmVxdWVzdC51cmwpLFxuICAgICAgICByZXF1ZXN0SGVhZGVyczogZm9yd2FyZGVkSGVhZGVycyxcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHJlc29sdmVkUGF0aG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc3RhdGljRmlsZSA9IHRoaXMudGFibGUuc3RhdGljRmlsZXMuZ2V0KHJlc29sdmVkUGF0aG5hbWUpO1xuICAgICAgY29uc3QgYXNTdGF0aWNGaWxlID0gKFxuICAgICAgICBmaWxlOiBTdGF0aWNGaWxlVGFyZ2V0LFxuICAgICAgKTogRGlzcGF0Y2hTdGF0aWNGaWxlUmVzdWx0ID0+ICh7XG4gICAgICAgIGtpbmQ6IFwic3RhdGljLWZpbGVcIixcbiAgICAgICAgcGF0aG5hbWU6IHJlc29sdmVkUGF0aG5hbWUsXG4gICAgICAgIGZpbGVQYXRoOiBmaWxlLmZpbGVQYXRoLFxuICAgICAgICBzb3VyY2U6IGZpbGUuc291cmNlLFxuICAgICAgICByZXF1ZXN0SGVhZGVyczogZm9yd2FyZGVkSGVhZGVycyxcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBzdGF0dXMsXG4gICAgICB9KTtcbiAgICAgIC8vIEFoZWFkIG9mIHRoZSBlbnRyeXBvaW50cywgd2hpY2ggaXMgYG5leHQgc3RhcnRgJ3Mgb3JkZXI6IGl0cyBmaWxlc3lzdGVtXG4gICAgICAvLyBjaGVjayB0cmllcyBgX25leHQvc3RhdGljYCBhbmQgdGhlbiBgcHVibGljL2AgYmVmb3JlIGFueSBhcHAgb3IgcGFnZVxuICAgICAgLy8gcm91dGUsIHNvIGBwdWJsaWMvcm9ib3RzLnR4dGAgYmVhdHMgYGFwcC9yb2JvdHMudHNgIGFuZFxuICAgICAgLy8gYHB1YmxpYy9mYXZpY29uLmljb2AgYmVhdHMgYGFwcC9mYXZpY29uLmljb2AuXG4gICAgICBpZiAoc3RhdGljRmlsZSAmJiBzdGF0aWNGaWxlLnNvdXJjZSAhPT0gXCJzZXJ2ZXJcIikge1xuICAgICAgICByZXR1cm4gYXNTdGF0aWNGaWxlKHN0YXRpY0ZpbGUpO1xuICAgICAgfVxuICAgICAgY29uc3QgZW50cnlwb2ludCA9IHRoaXMubWFuaWZlc3QuZW50cnlwb2ludHNbcmVzb2x2ZWRQYXRobmFtZV07XG4gICAgICBpZiAoZW50cnlwb2ludCkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IHJlcGFpclJvdXRlUGFyYW1RdWVyeShcbiAgICAgICAgICByZXN1bHQucmVzb2x2ZWRRdWVyeSA/PyB7fSxcbiAgICAgICAgICByZXN1bHQucm91dGVNYXRjaGVzID8/IHt9LFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGtpbmQ6IFwiZW50cnlwb2ludFwiLFxuICAgICAgICAgIGVudHJ5cG9pbnQsXG4gICAgICAgICAgcmVzb2x2ZWRQYXRobmFtZSxcbiAgICAgICAgICAvLyBgaW52b2NhdGlvblRhcmdldGAgaXMgYWx3YXlzIHByZXNlbnQgYWxvbmdzaWRlIGByZXNvbHZlZFBhdGhuYW1lYCBpblxuICAgICAgICAgIC8vIHByYWN0aWNlOyB0aGUgZmFsbGJhY2sga2VlcHMgYSBgbmV4dGAgc2hhcGUgY2hhbmdlIGZyb20gY3Jhc2hpbmcuXG4gICAgICAgICAgaW52b2NhdGlvblRhcmdldDoge1xuICAgICAgICAgICAgcGF0aG5hbWU6XG4gICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplUGF0aG5hbWUocmVzdWx0Lmludm9jYXRpb25UYXJnZXQ/LnBhdGhuYW1lKSA/P1xuICAgICAgICAgICAgICByZXNvbHZlZFBhdGhuYW1lLFxuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1ZXN0SGVhZGVyczogZm9yd2FyZGVkSGVhZGVycyxcbiAgICAgICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRpY0ZpbGUpIHtcbiAgICAgICAgcmV0dXJuIGFzU3RhdGljRmlsZShzdGF0aWNGaWxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6IFwicmVzcG9uc2VcIiwgc3RhdHVzLCByZXNwb25zZUhlYWRlcnMgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFVybCA9IG1pZGRsZXdhcmVSZXdyaXRlID8/IHJlcXVlc3QudXJsO1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiBcIm5vdC1mb3VuZFwiLFxuICAgICAgcGF0aG5hbWU6IHJlc29sdmVkUGF0aG5hbWUgPz8gcmVzb2x2ZWRVcmwucGF0aG5hbWUsXG4gICAgICByZXF1ZXN0SGVhZGVyczogZm9yd2FyZGVkSGVhZGVycyxcbiAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICB9O1xuICB9XG59XG5cbi8qKiBBIHN0YXRpYyBmaWxlLCBhcyBkaXNwYXRjaCByZXNvbHZlcyBvbmUuICovXG5pbnRlcmZhY2UgU3RhdGljRmlsZVRhcmdldCB7XG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZTogU3RhdGljRmlsZVNvdXJjZTtcbn1cblxuLyoqXG4gKiBXaGF0IGRpc3BhdGNoIG1hdGNoZXMgYSByZXF1ZXN0IGFnYWluc3QsIGRlcml2ZWQgb25jZSBmcm9tIHRoZSBtYW5pZmVzdCBhbmRcbiAqIGBwdWJsaWMvYDogd2l0aCBhIGZldyB0aG91c2FuZCBgcHVibGljL2AgZmlsZXMgdGhlIGRlcml2YXRpb24gd291bGQgYmUgbW9zdFxuICogb2YgdGhlIGNvc3Qgb2YgYSBkaXNwYXRjaC5cbiAqL1xuaW50ZXJmYWNlIFJvdXRpbmdUYWJsZSB7XG4gIC8qKlxuICAgKiBFdmVyeSBwYXRobmFtZSBgcmVzb2x2ZVJvdXRlc2AgbWF5IG1hdGNoOiB0aGUgbWFuaWZlc3QncywgZXZlcnkgc3BlbGxpbmcgb2ZcbiAgICogZXZlcnkgc3RhdGljIGZpbGUsIGFuZCDigJQgZm9yIGEgYHRyYWlsaW5nU2xhc2hgIGFwcCDigJQgdGhlIHNsYXNoIHZhcmlhbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aG5hbWVzOiBzdHJpbmdbXTtcbiAgLyoqIEV2ZXJ5IHNwZWxsaW5nIGEgc3RhdGljIGZpbGUgaXMgcmVxdWVzdGVkIGJ5IOKGkiB0aGUgZmlsZS4gKi9cbiAgcmVhZG9ubHkgc3RhdGljRmlsZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgU3RhdGljRmlsZVRhcmdldD47XG59XG5cbi8qKlxuICogQnVpbGQgb3V0cHV0cyBmaXJzdCwgdGhlbiBgcHVibGljL2Agb24gdG9wIG9mIHRoZW0sIGV4Y2VwdCBvdmVyXG4gKiBgX25leHQvc3RhdGljYDogdGhhdCBpcyBgbmV4dCBzdGFydGAncyBwcmVjZWRlbmNlIChzZWVcbiAqIHtAbGluayBEaXNwYXRjaGVyLmRpc3BhdGNofSkuXG4gKlxuICogQSBgcHVibGljL2AgZmlsZSBpcyByZWdpc3RlcmVkIHVuZGVyIGl0cyBwYXRobmFtZSB3aXRoIHRoZSBkZWZhdWx0IGxvY2FsZSBpblxuICogZnJvbnQsIHRvbywgZm9yIGFuIGkxOG4gYXBwLiBgcmVzb2x2ZVJvdXRlc2AgcHV0cyBhIGxvY2FsZSBvbiBldmVyeSBwYXRoXG4gKiBvdXRzaWRlIGAvX25leHQvYCBhbmQgYC9hcGkvYCBiZWZvcmUgaXQgbWF0Y2hlcywgc28gYC90ZXN0LnR4dGAgaXMgbG9va2VkIHVwXG4gKiBhcyBgL2VuLVVTL3Rlc3QudHh0YCBhbmQgbmV2ZXIgbWF0Y2hlZCB0aGUgYmFyZSBrZXk6IG5vIGBwdWJsaWMvYCBmaWxlXG4gKiByZXNvbHZlZCBpbiBhbiBpMThuIGFwcCBhdCBhbGwuIGBuZXh0IHN0YXJ0YCBzdHJpcHMgdGhlIGRlZmF1bHQgbG9jYWxlIOKAlCBhbmRcbiAqIGVhY2ggZG9tYWluJ3Mg4oCUIG9mZiBhIGBwdWJsaWMvYCByZXF1ZXN0IGFuZCBubyBvdGhlciBsb2NhbGUgKGZpbGVzeXN0ZW0uanM6XG4gKiBcImxlZ2FjeSBiZWhhdmlvciBhbGxvd3MgdmlzaXRpbmcgc3RhdGljIGFzc2V0cyB1bmRlciBkZWZhdWx0IGxvY2FsZSBidXQgbm9cbiAqIG90aGVyIGxvY2FsZVwiKSwgd2hpY2ggdGhlc2UgZW50cmllcyByZXByb2R1Y2U6IGAvZW4tVVMvdGVzdC50eHRgIHNlcnZlcyBhbmRcbiAqIGAvZnIvdGVzdC50eHRgIGRvZXMgbm90LlxuICovXG5mdW5jdGlvbiBidWlsZFJvdXRpbmdUYWJsZShcbiAgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdCxcbiAgcHVibGljRmlsZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogUm91dGluZ1RhYmxlIHtcbiAgY29uc3QgeyBiYXNlUGF0aCwgdHJhaWxpbmdTbGFzaCB9ID0gbWFuaWZlc3QuY29uZmlnO1xuICBjb25zdCBzdGF0aWNGaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBTdGF0aWNGaWxlVGFyZ2V0PigpO1xuICBjb25zdCBuZXh0U3RhdGljUHJlZml4ID0gYCR7YmFzZVBhdGh9L19uZXh0L3N0YXRpYy9gO1xuXG4gIGZvciAoY29uc3QgW3BhdGhuYW1lLCBmaWxlUGF0aF0gb2YgT2JqZWN0LmVudHJpZXMobWFuaWZlc3Quc3RhdGljRmlsZXMpKSB7XG4gICAgY29uc3QgdGFyZ2V0OiBTdGF0aWNGaWxlVGFyZ2V0ID0ge1xuICAgICAgZmlsZVBhdGgsXG4gICAgICBzb3VyY2U6IHBhdGhuYW1lLnN0YXJ0c1dpdGgobmV4dFN0YXRpY1ByZWZpeCkgPyBcIm5leHQtc3RhdGljXCIgOiBcInNlcnZlclwiLFxuICAgIH07XG4gICAgLy8gVGhlIGtleSBhcyBOZXh0LmpzIHJlcG9ydGVkIGl0LCBhbmQgdGhlbiBhcyBhIHJlcXVlc3Qgc3BlbGxzIGl0OiBhIGJ1aWxkXG4gICAgLy8gb3V0cHV0J3MgcGF0aG5hbWUgaXMgdGhlIGZpbGUncyBvd24gbmFtZSwgdW5lbmNvZGVkLCBhbmQgdGhlIEhUTUwgdGhhdFxuICAgIC8vIGxvYWRzIGl0IHBlcmNlbnQtZW5jb2RlcyBpdC4gYGFwcC9pc3IvW2lkXS9wYWdlLnRzeGAncyB3ZWJwYWNrIGNodW5rIGlzXG4gICAgLy8gYC9fbmV4dC9zdGF0aWMvY2h1bmtzL2FwcC9pc3IvW2lkXS9wYWdlLTxoYXNoPi5qc2AgaW4gdGhlIG91dHB1dHMgYW5kXG4gICAgLy8gYOKApi9pc3IvJTVCaWQlNUQvcGFnZS08aGFzaD4uanNgIGluIHRoZSBgPHNjcmlwdD5gIHRhZy5cbiAgICBmb3IgKGNvbnN0IHNwZWxsaW5nIG9mIFtwYXRobmFtZSwgLi4ucmVxdWVzdFNwZWxsaW5ncyhwYXRobmFtZSldKSB7XG4gICAgICBpZiAoIXN0YXRpY0ZpbGVzLmhhcyhzcGVsbGluZykpIHtcbiAgICAgICAgc3RhdGljRmlsZXMuc2V0KHNwZWxsaW5nLCB0YXJnZXQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHB1YmxpY0RpciA9IHB1YmxpY0RpcktleShtYW5pZmVzdCk7XG4gIGNvbnN0IGkxOG4gPSBhc0kxOG4obWFuaWZlc3QuY29uZmlnLmkxOG4pO1xuICBjb25zdCBsb2NhbGVQcmVmaXhlcyA9IFtcbiAgICBcIlwiLFxuICAgIC4uLm5ldyBTZXQoXG4gICAgICBpMThuXG4gICAgICAgID8gW1xuICAgICAgICAgICAgaTE4bi5kZWZhdWx0TG9jYWxlLFxuICAgICAgICAgICAgLi4uKGkxOG4uZG9tYWlucyA/PyBbXSkubWFwKChkb21haW4pID0+IGRvbWFpbi5kZWZhdWx0TG9jYWxlKSxcbiAgICAgICAgICBdLm1hcCgobG9jYWxlKSA9PiBgLyR7bG9jYWxlfWApXG4gICAgICAgIDogW10sXG4gICAgKSxcbiAgXTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIHB1YmxpY0ZpbGVzKSB7XG4gICAgY29uc3QgdGFyZ2V0OiBTdGF0aWNGaWxlVGFyZ2V0ID0ge1xuICAgICAgZmlsZVBhdGg6IGAke3B1YmxpY0Rpcn0vJHtmaWxlfWAsXG4gICAgICBzb3VyY2U6IFwicHVibGljXCIsXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHNwZWxsaW5nIG9mIHJlcXVlc3RTcGVsbGluZ3MoYC8ke2ZpbGV9YCkpIHtcbiAgICAgIGZvciAoY29uc3QgcHJlZml4IG9mIGxvY2FsZVByZWZpeGVzKSB7XG4gICAgICAgIGNvbnN0IHBhdGhuYW1lID0gYCR7YmFzZVBhdGh9JHtwcmVmaXh9JHtzcGVsbGluZ31gO1xuICAgICAgICBpZiAoc3RhdGljRmlsZXMuZ2V0KHBhdGhuYW1lKT8uc291cmNlICE9PSBcIm5leHQtc3RhdGljXCIpIHtcbiAgICAgICAgICBzdGF0aWNGaWxlcy5zZXQocGF0aG5hbWUsIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBgL19uZXh0L2ltYWdlYCBpcyBub3QgYW4gYWRhcHRlciBvdXRwdXQsIGJ1dCBpdCBpcyBhIGZpbGVzeXN0ZW0gcm91dGUgdG9cbiAgLy8gYG5leHQgc3RhcnRgIChgZmlsZXN5c3RlbS5qc2AgYW5zd2VycyBpdCBhcyBgbmV4dEltYWdlYCksIGFuZCBsaXN0aW5nIGl0IGlzXG4gIC8vIHdoYXQgbGV0cyBpdCByZXNvbHZlIGFoZWFkIG9mIHRoZSBkeW5hbWljIHJvdXRlczsgc2VlXG4gIC8vIHtAbGluayBEaXNwYXRjaGVyLmRpc3BhdGNofS5cbiAgY29uc3QgcGF0aG5hbWVzID0gW1xuICAgIC4uLm5ldyBTZXQoW1xuICAgICAgLi4ubWFuaWZlc3QucGF0aG5hbWVzLFxuICAgICAgLi4uc3RhdGljRmlsZXMua2V5cygpLFxuICAgICAgYCR7YmFzZVBhdGh9L19uZXh0L2ltYWdlYCxcbiAgICBdKSxcbiAgXTtcbiAgcmV0dXJuIHtcbiAgICBwYXRobmFtZXM6IHRyYWlsaW5nU2xhc2ggPyB3aXRoVHJhaWxpbmdTbGFzaFZhcmlhbnRzKHBhdGhuYW1lcykgOiBwYXRobmFtZXMsXG4gICAgc3RhdGljRmlsZXMsXG4gIH07XG59XG5cbi8qKlxuICogVGhlIHdheXMgYSByZXF1ZXN0IHNwZWxscyBhbiB1bmVuY29kZWQgcGF0aCwgZm9yIHRoZSBleGFjdCBtYXRjaFxuICogYEBuZXh0L3JvdXRpbmdgIGRvZXMgYWdhaW5zdCBgcGF0aG5hbWVzYC5cbiAqXG4gKiBUd28sIGJlY2F1c2UgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHdyaXRlIGEgbGluayB0byBgcHVibGljL2ltYWdlcy9sb2dvQDJ4LnBuZ2BcbiAqIGFuZCBhIGJyb3dzZXIgc2VuZHMgZWFjaCBhcyB3cml0dGVuOiBgL2ltYWdlcy9sb2dvQDJ4LnBuZ2AsIHdoaWNoIHRoZSBXSEFUV0dcbiAqIFVSTCBwYXJzZXIgbGVhdmVzIGFsb25lIOKAlCBpdCBvbmx5IGVuY29kZXMgc3BhY2VzLCBxdW90ZXMsIGAjYCwgYD9gLCBgPD5gLFxuICogYGAgYCBgYCwgYHt9YCBhbmQgbm9uLUFTQ0lJIGluIGEgcGF0aCDigJQgYW5kIGAvaW1hZ2VzL2xvZ28lNDAyeC5wbmdgLCB3aGljaCBpc1xuICogYGVuY29kZVVSSUNvbXBvbmVudGAgYSBzZWdtZW50IGF0IGEgdGltZSBhbmQgaXMgaG93IE5leHQuanMga2V5cyBpdHMgb3duXG4gKiBgcHVibGljL2Agc2V0IChgZW5jb2RlVVJJUGF0aGApLiBGb3IgbW9zdCBuYW1lcyB0aGUgdHdvIGFyZSB0aGUgc2FtZSBzdHJpbmc7XG4gKiB0aGV5IGRpZmZlciBmb3IgYEAgKyAmICwgOyA9ICQgOiBbIF1gIGFuZCB0aGUgbGlrZSwgYW5kIGEga2V5IGluIG9ubHkgdGhlXG4gKiBzZWNvbmQgZm9ybSA0MDQnZCBldmVyeSBgbG9nb0AyeC5wbmdgLCBgYysrLnN2Z2AgYW5kIGBpY29uWzFdLnBuZ2AuXG4gKlxuICogYCVgIGlzIGVuY29kZWQgaW4gYm90aCwgc2luY2UgYSBsaXRlcmFsIGAlYCBpbiBhIG5hbWUgY2FuIG9ubHkgYmUgcmVxdWVzdGVkXG4gKiBhcyBgJTI1YDsgc28gYXJlIGA/YCBhbmQgYCNgLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgZW5kIHRoZSBwYXRoLCBhbmQgYFxcYCxcbiAqIHdoaWNoIHRoZSBwYXJzZXIgdHVybnMgaW50byBgL2AuXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RTcGVsbGluZ3MocGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICBjb25zdCBlbmNvZGVkID0gc2VnbWVudHMubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIi9cIik7XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwoXG4gICAgc2VnbWVudHNcbiAgICAgIC5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQucmVwbGFjZSgvWyU/I1xcXFxdL2csIGVuY29kZVVSSUNvbXBvbmVudCkpXG4gICAgICAuam9pbihcIi9cIiksXG4gICAgXCJodHRwOi8vblwiLFxuICApLnBhdGhuYW1lO1xuICByZXR1cm4gcGFyc2VkID09PSBlbmNvZGVkID8gW2VuY29kZWRdIDogW2VuY29kZWQsIHBhcnNlZF07XG59XG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSB0d28gc2hhcGVzIGByZXNvbHZlUm91dGVzYCByZXBvcnRzIGEgcmVkaXJlY3QgaW4uXG4gKlxuICogYFJlc29sdmVSb3V0ZXNSZXN1bHQucmVkaXJlY3RgIGlzIGRvY3VtZW50ZWQsIGFuZCBhbiBpMThuIGxvY2FsZS1kZXRlY3Rpb24gMzA3XG4gKiBhcnJpdmVzIHRoYXQgd2F5LCBidXQgdGhlIHJlc3Qg4oCUIHRoZSBzbGFzaC1zdHJpcHBpbmcgMzA4LCBhIG1pZGRsZXdhcmVcbiAqIGBOZXh0UmVzcG9uc2UucmVkaXJlY3QoKWAg4oCUIGFycml2ZSBpbnN0ZWFkIGFzIGEgYmFyZSBgc3RhdHVzYCB3aXRoIGBsb2NhdGlvbmBcbiAqIGluIGByZXNvbHZlZEhlYWRlcnNgLiBgbmV4dC5jb25maWdgIGByZWRpcmVjdHMoKWAgdG9vOiB0aGV5IGNvbXBpbGUgdG8gcm91dGVzXG4gKiBjYXJyeWluZyBgaGVhZGVyczogeyBMb2NhdGlvbiB9YCBwbHVzIGBzdGF0dXNgLiBCb3RoIHNoYXBlcyBhcmUgaGFuZGxlZCwgYW5kXG4gKiB7QGxpbmsgRGlzcGF0Y2hlci5ub3JtYWxpemVSZWRpcmVjdExvY2F0aW9ufSB0aGVuIHB1dHMgdGhlIGxvY2F0aW9uIGl0c2VsZiBpblxuICogdGhlIGZvcm0gTmV4dC5qcyBzZW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUmVkaXJlY3QoXG4gIHJlc3VsdDogUmVzb2x2ZVJvdXRlc1Jlc3VsdCxcbiAgcmVzcG9uc2VIZWFkZXJzOiBIZWFkZXJzLFxuKTogeyBsb2NhdGlvbjogc3RyaW5nOyBzdGF0dXM6IG51bWJlciB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlc3VsdC5yZWRpcmVjdCkge1xuICAgIHJldHVybiB7XG4gICAgICBsb2NhdGlvbjogcmVzdWx0LnJlZGlyZWN0LnVybC5ocmVmLFxuICAgICAgc3RhdHVzOiByZXN1bHQucmVkaXJlY3Quc3RhdHVzLFxuICAgIH07XG4gIH1cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZUhlYWRlcnMuZ2V0KFwibG9jYXRpb25cIik7XG4gIGlmIChcbiAgICBsb2NhdGlvbiAhPT0gbnVsbCAmJlxuICAgIHJlc3VsdC5zdGF0dXMgIT09IHVuZGVmaW5lZCAmJlxuICAgIHJlc3VsdC5zdGF0dXMgPj0gMzAwICYmXG4gICAgcmVzdWx0LnN0YXR1cyA8IDQwMFxuICApIHtcbiAgICByZXR1cm4geyBsb2NhdGlvbiwgc3RhdHVzOiByZXN1bHQuc3RhdHVzIH07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBZGQgYDxwYXRobmFtZT4vYCBhbG9uZ3NpZGUgZXZlcnkgcm91dGUgcGF0aG5hbWUsIGZvciBhIGB0cmFpbGluZ1NsYXNoYCBhcHAuXG4gKlxuICogYHRyYWlsaW5nU2xhc2g6IHRydWVgIG1ha2VzIGAvYS9gIHRoZSBjYW5vbmljYWwgVVJMIOKAlCBOZXh0LmpzIGNvbXBpbGVzIGFcbiAqIGBwcmlvcml0eWAgMzA4IGZyb20gYC9hYCB0byBgL2EvYCBpbnRvIGByb3V0aW5nLmJlZm9yZU1pZGRsZXdhcmVgLCBhbmQgdGhhdFxuICogcmVkaXJlY3QgaXMgdGhlICpmaXJzdCogdGhpbmcgYHJlc29sdmVSb3V0ZXNgIGFwcGxpZXMuIEJ1dCB0aGUgYnVpbGQncyBvdXRwdXRcbiAqIHBhdGhuYW1lcyBoYXZlIG5vIHRyYWlsaW5nIHNsYXNoIChgL2FgLCBgL2FwaS9yZXZhbGlkYXRlYCksIGFuZFxuICogYEBuZXh0L3JvdXRpbmdgIG1hdGNoZXMgdGhlbSBieSBleGFjdCBzdHJpbmcgZXF1YWxpdHkgd2l0aCBubyBub3JtYWxpemF0aW9uIG9mXG4gKiBpdHMgb3duLiBTbyBldmVyeSBjYW5vbmljYWwgVVJMIGluIHN1Y2ggYW4gYXBwIHJlc29sdmVkIHRvIG5vdGhpbmc6IGJyb3dzZXJzXG4gKiBmb2xsb3dlZCB0aGUgMzA4IHRvIGAvYS9gIGFuZCBnb3QgYSA0MDQsIGFuZCBgZmV0Y2goJy9hcGkvcmV2YWxpZGF0ZScpYCBnb3RcbiAqIHRoZSA0MDQgKnBhZ2UqIOKAlCBtZWFzdXJlZCBhZ2FpbnN0IG5leHQuanMncyBgdGVzdC9lMmUvYXBwLWRpci90cmFpbGluZ3NsYXNoYCxcbiAqIHdoZXJlIDYgb2YgOCBjYXNlcyBmYWlsZWQgdGhpcyB3YXkuIER5bmFtaWMgcm91dGVzIGVzY2FwZWQgaXQgb25seSBiZWNhdXNlXG4gKiB0aGVpciBgc291cmNlUmVnZXhgIGhhcHBlbnMgdG8gZW5kIGluIGAoPzovKT9gLlxuICpcbiAqIE5vcm1hbGl6aW5nIHRoZSByZXF1ZXN0IFVSTCBiZWZvcmUgYHJlc29sdmVSb3V0ZXNgIGluc3RlYWQgd291bGQgYmUgd3Jvbmc6IHRoZVxuICogYWRkLXNsYXNoIHJlZGlyZWN0IG1hdGNoZXMgdGhlICpzbGFzaGxlc3MqIHBhdGgsIHNvIGEgbm9ybWFsaXplZCBgL2EvYCB3b3VsZFxuICogY29tZSBiYWNrIGFzIGEgMzA4IHRvIGAvYS9gIGFuZCBsb29wLiBUZWFjaGluZyB0aGUgbWF0Y2ggYWJvdXQgdGhlIHNsYXNoIGFuZFxuICogbm9ybWFsaXppbmcgaXQgb2ZmIHRoZSAqcmVzdWx0KiAoe0BsaW5rIERpc3BhdGNoZXIubm9ybWFsaXplUGF0aG5hbWV9KSBrZWVwc1xuICogdGhlIHJlZGlyZWN0IGV4YWN0bHkgYXMgTmV4dC5qcyBjb21waWxlZCBpdC5cbiAqXG4gKiBQYXRobmFtZXMgd2hvc2UgbGFzdCBzZWdtZW50IGhhcyBhbiBleHRlbnNpb24gYXJlIHNraXBwZWQ6IHRob3NlIGFyZSBzdGF0aWNcbiAqIGZpbGVzLCBhbmQgTmV4dC5qcyBjb21waWxlcyB0aGUgb3Bwb3NpdGUgcmVkaXJlY3QgZm9yIHRoZW0gKGAveC5qcy9gIOKGkiAzMDhcbiAqIGAveC5qc2ApLCB3aGljaCB0aGlzIG11c3Qgbm90IHNoYWRvdy5cbiAqL1xuZnVuY3Rpb24gd2l0aFRyYWlsaW5nU2xhc2hWYXJpYW50cyhwYXRobmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCB2YXJpYW50czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXRobmFtZSBvZiBwYXRobmFtZXMpIHtcbiAgICB2YXJpYW50cy5wdXNoKHBhdGhuYW1lKTtcbiAgICBpZiAocGF0aG5hbWUgIT09IFwiL1wiICYmICEvXFwuW14vXSskLy50ZXN0KHBhdGhuYW1lKSkge1xuICAgICAgdmFyaWFudHMucHVzaChgJHtwYXRobmFtZX0vYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YXJpYW50cztcbn1cblxuLyoqXG4gKiBDb3JyZWN0IHRoZSBgbnh0UGAgcm91dGUgcGFyYW1zIGluIGEgcmVzb2x2ZWQgcXVlcnkgZnJvbSBgcm91dGVNYXRjaGVzYC5cbiAqXG4gKiBgQG5leHQvcm91dGluZ2AgZXhwYW5kcyBhIGR5bmFtaWMgcm91dGUncyBkZXN0aW5hdGlvblxuICogKGAvW2lkXS9baWQyXT9ueHRQaWQ9JG54dFBpZCZueHRQaWQyPSRueHRQaWQyYCkgYnkgbG9vcGluZyBvdmVyIHRoZSBzb3VyY2VcbiAqIHJlZ2V4J3MgbmFtZWQgZ3JvdXBzIGFuZCBkb2luZyBvbmUgZ2xvYmFsIHN0cmluZyByZXBsYWNlIHBlciBncm91cCBuYW1lLiBHcm91cFxuICogbmFtZXMgYXJlIHN1YnN0aXR1dGVkIGluIGluc2VydGlvbiBvcmRlciwgc28gYCRueHRQaWRgIOKAlCBhICpwcmVmaXgqIG9mXG4gKiBgJG54dFBpZDJgIOKAlCBpcyByZXBsYWNlZCBmaXJzdCBhbmQgbGVhdmVzIHRoZSB0cmFpbGluZyBgMmAgYmVoaW5kIGFzIGFcbiAqIGxpdGVyYWw6IGAvYS9iYCByZXNvbHZlcyB3aXRoIGBueHRQaWQyPWEyYCBpbnN0ZWFkIG9mIGBueHRQaWQyPWJgLiBOZXh0LmpzXG4gKiByZWNvdmVycyBgcGFyYW1zYCBmcm9tIGV4YWN0bHkgdGhlc2UgcXVlcnkgdmFsdWVzIChgUm91dGVNb2R1bGUucHJlcGFyZWApLCBzb1xuICogdGhlIHBhZ2UgcmVuZGVycyBgaWQyOiBcImEyXCJgIOKAlCBtZWFzdXJlZCBhZ2FpbnN0XG4gKiBgdGVzdC9lMmUvYXBwLWRpci91c2UtcGFyYW1zYCwgd2hvc2UgZml4dHVyZSBpcyBgYXBwL1tpZF0vW2lkMl0vcGFnZS50c3hgLlxuICpcbiAqIGByb3V0ZU1hdGNoZXNgIGlzIHRoZSByYXcgY2FwdHVyZSBtYXAsIGJlZm9yZSBhbnkgZGVzdGluYXRpb24gZXhwYW5zaW9uLCBzbyBpdFxuICogaXMgdGhlIGF1dGhvcml0eSBmb3IgZXZlcnkgcGFyYW0gaXQgbmFtZXMuIE9ubHkga2V5cyB0aGUgZXhwYW5zaW9uIGFscmVhZHlcbiAqIHByb2R1Y2VkIGFyZSBvdmVyd3JpdHRlbjogYWRkaW5nIG90aGVycyB3b3VsZCBpbnZlbnQgcGFyYW1zIGZvciBhIHJld3JpdGUgdGhhdFxuICogZGVsaWJlcmF0ZWx5IGRyb3BwZWQgdGhlbS5cbiAqXG4gKiBUaGUgc2FtZSBwcmVmaXggY29sbGlzaW9uIHJlYWNoZXMgcG9zaXRpb25hbCBwbGFjZWhvbGRlcnMgKGAkMWAgaW5zaWRlIGAkMTBgLFxuICogc28gYSByb3V0ZSB3aXRoIHRlbiBvciBtb3JlIGNhcHR1cmVzKSwgYW5kIGBuZXh0LmNvbmZpZ2AgYHJld3JpdGVzKClgXG4gKiBkZXN0aW5hdGlvbnMgdGhhdCBpbnRlcnBvbGF0ZSB0aGVpciBvd24gcXVlcnkgdmFsdWVzLiBUaG9zZSBhcmUgbm90IHJvdXRlXG4gKiBwYXJhbXMgYW5kIGFyZSBsZWZ0IGFsb25lIOKAlCB0aGVyZSBpcyBubyBzZWNvbmQgc291cmNlIG9mIHRydXRoIHRvIHJlcGFpciB0aGVtXG4gKiBmcm9tLlxuICpcbiAqIFRoZSBzZWNvbmQgY29ycmVjdGlvbiBpcyB0aGUgb3Bwb3NpdGUgc2hhcGU6IGEgcGFyYW0gdGhlIHJvdXRlICpoYXMqIGJ1dCB0aGVcbiAqIHJlcXVlc3QgZGlkIG5vdCBmaWxsLiBBbiBvcHRpb25hbCBjYXRjaGFsbCdzIGdyb3VwIGlzIHRoZSBvbmx5IG9uZSBhIG1hdGNoIGNhblxuICogbGVhdmUgdW5zZXQg4oCUIGBeL29wdGlvbmFsXFwtY2F0Y2hhbGwoPzovKD88bnh0UHBhcmFtcz4uKz8pKT8oPzovKT8kYCBhZ2FpbnN0XG4gKiBgL29wdGlvbmFsLWNhdGNoYWxsYCDigJQgYW5kIGJvdGggYHJvdXRlTWF0Y2hlc2AgYW5kIHRoZSBleHBhbmRlZCBxdWVyeSBrZWVwIHRoZVxuICoga2V5IHdpdGggbm8gdmFsdWU6IGB7IG54dFBwYXJhbXM6IHVuZGVmaW5lZCB9YCwgd2hpY2ggdGhlIGBAbmV4dC9yb3V0aW5nYCB0eXBlc1xuICogZG8gbm90IGFkbWl0LiBUaGUga2V5IGlzIHdoYXQgbWF0dGVycywgbm90IHRoZSB2YWx1ZS4gYFJvdXRlTW9kdWxlLnByZXBhcmVgXG4gKiByZWNvdmVycyBhIHBhcmFtIGZvciBldmVyeSBgbnh0UGAga2V5IGl0IGZpbmRzLCBzbyBhIGxheW91dCByZWFkaW5nIGBwYXJhbXNgXG4gKiByZW5kZXJzIGEgc2VnbWVudCB0aGF0IHdhcyBuZXZlciByZXF1ZXN0ZWQg4oCUIGFzIGBbXCJ1bmRlZmluZWRcIl1gLCBiZWNhdXNlXG4gKiBgVVJMU2VhcmNoUGFyYW1zLmFwcGVuZGAgc3RyaW5naWZpZXMg4oCUIHdoZXJlIGBuZXh0IHN0YXJ0YCBnaXZlcyBpdCBubyBgcGFyYW1zYFxuICoga2V5IGF0IGFsbC4gTWVhc3VyZWQgYWdhaW5zdCBgdGVzdC9lMmUvYXBwLWRpci9sYXlvdXQtcGFyYW1zYCwgd2hvc2UgZml4dHVyZSBpc1xuICogYGFwcC9vcHRpb25hbC1jYXRjaGFsbC9bWy4uLnBhcmFtc11dYC4gTm8gb3RoZXIgcGFyYW0gc2hhcGUgY2FuIGJlIGxlZ2l0aW1hdGVseVxuICogdW5maWxsZWQg4oCUIGEgcmVxdWlyZWQgc2VnbWVudCBjYXB0dXJlcyBgW14vXSs/YCBhbmQgYSByZXF1aXJlZCBjYXRjaGFsbCBgLis/YCDigJRcbiAqIHNvIGFuIHVuZmlsbGVkIHZhbHVlIGByb3V0ZU1hdGNoZXNgIGRvZXMgbm90IHZvdWNoIGZvciBpcyBhbHdheXMgdGhpcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGFpclJvdXRlUGFyYW1RdWVyeShcbiAgcXVlcnk6IFJlc29sdmVSb3V0ZXNRdWVyeSxcbiAgcm91dGVNYXRjaGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LFxuKTogUmVzb2x2ZVJvdXRlc1F1ZXJ5IHtcbiAgbGV0IHJlcGFpcmVkOiBSZXNvbHZlUm91dGVzUXVlcnkgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJvdXRlTWF0Y2hlcykpIHtcbiAgICBpZiAoIWtleS5zdGFydHNXaXRoKFwibnh0UFwiKSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAoIShrZXkgaW4gcXVlcnkpIHx8IHF1ZXJ5W2tleV0gPT09IHZhbHVlKSBjb250aW51ZTtcbiAgICByZXBhaXJlZCA/Pz0geyAuLi5xdWVyeSB9O1xuICAgIHJlcGFpcmVkW2tleV0gPSB2YWx1ZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZXBhaXJlZCA/PyBxdWVyeSkpIHtcbiAgICBpZiAoIWtleS5zdGFydHNXaXRoKFwibnh0UFwiKSB8fCBpc0ZpbGxlZFBhcmFtKHZhbHVlKSkgY29udGludWU7XG4gICAgaWYgKGlzRmlsbGVkUGFyYW0ocm91dGVNYXRjaGVzW2tleV0pKSBjb250aW51ZTtcbiAgICByZXBhaXJlZCA/Pz0geyAuLi5xdWVyeSB9O1xuICAgIGRlbGV0ZSByZXBhaXJlZFtrZXldO1xuICB9XG4gIHJldHVybiByZXBhaXJlZCA/PyBxdWVyeTtcbn1cblxuLyoqXG4gKiBSb3V0ZSBwYXJhbXMgdG8gaGFuZCBOZXh0LmpzIG91dC1vZi1iYW5kLCBmb3IgdGhlIG9uZSByZXF1ZXN0IHNoYXBlIHRoZSBgbnh0UGBcbiAqIHF1ZXJ5IGNvbnRyYWN0IGNhbm5vdCBjYXJyeTogYSBjYXB0dXJlIGNvbnRhaW5pbmcgYW4gZW5jb2RlZCBgL2AuIGB1bmRlZmluZWRgXG4gKiDigJQgdGhlIGNvbW1vbiBjYXNlIOKAlCBtZWFucyB0aGUgY29udHJhY3QgaXMgbG9zc2xlc3MgYW5kIG5vdGhpbmcgc3BlY2lhbCBpc1xuICogbmVlZGVkLlxuICpcbiAqIFRoZSBjb250cmFjdCBub3JtYWxseSBpcyBsb3NzbGVzcywgd2hpY2ggaXMgd2h5IHtAbGluayBOZXh0anNSdW50aW1lfSBwYXNzZXNcbiAqIHJvdXRlIHBhcmFtcyBhcyBxdWVyeSB2YWx1ZXMgZXZlcnl3aGVyZSBlbHNlLiBCdXQgYFJvdXRlTW9kdWxlLnByZXBhcmVgXG4gKiByZWNvdmVycyB0aGVtIGJ5IHJ1bm5pbmcgYG5vcm1hbGl6ZVF1ZXJ5UGFyYW1zYCDigJQgd2hpY2ggY2FsbHNcbiAqIGBkZWNvZGVRdWVyeVBhdGhQYXJhbWV0ZXJgLCBhICoqc2Vjb25kKiogYGRlY29kZVVSSUNvbXBvbmVudGAsIG9uIGV2ZXJ5XG4gKiBkZS1wcmVmaXhlZCB2YWx1ZSBiZWNhdXNlIFwid2hlbiBkZXBsb3llZCB0byBWZXJjZWwgdGhlIHZhbHVlIG1heSBiZSBlbmNvZGVkXCIg4oCUXG4gKiBhbmQgdGhlbiBgbm9ybWFsaXplRHluYW1pY1JvdXRlUGFyYW1zYCwgd2hpY2ggc3BsaXRzIGEgc3RyaW5nIHJlcGVhdCBwYXJhbSBvblxuICogYC9gIGJlY2F1c2UgXCJxdWVyeSB2YWx1ZXMgZnJvbSB0aGUgcHJveHkgYXJlbid0IGFscmVhZHkgc3BsaXQgaW50byBhcnJheXNcIi5cbiAqIFR3byBkZWNvZGVzIGFuZCBhIHNwbGl0OiBgbnh0UHJlc3Q9Li4lMjUyRi4uJTI1MkZzZXJ2ZXItcmVmZXJlbmNlLW1hbmlmZXN0YFxuICogKHdoYXQgdGhlIGNvbnRyYWN0IGFza3MgZm9yLCBhbmQgd2hhdCB3ZSBzZW5kKSBhcnJpdmVzIGFzIHRoZSB0aHJlZSBwYXJhbXNcbiAqIGBbJy4uJywgJy4uJywgJ3NlcnZlci1yZWZlcmVuY2UtbWFuaWZlc3QnXWAgcmF0aGVyIHRoYW4gdGhlIG9uZSB0aGUgY2xpZW50XG4gKiByZXF1ZXN0ZWQuIFRoZSByZXNvbHZlZCBwYXRobmFtZSBidWlsdCBiYWNrIG91dCBvZiB0aG9zZSBpc1xuICogYC9wYWdlcy1jYWNoZS8uLi8uLi9zZXJ2ZXItcmVmZXJlbmNlLW1hbmlmZXN0YCwgYW5kIGBub3JtYWxpemVQYWdlUGF0aGAgdGhyb3dzXG4gKiBgUmVxdWVzdGVkIGFuZCByZXNvbHZlZCBwYWdlIG1pc21hdGNoYCBvbiBpdCB3aGVuIHRoZSBjYWNoZSBhc2tzIGZvciBhIGtleSDigJRcbiAqIHNvIGEgYF9uZXh0L2RhdGFgIHJlcXVlc3QgZm9yIGEgY2F0Y2gtYWxsIHdob3NlIHNlZ21lbnQgY29udGFpbnMgYCUyRmAgNTAwcy5cbiAqIE1lYXN1cmVkIGFnYWluc3QgYHRlc3QvZTJlL2luY3JlbWVudGFsLWNhY2hlLXBhdGgtdHJhdmVyc2FsYC4gTm8gZW5jb2RpbmcgY2FuXG4gKiBmaXggaXQgZnJvbSB0aGlzIHNpZGU6IHdoYXRldmVyIHN1cnZpdmVzIHR3byBkZWNvZGVzIHN0aWxsIGdldHMgc3BsaXQuXG4gKlxuICogYG5leHQgc3RhcnRgIG5ldmVyIGhpdHMgaXQgYmVjYXVzZSBpdHMgYHJvdXRlci1zZXJ2ZXJgIHNldHNcbiAqIGByZXF1ZXN0TWV0YS5wYXJhbXNgIGluc3RlYWQsIHdoaWNoIGBwcmVwYXJlYCB0YWtlcyBhcy1pc1xuICogKGByb3V0ZS1tb2R1bGUudHNgOiBgZ2V0UmVxdWVzdE1ldGEocmVxLCAncGFyYW1zJylgKSB3aXRoIG5vIGRlY29kZSBhbmQgbm9cbiAqIHNwbGl0LiBUaGF0IGlzIHdoYXQgdGhpcyByZXByb2R1Y2VzIOKAlCBuYXJyb3dseSwgb25seSBmb3IgdGhlIGFmZmVjdGVkXG4gKiByZXF1ZXN0cywgc28gdGhhdCB0aGUgZG9jdW1lbnRlZCBxdWVyeSBjb250cmFjdCBzdGF5cyB0aGUgcGF0aCBmb3IgZXZlcnl0aGluZ1xuICogZWxzZS5cbiAqXG4gKiBUaGUgYG54dFBgIHZhbHVlcyBoYXZlIHRvIGxlYXZlIHRoZSBxdWVyeSBhcyB3ZWxsIGFzIGFycml2ZSBpbiBgcGFyYW1zYC5cbiAqIGBwcmVwYXJlYCBwcmVmZXJzIHRoZSBxdWVyeSBvdmVyIGBwYXJhbXNgIHdoZW4gYm90aCBwYXJzZSBhbmQgYXJlIHRoZSBzYW1lXG4gKiBzaXplLCBzbyBsZWF2aW5nIHRoZW0gaW4gd291bGQganVzdCByZXN0b3JlIHRoZSBzcGxpdC4gRHJvcHBpbmcgdGhlbSBhbHNvXG4gKiBtYXRjaGVzIGBuZXh0IHN0YXJ0YCwgd2hpY2ggaGFzIG5vIGBueHRQYCBxdWVyeSBhdCBhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdXRPZkJhbmRSb3V0ZVBhcmFtcyhcbiAgcXVlcnk6IFJlc29sdmVSb3V0ZXNRdWVyeSxcbiAgcmVzb2x2ZWRQYXRobmFtZTogc3RyaW5nLFxuKTpcbiAgfCB7IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+OyBxdWVyeTogUmVzb2x2ZVJvdXRlc1F1ZXJ5IH1cbiAgfCB1bmRlZmluZWQge1xuICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMocXVlcnkpO1xuICBpZiAoXG4gICAgIWVudHJpZXMuc29tZShcbiAgICAgIChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgIGtleS5zdGFydHNXaXRoKFwibnh0UFwiKSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgRU5DT0RFRF9QQVRIX0RFTElNSVRFUi50ZXN0KHZhbHVlKSxcbiAgICApXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gV2hpY2ggcGFyYW1zIGFyZSByZXBlYXRzIOKAlCBgWy4uLnJlc3RdYCwgYFtbLi4ucmVzdF1dYCDigJQgZGVjaWRlcyBhcnJheSB2ZXJzdXNcbiAgLy8gc3RyaW5nLCB0aGUgc2FtZSBkaXN0aW5jdGlvbiBgbm9ybWFsaXplRHluYW1pY1JvdXRlUGFyYW1zYCBtYWtlcyBmcm9tIHRoZVxuICAvLyByb3V0ZSdzIG93biBgZ3JvdXBzYC4gYHJlc29sdmVkUGF0aG5hbWVgIGlzIHRoZSBtYXRjaGVkIHJvdXRlLCBicmFja2V0cyBhbmRcbiAgLy8gYWxsLlxuICBjb25zdCByZXBlYXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgcmVzb2x2ZWRQYXRobmFtZS5tYXRjaEFsbCgvXFxbXFxbP1xcLlxcLlxcLihbXlxcXV0rPylcXF1cXF0/L2cpKSB7XG4gICAgcmVwZWF0cy5hZGQobWF0Y2hbMV0pO1xuICB9XG4gIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+ID0ge307XG4gIGNvbnN0IHJlbWFpbmluZzogUmVzb2x2ZVJvdXRlc1F1ZXJ5ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICBpZiAoIWtleS5zdGFydHNXaXRoKFwibnh0UFwiKSkge1xuICAgICAgcmVtYWluaW5nW2tleV0gPSB2YWx1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBBbnl0aGluZyBidXQgYSBmaWxsZWQgc3RyaW5nIGlzIGEgcGFyYW0gd2UgY2Fubm90IHJlc3RhdGUg4oCUIGFuIG9wdGlvbmFsXG4gICAgLy8gY2F0Y2hhbGwgdGhlIHJlcXVlc3QgbGVmdCB1bnNldCwgb3IgYSByZXBlYXRlZCBrZXkuIFJhdGhlciB0aGFuIGhhbmRcbiAgICAvLyBgcHJlcGFyZWAgYSBwYXJhbSBzZXQgdGhhdCBpcyBtaXNzaW5nIG9uZSwgbGVhdmUgdGhlIHdob2xlIHJlcXVlc3Qgb24gdGhlXG4gICAgLy8gcXVlcnkgY29udHJhY3QuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBuYW1lID0ga2V5LnNsaWNlKFwibnh0UFwiLmxlbmd0aCk7XG4gICAgcGFyYW1zW25hbWVdID0gcmVwZWF0cy5oYXMobmFtZSlcbiAgICAgID8gdmFsdWUuc3BsaXQoXCIvXCIpLm1hcChzYWZlRGVjb2RlKVxuICAgICAgOiBzYWZlRGVjb2RlKHZhbHVlKTtcbiAgfVxuICByZXR1cm4geyBwYXJhbXMsIHF1ZXJ5OiByZW1haW5pbmcgfTtcbn1cblxuLyoqIEFuIGVuY29kZWQgYC9gOiB0aGUgZGVsaW1pdGVyIHRoZSBxdWVyeSBjb250cmFjdCdzIHNwbGl0IHdvdWxkIGNvbnN1bWUuICovXG5jb25zdCBFTkNPREVEX1BBVEhfREVMSU1JVEVSID0gLyUyZi9pO1xuXG4vKiogV2hldGhlciBhIHJvdXRlIHBhcmFtIGNhcnJpZXMgYSBzZWdtZW50LCBhcyBvcHBvc2VkIHRvIGBcIlwiYCBvciBub3RoaW5nLiAqL1xuZnVuY3Rpb24gaXNGaWxsZWRQYXJhbSh2YWx1ZTogUmVzb2x2ZVJvdXRlc1F1ZXJ5VmFsdWUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubGVuZ3RoID4gMCA6IEJvb2xlYW4odmFsdWUpO1xufVxuXG4vKipcbiAqIFRoZSBvcmRlciBuZXh0IGl0c2VsZiB1c2VzLCBpbiBgYmFzZS1zZXJ2ZXIudHNgJ3MgYHJlbmRlckVycm9yVG9SZXNwb25zZWA6XG4gKiB0aGUgc3RhdHVzIHBhZ2UncyBlbnRyeXBvaW50cywgdGhlbiBpdHMgcHJlcmVuZGVyLCB0aGVuIGAvX2Vycm9yYCwgd2hpY2ggaXNcbiAqIHRoZSBidWlsdC1pbiBlcnJvciBwYWdlIHVubGVzcyB0aGUgYXBwIHdyb3RlIGl0cyBvd24uXG4gKlxuICogRm9yIGEgNDA0IHRoZSBlbnRyeXBvaW50cyBhcmUgQXBwIFJvdXRlcidzIGAvX25vdC1mb3VuZGAsIHRoZW4gUGFnZXNcbiAqIFJvdXRlcidzIGAvNDA0YC4gYC80MDRgIGhhcyB0byBjb21lIGJlZm9yZSBgL19lcnJvcmAg4oCUIGl0IGlzIHRoZSBhcHAnc1xuICogKmN1c3RvbSogNDA0LCBhbmQgYC9fZXJyb3JgIGlzIHRoZSBidWlsdC1pbiBcIjQwNDogVGhpcyBwYWdlIGNvdWxkIG5vdCBiZVxuICogZm91bmRcIi4gTWVhc3VyZWQgYWdhaW5zdCBgdGVzdC9lMmUvNDA0LXBhZ2UtYXBwYCwgd2hlcmUgZXZlcnkgVVJMIGdvdCB0aGVcbiAqIGJ1aWx0LWluIHBhZ2UuIEZvciBhIDUwMCBpdCBpcyBgLzUwMGAuXG4gKlxuICogVGhlIHByZXJlbmRlciBpcyBhbG1vc3QgYWx3YXlzIHRoZXJlOiBgbmV4dCBidWlsZGAgZW1pdHMgYDQwNC5odG1sYCB3aGVuZXZlclxuICogYHBhZ2VzL19hcHBgIGhhcyBubyBgZ2V0SW5pdGlhbFByb3BzYCAoYHVzZVN0YXRpY1BhZ2VzNDA0YCksIGZyb20gdGhlIGFwcCdzXG4gKiBgcGFnZXMvNDA0LmpzYCBvciBlbHNlIGZyb20gYF9lcnJvcmAsIGFuZCBgcGFnZXMvNTAwLmpzYCBpcyBhXG4gKiBgU1RBVElDX1NUQVRVU19QQUdFU2AgZW50cnkuIFNvIGl0IHJlYWNoZXMgdXMgYXMgYSBzdGF0aWMgZmlsZSDigJQgdW5kZXIgaTE4blxuICogb25lIHBlciBsb2NhbGUgKGAvZW4tVVMvNDA0YCksIGFuZCBuZXZlciBhIGJhcmUgYC80MDRgIOKAlCBhbmQgYG5leHQgc3RhcnRgXG4gKiBzZXJ2ZXMgaXQgYWhlYWQgb2YgYC9fZXJyb3JgLCB3aGljaCBldmVyeSBQYWdlcyBidWlsZCBoYXMuIFRoZSBwYWdlIGlzIGFuXG4gKiBlbnRyeXBvaW50IG9ubHkgd2hlbiBzb21ldGhpbmcgZm9yY2VzIGEgcGVyLXJlcXVlc3QgcmVuZGVyLCB3aGljaCBhXG4gKiBgZ2V0SW5pdGlhbFByb3BzYCBpbiBgX2FwcGAgZG9lcy5cbiAqXG4gKiBBIDUwMCBpcyBvbmx5IHJlbmRlcmVkIHdoZW4gYW4gZW50cnlwb2ludCAqdGhyb3dzKi4gTmV4dC5qcydzIHBhZ2UgaGFuZGxlcnNcbiAqIGRlbGliZXJhdGVseSByZXRocm93IChcInJldGhyb3cgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIHNlcnZpbmcgZXJyb3IgcGFnZVwiLFxuICogYHBhZ2VzLWhhbmRsZXIudHNgKSwgbGVhdmluZyB0aGUgZXJyb3IgcGFnZSB0byB3aGF0ZXZlciBpcyBob3N0aW5nIHRoZW0g4oCUXG4gKiBtZWFzdXJlZCBhZ2FpbnN0IGB0ZXN0L2UyZS9hc3luYy1tb2R1bGVzYCwgd2hvc2UgYC9tYWtlLWVycm9yYCB0aHJvd3MgaW5cbiAqIGBnZXRTZXJ2ZXJTaWRlUHJvcHNgIGFuZCBleHBlY3RzIHRoZSBhcHAncyBgcGFnZXMvX2Vycm9yYC5cbiAqXG4gKiBBcHBzIHdpdGggbm9uZSBvZiB0aGVzZSBnZXQgbm90aGluZy5cbiAqL1xuZnVuY3Rpb24gc3RhdHVzVGFyZ2V0KFxuICBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0LFxuICBzdGF0dXM6IDQwNCB8IDUwMCxcbiAgLyoqIFdoaWNoIGxvY2FsZSdzIHByZXJlbmRlciB0byBsb29rIGZvciwgaW4gYW4gaTE4biBhcHAuICovXG4gIGxvY2FsZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogU3RhdHVzVGFyZ2V0IHtcbiAgY29uc3QgeyBiYXNlUGF0aCB9ID0gbWFuaWZlc3QuY29uZmlnO1xuICBmb3IgKGNvbnN0IHN1ZmZpeCBvZiBTVEFUVVNfUEFHRV9TVUZGSVhFU1tzdGF0dXNdKSB7XG4gICAgY29uc3QgcGF0aG5hbWUgPSBgJHtiYXNlUGF0aH0ke3N1ZmZpeH1gO1xuICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBtYW5pZmVzdC5lbnRyeXBvaW50c1twYXRobmFtZV07XG4gICAgaWYgKGVudHJ5cG9pbnQpIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6IFwiZW50cnlwb2ludFwiLCBwYXRobmFtZSwgZW50cnlwb2ludCB9O1xuICAgIH1cbiAgfVxuICBjb25zdCBwcmVyZW5kZXJlZCA9IGAke2Jhc2VQYXRofSR7bG9jYWxlID8gYC8ke2xvY2FsZX1gIDogXCJcIn0vJHtzdGF0dXN9YDtcbiAgY29uc3QgZmlsZVBhdGggPSBtYW5pZmVzdC5zdGF0aWNGaWxlc1twcmVyZW5kZXJlZF07XG4gIGlmIChmaWxlUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsga2luZDogXCJzdGF0aWMtZmlsZVwiLCBwYXRobmFtZTogcHJlcmVuZGVyZWQsIGZpbGVQYXRoIH07XG4gIH1cbiAgY29uc3QgZXJyb3JQYXRobmFtZSA9IGAke2Jhc2VQYXRofSR7U1RBVFVTX1BBR0VfU1VGRklYRVMuZmFsbGJhY2t9YDtcbiAgY29uc3QgZXJyb3JFbnRyeXBvaW50ID0gbWFuaWZlc3QuZW50cnlwb2ludHNbZXJyb3JQYXRobmFtZV07XG4gIGlmIChlcnJvckVudHJ5cG9pbnQpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogXCJlbnRyeXBvaW50XCIsXG4gICAgICBwYXRobmFtZTogZXJyb3JQYXRobmFtZSxcbiAgICAgIGVudHJ5cG9pbnQ6IGVycm9yRW50cnlwb2ludCxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7IGtpbmQ6IFwibm9uZVwiIH07XG59XG5cbi8qKlxuICoge0BsaW5rIHN0YXR1c1RhcmdldH0gZm9yIGV2ZXJ5IGxvY2FsZSwgcmVzb2x2ZWQgb25jZSwgYW5kIGEgbG9va3VwIG9mIHRoZVxuICogcmVxdWVzdCdzOiBpbiBhbiBpMThuIGFwcCwgdGhlIHByZXJlbmRlciBvZiB0aGUgbG9jYWxlIHRoZSBVUkwgaXMgaW5cbiAqIChgL2ZyL25vcGVgIGdldHMgYC9mci80MDRgKSwgYW5kIG90aGVyd2lzZSBvZiB0aGUgZG9tYWluJ3MgZGVmYXVsdCBsb2NhbGUg4oCUXG4gKiB3aGljaCBpcyBob3cgYG5leHQgc3RhcnRgIHBpY2tzIHRoZSBsb2NhbGUgaXQgcmVuZGVycyBhIHN0YXR1cyBwYWdlIGluLiBBXG4gKiByZXF1ZXN0IHdob3NlIFVSTCBjb3VsZCBub3QgYmUgcGFyc2VkLCBgdW5kZWZpbmVkYCwgZ2V0cyB0aGUgZGVmYXVsdFxuICogbG9jYWxlJ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGF0dXNUYXJnZXRzKFxuICBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0LFxuICBzdGF0dXM6IDQwNCB8IDUwMCxcbik6ICh1cmw6IFVSTCB8IHVuZGVmaW5lZCkgPT4gU3RhdHVzVGFyZ2V0IHtcbiAgY29uc3QgaTE4biA9IGFzSTE4bihtYW5pZmVzdC5jb25maWcuaTE4bik7XG4gIGNvbnN0IGZhbGxiYWNrID0gc3RhdHVzVGFyZ2V0KG1hbmlmZXN0LCBzdGF0dXMsIGkxOG4/LmRlZmF1bHRMb2NhbGUpO1xuICBjb25zdCBieUxvY2FsZSA9IG5ldyBNYXAoXG4gICAgKGkxOG4/LmxvY2FsZXMgPz8gW10pLm1hcCgobG9jYWxlKSA9PiBbXG4gICAgICBsb2NhbGUsXG4gICAgICBzdGF0dXNUYXJnZXQobWFuaWZlc3QsIHN0YXR1cywgbG9jYWxlKSxcbiAgICBdKSxcbiAgKTtcbiAgcmV0dXJuICh1cmwpID0+IHtcbiAgICBjb25zdCBsb2NhbGUgPSB1cmwgPyByZXF1ZXN0TG9jYWxlKG1hbmlmZXN0LCB1cmwpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiAobG9jYWxlICE9PSB1bmRlZmluZWQgJiYgYnlMb2NhbGUuZ2V0KGxvY2FsZSkpIHx8IGZhbGxiYWNrO1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSBsb2NhbGUgYSByZXF1ZXN0J3Mgc3RhdHVzIHBhZ2UgcmVuZGVycyBpbiwgdGhlIHdheSBgbmV4dCBzdGFydGAgcGlja3MgaXQ6XG4gKiB0aGUgbG9jYWxlIHRoZSBVUkwncyBmaXJzdCBzZWdtZW50IG5hbWVzIChjYXNlLWluc2Vuc2l0aXZlbHksIGFzXG4gKiBgbm9ybWFsaXplTG9jYWxlUGF0aGAgbWF0Y2hlcyBpdCksIGFuZCBvdGhlcndpc2UgdGhlIGRvbWFpbidzIGRlZmF1bHQgbG9jYWxlLFxuICogdGhlbiB0aGUgYXBwJ3MuIGB1bmRlZmluZWRgIHdpdGhvdXQgaTE4bi5cbiAqL1xuZnVuY3Rpb24gcmVxdWVzdExvY2FsZShcbiAgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdCxcbiAgdXJsOiBVUkwsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBpMThuID0gYXNJMThuKG1hbmlmZXN0LmNvbmZpZy5pMThuKTtcbiAgaWYgKCFpMThuKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXRobmFtZSA9IHdpdGhvdXRQYXRoUHJlZml4KHVybC5wYXRobmFtZSwgbWFuaWZlc3QuY29uZmlnLmJhc2VQYXRoKTtcbiAgY29uc3Qgc2VnbWVudCA9IChwYXRobmFtZS5zcGxpdChcIi9cIilbMV0gPz8gXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChcbiAgICBpMThuLmxvY2FsZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUudG9Mb3dlckNhc2UoKSA9PT0gc2VnbWVudCkgPz9cbiAgICBkZXRlY3REb21haW5Mb2NhbGUoaTE4bi5kb21haW5zLCB1cmwuaG9zdG5hbWUpPy5kZWZhdWx0TG9jYWxlID8/XG4gICAgaTE4bi5kZWZhdWx0TG9jYWxlXG4gICk7XG59XG4iXX0=
|
|
750
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9kaXNwYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1c0JBLGdDQW9CQztBQTJFRCxzREFrQkM7QUFxQ0Qsb0RBMkNDO0FBNkVELHNDQWdCQztBQXIrQkQsc0RBQXNEO0FBQ3REOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCwyQ0FZdUI7QUFDdkIseUNBSW9CO0FBQ3BCLGlEQUE4QztBQUM5QyxpQ0FBaUU7QUFpS2pFOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxRQUFRLENBQUMsT0FBZ0I7SUFDaEMsT0FBTyxPQUF3QyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxNQUFNLENBQUMsSUFBb0I7SUFDbEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFFLElBQW9DLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsTUFBYSxVQUFVO0lBVWU7SUFUcEMsMkVBQTJFO0lBQzNELFdBQVcsQ0FBNkI7SUFFdkMsTUFBTSxDQUFnQztJQUN0QyxJQUFJLENBQTBDO0lBQzlDLEtBQUssQ0FBZTtJQUNwQixhQUFhLENBQVM7SUFDdEIsYUFBYSxDQUFVO0lBRXhDLFlBQW9DLE9BQTBCO1FBQTFCLFlBQU8sR0FBUCxPQUFPLENBQW1CO1FBQzVELE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUNuRCxJQUFJLENBQUMsS0FBSyxHQUFHLGlCQUFpQixDQUFDLFFBQVEs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QUFTLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQztJQUNwRSxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGFBQWEsQ0FDcEIsUUFBeUIsRUFDekIsR0FBUTtJQUVSLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBQSx3QkFBaUIsRUFBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0UsT0FBTyxDQUNMLElBQUEsNkJBQW1CLEVBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjO1FBQzFELElBQUEsNEJBQWtCLEVBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsYUFBYTtRQUM3RCxJQUFJLENBQUMsYUFBYSxDQUNuQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyoqXG4gKiBSZXF1ZXN0IGRpc3BhdGNoOiBVUkwgaW4sIHJvdXRpbmcgZGVjaXNpb24gb3V0LlxuICpcbiAqIEFsbCByb3V0ZSBtYXRjaGluZyBpcyBkZWxlZ2F0ZWQgdG8gYEBuZXh0L3JvdXRpbmdgJ3MgYHJlc29sdmVSb3V0ZXNgLCB0aGVcbiAqIGZpcnN0LXBhcnR5IHBhY2thZ2UgYG5leHQgc3RhcnRgIHdhcyByZWZhY3RvcmVkIHRvIGV4cG9zZS4gUmVpbXBsZW1lbnRpbmdcbiAqIHJlZGlyZWN0cy9yZXdyaXRlcy9pMThuL2R5bmFtaWMtcm91dGUgbWF0Y2hpbmcgaXMgd2hhdCBwcmV2aW91cyB2ZXJzaW9ucyBvZlxuICogdGhpcyBjb25zdHJ1Y3QgZGlkLCBhbmQgaXQgaXMgdGhlIHRoaW5nIHRoaXMgcmV3cml0ZSBleGlzdHMgdG8gZGVsZXRlLlxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIHB1cmUgZGVjaXNpb24tbWFraW5nOiBpdCBuZXZlciB0b3VjaGVzIHRoZSBmaWxlc3lzdGVtLCBuZXZlclxuICogcmVxdWlyZXMgYW4gZW50cnlwb2ludCwgYW5kIG5ldmVyIGJ1aWxkcyBhIGBSZXNwb25zZWAuIEl0IHJldHVybnMgYVxuICoge0BsaW5rIERpc3BhdGNoUmVzdWx0fSBhbmQgdGhlIGNhbGxlciAodGhlIHJ1bnRpbWUgY29yZSwgc3RlcCA0KSBhY3RzIG9uIGl0LlxuICogVGhhdCBzcGxpdCBpcyB3aGF0IG1ha2VzIGl0IHVuaXQtdGVzdGFibGUgYWdhaW5zdCB0aGUgY29tbWl0dGVkXG4gKiBgb25CdWlsZENvbXBsZXRlYCBmaXh0dXJlcyB3aXRoIG5vIEFXUyBhbmQgbm8gTmV4dC5qcyBzZXJ2ZXIuXG4gKi9cbmltcG9ydCB7XG4gIE1pZGRsZXdhcmVDb250ZXh0LFxuICBNaWRkbGV3YXJlUmVzdWx0LFxuICBSZXNvbHZlUm91dGVzUGFyYW1zLFxuICBSZXNvbHZlUm91dGVzUXVlcnksXG4gIFJlc29sdmVSb3V0ZXNRdWVyeVZhbHVlLFxuICBSZXNvbHZlUm91dGVzUmVzdWx0LFxuICBSb3V0ZUludm9jYXRpb25UYXJnZXQsXG4gIGRldGVjdERvbWFpbkxvY2FsZSxcbiAgZGV0ZWN0TG9jYWxlLFxuICBub3JtYWxpemVMb2NhbGVQYXRoLFxuICByZXNvbHZlUm91dGVzLFxufSBmcm9tIFwiQG5leHQvcm91dGluZ1wiO1xuaW1wb3J0IHtcbiAgQWRhcHRlckVudHJ5cG9pbnQsXG4gIEFkYXB0ZXJNYW5pZmVzdCxcbiAgU1RBVFVTX1BBR0VfU1VGRklYRVMsXG59IGZyb20gXCIuL21hbmlmZXN0XCI7XG5pbXBvcnQgeyBwdWJsaWNEaXJLZXkgfSBmcm9tIFwiLi9wdWJsaWMtZmlsZXNcIjtcbmltcG9ydCB7IHNhZmVEZWNvZGUsIHRvU2VhcmNoLCB3aXRob3V0UGF0aFByZWZpeCB9IGZyb20gXCIuL3V0aWxcIjtcblxuLyoqXG4gKiBSdW5zIHRoZSBhcHAncyBtaWRkbGV3YXJlIGZvciBvbmUgcmVxdWVzdC4gU3VwcGxpZWQgYnkgYE1pZGRsZXdhcmVSdW5uZXJgIGluXG4gKiBgLi9taWRkbGV3YXJlYC5cbiAqXG4gKiBgTWlkZGxld2FyZUNvbnRleHRgIGNhcnJpZXMgbm8gbWV0aG9kIOKAlCBgcmVzb2x2ZVJvdXRlc2AgbmV2ZXIgbmVlZHMgb25lIOKAlCBidXRcbiAqIG1pZGRsZXdhcmUgdmVyeSBtdWNoIGRvZXMgKGBpZiAocmVxdWVzdC5tZXRob2QgPT09IFwiUE9TVFwiKWApLCBzbyBkaXNwYXRjaCBhZGRzXG4gKiBpdCBmcm9tIHRoZSByZXF1ZXN0IGl0IHdhcyBnaXZlbi4gVGhlIGBSZXNwb25zZWAgbWlkZGxld2FyZSByZXR1cm5lZCBjb21lc1xuICogYmFjayBiZXNpZGUgdGhlIHJlc3VsdCwgYmVjYXVzZSBgcmVzb2x2ZVJvdXRlc2AgcmVwb3J0cyBgbWlkZGxld2FyZVJlc3BvbmRlZGBcbiAqIHdpdGhvdXQgaXQuXG4gKi9cbmV4cG9ydCB0eXBlIE1pZGRsZXdhcmVJbnZva2VyID0gKFxuICBjdHg6IE1pZGRsZXdhcmVDb250ZXh0ICYgeyByZWFkb25seSBtZXRob2Q6IHN0cmluZyB9LFxuKSA9PiBQcm9taXNlPE1pZGRsZXdhcmVSZXN1bHQgJiB7IHJlYWRvbmx5IHJlc3BvbnNlOiBSZXNwb25zZSB9PjtcblxuZXhwb3J0IGludGVyZmFjZSBEaXNwYXRjaGVyT3B0aW9ucyB7XG4gIHJlYWRvbmx5IG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3Q7XG4gIC8qKlxuICAgKiBUaGUgZmlsZXMgdW5kZXIgYHB1YmxpYy9gLCBmcm9tIGByZWFkUHVibGljRmlsZXNgOiB1bmVuY29kZWQgcGF0aHMgcmVsYXRpdmVcbiAgICogdG8gaXQuIFNlcnZlZCBhaGVhZCBvZiBldmVyeSByb3V0ZSwgYXMgYG5leHQgc3RhcnRgIHNlcnZlcyB0aGVtLlxuICAgKiBAZGVmYXVsdCAtIG5vIGBwdWJsaWMvYCBmaWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljRmlsZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXNwYXRjaFJlcXVlc3Qge1xuICByZWFkb25seSBtZXRob2Q6IHN0cmluZztcbiAgcmVhZG9ubHkgdXJsOiBVUkw7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIC8qKlxuICAgKiBBbHdheXMgYSBzdHJlYW0g4oCUIGByZXNvbHZlUm91dGVzYCByZXF1aXJlcyBvbmUgYmVjYXVzZSBtaWRkbGV3YXJlIG1heSByZWFkXG4gICAqIHRoZSBib2R5LiBVc2UgYW4gYWxyZWFkeS1jbG9zZWQgc3RyZWFtIGZvciBHRVQvSEVBRC5cbiAgICovXG4gIHJlYWRvbmx5IGJvZHk6IFJlYWRhYmxlU3RyZWFtO1xuICAvKipcbiAgICogUmVxdWlyZWQgd2hlbmV2ZXIgYG1hbmlmZXN0Lm1pZGRsZXdhcmVgIGlzIG5vbi1udWxsLiBgcmVzb2x2ZVJvdXRlc2AgZGVjaWRlc1xuICAgKiAqd2hldGhlciogdG8gY2FsbCBpdCBmcm9tIGByb3V0aW5nLm1pZGRsZXdhcmVNYXRjaGVyc2A7IHdlIG9ubHkgc3VwcGx5IHRoZVxuICAgKiBob3cuXG4gICAqL1xuICByZWFkb25seSBpbnZva2VNaWRkbGV3YXJlPzogTWlkZGxld2FyZUludm9rZXI7XG59XG5cbmludGVyZmFjZSBEaXNwYXRjaFJlc3VsdEJhc2Uge1xuICAvKipcbiAgICogSGVhZGVycyB0byBtZXJnZSBpbnRvIHRoZSByZXNwb25zZTogYGhlYWRlcnMoKWAgcnVsZXMsIHRoZSBpbW11dGFibGVcbiAgICogYGNhY2hlLWNvbnRyb2xgIGZvciBgX25leHQvc3RhdGljYCwgYW5kIGFueXRoaW5nIG1pZGRsZXdhcmUgc2V0IHZpYVxuICAgKiBgTmV4dFJlc3BvbnNlLm5leHQoeyBoZWFkZXJzIH0pYC4gTmV2ZXIgcmVxdWVzdCBoZWFkZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzcG9uc2VIZWFkZXJzOiBIZWFkZXJzO1xuICAvKiogU3RhdHVzIGZvcmNlZCBieSBhIG1hdGNoZWQgcm91dGUsIGlmIGFueS4gKi9cbiAgcmVhZG9ubHkgc3RhdHVzPzogbnVtYmVyO1xufVxuXG4vKiogQSByb3V0ZSB3ZSBtdXN0IGludm9rZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGF0Y2hFbnRyeXBvaW50UmVzdWx0IGV4dGVuZHMgRGlzcGF0Y2hSZXN1bHRCYXNlIHtcbiAgcmVhZG9ubHkga2luZDogXCJlbnRyeXBvaW50XCI7XG4gIHJlYWRvbmx5IGVudHJ5cG9pbnQ6IEFkYXB0ZXJFbnRyeXBvaW50O1xuICAvKiogVGhlIG1hdGNoZWQgdGVtcGxhdGUsIGkuZS4gdGhlIGBtYW5pZmVzdC5lbnRyeXBvaW50c2Aga2V5LiAqL1xuICByZWFkb25seSByZXNvbHZlZFBhdGhuYW1lOiBzdHJpbmc7XG4gIC8qKiBUaGUgKmNvbmNyZXRlKiBwYXRobmFtZSArIHF1ZXJ5IHRvIGludm9rZSB0aGUgcm91dGUgd2l0aC4gKi9cbiAgcmVhZG9ubHkgaW52b2NhdGlvblRhcmdldDogUm91dGVJbnZvY2F0aW9uVGFyZ2V0O1xuICAvKiogUmVxdWVzdCBoZWFkZXJzIGFzIG1pZGRsZXdhcmUgbGVmdCB0aGVtLiAqL1xuICByZWFkb25seSByZXF1ZXN0SGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqIEEgZmlsZSBpbiBgbWFuaWZlc3Quc3RhdGljRmlsZXNgIG9yIGBwdWJsaWMvYDogcmVhZCBvZmYgZGlzaywgbm90IGludm9rZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3BhdGNoU3RhdGljRmlsZVJlc3VsdCBleHRlbmRzIERpc3BhdGNoUmVzdWx0QmFzZSB7XG4gIHJlYWRvbmx5IGtpbmQ6IFwic3RhdGljLWZpbGVcIjtcbiAgcmVhZG9ubHkgcGF0aG5hbWU6IHN0cmluZztcbiAgLyoqIFJlcG8tcm9vdC1yZWxhdGl2ZSBrZXkgaW5zaWRlIHRoZSBkZXBsb3ltZW50IHJvb3QuICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZTogU3RhdGljRmlsZVNvdXJjZTtcbiAgLyoqXG4gICAqIFJlcXVlc3QgaGVhZGVycyBhcyBtaWRkbGV3YXJlIGxlZnQgdGhlbSwgZm9yIHRoZSA0MDQgdGhlIHJ1bnRpbWUgcmVuZGVyc1xuICAgKiB3aGVuIHRoZSBmaWxlIGlzIG5vdCBpbiB0aGUgcGFja2FnZSBhZnRlciBhbGwuXG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0SGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqXG4gKiBXaGVyZSBhIHN0YXRpYyBmaWxlIGNhbWUgZnJvbSwgd2hpY2ggZGVjaWRlcyB3aGF0IGVsc2UgaXQgaXMgYWxsb3dlZCB0byBkby5cbiAqXG4gKiAtIGBwdWJsaWNgIOKAlCBhIGZpbGUgaW4gYHB1YmxpYy9gLlxuICogLSBgbmV4dC1zdGF0aWNgIOKAlCBgPGRpc3REaXI+L3N0YXRpY2AsIHRoZSBjbGllbnQgYnVuZGxlcy5cbiAqIC0gYHNlcnZlcmAg4oCUIGEgYnVpbGQgb3V0cHV0IHVuZGVyIGA8ZGlzdERpcj4vc2VydmVyYDogcHJlcmVuZGVyZWQgSFRNTCwgYVxuICogICBzdGF0aWMgbWV0YWRhdGEgcm91dGUncyBgLmJvZHlgLlxuICpcbiAqIFRoZSBmaXJzdCB0d28gYXJlIHdoYXQgYG5leHQgc3RhcnRgIHNlcnZlcyBhcyBwbGFpbiBmaWxlcywgd2l0aCBgc2VuZGAsIGFuZFxuICogb25seSB0byBHRVQgYW5kIEhFQUQgKGByb3V0ZXItc2VydmVyLmpzYCwgdGhlIGBmc1BhdGhgIGJyYW5jaCk7IHRoZSB0aGlyZCBpdFxuICogc2VydmVzIGJ5IGludm9raW5nIHRoZSByb3V0ZSBpdCBjYW1lIGZyb20uXG4gKi9cbmV4cG9ydCB0eXBlIFN0YXRpY0ZpbGVTb3VyY2UgPSBcInB1YmxpY1wiIHwgXCJuZXh0LXN0YXRpY1wiIHwgXCJzZXJ2ZXJcIjtcblxuLyoqIGAvX25leHQvaW1hZ2VgOiBvdXIgb3duIG9wdGltaXplciwgZGVsaWJlcmF0ZWx5IHJlYWNoZWQgYWZ0ZXIgbWlkZGxld2FyZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGF0Y2hJbWFnZU9wdGltaXphdGlvblJlc3VsdCBleHRlbmRzIERpc3BhdGNoUmVzdWx0QmFzZSB7XG4gIHJlYWRvbmx5IGtpbmQ6IFwiaW1hZ2Utb3B0aW1pemF0aW9uXCI7XG4gIHJlYWRvbmx5IHVybDogVVJMO1xuICByZWFkb25seSByZXF1ZXN0SGVhZGVyczogSGVhZGVycztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXNwYXRjaFJlZGlyZWN0UmVzdWx0IGV4dGVuZHMgRGlzcGF0Y2hSZXN1bHRCYXNlIHtcbiAgcmVhZG9ubHkga2luZDogXCJyZWRpcmVjdFwiO1xuICByZWFkb25seSBsb2NhdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBzdGF0dXM6IG51bWJlcjtcbn1cblxuLyoqIEEgcmV3cml0ZSB0byBhbm90aGVyIG9yaWdpbjogcHJveHkgdGhlIHJlcXVlc3QgdGhyb3VnaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGF0Y2hFeHRlcm5hbFJld3JpdGVSZXN1bHQgZXh0ZW5kcyBEaXNwYXRjaFJlc3VsdEJhc2Uge1xuICByZWFkb25seSBraW5kOiBcImV4dGVybmFsLXJld3JpdGVcIjtcbiAgcmVhZG9ubHkgdXJsOiBVUkw7XG4gIHJlYWRvbmx5IHJlcXVlc3RIZWFkZXJzOiBIZWFkZXJzO1xufVxuXG4vKiogTWlkZGxld2FyZSByZXR1cm5lZCBpdHMgb3duIHJlc3BvbnNlOiBzZW5kIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXNwYXRjaE1pZGRsZXdhcmVSZXNwb25kZWRSZXN1bHQgZXh0ZW5kcyBEaXNwYXRjaFJlc3VsdEJhc2Uge1xuICByZWFkb25seSBraW5kOiBcIm1pZGRsZXdhcmUtcmVzcG9uZGVkXCI7XG4gIHJlYWRvbmx5IHJlc3BvbnNlOiBSZXNwb25zZTtcbn1cblxuLyoqIEEgbWF0Y2hlZCByb3V0ZSBmb3JjZWQgYSBzdGF0dXMgd2l0aCBub3RoaW5nIHRvIGludm9rZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGF0Y2hEaXJlY3RSZXNwb25zZVJlc3VsdCBleHRlbmRzIERpc3BhdGNoUmVzdWx0QmFzZSB7XG4gIHJlYWRvbmx5IGtpbmQ6IFwicmVzcG9uc2VcIjtcbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcGF0Y2hOb3RGb3VuZFJlc3VsdCBleHRlbmRzIERpc3BhdGNoUmVzdWx0QmFzZSB7XG4gIHJlYWRvbmx5IGtpbmQ6IFwibm90LWZvdW5kXCI7XG4gIC8qKiBXaGF0IGZhaWxlZCB0byByZXNvbHZlLiBGb3IgbG9nZ2luZy4gKi9cbiAgcmVhZG9ubHkgcGF0aG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVxdWVzdEhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbmV4cG9ydCB0eXBlIERpc3BhdGNoUmVzdWx0ID1cbiAgfCBEaXNwYXRjaEVudHJ5cG9pbnRSZXN1bHRcbiAgfCBEaXNwYXRjaFN0YXRpY0ZpbGVSZXN1bHRcbiAgfCBEaXNwYXRjaEltYWdlT3B0aW1pemF0aW9uUmVzdWx0XG4gIHwgRGlzcGF0Y2hSZWRpcmVjdFJlc3VsdFxuICB8IERpc3BhdGNoRXh0ZXJuYWxSZXdyaXRlUmVzdWx0XG4gIHwgRGlzcGF0Y2hNaWRkbGV3YXJlUmVzcG9uZGVkUmVzdWx0XG4gIHwgRGlzcGF0Y2hEaXJlY3RSZXNwb25zZVJlc3VsdFxuICB8IERpc3BhdGNoTm90Rm91bmRSZXN1bHQ7XG5cbi8qKlxuICogSG93IHRvIHByb2R1Y2UgYSA0MDQgb3IgNTAwIGJvZHkuIFJlc29sdmVkIG9uY2UgcGVyIGxvY2FsZSBmcm9tIHRoZSBtYW5pZmVzdFxuICogKHNlZSB7QGxpbmsgc3RhdHVzVGFyZ2V0c30pOyBob25vcmluZyBgbm90Rm91bmQoKWAgZnJvbSBhIHJvdXRlIGlzIHRoZVxuICogcnVudGltZSBjb3JlJ3Mgam9iLCBub3QgZGlzcGF0Y2gncy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhdHVzVGFyZ2V0ID1cbiAgfCB7XG4gICAgICByZWFkb25seSBraW5kOiBcImVudHJ5cG9pbnRcIjtcbiAgICAgIHJlYWRvbmx5IHBhdGhuYW1lOiBzdHJpbmc7XG4gICAgICByZWFkb25seSBlbnRyeXBvaW50OiBBZGFwdGVyRW50cnlwb2ludDtcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkga2luZDogXCJzdGF0aWMtZmlsZVwiO1xuICAgICAgcmVhZG9ubHkgcGF0aG5hbWU6IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgfVxuICB8IHsgcmVhZG9ubHkga2luZDogXCJub25lXCIgfTtcblxuLyoqXG4gKiBgY3R4LnJvdXRpbmdgIGlzIHBlcnNpc3RlZCBpbnRvIHRoZSBtYW5pZmVzdCB2ZXJiYXRpbSBhbmQgdHlwZWQgYHVua25vd25gXG4gKiB0aGVyZSwgYmVjYXVzZSB0aGUgbWFuaWZlc3QgbXVzdCBub3QgZGVwZW5kIG9uIGBAbmV4dC9yb3V0aW5nYCAoaXQgaXMgYWxzb1xuICogcmVhZCBhdCBzeW50aCBieSB0aGUgQ0RLIGNvbnN0cnVjdHMpLiBEaXNwYXRjaCBpcyB0aGUgb25lIHBsYWNlIHRoYXQga25vd3NcbiAqIHRoZSByZWFsIHNoYXBlLCBzbyB0aGUgY2FzdCBsaXZlcyBoZXJlLlxuICpcbiAqIGBjdHgucm91dGluZ2AgaXMgYSBzdXBlcnNldCBvZiBgUmVzb2x2ZVJvdXRlc1BhcmFtc1tcInJvdXRlc1wiXWAg4oCUIGl0IGFsc29cbiAqIGNhcnJpZXMgYHJzY2Ag4oCUIHdoaWNoIGlzIHdoeSB0aGlzIGlzIGEgY2FzdCBhbmQgbm90IGFuIGFzc2lnbm1lbnQuXG4gKi9cbmZ1bmN0aW9uIGFzUm91dGVzKHJvdXRpbmc6IHVua25vd24pOiBSZXNvbHZlUm91dGVzUGFyYW1zW1wicm91dGVzXCJdIHtcbiAgcmV0dXJuIHJvdXRpbmcgYXMgUmVzb2x2ZVJvdXRlc1BhcmFtc1tcInJvdXRlc1wiXTtcbn1cblxuLyoqXG4gKiBMaWtld2lzZSBmb3IgYGkxOG5gOiBgTmV4dENvbmZpZ0NvbXBsZXRlW1wiaTE4blwiXWAgaXMgd2lkZXIgdGhhblxuICogYFJlc29sdmVSb3V0ZXNQYXJhbXNbXCJpMThuXCJdYCAoZXh0cmEgZmllbGRzLCBhbmQgYGxvY2FsZURldGVjdGlvbj86IGJvb2xlYW5gXG4gKiBhZ2FpbnN0IGBmYWxzZWApLCBhbmQgdGhlIG1hbmlmZXN0IHN0b3JlcyB0aGUgY29uZmlnIHZhbHVlIGFzLWlzLlxuICovXG5mdW5jdGlvbiBhc0kxOG4oaTE4bjogdW5rbm93biB8IG51bGwpOiBSZXNvbHZlUm91dGVzUGFyYW1zW1wiaTE4blwiXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpMThuID8gKGkxOG4gYXMgUmVzb2x2ZVJvdXRlc1BhcmFtc1tcImkxOG5cIl0pIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgRGlzcGF0Y2hlciB7XG4gIC8qKiBUaGUgNDA0IHRvIHJlbmRlciBmb3IgYSByZXF1ZXN0IHRvIGEgVVJMOyBzZWUge0BsaW5rIHN0YXR1c1RhcmdldHN9LiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbm90Rm91bmRGb3I6ICh1cmw6IFVSTCkgPT4gU3RhdHVzVGFyZ2V0O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcm91dGVzOiBSZXNvbHZlUm91dGVzUGFyYW1zW1wicm91dGVzXCJdO1xuICBwcml2YXRlIHJlYWRvbmx5IGkxOG46IFJlc29sdmVSb3V0ZXNQYXJhbXNbXCJpMThuXCJdIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlOiBSb3V0aW5nVGFibGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW1hZ2VQYXRobmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYWlsaW5nU2xhc2g6IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogRGlzcGF0Y2hlck9wdGlvbnMpIHtcbiAgICBjb25zdCB7IG1hbmlmZXN0IH0gPSBvcHRpb25zO1xuICAgIHRoaXMucm91dGVzID0gYXNSb3V0ZXMobWFuaWZlc3Qucm91dGluZyk7XG4gICAgdGhpcy5pMThuID0gYXNJMThuKG1hbmlmZXN0LmNvbmZpZy5pMThuKTtcbiAgICB0aGlzLnRyYWlsaW5nU2xhc2ggPSBtYW5pZmVzdC5jb25maWcudHJhaWxpbmdTbGFzaDtcbiAgICB0aGlzLnRhYmxlID0gYnVpbGRSb3V0aW5nVGFibGUobWFuaWZlc3QsIG9wdGlvbnMucHVibGljRmlsZXMgPz8gW10pO1xuICAgIHRoaXMuaW1hZ2VQYXRobmFtZSA9IGAke21hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aH0vX25leHQvaW1hZ2VgO1xuICAgIHRoaXMubm90Rm91bmRGb3IgPSBzdGF0dXNUYXJnZXRzKG1hbmlmZXN0LCA0MDQpO1xuICB9XG5cbiAgcHVibGljIGdldCBtYW5pZmVzdCgpOiBBZGFwdGVyTWFuaWZlc3Qge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWFuaWZlc3Q7XG4gIH1cblxuICAvKipcbiAgICogRHJvcCB0aGUgYHRyYWlsaW5nU2xhc2hgIHNsYXNoIGEgcmVzb2x2ZWQgcGF0aG5hbWUgbWF5IGNhcnJ5LCBzbyBpdCBjYW4gYmVcbiAgICogbG9va2VkIHVwIGluIGBlbnRyeXBvaW50c2AvYHN0YXRpY0ZpbGVzYCBhbmQgcmVuZGVyZWQgdW5kZXIgdGhlIHNhbWUgY2FjaGVcbiAgICoga2V5IGFzIGl0cyBwcmVyZW5kZXIuIEEgbm8tb3AgdW5sZXNzIHRoZSBhcHAgc2V0cyBgdHJhaWxpbmdTbGFzaGAuXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVBhdGhuYW1lKHBhdGhuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy50cmFpbGluZ1NsYXNoIHx8IHBhdGhuYW1lID09PSB1bmRlZmluZWQpIHJldHVybiBwYXRobmFtZTtcbiAgICByZXR1cm4gcGF0aG5hbWUubGVuZ3RoID4gMSAmJiBwYXRobmFtZS5lbmRzV2l0aChcIi9cIilcbiAgICAgID8gcGF0aG5hbWUuc2xpY2UoMCwgLTEpXG4gICAgICA6IHBhdGhuYW1lO1xuICB9XG5cbiAgLyoqIFRoZSByZXF1ZXN0IHBhdGggd2l0aCBgYmFzZVBhdGhgIHJlbW92ZWQsIHdoaWNoIGlzIHdoYXQgaTE4biBhcHBsaWVzIHRvLiAqL1xuICBwcml2YXRlIHdpdGhvdXRCYXNlUGF0aChwYXRobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gd2l0aG91dFBhdGhQcmVmaXgocGF0aG5hbWUsIHRoaXMubWFuaWZlc3QuY29uZmlnLmJhc2VQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgdGhlIGxvY2FsZSBpbiBmcm9udCBvZiBhIHJlcXVlc3QgZm9yIHRoZSBhcHAncyByb290ICpoZXJlKiwgd2hlbiB0aGVcbiAgICogbG9jYWxlIGlzIHRoZSBvbmUgdGhlIHJlcXVlc3QgaXMgYWxyZWFkeSBpbi5cbiAgICpcbiAgICogYHJlc29sdmVSb3V0ZXNgIHByZWZpeGVzIHRoZSBsb2NhbGUgaXRzZWxmLCBhcyBgJHtiYXNlUGF0aH0vJHtsb2NhbGV9JHtwYXRobmFtZX1gXG4gICAqIOKAlCB3aGljaCBmb3IgdGhlIHJvb3QgdHVybnMgYC9gIGludG8gYC9lbi1VUy9gLiBUaGUgc2xhc2gtc3RyaXBwaW5nIDMwOCB0aGF0XG4gICAqIGBuZXh0IGJ1aWxkYCBhbHdheXMgY29tcGlsZXMgaW50byBgcm91dGluZy5iZWZvcmVNaWRkbGV3YXJlYCB0aGVuIG1hdGNoZXMgaXQsXG4gICAqIHNvIGBHRVQgL2AgY2FtZSBiYWNrIGFzIGEgcmVkaXJlY3Qgbm8gYG5leHQgc3RhcnRgIHNlbmRzOiBtZWFzdXJlZCBhZ2FpbnN0XG4gICAqIGB0ZXN0L2UyZS9pMThuLXN1cHBvcnQtY2F0Y2hhbGxgLCB3aGVyZSBgL2AgYW5zd2VycyAyMDAuIE5leHQuanMncyBvd24gcm91dGVyXG4gICAqIHNwZWNpYWwtY2FzZXMgZXhhY3RseSB0aGlzIChgcmVzb2x2ZS1yb3V0ZXMudHNgOiBgcGF0aG5hbWUgPT09ICcvJyA/XG4gICAqIGAvJHtkZWZhdWx0TG9jYWxlfWAgOiDigKZgKS5cbiAgICpcbiAgICogV2l0aCBgdHJhaWxpbmdTbGFzaGAsIHRoZSBwcmVmaXhlZCByb290IGtlZXBzIGl0cyBzbGFzaCAoYC9lbi1VUy9gKTogdGhlXG4gICAqIHNsYXNoLSphZGRpbmcqIDMwOCB0aGF0IGJ1aWxkIGNvbXBpbGVzIGluc3RlYWQgbWF0Y2hlcyBgL2VuLVVTYCB0aGUgc2FtZVxuICAgKiB3YXksIGFuZCBgL2VuLVVTL2AgaXMgdGhlIGNhbm9uaWNhbCBVUkwgYG5leHQgc3RhcnRgIHNlcnZlcyB3aXRoIGEgMjAwLlxuICAgKlxuICAgKiBPbmx5IHRoZSByb290LCBhbmQgb25seSB3aGVuIG5vIHJlZGlyZWN0IGlzIG93ZWQ6IGEgcmVxdWVzdCB3aG9zZSBkZXRlY3RlZFxuICAgKiBsb2NhbGUgaXMgKm5vdCogdGhlIGRlZmF1bHQgaGFzIHRvIHJlYWNoIGByZXNvbHZlUm91dGVzYCwgd2hpY2ggYW5zd2VycyBpdFxuICAgKiB3aXRoIHRoZSAzMDcgTmV4dC5qcyBzZW5kcyDigJQgYWZ0ZXIgbWlkZGxld2FyZSBoYXMgaGFkIHRoZSByZXF1ZXN0LCB3aGljaCBpc1xuICAgKiB0aGUgb3JkZXJpbmcgdGhhdCBtYXR0ZXJzIGFuZCB0aGUgcmVhc29uIHRoaXMgZG9lcyBub3QgcmVkaXJlY3QgaXRzZWxmLlxuICAgKi9cbiAgcHJpdmF0ZSB3aXRoUm9vdExvY2FsZSh1cmw6IFVSTCwgaGVhZGVyczogSGVhZGVycyk6IFVSTCB7XG4gICAgY29uc3QgaTE4biA9IHRoaXMuaTE4bjtcbiAgICBpZiAoIWkxOG4pIHJldHVybiB1cmw7XG4gICAgY29uc3QgcGF0aG5hbWUgPSB0aGlzLndpdGhvdXRCYXNlUGF0aCh1cmwucGF0aG5hbWUpO1xuICAgIGlmIChwYXRobmFtZSAhPT0gXCIvXCIpIHJldHVybiB1cmw7XG5cbiAgICBjb25zdCBkZWZhdWx0TG9jYWxlID1cbiAgICAgIGRldGVjdERvbWFpbkxvY2FsZShpMThuLmRvbWFpbnMsIHVybC5ob3N0bmFtZSk/LmRlZmF1bHRMb2NhbGUgPz9cbiAgICAgIGkxOG4uZGVmYXVsdExvY2FsZTtcbiAgICBjb25zdCBkZXRlY3RlZCA9IGRldGVjdExvY2FsZSh7XG4gICAgICBwYXRobmFtZSxcbiAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICBjb29raWVIZWFkZXI6IGhlYWRlcnMuZ2V0KFwiY29va2llXCIpID8/IHVuZGVmaW5lZCxcbiAgICAgIGFjY2VwdExhbmd1YWdlSGVhZGVyOiBoZWFkZXJzLmdldChcImFjY2VwdC1sYW5ndWFnZVwiKSA/PyB1bmRlZmluZWQsXG4gICAgICBpMThuLFxuICAgIH0pO1xuICAgIGlmIChkZXRlY3RlZC5sb2NhbGUgIT09IGRlZmF1bHRMb2NhbGUpIHJldHVybiB1cmw7XG5cbiAgICBjb25zdCBwcmVmaXhlZCA9IG5ldyBVUkwodXJsLnRvU3RyaW5nKCkpO1xuICAgIHByZWZpeGVkLnBhdGhuYW1lID0gYCR7dGhpcy5tYW5pZmVzdC5jb25maWcuYmFzZVBhdGh9LyR7ZGVmYXVsdExvY2FsZX0ke1xuICAgICAgdGhpcy50cmFpbGluZ1NsYXNoID8gXCIvXCIgOiBcIlwiXG4gICAgfWA7XG4gICAgcmV0dXJuIHByZWZpeGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGFpciB0aGUgdHdvIHRoaW5ncyBgcmVzb2x2ZVJvdXRlc2AgZ2V0cyB3cm9uZyBhYm91dCBhIHJlZGlyZWN0IGl0IGJ1aWx0XG4gICAqIGZyb20gdGhlIGxvY2FsZS1wcmVmaXhlZCByb290IOKAlCB0aGUgc2FtZSBgJHtiYXNlUGF0aH0vJHtsb2NhbGV9JHtwYXRobmFtZX1gXG4gICAqIGNvbmNhdGVuYXRpb24gYXMgaW4ge0BsaW5rIHdpdGhSb290TG9jYWxlfSwgdGhpcyB0aW1lIHJlcG9ydGVkIGFzIGEgbG9jYXRpb246XG4gICAqXG4gICAqIC0gdGhlIHN0cmF5IHRyYWlsaW5nIHNsYXNoIChgL25sL2AsIHdoZXJlIE5leHQuanMgc2VuZHMgYC9ubGApLCB3aGljaFxuICAgKiAgIG90aGVyd2lzZSBjb3N0cyBhIHNlY29uZCByb3VuZCB0cmlwIHRvIHRoZSAzMDggdGhhdCBzdHJpcHMgaXQsIGFuZFxuICAgKiAtIHRoZSBhYnNvbHV0ZSBVUkwsIHdoZXJlIE5leHQuanMgc2VuZHMgYSBwYXRoLiBCb3RoIGFyZSBsZWdhbCwgYnV0IGEgdGVzdFxuICAgKiAgIGFzc2VydGluZyBgaGVhZGVycy5sb2NhdGlvbmAgc2VlcyB0aGUgZGlmZmVyZW5jZSwgYW5kIHNvIGRvZXMgYW55IGNsaWVudFxuICAgKiAgIGNvbXBhcmluZyBpdCB0byBhIGxpbmsuXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVJlZGlyZWN0TG9jYXRpb24obG9jYXRpb246IHN0cmluZywgcmVxdWVzdDogVVJMKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzb2x2ZWQ6IFVSTDtcbiAgICB0cnkge1xuICAgICAgcmVzb2x2ZWQgPSBuZXcgVVJMKGxvY2F0aW9uLCByZXF1ZXN0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBsb2NhdGlvbjtcbiAgICB9XG4gICAgaWYgKHJlc29sdmVkLm9yaWdpbiAhPT0gcmVxdWVzdC5vcmlnaW4pIHJldHVybiBsb2NhdGlvbjtcblxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMud2l0aG91dEJhc2VQYXRoKHJlc29sdmVkLnBhdGhuYW1lKTtcbiAgICBjb25zdCBpc0xvY2FsZVJvb3QgPVxuICAgICAgdGhpcy5pMThuICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICF0aGlzLnRyYWlsaW5nU2xhc2ggJiZcbiAgICAgIHRoaXMud2l0aG91dEJhc2VQYXRoKHJlcXVlc3QucGF0aG5hbWUpID09PSBcIi9cIiAmJlxuICAgICAgdGhpcy5pMThuLmxvY2FsZXMuc29tZSgobG9jYWxlKSA9PiB0YXJnZXQgPT09IGAvJHtsb2NhbGV9L2ApO1xuICAgIGlmIChpc0xvY2FsZVJvb3QpIHtcbiAgICAgIHJlc29sdmVkLnBhdGhuYW1lID0gcmVzb2x2ZWQucGF0aG5hbWUuc2xpY2UoMCwgLTEpO1xuICAgIH1cbiAgICByZXR1cm4gYCR7cmVzb2x2ZWQucGF0aG5hbWV9JHtyZXNvbHZlZC5zZWFyY2h9JHtyZXNvbHZlZC5oYXNofWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGBoZWFkZXJzKClgIHJ1bGVzIGEgcmVxdWVzdCBtYXRjaGVkLCBmb3IgYSByZXNwb25zZSBtaWRkbGV3YXJlIHdyb3RlXG4gICAqIGl0c2VsZi5cbiAgICpcbiAgICogVGhleSBjb21waWxlIGludG8gYHJvdXRpbmcuYmVmb3JlTWlkZGxld2FyZWAsIGFuZCBgcmVzb2x2ZVJvdXRlc2AgYXBwbGllc1xuICAgKiB0aGVtIHRoZXJlLCBidXQgd2hlbiBtaWRkbGV3YXJlIGFuc3dlcnMgaXQgcmV0dXJucyBgeyBtaWRkbGV3YXJlUmVzcG9uZGVkOlxuICAgKiB0cnVlIH1gIGFuZCBub3RoaW5nIGVsc2UsIHNvIHRoZXkgd2VyZSBsb3N0OiBhIG1pZGRsZXdhcmUgNDAxIHdlbnQgb3V0XG4gICAqIHdpdGhvdXQgdGhlIGFwcCdzIEhTVFMgYW5kIENTUC4gYG5leHQgc3RhcnRgIHNlbmRzIHRoZW0gd2l0aCBpdCAoaXRzXG4gICAqIGByZXNvbHZlLXJvdXRlcy5qc2Agc2V0cyB0aGVtIG9uIHRoZSByZXNwb25zZSBiZWZvcmUgbWlkZGxld2FyZSBydW5zKS4gU29cbiAgICogdGhhdCBvbmUgcGhhc2UgaXMgcnVuIGFnYWluIG9uIGl0cyBvd24g4oCUIG5vIG1pZGRsZXdhcmUsIG5vIGZpbGVzLCBub3RoaW5nXG4gICAqIGFmdGVyIGl0IOKAlCB3aGljaCBsZWF2ZXMgZXhhY3RseSB0aGUgaGVhZGVycyBpdCBzZXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJlZm9yZU1pZGRsZXdhcmVIZWFkZXJzKFxuICAgIHVybDogVVJMLFxuICAgIGhlYWRlcnM6IEhlYWRlcnMsXG4gICk6IFByb21pc2U8SGVhZGVycz4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc29sdmVSb3V0ZXMoe1xuICAgICAgdXJsLFxuICAgICAgYnVpbGRJZDogdGhpcy5tYW5pZmVzdC5idWlsZElkLFxuICAgICAgYmFzZVBhdGg6IHRoaXMubWFuaWZlc3QuY29uZmlnLmJhc2VQYXRoLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHJlcXVlc3RCb2R5OiBuZXcgQmxvYihbXSkuc3RyZWFtKCksXG4gICAgICBwYXRobmFtZXM6IFtdLFxuICAgICAgcm91dGVzOiB7XG4gICAgICAgIC4uLnRoaXMucm91dGVzLFxuICAgICAgICBtaWRkbGV3YXJlTWF0Y2hlcnM6IFtdLFxuICAgICAgICBiZWZvcmVGaWxlczogW10sXG4gICAgICAgIGFmdGVyRmlsZXM6IFtdLFxuICAgICAgICBkeW5hbWljUm91dGVzOiBbXSxcbiAgICAgICAgb25NYXRjaDogW10sXG4gICAgICAgIGZhbGxiYWNrOiBbXSxcbiAgICAgIH0sXG4gICAgICBpMThuOiB0aGlzLmkxOG4sXG4gICAgICBpbnZva2VNaWRkbGV3YXJlOiBhc3luYyAoKSA9PiAoe30pLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlc3VsdC5yZXNvbHZlZEhlYWRlcnMgPz8gdW5kZWZpbmVkKTtcbiAgICAvLyBBIGxvY2FsZS1kZXRlY3Rpb24gcmVkaXJlY3QgaXMgZGVjaWRlZCBhZnRlciBtaWRkbGV3YXJlLCBhbmQgbWlkZGxld2FyZVxuICAgIC8vIGFscmVhZHkgYW5zd2VyZWQsIHNvIGl0cyBgbG9jYXRpb25gIGlzIG5vdCBvd2VkLlxuICAgIGlmIChyZXN1bHQucmVkaXJlY3QpIHtcbiAgICAgIHJlc3BvbnNlSGVhZGVycy5kZWxldGUoXCJsb2NhdGlvblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlSGVhZGVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgVVJMIHRvIG9wdGltaXplLCBvbmNlIGAvX25leHQvaW1hZ2VgIGhhcyByZXNvbHZlZDogYXMgbWlkZGxld2FyZVxuICAgKiByZXdyb3RlIGl0LCBvciBhcyByZWNlaXZlZCDigJQgb3IsIHdoZW4gYSBgbmV4dC5jb25maWdgIHJld3JpdGUgaXMgd2hhdCBwdXRcbiAgICogdGhlIHJlcXVlc3Qgb24gdGhlIGltYWdlIHBhdGgsIHJlYnVpbHQgZnJvbSB0aGUgcXVlcnkgYHJlc29sdmVSb3V0ZXNgXG4gICAqIHJlc29sdmVkLCB3aGljaCBpcyB0aGUgb25seSBwbGFjZSB0aGF0IHJld3JpdGUncyBkZXN0aW5hdGlvbiBxdWVyeSBpcy5cbiAgICovXG4gIHByaXZhdGUgaW1hZ2VVcmwocmVzdWx0OiBSZXNvbHZlUm91dGVzUmVzdWx0LCByZWNlaXZlZDogVVJMKTogVVJMIHtcbiAgICBpZiAocmVjZWl2ZWQucGF0aG5hbWUgPT09IHRoaXMuaW1hZ2VQYXRobmFtZSkgcmV0dXJuIHJlY2VpdmVkO1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVjZWl2ZWQudG9TdHJpbmcoKSk7XG4gICAgdXJsLnBhdGhuYW1lID0gdGhpcy5pbWFnZVBhdGhuYW1lO1xuICAgIGlmIChyZXN1bHQucmVzb2x2ZWRRdWVyeSkge1xuICAgICAgdXJsLnNlYXJjaCA9IHRvU2VhcmNoKHJlc3VsdC5yZXNvbHZlZFF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkaXNwYXRjaChyZXF1ZXN0OiBEaXNwYXRjaFJlcXVlc3QpOiBQcm9taXNlPERpc3BhdGNoUmVzdWx0PiB7XG4gICAgLy8gQ29waWVkIGJlY2F1c2UgYHJlc29sdmVSb3V0ZXNgIGlzIGZyZWUgdG8gbXV0YXRlIHdoYXQgaXQgaXMgaGFuZGVkLCBhbmRcbiAgICAvLyB0aGUgY2FsbGVyJ3MgaGVhZGVycyBvYmplY3Qgb3V0bGl2ZXMgdGhpcyBjYWxsLlxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gbmV3IEhlYWRlcnMocmVxdWVzdC5oZWFkZXJzKTtcbiAgICAvLyBBIHNlY29uZCBjb3B5LCBhcyB0aGUgcmVxdWVzdCByZWFjaGVkIGBiZWZvcmVNaWRkbGV3YXJlYCwgZm9yXG4gICAgLy8ge0BsaW5rIGJlZm9yZU1pZGRsZXdhcmVIZWFkZXJzfS5cbiAgICBjb25zdCByZWNlaXZlZEhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGNvbnN0IHVybCA9IHRoaXMud2l0aFJvb3RMb2NhbGUocmVxdWVzdC51cmwsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICBsZXQgbWlkZGxld2FyZVJlcXVlc3RIZWFkZXJzOiBIZWFkZXJzIHwgdW5kZWZpbmVkO1xuICAgIGxldCBtaWRkbGV3YXJlUmV3cml0ZTogVVJMIHwgdW5kZWZpbmVkO1xuICAgIGxldCBtaWRkbGV3YXJlUmVzcG9uc2U6IFJlc3BvbnNlIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZVJvdXRlcyh7XG4gICAgICB1cmwsXG4gICAgICBidWlsZElkOiB0aGlzLm1hbmlmZXN0LmJ1aWxkSWQsXG4gICAgICBiYXNlUGF0aDogdGhpcy5tYW5pZmVzdC5jb25maWcuYmFzZVBhdGgsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIHJlcXVlc3RCb2R5OiByZXF1ZXN0LmJvZHksXG4gICAgICBwYXRobmFtZXM6IHRoaXMudGFibGUucGF0aG5hbWVzLFxuICAgICAgcm91dGVzOiB0aGlzLnJvdXRlcyxcbiAgICAgIGkxOG46IHRoaXMuaTE4bixcbiAgICAgIC8vIE9ubHkgY2FsbGVkIHdoZW4gYSBgbWlkZGxld2FyZU1hdGNoZXJzYCBlbnRyeSBtYXRjaGVzLCB3aGljaCBvbmx5IGFcbiAgICAgIC8vIGJ1aWxkIHdpdGggbWlkZGxld2FyZSBoYXMuXG4gICAgICBpbnZva2VNaWRkbGV3YXJlOiBhc3luYyAoY3R4KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmVzcG9uc2UsIC4uLm1pZGRsZXdhcmUgfSA9IGF3YWl0IHJlcXVlc3QuaW52b2tlTWlkZGxld2FyZSEoe1xuICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICB9KTtcbiAgICAgICAgbWlkZGxld2FyZVJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIC8vIGByZXNvbHZlUm91dGVzYCBkcm9wcyBgTWlkZGxld2FyZVJlc3VsdC5yZXF1ZXN0SGVhZGVyc2AgZW50aXJlbHk6IGl0XG4gICAgICAgIC8vIG5laXRoZXIgcmV0dXJucyB0aGVtIG5vciBtdXRhdGVzIHRoZSBgaGVhZGVyc2AgcGFzc2VkIGluLiBDYXB0dXJpbmdcbiAgICAgICAgLy8gdGhlbSBoZXJlIGlzIHdoYXQga2VlcHMgYE5leHRSZXNwb25zZS5uZXh0KHsgcmVxdWVzdDogeyBoZWFkZXJzIH0gfSlgXG4gICAgICAgIC8vIHdvcmtpbmcuXG4gICAgICAgIGlmIChtaWRkbGV3YXJlLnJlcXVlc3RIZWFkZXJzKSB7XG4gICAgICAgICAgbWlkZGxld2FyZVJlcXVlc3RIZWFkZXJzID0gbWlkZGxld2FyZS5yZXF1ZXN0SGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICAvLyBDYXB0dXJlZCBmb3IgdGhlIHNhbWUgcmVhc29uOiBgcmVzb2x2ZVJvdXRlc2Agcm91dGVzIHRoZSByZXdyaXR0ZW4gVVJMXG4gICAgICAgIC8vIGludGVybmFsbHkgYnV0IG5ldmVyIHJlcG9ydHMgaXQgYmFjaywgYW5kIGAvX25leHQvaW1hZ2VgIGlzIG1hdGNoZWRcbiAgICAgICAgLy8gaGVyZSByYXRoZXIgdGhhbiBieSBgcmVzb2x2ZVJvdXRlc2AgKHNlZSBiZWxvdyksIHNvIHRoaXMgaXMgdGhlIG9ubHlcbiAgICAgICAgLy8gd2F5IHRvIHNlZSB0aGUgcGF0aCBtaWRkbGV3YXJlIGFjdHVhbGx5IGFza2VkIGZvci5cbiAgICAgICAgaWYgKG1pZGRsZXdhcmUucmV3cml0ZSkge1xuICAgICAgICAgIG1pZGRsZXdhcmVSZXdyaXRlID0gbWlkZGxld2FyZS5yZXdyaXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaWRkbGV3YXJlO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlc3VsdC5yZXNvbHZlZEhlYWRlcnMgPz8gdW5kZWZpbmVkKTtcbiAgICAvLyBgQG5leHQvcm91dGluZ2AgZWNob2VzIHRoZSByZXdyaXRlIGl0IGZvbGxvd2VkIGludG8gYHJlc29sdmVkSGVhZGVyc2A7XG4gICAgLy8gTmV4dC5qcydzIG93biByb3V0ZXIgY29uc3VtZXMgdGhhdCBoZWFkZXIgcmF0aGVyIHRoYW4gc2VuZGluZyBpdCwgYW5kIHNvIGRvXG4gICAgLy8gd2Ug4oCUIGl0IGlzIGFuIGludGVybmFsIHJvdXRpbmcgc2lnbmFsLCBhbmQgZm9yd2FyZGluZyBpdCB3b3VsZCBleHBvc2UgdGhlXG4gICAgLy8gYXBwJ3MgcG9zdC1taWRkbGV3YXJlIHBhdGhzIHRvIGNsaWVudHMuXG4gICAgcmVzcG9uc2VIZWFkZXJzLmRlbGV0ZShcIngtbWlkZGxld2FyZS1yZXdyaXRlXCIpO1xuICAgIGNvbnN0IGZvcndhcmRlZEhlYWRlcnMgPSBtaWRkbGV3YXJlUmVxdWVzdEhlYWRlcnMgPz8gcmVxdWVzdEhlYWRlcnM7XG4gICAgY29uc3Qgc3RhdHVzID0gcmVzdWx0LnN0YXR1cztcblxuICAgIGlmIChyZXN1bHQubWlkZGxld2FyZVJlc3BvbmRlZCAmJiBtaWRkbGV3YXJlUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IFwibWlkZGxld2FyZS1yZXNwb25kZWRcIixcbiAgICAgICAgcmVzcG9uc2U6IG1pZGRsZXdhcmVSZXNwb25zZSxcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzOiBhd2FpdCB0aGlzLmJlZm9yZU1pZGRsZXdhcmVIZWFkZXJzKFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICByZWNlaXZlZEhlYWRlcnMsXG4gICAgICAgICksXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5leHRlcm5hbFJld3JpdGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IFwiZXh0ZXJuYWwtcmV3cml0ZVwiLFxuICAgICAgICB1cmw6IHJlc3VsdC5leHRlcm5hbFJld3JpdGUsXG4gICAgICAgIHJlcXVlc3RIZWFkZXJzOiBmb3J3YXJkZWRIZWFkZXJzLFxuICAgICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVkaXJlY3QgPSB0b1JlZGlyZWN0KHJlc3VsdCwgcmVzcG9uc2VIZWFkZXJzKTtcbiAgICBpZiAocmVkaXJlY3QpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6IFwicmVkaXJlY3RcIixcbiAgICAgICAgLi4ucmVkaXJlY3QsXG4gICAgICAgIGxvY2F0aW9uOiB0aGlzLm5vcm1hbGl6ZVJlZGlyZWN0TG9jYXRpb24oXG4gICAgICAgICAgcmVkaXJlY3QubG9jYXRpb24sXG4gICAgICAgICAgcmVxdWVzdC51cmwsXG4gICAgICAgICksXG4gICAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQm90aCBhcmUga2V5cyBpbnRvIGBlbnRyeXBvaW50c2AvYHN0YXRpY0ZpbGVzYCwgd2hpY2ggbmV2ZXIgY2FycnkgYVxuICAgIC8vIHRyYWlsaW5nIHNsYXNoOyBzZWUge0BsaW5rIHdpdGhUcmFpbGluZ1NsYXNoVmFyaWFudHN9LlxuICAgIGNvbnN0IHJlc29sdmVkUGF0aG5hbWUgPSB0aGlzLm5vcm1hbGl6ZVBhdGhuYW1lKHJlc3VsdC5yZXNvbHZlZFBhdGhuYW1lKTtcbiAgICAvLyBJbiBgcGF0aG5hbWVzYCAoc2VlIHtAbGluayBidWlsZFJvdXRpbmdUYWJsZX0pLCBzbyBpdCByZXNvbHZlcyBpbiB0aGVcbiAgICAvLyBmaWxlc3lzdGVtIHBoYXNlOiBhZnRlciBtaWRkbGV3YXJlIGFuZCBgYmVmb3JlRmlsZXNgLCBhbmQgYmVmb3JlIGFueVxuICAgIC8vIGR5bmFtaWMgcm91dGUsIHdoaWNoIGlzIGBuZXh0IHN0YXJ0YCdzIG9yZGVyLiBVbmxpc3RlZCwgYSByb290IGNhdGNoLWFsbFxuICAgIC8vIChgYXBwL1suLi5zbHVnXWApIG9yIGFueSB0d28tc2VnbWVudCBkeW5hbWljIHJvdXRlIHRvb2sgZXZlcnkgaW1hZ2VcbiAgICAvLyByZXF1ZXN0IGFzIGBzbHVnOiBbXCJfbmV4dFwiLCBcImltYWdlXCJdYC5cbiAgICBpZiAocmVzb2x2ZWRQYXRobmFtZSA9PT0gdGhpcy5pbWFnZVBhdGhuYW1lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiBcImltYWdlLW9wdGltaXphdGlvblwiLFxuICAgICAgICB1cmw6IHRoaXMuaW1hZ2VVcmwocmVzdWx0LCBtaWRkbGV3YXJlUmV3cml0ZSA/PyByZXF1ZXN0LnVybCksXG4gICAgICAgIHJlcXVlc3RIZWFkZXJzOiBmb3J3YXJkZWRIZWFkZXJzLFxuICAgICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAocmVzb2x2ZWRQYXRobmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzdGF0aWNGaWxlID0gdGhpcy50YWJsZS5zdGF0aWNGaWxlcy5nZXQocmVzb2x2ZWRQYXRobmFtZSk7XG4gICAgICBjb25zdCBhc1N0YXRpY0ZpbGUgPSAoXG4gICAgICAgIGZpbGU6IFN0YXRpY0ZpbGVUYXJnZXQsXG4gICAgICApOiBEaXNwYXRjaFN0YXRpY0ZpbGVSZXN1bHQgPT4gKHtcbiAgICAgICAga2luZDogXCJzdGF0aWMtZmlsZVwiLFxuICAgICAgICBwYXRobmFtZTogcmVzb2x2ZWRQYXRobmFtZSxcbiAgICAgICAgZmlsZVBhdGg6IGZpbGUuZmlsZVBhdGgsXG4gICAgICAgIHNvdXJjZTogZmlsZS5zb3VyY2UsXG4gICAgICAgIHJlcXVlc3RIZWFkZXJzOiBmb3J3YXJkZWRIZWFkZXJzLFxuICAgICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH0pO1xuICAgICAgLy8gQWhlYWQgb2YgdGhlIGVudHJ5cG9pbnRzLCB3aGljaCBpcyBgbmV4dCBzdGFydGAncyBvcmRlcjogaXRzIGZpbGVzeXN0ZW1cbiAgICAgIC8vIGNoZWNrIHRyaWVzIGBfbmV4dC9zdGF0aWNgIGFuZCB0aGVuIGBwdWJsaWMvYCBiZWZvcmUgYW55IGFwcCBvciBwYWdlXG4gICAgICAvLyByb3V0ZSwgc28gYHB1YmxpYy9yb2JvdHMudHh0YCBiZWF0cyBgYXBwL3JvYm90cy50c2AgYW5kXG4gICAgICAvLyBgcHVibGljL2Zhdmljb24uaWNvYCBiZWF0cyBgYXBwL2Zhdmljb24uaWNvYC5cbiAgICAgIGlmIChzdGF0aWNGaWxlICYmIHN0YXRpY0ZpbGUuc291cmNlICE9PSBcInNlcnZlclwiKSB7XG4gICAgICAgIHJldHVybiBhc1N0YXRpY0ZpbGUoc3RhdGljRmlsZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbnRyeXBvaW50ID0gdGhpcy5tYW5pZmVzdC5lbnRyeXBvaW50c1tyZXNvbHZlZFBhdGhuYW1lXTtcbiAgICAgIGlmIChlbnRyeXBvaW50KSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gcmVwYWlyUm91dGVQYXJhbVF1ZXJ5KFxuICAgICAgICAgIHJlc3VsdC5yZXNvbHZlZFF1ZXJ5ID8/IHt9LFxuICAgICAgICAgIHJlc3VsdC5yb3V0ZU1hdGNoZXMgPz8ge30sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2luZDogXCJlbnRyeXBvaW50XCIsXG4gICAgICAgICAgZW50cnlwb2ludCxcbiAgICAgICAgICByZXNvbHZlZFBhdGhuYW1lLFxuICAgICAgICAgIC8vIGBpbnZvY2F0aW9uVGFyZ2V0YCBpcyBhbHdheXMgcHJlc2VudCBhbG9uZ3NpZGUgYHJlc29sdmVkUGF0aG5hbWVgIGluXG4gICAgICAgICAgLy8gcHJhY3RpY2U7IHRoZSBmYWxsYmFjayBrZWVwcyBhIGBuZXh0YCBzaGFwZSBjaGFuZ2UgZnJvbSBjcmFzaGluZy5cbiAgICAgICAgICBpbnZvY2F0aW9uVGFyZ2V0OiB7XG4gICAgICAgICAgICBwYXRobmFtZTpcbiAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVQYXRobmFtZShyZXN1bHQuaW52b2NhdGlvblRhcmdldD8ucGF0aG5hbWUpID8/XG4gICAgICAgICAgICAgIHJlc29sdmVkUGF0aG5hbWUsXG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVlc3RIZWFkZXJzOiBmb3J3YXJkZWRIZWFkZXJzLFxuICAgICAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGljRmlsZSkge1xuICAgICAgICByZXR1cm4gYXNTdGF0aWNGaWxlKHN0YXRpY0ZpbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHsga2luZDogXCJyZXNwb25zZVwiLCBzdGF0dXMsIHJlc3BvbnNlSGVhZGVycyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkVXJsID0gbWlkZGxld2FyZVJld3JpdGUgPz8gcmVxdWVzdC51cmw7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IFwibm90LWZvdW5kXCIsXG4gICAgICBwYXRobmFtZTogcmVzb2x2ZWRQYXRobmFtZSA/PyByZXNvbHZlZFVybC5wYXRobmFtZSxcbiAgICAgIHJlcXVlc3RIZWFkZXJzOiBmb3J3YXJkZWRIZWFkZXJzLFxuICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgIH07XG4gIH1cbn1cblxuLyoqIEEgc3RhdGljIGZpbGUsIGFzIGRpc3BhdGNoIHJlc29sdmVzIG9uZS4gKi9cbmludGVyZmFjZSBTdGF0aWNGaWxlVGFyZ2V0IHtcbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc291cmNlOiBTdGF0aWNGaWxlU291cmNlO1xufVxuXG4vKipcbiAqIFdoYXQgZGlzcGF0Y2ggbWF0Y2hlcyBhIHJlcXVlc3QgYWdhaW5zdCwgZGVyaXZlZCBvbmNlIGZyb20gdGhlIG1hbmlmZXN0IGFuZFxuICogYHB1YmxpYy9gOiB3aXRoIGEgZmV3IHRob3VzYW5kIGBwdWJsaWMvYCBmaWxlcyB0aGUgZGVyaXZhdGlvbiB3b3VsZCBiZSBtb3N0XG4gKiBvZiB0aGUgY29zdCBvZiBhIGRpc3BhdGNoLlxuICovXG5pbnRlcmZhY2UgUm91dGluZ1RhYmxlIHtcbiAgLyoqXG4gICAqIEV2ZXJ5IHBhdGhuYW1lIGByZXNvbHZlUm91dGVzYCBtYXkgbWF0Y2g6IHRoZSBtYW5pZmVzdCdzLCBldmVyeSBzcGVsbGluZyBvZlxuICAgKiBldmVyeSBzdGF0aWMgZmlsZSwgYW5kIOKAlCBmb3IgYSBgdHJhaWxpbmdTbGFzaGAgYXBwIOKAlCB0aGUgc2xhc2ggdmFyaWFudHMuXG4gICAqL1xuICByZWFkb25seSBwYXRobmFtZXM6IHN0cmluZ1tdO1xuICAvKiogRXZlcnkgc3BlbGxpbmcgYSBzdGF0aWMgZmlsZSBpcyByZXF1ZXN0ZWQgYnkg4oaSIHRoZSBmaWxlLiAqL1xuICByZWFkb25seSBzdGF0aWNGaWxlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBTdGF0aWNGaWxlVGFyZ2V0Pjtcbn1cblxuLyoqXG4gKiBCdWlsZCBvdXRwdXRzIGZpcnN0LCB0aGVuIGBwdWJsaWMvYCBvbiB0b3Agb2YgdGhlbSwgZXhjZXB0IG92ZXJcbiAqIGBfbmV4dC9zdGF0aWNgOiB0aGF0IGlzIGBuZXh0IHN0YXJ0YCdzIHByZWNlZGVuY2UgKHNlZVxuICoge0BsaW5rIERpc3BhdGNoZXIuZGlzcGF0Y2h9KS5cbiAqXG4gKiBBIGBwdWJsaWMvYCBmaWxlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgaXRzIHBhdGhuYW1lIHdpdGggdGhlIGRlZmF1bHQgbG9jYWxlIGluXG4gKiBmcm9udCwgdG9vLCBmb3IgYW4gaTE4biBhcHAuIGByZXNvbHZlUm91dGVzYCBwdXRzIGEgbG9jYWxlIG9uIGV2ZXJ5IHBhdGhcbiAqIG91dHNpZGUgYC9fbmV4dC9gIGFuZCBgL2FwaS9gIGJlZm9yZSBpdCBtYXRjaGVzLCBzbyBgL3Rlc3QudHh0YCBpcyBsb29rZWQgdXBcbiAqIGFzIGAvZW4tVVMvdGVzdC50eHRgIGFuZCBuZXZlciBtYXRjaGVkIHRoZSBiYXJlIGtleTogbm8gYHB1YmxpYy9gIGZpbGVcbiAqIHJlc29sdmVkIGluIGFuIGkxOG4gYXBwIGF0IGFsbC4gYG5leHQgc3RhcnRgIHN0cmlwcyB0aGUgZGVmYXVsdCBsb2NhbGUg4oCUIGFuZFxuICogZWFjaCBkb21haW4ncyDigJQgb2ZmIGEgYHB1YmxpYy9gIHJlcXVlc3QgYW5kIG5vIG90aGVyIGxvY2FsZSAoZmlsZXN5c3RlbS5qczpcbiAqIFwibGVnYWN5IGJlaGF2aW9yIGFsbG93cyB2aXNpdGluZyBzdGF0aWMgYXNzZXRzIHVuZGVyIGRlZmF1bHQgbG9jYWxlIGJ1dCBub1xuICogb3RoZXIgbG9jYWxlXCIpLCB3aGljaCB0aGVzZSBlbnRyaWVzIHJlcHJvZHVjZTogYC9lbi1VUy90ZXN0LnR4dGAgc2VydmVzIGFuZFxuICogYC9mci90ZXN0LnR4dGAgZG9lcyBub3QuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUm91dGluZ1RhYmxlKFxuICBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0LFxuICBwdWJsaWNGaWxlczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBSb3V0aW5nVGFibGUge1xuICBjb25zdCB7IGJhc2VQYXRoLCB0cmFpbGluZ1NsYXNoIH0gPSBtYW5pZmVzdC5jb25maWc7XG4gIGNvbnN0IHN0YXRpY0ZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIFN0YXRpY0ZpbGVUYXJnZXQ+KCk7XG4gIGNvbnN0IG5leHRTdGF0aWNQcmVmaXggPSBgJHtiYXNlUGF0aH0vX25leHQvc3RhdGljL2A7XG5cbiAgZm9yIChjb25zdCBbcGF0aG5hbWUsIGZpbGVQYXRoXSBvZiBPYmplY3QuZW50cmllcyhtYW5pZmVzdC5zdGF0aWNGaWxlcykpIHtcbiAgICBjb25zdCB0YXJnZXQ6IFN0YXRpY0ZpbGVUYXJnZXQgPSB7XG4gICAgICBmaWxlUGF0aCxcbiAgICAgIHNvdXJjZTogcGF0aG5hbWUuc3RhcnRzV2l0aChuZXh0U3RhdGljUHJlZml4KSA/IFwibmV4dC1zdGF0aWNcIiA6IFwic2VydmVyXCIsXG4gICAgfTtcbiAgICAvLyBUaGUga2V5IGFzIE5leHQuanMgcmVwb3J0ZWQgaXQsIGFuZCB0aGVuIGFzIGEgcmVxdWVzdCBzcGVsbHMgaXQ6IGEgYnVpbGRcbiAgICAvLyBvdXRwdXQncyBwYXRobmFtZSBpcyB0aGUgZmlsZSdzIG93biBuYW1lLCB1bmVuY29kZWQsIGFuZCB0aGUgSFRNTCB0aGF0XG4gICAgLy8gbG9hZHMgaXQgcGVyY2VudC1lbmNvZGVzIGl0LiBgYXBwL2lzci9baWRdL3BhZ2UudHN4YCdzIHdlYnBhY2sgY2h1bmsgaXNcbiAgICAvLyBgL19uZXh0L3N0YXRpYy9jaHVua3MvYXBwL2lzci9baWRdL3BhZ2UtPGhhc2g+LmpzYCBpbiB0aGUgb3V0cHV0cyBhbmRcbiAgICAvLyBg4oCmL2lzci8lNUJpZCU1RC9wYWdlLTxoYXNoPi5qc2AgaW4gdGhlIGA8c2NyaXB0PmAgdGFnLlxuICAgIGZvciAoY29uc3Qgc3BlbGxpbmcgb2YgW3BhdGhuYW1lLCAuLi5yZXF1ZXN0U3BlbGxpbmdzKHBhdGhuYW1lKV0pIHtcbiAgICAgIGlmICghc3RhdGljRmlsZXMuaGFzKHNwZWxsaW5nKSkge1xuICAgICAgICBzdGF0aWNGaWxlcy5zZXQoc3BlbGxpbmcsIHRhcmdldCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHVibGljRGlyID0gcHVibGljRGlyS2V5KG1hbmlmZXN0KTtcbiAgY29uc3QgaTE4biA9IGFzSTE4bihtYW5pZmVzdC5jb25maWcuaTE4bik7XG4gIGNvbnN0IGxvY2FsZVByZWZpeGVzID0gW1xuICAgIFwiXCIsXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGkxOG5cbiAgICAgICAgPyBbXG4gICAgICAgICAgICBpMThuLmRlZmF1bHRMb2NhbGUsXG4gICAgICAgICAgICAuLi4oaTE4bi5kb21haW5zID8/IFtdKS5tYXAoKGRvbWFpbikgPT4gZG9tYWluLmRlZmF1bHRMb2NhbGUpLFxuICAgICAgICAgIF0ubWFwKChsb2NhbGUpID0+IGAvJHtsb2NhbGV9YClcbiAgICAgICAgOiBbXSxcbiAgICApLFxuICBdO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgcHVibGljRmlsZXMpIHtcbiAgICBjb25zdCB0YXJnZXQ6IFN0YXRpY0ZpbGVUYXJnZXQgPSB7XG4gICAgICBmaWxlUGF0aDogYCR7cHVibGljRGlyfS8ke2ZpbGV9YCxcbiAgICAgIHNvdXJjZTogXCJwdWJsaWNcIixcbiAgICB9O1xuICAgIGZvciAoY29uc3Qgc3BlbGxpbmcgb2YgcmVxdWVzdFNwZWxsaW5ncyhgLyR7ZmlsZX1gKSkge1xuICAgICAgZm9yIChjb25zdCBwcmVmaXggb2YgbG9jYWxlUHJlZml4ZXMpIHtcbiAgICAgICAgY29uc3QgcGF0aG5hbWUgPSBgJHtiYXNlUGF0aH0ke3ByZWZpeH0ke3NwZWxsaW5nfWA7XG4gICAgICAgIGlmIChzdGF0aWNGaWxlcy5nZXQocGF0aG5hbWUpPy5zb3VyY2UgIT09IFwibmV4dC1zdGF0aWNcIikge1xuICAgICAgICAgIHN0YXRpY0ZpbGVzLnNldChwYXRobmFtZSwgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGAvX25leHQvaW1hZ2VgIGlzIG5vdCBhbiBhZGFwdGVyIG91dHB1dCwgYnV0IGl0IGlzIGEgZmlsZXN5c3RlbSByb3V0ZSB0b1xuICAvLyBgbmV4dCBzdGFydGAgKGBmaWxlc3lzdGVtLmpzYCBhbnN3ZXJzIGl0IGFzIGBuZXh0SW1hZ2VgKSwgYW5kIGxpc3RpbmcgaXQgaXNcbiAgLy8gd2hhdCBsZXRzIGl0IHJlc29sdmUgYWhlYWQgb2YgdGhlIGR5bmFtaWMgcm91dGVzOyBzZWVcbiAgLy8ge0BsaW5rIERpc3BhdGNoZXIuZGlzcGF0Y2h9LlxuICBjb25zdCBwYXRobmFtZXMgPSBbXG4gICAgLi4ubmV3IFNldChbXG4gICAgICAuLi5tYW5pZmVzdC5wYXRobmFtZXMsXG4gICAgICAuLi5zdGF0aWNGaWxlcy5rZXlzKCksXG4gICAgICBgJHtiYXNlUGF0aH0vX25leHQvaW1hZ2VgLFxuICAgIF0pLFxuICBdO1xuICByZXR1cm4ge1xuICAgIHBhdGhuYW1lczogdHJhaWxpbmdTbGFzaCA/IHdpdGhUcmFpbGluZ1NsYXNoVmFyaWFudHMocGF0aG5hbWVzKSA6IHBhdGhuYW1lcyxcbiAgICBzdGF0aWNGaWxlcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgd2F5cyBhIHJlcXVlc3Qgc3BlbGxzIGFuIHVuZW5jb2RlZCBwYXRoLCBmb3IgdGhlIGV4YWN0IG1hdGNoXG4gKiBgQG5leHQvcm91dGluZ2AgZG9lcyBhZ2FpbnN0IGBwYXRobmFtZXNgLlxuICpcbiAqIFR3bywgYmVjYXVzZSB0aGVyZSBhcmUgdHdvIHdheXMgdG8gd3JpdGUgYSBsaW5rIHRvIGBwdWJsaWMvaW1hZ2VzL2xvZ29AMngucG5nYFxuICogYW5kIGEgYnJvd3NlciBzZW5kcyBlYWNoIGFzIHdyaXR0ZW46IGAvaW1hZ2VzL2xvZ29AMngucG5nYCwgd2hpY2ggdGhlIFdIQVRXR1xuICogVVJMIHBhcnNlciBsZWF2ZXMgYWxvbmUg4oCUIGl0IG9ubHkgZW5jb2RlcyBzcGFjZXMsIHF1b3RlcywgYCNgLCBgP2AsIGA8PmAsXG4gKiBgYCBgIGBgLCBge31gIGFuZCBub24tQVNDSUkgaW4gYSBwYXRoIOKAlCBhbmQgYC9pbWFnZXMvbG9nbyU0MDJ4LnBuZ2AsIHdoaWNoIGlzXG4gKiBgZW5jb2RlVVJJQ29tcG9uZW50YCBhIHNlZ21lbnQgYXQgYSB0aW1lIGFuZCBpcyBob3cgTmV4dC5qcyBrZXlzIGl0cyBvd25cbiAqIGBwdWJsaWMvYCBzZXQgKGBlbmNvZGVVUklQYXRoYCkuIEZvciBtb3N0IG5hbWVzIHRoZSB0d28gYXJlIHRoZSBzYW1lIHN0cmluZztcbiAqIHRoZXkgZGlmZmVyIGZvciBgQCArICYgLCA7ID0gJCA6IFsgXWAgYW5kIHRoZSBsaWtlLCBhbmQgYSBrZXkgaW4gb25seSB0aGVcbiAqIHNlY29uZCBmb3JtIDQwNCdkIGV2ZXJ5IGBsb2dvQDJ4LnBuZ2AsIGBjKysuc3ZnYCBhbmQgYGljb25bMV0ucG5nYC5cbiAqXG4gKiBgJWAgaXMgZW5jb2RlZCBpbiBib3RoLCBzaW5jZSBhIGxpdGVyYWwgYCVgIGluIGEgbmFtZSBjYW4gb25seSBiZSByZXF1ZXN0ZWRcbiAqIGFzIGAlMjVgOyBzbyBhcmUgYD9gIGFuZCBgI2AsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBlbmQgdGhlIHBhdGgsIGFuZCBgXFxgLFxuICogd2hpY2ggdGhlIHBhcnNlciB0dXJucyBpbnRvIGAvYC5cbiAqL1xuZnVuY3Rpb24gcmVxdWVzdFNwZWxsaW5ncyhwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gIGNvbnN0IGVuY29kZWQgPSBzZWdtZW50cy5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKTtcbiAgY29uc3QgcGFyc2VkID0gbmV3IFVSTChcbiAgICBzZWdtZW50c1xuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC5yZXBsYWNlKC9bJT8jXFxcXF0vZywgZW5jb2RlVVJJQ29tcG9uZW50KSlcbiAgICAgIC5qb2luKFwiL1wiKSxcbiAgICBcImh0dHA6Ly9uXCIsXG4gICkucGF0aG5hbWU7XG4gIHJldHVybiBwYXJzZWQgPT09IGVuY29kZWQgPyBbZW5jb2RlZF0gOiBbZW5jb2RlZCwgcGFyc2VkXTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIHR3byBzaGFwZXMgYHJlc29sdmVSb3V0ZXNgIHJlcG9ydHMgYSByZWRpcmVjdCBpbi5cbiAqXG4gKiBgUmVzb2x2ZVJvdXRlc1Jlc3VsdC5yZWRpcmVjdGAgaXMgZG9jdW1lbnRlZCwgYW5kIGFuIGkxOG4gbG9jYWxlLWRldGVjdGlvbiAzMDdcbiAqIGFycml2ZXMgdGhhdCB3YXksIGJ1dCB0aGUgcmVzdCDigJQgdGhlIHNsYXNoLXN0cmlwcGluZyAzMDgsIGEgbWlkZGxld2FyZVxuICogYE5leHRSZXNwb25zZS5yZWRpcmVjdCgpYCDigJQgYXJyaXZlIGluc3RlYWQgYXMgYSBiYXJlIGBzdGF0dXNgIHdpdGggYGxvY2F0aW9uYFxuICogaW4gYHJlc29sdmVkSGVhZGVyc2AuIGBuZXh0LmNvbmZpZ2AgYHJlZGlyZWN0cygpYCB0b286IHRoZXkgY29tcGlsZSB0byByb3V0ZXNcbiAqIGNhcnJ5aW5nIGBoZWFkZXJzOiB7IExvY2F0aW9uIH1gIHBsdXMgYHN0YXR1c2AuIEJvdGggc2hhcGVzIGFyZSBoYW5kbGVkLCBhbmRcbiAqIHtAbGluayBEaXNwYXRjaGVyLm5vcm1hbGl6ZVJlZGlyZWN0TG9jYXRpb259IHRoZW4gcHV0cyB0aGUgbG9jYXRpb24gaXRzZWxmIGluXG4gKiB0aGUgZm9ybSBOZXh0LmpzIHNlbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9SZWRpcmVjdChcbiAgcmVzdWx0OiBSZXNvbHZlUm91dGVzUmVzdWx0LFxuICByZXNwb25zZUhlYWRlcnM6IEhlYWRlcnMsXG4pOiB7IGxvY2F0aW9uOiBzdHJpbmc7IHN0YXR1czogbnVtYmVyIH0gfCB1bmRlZmluZWQge1xuICBpZiAocmVzdWx0LnJlZGlyZWN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uOiByZXN1bHQucmVkaXJlY3QudXJsLmhyZWYsXG4gICAgICBzdGF0dXM6IHJlc3VsdC5yZWRpcmVjdC5zdGF0dXMsXG4gICAgfTtcbiAgfVxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlSGVhZGVycy5nZXQoXCJsb2NhdGlvblwiKTtcbiAgaWYgKFxuICAgIGxvY2F0aW9uICE9PSBudWxsICYmXG4gICAgcmVzdWx0LnN0YXR1cyAhPT0gdW5kZWZpbmVkICYmXG4gICAgcmVzdWx0LnN0YXR1cyA+PSAzMDAgJiZcbiAgICByZXN1bHQuc3RhdHVzIDwgNDAwXG4gICkge1xuICAgIHJldHVybiB7IGxvY2F0aW9uLCBzdGF0dXM6IHJlc3VsdC5zdGF0dXMgfTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEFkZCBgPHBhdGhuYW1lPi9gIGFsb25nc2lkZSBldmVyeSByb3V0ZSBwYXRobmFtZSwgZm9yIGEgYHRyYWlsaW5nU2xhc2hgIGFwcC5cbiAqXG4gKiBgdHJhaWxpbmdTbGFzaDogdHJ1ZWAgbWFrZXMgYC9hL2AgdGhlIGNhbm9uaWNhbCBVUkwg4oCUIE5leHQuanMgY29tcGlsZXMgYVxuICogYHByaW9yaXR5YCAzMDggZnJvbSBgL2FgIHRvIGAvYS9gIGludG8gYHJvdXRpbmcuYmVmb3JlTWlkZGxld2FyZWAsIGFuZCB0aGF0XG4gKiByZWRpcmVjdCBpcyB0aGUgKmZpcnN0KiB0aGluZyBgcmVzb2x2ZVJvdXRlc2AgYXBwbGllcy4gQnV0IHRoZSBidWlsZCdzIG91dHB1dFxuICogcGF0aG5hbWVzIGhhdmUgbm8gdHJhaWxpbmcgc2xhc2ggKGAvYWAsIGAvYXBpL3JldmFsaWRhdGVgKSwgYW5kXG4gKiBgQG5leHQvcm91dGluZ2AgbWF0Y2hlcyB0aGVtIGJ5IGV4YWN0IHN0cmluZyBlcXVhbGl0eSB3aXRoIG5vIG5vcm1hbGl6YXRpb24gb2ZcbiAqIGl0cyBvd24uIFNvIGV2ZXJ5IGNhbm9uaWNhbCBVUkwgaW4gc3VjaCBhbiBhcHAgcmVzb2x2ZWQgdG8gbm90aGluZzogYnJvd3NlcnNcbiAqIGZvbGxvd2VkIHRoZSAzMDggdG8gYC9hL2AgYW5kIGdvdCBhIDQwNCwgYW5kIGBmZXRjaCgnL2FwaS9yZXZhbGlkYXRlJylgIGdvdFxuICogdGhlIDQwNCAqcGFnZSog4oCUIG1lYXN1cmVkIGFnYWluc3QgbmV4dC5qcydzIGB0ZXN0L2UyZS9hcHAtZGlyL3RyYWlsaW5nc2xhc2hgLFxuICogd2hlcmUgNiBvZiA4IGNhc2VzIGZhaWxlZCB0aGlzIHdheS4gRHluYW1pYyByb3V0ZXMgZXNjYXBlZCBpdCBvbmx5IGJlY2F1c2VcbiAqIHRoZWlyIGBzb3VyY2VSZWdleGAgaGFwcGVucyB0byBlbmQgaW4gYCg/Oi8pP2AuXG4gKlxuICogTm9ybWFsaXppbmcgdGhlIHJlcXVlc3QgVVJMIGJlZm9yZSBgcmVzb2x2ZVJvdXRlc2AgaW5zdGVhZCB3b3VsZCBiZSB3cm9uZzogdGhlXG4gKiBhZGQtc2xhc2ggcmVkaXJlY3QgbWF0Y2hlcyB0aGUgKnNsYXNobGVzcyogcGF0aCwgc28gYSBub3JtYWxpemVkIGAvYS9gIHdvdWxkXG4gKiBjb21lIGJhY2sgYXMgYSAzMDggdG8gYC9hL2AgYW5kIGxvb3AuIFRlYWNoaW5nIHRoZSBtYXRjaCBhYm91dCB0aGUgc2xhc2ggYW5kXG4gKiBub3JtYWxpemluZyBpdCBvZmYgdGhlICpyZXN1bHQqICh7QGxpbmsgRGlzcGF0Y2hlci5ub3JtYWxpemVQYXRobmFtZX0pIGtlZXBzXG4gKiB0aGUgcmVkaXJlY3QgZXhhY3RseSBhcyBOZXh0LmpzIGNvbXBpbGVkIGl0LlxuICpcbiAqIFBhdGhuYW1lcyB3aG9zZSBsYXN0IHNlZ21lbnQgaGFzIGFuIGV4dGVuc2lvbiBhcmUgc2tpcHBlZDogdGhvc2UgYXJlIHN0YXRpY1xuICogZmlsZXMsIGFuZCBOZXh0LmpzIGNvbXBpbGVzIHRoZSBvcHBvc2l0ZSByZWRpcmVjdCBmb3IgdGhlbSAoYC94LmpzL2Ag4oaSIDMwOFxuICogYC94LmpzYCksIHdoaWNoIHRoaXMgbXVzdCBub3Qgc2hhZG93LlxuICovXG5mdW5jdGlvbiB3aXRoVHJhaWxpbmdTbGFzaFZhcmlhbnRzKHBhdGhuYW1lczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHZhcmlhbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhdGhuYW1lIG9mIHBhdGhuYW1lcykge1xuICAgIHZhcmlhbnRzLnB1c2gocGF0aG5hbWUpO1xuICAgIGlmIChwYXRobmFtZSAhPT0gXCIvXCIgJiYgIS9cXC5bXi9dKyQvLnRlc3QocGF0aG5hbWUpKSB7XG4gICAgICB2YXJpYW50cy5wdXNoKGAke3BhdGhuYW1lfS9gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhcmlhbnRzO1xufVxuXG4vKipcbiAqIENvcnJlY3QgdGhlIGBueHRQYCByb3V0ZSBwYXJhbXMgaW4gYSByZXNvbHZlZCBxdWVyeSBmcm9tIGByb3V0ZU1hdGNoZXNgLlxuICpcbiAqIGBAbmV4dC9yb3V0aW5nYCBleHBhbmRzIGEgZHluYW1pYyByb3V0ZSdzIGRlc3RpbmF0aW9uXG4gKiAoYC9baWRdL1tpZDJdP254dFBpZD0kbnh0UGlkJm54dFBpZDI9JG54dFBpZDJgKSBieSBsb29waW5nIG92ZXIgdGhlIHNvdXJjZVxuICogcmVnZXgncyBuYW1lZCBncm91cHMgYW5kIGRvaW5nIG9uZSBnbG9iYWwgc3RyaW5nIHJlcGxhY2UgcGVyIGdyb3VwIG5hbWUuIEdyb3VwXG4gKiBuYW1lcyBhcmUgc3Vic3RpdHV0ZWQgaW4gaW5zZXJ0aW9uIG9yZGVyLCBzbyBgJG54dFBpZGAg4oCUIGEgKnByZWZpeCogb2ZcbiAqIGAkbnh0UGlkMmAg4oCUIGlzIHJlcGxhY2VkIGZpcnN0IGFuZCBsZWF2ZXMgdGhlIHRyYWlsaW5nIGAyYCBiZWhpbmQgYXMgYVxuICogbGl0ZXJhbDogYC9hL2JgIHJlc29sdmVzIHdpdGggYG54dFBpZDI9YTJgIGluc3RlYWQgb2YgYG54dFBpZDI9YmAuIE5leHQuanNcbiAqIHJlY292ZXJzIGBwYXJhbXNgIGZyb20gZXhhY3RseSB0aGVzZSBxdWVyeSB2YWx1ZXMgKGBSb3V0ZU1vZHVsZS5wcmVwYXJlYCksIHNvXG4gKiB0aGUgcGFnZSByZW5kZXJzIGBpZDI6IFwiYTJcImAg4oCUIG1lYXN1cmVkIGFnYWluc3RcbiAqIGB0ZXN0L2UyZS9hcHAtZGlyL3VzZS1wYXJhbXNgLCB3aG9zZSBmaXh0dXJlIGlzIGBhcHAvW2lkXS9baWQyXS9wYWdlLnRzeGAuXG4gKlxuICogYHJvdXRlTWF0Y2hlc2AgaXMgdGhlIHJhdyBjYXB0dXJlIG1hcCwgYmVmb3JlIGFueSBkZXN0aW5hdGlvbiBleHBhbnNpb24sIHNvIGl0XG4gKiBpcyB0aGUgYXV0aG9yaXR5IGZvciBldmVyeSBwYXJhbSBpdCBuYW1lcy4gT25seSBrZXlzIHRoZSBleHBhbnNpb24gYWxyZWFkeVxuICogcHJvZHVjZWQgYXJlIG92ZXJ3cml0dGVuOiBhZGRpbmcgb3RoZXJzIHdvdWxkIGludmVudCBwYXJhbXMgZm9yIGEgcmV3cml0ZSB0aGF0XG4gKiBkZWxpYmVyYXRlbHkgZHJvcHBlZCB0aGVtLlxuICpcbiAqIFRoZSBzYW1lIHByZWZpeCBjb2xsaXNpb24gcmVhY2hlcyBwb3NpdGlvbmFsIHBsYWNlaG9sZGVycyAoYCQxYCBpbnNpZGUgYCQxMGAsXG4gKiBzbyBhIHJvdXRlIHdpdGggdGVuIG9yIG1vcmUgY2FwdHVyZXMpLCBhbmQgYG5leHQuY29uZmlnYCBgcmV3cml0ZXMoKWBcbiAqIGRlc3RpbmF0aW9ucyB0aGF0IGludGVycG9sYXRlIHRoZWlyIG93biBxdWVyeSB2YWx1ZXMuIFRob3NlIGFyZSBub3Qgcm91dGVcbiAqIHBhcmFtcyBhbmQgYXJlIGxlZnQgYWxvbmUg4oCUIHRoZXJlIGlzIG5vIHNlY29uZCBzb3VyY2Ugb2YgdHJ1dGggdG8gcmVwYWlyIHRoZW1cbiAqIGZyb20uXG4gKlxuICogVGhlIHNlY29uZCBjb3JyZWN0aW9uIGlzIHRoZSBvcHBvc2l0ZSBzaGFwZTogYSBwYXJhbSB0aGUgcm91dGUgKmhhcyogYnV0IHRoZVxuICogcmVxdWVzdCBkaWQgbm90IGZpbGwuIEFuIG9wdGlvbmFsIGNhdGNoYWxsJ3MgZ3JvdXAgaXMgdGhlIG9ubHkgb25lIGEgbWF0Y2ggY2FuXG4gKiBsZWF2ZSB1bnNldCDigJQgYF4vb3B0aW9uYWxcXC1jYXRjaGFsbCg/Oi8oPzxueHRQcGFyYW1zPi4rPykpPyg/Oi8pPyRgIGFnYWluc3RcbiAqIGAvb3B0aW9uYWwtY2F0Y2hhbGxgIOKAlCBhbmQgYm90aCBgcm91dGVNYXRjaGVzYCBhbmQgdGhlIGV4cGFuZGVkIHF1ZXJ5IGtlZXAgdGhlXG4gKiBrZXkgd2l0aCBubyB2YWx1ZTogYHsgbnh0UHBhcmFtczogdW5kZWZpbmVkIH1gLCB3aGljaCB0aGUgYEBuZXh0L3JvdXRpbmdgIHR5cGVzXG4gKiBkbyBub3QgYWRtaXQuIFRoZSBrZXkgaXMgd2hhdCBtYXR0ZXJzLCBub3QgdGhlIHZhbHVlLiBgUm91dGVNb2R1bGUucHJlcGFyZWBcbiAqIHJlY292ZXJzIGEgcGFyYW0gZm9yIGV2ZXJ5IGBueHRQYCBrZXkgaXQgZmluZHMsIHNvIGEgbGF5b3V0IHJlYWRpbmcgYHBhcmFtc2BcbiAqIHJlbmRlcnMgYSBzZWdtZW50IHRoYXQgd2FzIG5ldmVyIHJlcXVlc3RlZCDigJQgYXMgYFtcInVuZGVmaW5lZFwiXWAsIGJlY2F1c2VcbiAqIGBVUkxTZWFyY2hQYXJhbXMuYXBwZW5kYCBzdHJpbmdpZmllcyDigJQgd2hlcmUgYG5leHQgc3RhcnRgIGdpdmVzIGl0IG5vIGBwYXJhbXNgXG4gKiBrZXkgYXQgYWxsLiBNZWFzdXJlZCBhZ2FpbnN0IGB0ZXN0L2UyZS9hcHAtZGlyL2xheW91dC1wYXJhbXNgLCB3aG9zZSBmaXh0dXJlIGlzXG4gKiBgYXBwL29wdGlvbmFsLWNhdGNoYWxsL1tbLi4ucGFyYW1zXV1gLiBObyBvdGhlciBwYXJhbSBzaGFwZSBjYW4gYmUgbGVnaXRpbWF0ZWx5XG4gKiB1bmZpbGxlZCDigJQgYSByZXF1aXJlZCBzZWdtZW50IGNhcHR1cmVzIGBbXi9dKz9gIGFuZCBhIHJlcXVpcmVkIGNhdGNoYWxsIGAuKz9gIOKAlFxuICogc28gYW4gdW5maWxsZWQgdmFsdWUgYHJvdXRlTWF0Y2hlc2AgZG9lcyBub3Qgdm91Y2ggZm9yIGlzIGFsd2F5cyB0aGlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwYWlyUm91dGVQYXJhbVF1ZXJ5KFxuICBxdWVyeTogUmVzb2x2ZVJvdXRlc1F1ZXJ5LFxuICByb3V0ZU1hdGNoZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4pOiBSZXNvbHZlUm91dGVzUXVlcnkge1xuICBsZXQgcmVwYWlyZWQ6IFJlc29sdmVSb3V0ZXNRdWVyeSB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocm91dGVNYXRjaGVzKSkge1xuICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoXCJueHRQXCIpIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmICghKGtleSBpbiBxdWVyeSkgfHwgcXVlcnlba2V5XSA9PT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgIHJlcGFpcmVkID8/PSB7IC4uLnF1ZXJ5IH07XG4gICAgcmVwYWlyZWRba2V5XSA9IHZhbHVlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcGFpcmVkID8/IHF1ZXJ5KSkge1xuICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoXCJueHRQXCIpIHx8IGlzRmlsbGVkUGFyYW0odmFsdWUpKSBjb250aW51ZTtcbiAgICBpZiAoaXNGaWxsZWRQYXJhbShyb3V0ZU1hdGNoZXNba2V5XSkpIGNvbnRpbnVlO1xuICAgIHJlcGFpcmVkID8/PSB7IC4uLnF1ZXJ5IH07XG4gICAgZGVsZXRlIHJlcGFpcmVkW2tleV07XG4gIH1cbiAgcmV0dXJuIHJlcGFpcmVkID8/IHF1ZXJ5O1xufVxuXG4vKipcbiAqIFJvdXRlIHBhcmFtcyB0byBoYW5kIE5leHQuanMgb3V0LW9mLWJhbmQsIGZvciB0aGUgb25lIHJlcXVlc3Qgc2hhcGUgdGhlIGBueHRQYFxuICogcXVlcnkgY29udHJhY3QgY2Fubm90IGNhcnJ5OiBhIGNhcHR1cmUgY29udGFpbmluZyBhbiBlbmNvZGVkIGAvYC4gYHVuZGVmaW5lZGBcbiAqIOKAlCB0aGUgY29tbW9uIGNhc2Ug4oCUIG1lYW5zIHRoZSBjb250cmFjdCBpcyBsb3NzbGVzcyBhbmQgbm90aGluZyBzcGVjaWFsIGlzXG4gKiBuZWVkZWQuXG4gKlxuICogVGhlIGNvbnRyYWN0IG5vcm1hbGx5IGlzIGxvc3NsZXNzLCB3aGljaCBpcyB3aHkge0BsaW5rIE5leHRqc1J1bnRpbWV9IHBhc3Nlc1xuICogcm91dGUgcGFyYW1zIGFzIHF1ZXJ5IHZhbHVlcyBldmVyeXdoZXJlIGVsc2UuIEJ1dCBgUm91dGVNb2R1bGUucHJlcGFyZWBcbiAqIHJlY292ZXJzIHRoZW0gYnkgcnVubmluZyBgbm9ybWFsaXplUXVlcnlQYXJhbXNgIOKAlCB3aGljaCBjYWxsc1xuICogYGRlY29kZVF1ZXJ5UGF0aFBhcmFtZXRlcmAsIGEgKipzZWNvbmQqKiBgZGVjb2RlVVJJQ29tcG9uZW50YCwgb24gZXZlcnlcbiAqIGRlLXByZWZpeGVkIHZhbHVlIGJlY2F1c2UgXCJ3aGVuIGRlcGxveWVkIHRvIFZlcmNlbCB0aGUgdmFsdWUgbWF5IGJlIGVuY29kZWRcIiDigJRcbiAqIGFuZCB0aGVuIGBub3JtYWxpemVEeW5hbWljUm91dGVQYXJhbXNgLCB3aGljaCBzcGxpdHMgYSBzdHJpbmcgcmVwZWF0IHBhcmFtIG9uXG4gKiBgL2AgYmVjYXVzZSBcInF1ZXJ5IHZhbHVlcyBmcm9tIHRoZSBwcm94eSBhcmVuJ3QgYWxyZWFkeSBzcGxpdCBpbnRvIGFycmF5c1wiLlxuICogVHdvIGRlY29kZXMgYW5kIGEgc3BsaXQ6IGBueHRQcmVzdD0uLiUyNTJGLi4lMjUyRnNlcnZlci1yZWZlcmVuY2UtbWFuaWZlc3RgXG4gKiAod2hhdCB0aGUgY29udHJhY3QgYXNrcyBmb3IsIGFuZCB3aGF0IHdlIHNlbmQpIGFycml2ZXMgYXMgdGhlIHRocmVlIHBhcmFtc1xuICogYFsnLi4nLCAnLi4nLCAnc2VydmVyLXJlZmVyZW5jZS1tYW5pZmVzdCddYCByYXRoZXIgdGhhbiB0aGUgb25lIHRoZSBjbGllbnRcbiAqIHJlcXVlc3RlZC4gVGhlIHJlc29sdmVkIHBhdGhuYW1lIGJ1aWx0IGJhY2sgb3V0IG9mIHRob3NlIGlzXG4gKiBgL3BhZ2VzLWNhY2hlLy4uLy4uL3NlcnZlci1yZWZlcmVuY2UtbWFuaWZlc3RgLCBhbmQgYG5vcm1hbGl6ZVBhZ2VQYXRoYCB0aHJvd3NcbiAqIGBSZXF1ZXN0ZWQgYW5kIHJlc29sdmVkIHBhZ2UgbWlzbWF0Y2hgIG9uIGl0IHdoZW4gdGhlIGNhY2hlIGFza3MgZm9yIGEga2V5IOKAlFxuICogc28gYSBgX25leHQvZGF0YWAgcmVxdWVzdCBmb3IgYSBjYXRjaC1hbGwgd2hvc2Ugc2VnbWVudCBjb250YWlucyBgJTJGYCA1MDBzLlxuICogTWVhc3VyZWQgYWdhaW5zdCBgdGVzdC9lMmUvaW5jcmVtZW50YWwtY2FjaGUtcGF0aC10cmF2ZXJzYWxgLiBObyBlbmNvZGluZyBjYW5cbiAqIGZpeCBpdCBmcm9tIHRoaXMgc2lkZTogd2hhdGV2ZXIgc3Vydml2ZXMgdHdvIGRlY29kZXMgc3RpbGwgZ2V0cyBzcGxpdC5cbiAqXG4gKiBgbmV4dCBzdGFydGAgbmV2ZXIgaGl0cyBpdCBiZWNhdXNlIGl0cyBgcm91dGVyLXNlcnZlcmAgc2V0c1xuICogYHJlcXVlc3RNZXRhLnBhcmFtc2AgaW5zdGVhZCwgd2hpY2ggYHByZXBhcmVgIHRha2VzIGFzLWlzXG4gKiAoYHJvdXRlLW1vZHVsZS50c2A6IGBnZXRSZXF1ZXN0TWV0YShyZXEsICdwYXJhbXMnKWApIHdpdGggbm8gZGVjb2RlIGFuZCBub1xuICogc3BsaXQuIFRoYXQgaXMgd2hhdCB0aGlzIHJlcHJvZHVjZXMg4oCUIG5hcnJvd2x5LCBvbmx5IGZvciB0aGUgYWZmZWN0ZWRcbiAqIHJlcXVlc3RzLCBzbyB0aGF0IHRoZSBkb2N1bWVudGVkIHF1ZXJ5IGNvbnRyYWN0IHN0YXlzIHRoZSBwYXRoIGZvciBldmVyeXRoaW5nXG4gKiBlbHNlLlxuICpcbiAqIFRoZSBgbnh0UGAgdmFsdWVzIGhhdmUgdG8gbGVhdmUgdGhlIHF1ZXJ5IGFzIHdlbGwgYXMgYXJyaXZlIGluIGBwYXJhbXNgLlxuICogYHByZXBhcmVgIHByZWZlcnMgdGhlIHF1ZXJ5IG92ZXIgYHBhcmFtc2Agd2hlbiBib3RoIHBhcnNlIGFuZCBhcmUgdGhlIHNhbWVcbiAqIHNpemUsIHNvIGxlYXZpbmcgdGhlbSBpbiB3b3VsZCBqdXN0IHJlc3RvcmUgdGhlIHNwbGl0LiBEcm9wcGluZyB0aGVtIGFsc29cbiAqIG1hdGNoZXMgYG5leHQgc3RhcnRgLCB3aGljaCBoYXMgbm8gYG54dFBgIHF1ZXJ5IGF0IGFsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG91dE9mQmFuZFJvdXRlUGFyYW1zKFxuICBxdWVyeTogUmVzb2x2ZVJvdXRlc1F1ZXJ5LFxuICByZXNvbHZlZFBhdGhuYW1lOiBzdHJpbmcsXG4pOlxuICB8IHsgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT47IHF1ZXJ5OiBSZXNvbHZlUm91dGVzUXVlcnkgfVxuICB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhxdWVyeSk7XG4gIGlmIChcbiAgICAhZW50cmllcy5zb21lKFxuICAgICAgKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAga2V5LnN0YXJ0c1dpdGgoXCJueHRQXCIpICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICBFTkNPREVEX1BBVEhfREVMSU1JVEVSLnRlc3QodmFsdWUpLFxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvLyBXaGljaCBwYXJhbXMgYXJlIHJlcGVhdHMg4oCUIGBbLi4ucmVzdF1gLCBgW1suLi5yZXN0XV1gIOKAlCBkZWNpZGVzIGFycmF5IHZlcnN1c1xuICAvLyBzdHJpbmcsIHRoZSBzYW1lIGRpc3RpbmN0aW9uIGBub3JtYWxpemVEeW5hbWljUm91dGVQYXJhbXNgIG1ha2VzIGZyb20gdGhlXG4gIC8vIHJvdXRlJ3Mgb3duIGBncm91cHNgLiBgcmVzb2x2ZWRQYXRobmFtZWAgaXMgdGhlIG1hdGNoZWQgcm91dGUsIGJyYWNrZXRzIGFuZFxuICAvLyBhbGwuXG4gIGNvbnN0IHJlcGVhdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiByZXNvbHZlZFBhdGhuYW1lLm1hdGNoQWxsKC9cXFtcXFs/XFwuXFwuXFwuKFteXFxdXSs/KVxcXVxcXT8vZykpIHtcbiAgICByZXBlYXRzLmFkZChtYXRjaFsxXSk7XG4gIH1cbiAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4gPSB7fTtcbiAgY29uc3QgcmVtYWluaW5nOiBSZXNvbHZlUm91dGVzUXVlcnkgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoXCJueHRQXCIpKSB7XG4gICAgICByZW1haW5pbmdba2V5XSA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEFueXRoaW5nIGJ1dCBhIGZpbGxlZCBzdHJpbmcgaXMgYSBwYXJhbSB3ZSBjYW5ub3QgcmVzdGF0ZSDigJQgYW4gb3B0aW9uYWxcbiAgICAvLyBjYXRjaGFsbCB0aGUgcmVxdWVzdCBsZWZ0IHVuc2V0LCBvciBhIHJlcGVhdGVkIGtleS4gUmF0aGVyIHRoYW4gaGFuZFxuICAgIC8vIGBwcmVwYXJlYCBhIHBhcmFtIHNldCB0aGF0IGlzIG1pc3Npbmcgb25lLCBsZWF2ZSB0aGUgd2hvbGUgcmVxdWVzdCBvbiB0aGVcbiAgICAvLyBxdWVyeSBjb250cmFjdC5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG5hbWUgPSBrZXkuc2xpY2UoXCJueHRQXCIubGVuZ3RoKTtcbiAgICBwYXJhbXNbbmFtZV0gPSByZXBlYXRzLmhhcyhuYW1lKVxuICAgICAgPyB2YWx1ZS5zcGxpdChcIi9cIikubWFwKHNhZmVEZWNvZGUpXG4gICAgICA6IHNhZmVEZWNvZGUodmFsdWUpO1xuICB9XG4gIHJldHVybiB7IHBhcmFtcywgcXVlcnk6IHJlbWFpbmluZyB9O1xufVxuXG4vKiogQW4gZW5jb2RlZCBgL2A6IHRoZSBkZWxpbWl0ZXIgdGhlIHF1ZXJ5IGNvbnRyYWN0J3Mgc3BsaXQgd291bGQgY29uc3VtZS4gKi9cbmNvbnN0IEVOQ09ERURfUEFUSF9ERUxJTUlURVIgPSAvJTJmL2k7XG5cbi8qKiBXaGV0aGVyIGEgcm91dGUgcGFyYW0gY2FycmllcyBhIHNlZ21lbnQsIGFzIG9wcG9zZWQgdG8gYFwiXCJgIG9yIG5vdGhpbmcuICovXG5mdW5jdGlvbiBpc0ZpbGxlZFBhcmFtKHZhbHVlOiBSZXNvbHZlUm91dGVzUXVlcnlWYWx1ZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggPiAwIDogQm9vbGVhbih2YWx1ZSk7XG59XG5cbi8qKlxuICogVGhlIG9yZGVyIG5leHQgaXRzZWxmIHVzZXMsIGluIGBiYXNlLXNlcnZlci50c2AncyBgcmVuZGVyRXJyb3JUb1Jlc3BvbnNlYDpcbiAqIHRoZSBzdGF0dXMgcGFnZSdzIGVudHJ5cG9pbnRzLCB0aGVuIGl0cyBwcmVyZW5kZXIsIHRoZW4gYC9fZXJyb3JgLCB3aGljaCBpc1xuICogdGhlIGJ1aWx0LWluIGVycm9yIHBhZ2UgdW5sZXNzIHRoZSBhcHAgd3JvdGUgaXRzIG93bi5cbiAqXG4gKiBGb3IgYSA0MDQgdGhlIGVudHJ5cG9pbnRzIGFyZSBBcHAgUm91dGVyJ3MgYC9fbm90LWZvdW5kYCwgdGhlbiBQYWdlc1xuICogUm91dGVyJ3MgYC80MDRgLiBgLzQwNGAgaGFzIHRvIGNvbWUgYmVmb3JlIGAvX2Vycm9yYCDigJQgaXQgaXMgdGhlIGFwcCdzXG4gKiAqY3VzdG9tKiA0MDQsIGFuZCBgL19lcnJvcmAgaXMgdGhlIGJ1aWx0LWluIFwiNDA0OiBUaGlzIHBhZ2UgY291bGQgbm90IGJlXG4gKiBmb3VuZFwiLiBNZWFzdXJlZCBhZ2FpbnN0IGB0ZXN0L2UyZS80MDQtcGFnZS1hcHBgLCB3aGVyZSBldmVyeSBVUkwgZ290IHRoZVxuICogYnVpbHQtaW4gcGFnZS4gRm9yIGEgNTAwIGl0IGlzIGAvNTAwYC5cbiAqXG4gKiBUaGUgcHJlcmVuZGVyIGlzIGFsbW9zdCBhbHdheXMgdGhlcmU6IGBuZXh0IGJ1aWxkYCBlbWl0cyBgNDA0Lmh0bWxgIHdoZW5ldmVyXG4gKiBgcGFnZXMvX2FwcGAgaGFzIG5vIGBnZXRJbml0aWFsUHJvcHNgIChgdXNlU3RhdGljUGFnZXM0MDRgKSwgZnJvbSB0aGUgYXBwJ3NcbiAqIGBwYWdlcy80MDQuanNgIG9yIGVsc2UgZnJvbSBgX2Vycm9yYCwgYW5kIGBwYWdlcy81MDAuanNgIGlzIGFcbiAqIGBTVEFUSUNfU1RBVFVTX1BBR0VTYCBlbnRyeS4gU28gaXQgcmVhY2hlcyB1cyBhcyBhIHN0YXRpYyBmaWxlIOKAlCB1bmRlciBpMThuXG4gKiBvbmUgcGVyIGxvY2FsZSAoYC9lbi1VUy80MDRgKSwgYW5kIG5ldmVyIGEgYmFyZSBgLzQwNGAg4oCUIGFuZCBgbmV4dCBzdGFydGBcbiAqIHNlcnZlcyBpdCBhaGVhZCBvZiBgL19lcnJvcmAsIHdoaWNoIGV2ZXJ5IFBhZ2VzIGJ1aWxkIGhhcy4gVGhlIHBhZ2UgaXMgYW5cbiAqIGVudHJ5cG9pbnQgb25seSB3aGVuIHNvbWV0aGluZyBmb3JjZXMgYSBwZXItcmVxdWVzdCByZW5kZXIsIHdoaWNoIGFcbiAqIGBnZXRJbml0aWFsUHJvcHNgIGluIGBfYXBwYCBkb2VzLlxuICpcbiAqIEEgNTAwIGlzIG9ubHkgcmVuZGVyZWQgd2hlbiBhbiBlbnRyeXBvaW50ICp0aHJvd3MqLiBOZXh0LmpzJ3MgcGFnZSBoYW5kbGVyc1xuICogZGVsaWJlcmF0ZWx5IHJldGhyb3cgKFwicmV0aHJvdyBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgc2VydmluZyBlcnJvciBwYWdlXCIsXG4gKiBgcGFnZXMtaGFuZGxlci50c2ApLCBsZWF2aW5nIHRoZSBlcnJvciBwYWdlIHRvIHdoYXRldmVyIGlzIGhvc3RpbmcgdGhlbSDigJRcbiAqIG1lYXN1cmVkIGFnYWluc3QgYHRlc3QvZTJlL2FzeW5jLW1vZHVsZXNgLCB3aG9zZSBgL21ha2UtZXJyb3JgIHRocm93cyBpblxuICogYGdldFNlcnZlclNpZGVQcm9wc2AgYW5kIGV4cGVjdHMgdGhlIGFwcCdzIGBwYWdlcy9fZXJyb3JgLlxuICpcbiAqIEFwcHMgd2l0aCBub25lIG9mIHRoZXNlIGdldCBub3RoaW5nLlxuICovXG5mdW5jdGlvbiBzdGF0dXNUYXJnZXQoXG4gIG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3QsXG4gIHN0YXR1czogNDA0IHwgNTAwLFxuICAvKiogV2hpY2ggbG9jYWxlJ3MgcHJlcmVuZGVyIHRvIGxvb2sgZm9yLCBpbiBhbiBpMThuIGFwcC4gKi9cbiAgbG9jYWxlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBTdGF0dXNUYXJnZXQge1xuICBjb25zdCB7IGJhc2VQYXRoIH0gPSBtYW5pZmVzdC5jb25maWc7XG4gIGZvciAoY29uc3Qgc3VmZml4IG9mIFNUQVRVU19QQUdFX1NVRkZJWEVTW3N0YXR1c10pIHtcbiAgICBjb25zdCBwYXRobmFtZSA9IGAke2Jhc2VQYXRofSR7c3VmZml4fWA7XG4gICAgY29uc3QgZW50cnlwb2ludCA9IG1hbmlmZXN0LmVudHJ5cG9pbnRzW3BhdGhuYW1lXTtcbiAgICBpZiAoZW50cnlwb2ludCkge1xuICAgICAgcmV0dXJuIHsga2luZDogXCJlbnRyeXBvaW50XCIsIHBhdGhuYW1lLCBlbnRyeXBvaW50IH07XG4gICAgfVxuICB9XG4gIGNvbnN0IHByZXJlbmRlcmVkID0gYCR7YmFzZVBhdGh9JHtsb2NhbGUgPyBgLyR7bG9jYWxlfWAgOiBcIlwifS8ke3N0YXR1c31gO1xuICBjb25zdCBmaWxlUGF0aCA9IG1hbmlmZXN0LnN0YXRpY0ZpbGVzW3ByZXJlbmRlcmVkXTtcbiAgaWYgKGZpbGVQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInN0YXRpYy1maWxlXCIsIHBhdGhuYW1lOiBwcmVyZW5kZXJlZCwgZmlsZVBhdGggfTtcbiAgfVxuICBjb25zdCBlcnJvclBhdGhuYW1lID0gYCR7YmFzZVBhdGh9JHtTVEFUVVNfUEFHRV9TVUZGSVhFUy5mYWxsYmFja31gO1xuICBjb25zdCBlcnJvckVudHJ5cG9pbnQgPSBtYW5pZmVzdC5lbnRyeXBvaW50c1tlcnJvclBhdGhuYW1lXTtcbiAgaWYgKGVycm9yRW50cnlwb2ludCkge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiBcImVudHJ5cG9pbnRcIixcbiAgICAgIHBhdGhuYW1lOiBlcnJvclBhdGhuYW1lLFxuICAgICAgZW50cnlwb2ludDogZXJyb3JFbnRyeXBvaW50LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHsga2luZDogXCJub25lXCIgfTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgc3RhdHVzVGFyZ2V0fSBmb3IgZXZlcnkgbG9jYWxlLCByZXNvbHZlZCBvbmNlLCBhbmQgYSBsb29rdXAgb2YgdGhlXG4gKiByZXF1ZXN0J3M6IGluIGFuIGkxOG4gYXBwLCB0aGUgcHJlcmVuZGVyIG9mIHRoZSBsb2NhbGUgdGhlIFVSTCBpcyBpblxuICogKGAvZnIvbm9wZWAgZ2V0cyBgL2ZyLzQwNGApLCBhbmQgb3RoZXJ3aXNlIG9mIHRoZSBkb21haW4ncyBkZWZhdWx0IGxvY2FsZSDigJRcbiAqIHdoaWNoIGlzIGhvdyBgbmV4dCBzdGFydGAgcGlja3MgdGhlIGxvY2FsZSBpdCByZW5kZXJzIGEgc3RhdHVzIHBhZ2UgaW4uIEFcbiAqIHJlcXVlc3Qgd2hvc2UgVVJMIGNvdWxkIG5vdCBiZSBwYXJzZWQsIGB1bmRlZmluZWRgLCBnZXRzIHRoZSBkZWZhdWx0XG4gKiBsb2NhbGUncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXR1c1RhcmdldHMoXG4gIG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3QsXG4gIHN0YXR1czogNDA0IHwgNTAwLFxuKTogKHVybDogVVJMIHwgdW5kZWZpbmVkKSA9PiBTdGF0dXNUYXJnZXQge1xuICBjb25zdCBpMThuID0gYXNJMThuKG1hbmlmZXN0LmNvbmZpZy5pMThuKTtcbiAgY29uc3QgZmFsbGJhY2sgPSBzdGF0dXNUYXJnZXQobWFuaWZlc3QsIHN0YXR1cywgaTE4bj8uZGVmYXVsdExvY2FsZSk7XG4gIGNvbnN0IGJ5TG9jYWxlID0gbmV3IE1hcChcbiAgICAoaTE4bj8ubG9jYWxlcyA/PyBbXSkubWFwKChsb2NhbGUpID0+IFtcbiAgICAgIGxvY2FsZSxcbiAgICAgIHN0YXR1c1RhcmdldChtYW5pZmVzdCwgc3RhdHVzLCBsb2NhbGUpLFxuICAgIF0pLFxuICApO1xuICByZXR1cm4gKHVybCkgPT4ge1xuICAgIGNvbnN0IGxvY2FsZSA9IHVybCA/IHJlcXVlc3RMb2NhbGUobWFuaWZlc3QsIHVybCkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIChsb2NhbGUgIT09IHVuZGVmaW5lZCAmJiBieUxvY2FsZS5nZXQobG9jYWxlKSkgfHwgZmFsbGJhY2s7XG4gIH07XG59XG5cbi8qKlxuICogVGhlIGxvY2FsZSBhIHJlcXVlc3QncyBzdGF0dXMgcGFnZSByZW5kZXJzIGluLCB0aGUgd2F5IGBuZXh0IHN0YXJ0YCBwaWNrcyBpdDpcbiAqIHRoZSBsb2NhbGUgdGhlIFVSTCdzIGZpcnN0IHNlZ21lbnQgbmFtZXMgKGBub3JtYWxpemVMb2NhbGVQYXRoYCwgd2hpY2hcbiAqIG1hdGNoZXMgaXQgY2FzZS1pbnNlbnNpdGl2ZWx5KSwgYW5kIG90aGVyd2lzZSB0aGUgZG9tYWluJ3MgZGVmYXVsdCBsb2NhbGUsXG4gKiB0aGVuIHRoZSBhcHAncy4gYHVuZGVmaW5lZGAgd2l0aG91dCBpMThuLlxuICovXG5mdW5jdGlvbiByZXF1ZXN0TG9jYWxlKFxuICBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0LFxuICB1cmw6IFVSTCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGkxOG4gPSBhc0kxOG4obWFuaWZlc3QuY29uZmlnLmkxOG4pO1xuICBpZiAoIWkxOG4pIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhdGhuYW1lID0gd2l0aG91dFBhdGhQcmVmaXgodXJsLnBhdGhuYW1lLCBtYW5pZmVzdC5jb25maWcuYmFzZVBhdGgpO1xuICByZXR1cm4gKFxuICAgIG5vcm1hbGl6ZUxvY2FsZVBhdGgocGF0aG5hbWUsIGkxOG4ubG9jYWxlcykuZGV0ZWN0ZWRMb2NhbGUgPz9cbiAgICBkZXRlY3REb21haW5Mb2NhbGUoaTE4bi5kb21haW5zLCB1cmwuaG9zdG5hbWUpPy5kZWZhdWx0TG9jYWxlID8/XG4gICAgaTE4bi5kZWZhdWx0TG9jYWxlXG4gICk7XG59XG4iXX0=
|