cdk-nextjs 0.7.13 → 0.7.15
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 +132 -42
- package/.jsii.tabl.json +1 -1
- package/API.md +56 -0
- package/docs/harness-coverage.md +16 -6
- package/docs/next-build-output-guide.md +1 -1
- package/lib/adapter/adapter.mjs +1 -1
- package/lib/generated-structs/OptionalNextjsApiProps.d.ts +6 -0
- package/lib/generated-structs/OptionalNextjsApiProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +6 -0
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
- package/lib/nextjs-api.d.ts +11 -0
- package/lib/nextjs-api.js +63 -9
- package/lib/nextjs-api.test.js +127 -1
- package/lib/nextjs-build/nextjs-build.js +1 -1
- 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.d.ts +21 -0
- package/lib/nextjs-distribution.js +69 -4
- package/lib/nextjs-distribution.test.js +132 -1
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.d.ts +7 -0
- package/lib/root-constructs/nextjs-base-construct.js +14 -2
- package/lib/root-constructs/nextjs-global-containers.js +3 -2
- package/lib/root-constructs/nextjs-global-functions.js +3 -2
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +3 -2
- package/lib/runtime/core.js +4 -6
- package/lib/runtime/http/response.d.ts +0 -6
- package/lib/runtime/http/response.js +1 -7
- package/lib/runtime/http/sink.js +10 -6
- package/lib/runtime/http/sink.test.js +45 -13
- package/lib/runtime/lambda.mjs +2 -10
- package/lib/runtime/server.mjs +2 -10
- package/package.json +1 -1
- package/scripts/e2e-harness/README.md +10 -8
package/lib/runtime/core.js
CHANGED
|
@@ -1217,16 +1217,14 @@ async function sendWebResponse(res, response) {
|
|
|
1217
1217
|
}
|
|
1218
1218
|
// Paced by the client: without waiting for `drain`, a large proxied body
|
|
1219
1219
|
// headed for a slow client is buffered whole in memory.
|
|
1220
|
+
// No flush needed when the sink compresses: its gzip stage sync-flushes
|
|
1221
|
+
// every chunk, so a streamed body (server-sent events through a rewrite, a
|
|
1222
|
+
// middleware `ReadableStream`) reaches the client chunk by chunk.
|
|
1220
1223
|
const accepted = res.write(chunk);
|
|
1221
|
-
// Set by the sink when it compresses. Without it the chunk sits in zlib's
|
|
1222
|
-
// buffer, and a streamed body — server-sent events through a rewrite, a
|
|
1223
|
-
// middleware `ReadableStream` — reaches the client all at once, at the end.
|
|
1224
|
-
// Next.js flushes after every chunk for the same reason (`pipe-readable`).
|
|
1225
|
-
res.flush?.();
|
|
1226
1224
|
if (!accepted && !(await (0, util_1.drained)(res))) {
|
|
1227
1225
|
return;
|
|
1228
1226
|
}
|
|
1229
1227
|
}
|
|
1230
1228
|
res.end();
|
|
1231
1229
|
}
|
|
1232
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2NvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMitCQSx3REFnQkM7QUFtREQsc0RBK0JDO0FBbUJELGtDQTBEQztBQWlJRCw4QkEyQ0M7QUF0MENELHNEQUFzRDtBQUN0RDs7Ozs7Ozs7Ozs7R0FXRztBQUNILCtDQUE0QztBQUU1Qyx5Q0FBaUM7QUFDakMsNkNBQWlEO0FBQ2pELG1EQUFvRDtBQUNwRCx5Q0FLb0I7QUFDcEIsK0NBSXVCO0FBQ3ZCLDRDQUE0RTtBQUM1RSw4Q0FJeUI7QUFDekIsc0NBQXVEO0FBQ3ZELG1DQUF1RTtBQUN2RSx5Q0FNb0I7QUFDcEIsNkNBQWdEO0FBQ2hELGlEQUt3QjtBQUN4QixpREFBa0U7QUFDbEUsaURBQW9FO0FBQ3BFLGlEQUFvRTtBQUNwRSxpQ0FBMEU7QUFFMUUsMEVBQTBFO0FBQzFFLElBQUEsb0NBQXFCLEdBQUUsQ0FBQztBQStEeEIsTUFBYSxhQUFhO0lBVVk7SUFUbkIsV0FBVyxDQUFxQjtJQUNoQyxVQUFVLENBQWE7SUFDdkIsVUFBVSxDQUFvQjtJQUM5QixNQUFNLENBQXdCO0lBQy9DLDJDQUEyQztJQUMxQixjQUFjLENBQXlDO0lBQ3hFLGtFQUFrRTtJQUNqRCxZQUFZLENBQVU7SUFFdkMsWUFBb0MsT0FBNkI7UUFBN0IsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFDL0QsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGdDQUFrQixDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRSx3REFBd0Q7UUFDeEQsTUFBTSxXQUFXLEdBQUcsSUFBQSxpQ0FBa0IsRUFBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHFCQUFVLENBQUM7WUFDL0IsUUFB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TUFBTSxJQUFBLGNBQU8sRUFBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTztRQUNULENBQUM7SUFDSCxDQUFDO0lBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyoqXG4gKiBUaGUgcnVudGltZSBjb3JlOiBvbmUgYGhhbmRsZShyZXF1ZXN0LCBzaW5rKWAgdGhhdCBib3RoIHNoZWxscyB3cmFwLlxuICpcbiAqIFRoZSBMYW1iZGEgc2hlbGwgKGBsYW1iZGEubXRzYCkgYW5kIHRoZSBjb250YWluZXIgc2hlbGwgKGBzZXJ2ZXIubXRzYCkgZG9cbiAqIG5vdGhpbmcgYnV0IHR1cm4gdGhlaXIgaW5wdXQgaW50byBhIHtAbGluayBSdW50aW1lUmVxdWVzdH0gYW5kIHRoZWlyIG91dHB1dCBpbnRvXG4gKiBhIHtAbGluayBSZXNwb25zZVNpbmt9LiBFdmVyeXRoaW5nIGVsc2Ug4oCUIHN5bnRoZXNpemluZyBgcmVxYC9gcmVzYCwgZGlzcGF0Y2gsXG4gKiBtaWRkbGV3YXJlLCBlbnRyeXBvaW50IGludm9jYXRpb24sIHN0YXRpYyBmaWxlcywgaW1hZ2Ugb3B0aW1pemF0aW9uLCBnemlwLFxuICogYHdhaXRVbnRpbGAg4oCUIGhhcHBlbnMgaGVyZSwgc28gdGhlIGNvbnRhaW5lciBlMmUgc3VpdGUgZXhlcmNpc2VzIHRoZSBzYW1lIGNvZGVcbiAqIExhbWJkYSBydW5zLiBUaGF0IGlzIGRlbGliZXJhdGU6IHRoZSBjb250YWluZXIgcGF0aCB1c2VkIHRvIGdldCByZWFsXG4gKiBgbm9kZTpodHRwYCBvYmplY3RzIGZyb20gTGFtYmRhIFdlYiBBZGFwdGVyLCB3aGljaCBtZWFudCBjb250YWluZXIgdGVzdHMgcHJvdmVkXG4gKiBub3RoaW5nIGFib3V0IExhbWJkYS5cbiAqL1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ0h0dHBIZWFkZXJzIH0gZnJvbSBcIm5vZGU6aHR0cFwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IFJlYWRhYmxlLCBXcml0YWJsZSB9IGZyb20gXCJub2RlOnN0cmVhbVwiO1xuaW1wb3J0IHsgY2FzZUNhbm9uaWNhbFBhdGggfSBmcm9tIFwiLi9jYXNlLXJlZGlyZWN0XCI7XG5pbXBvcnQge1xuICBEaXNwYXRjaGVyLFxuICBvdXRPZkJhbmRSb3V0ZVBhcmFtcyxcbiAgU3RhdHVzVGFyZ2V0LFxuICBzdGF0dXNUYXJnZXRzLFxufSBmcm9tIFwiLi9kaXNwYXRjaFwiO1xuaW1wb3J0IHtcbiAgRW50cnlwb2ludEhhbmRsZXIsXG4gIEVudHJ5cG9pbnRSZWdpc3RyeSxcbiAgUm91dGVJbk90aGVyR3JvdXBFcnJvcixcbn0gZnJvbSBcIi4vZW50cnlwb2ludHNcIjtcbmltcG9ydCB7IFNoaW1JbmNvbWluZ01lc3NhZ2UsIHRvSW5jb21pbmdIdHRwSGVhZGVycyB9IGZyb20gXCIuL2h0dHAvcmVxdWVzdFwiO1xuaW1wb3J0IHtcbiAgYXNTZXJ2ZXJSZXNwb25zZSxcbiAgUmVzcG9uc2VIZWFkLFxuICBTaGltU2VydmVyUmVzcG9uc2UsXG59IGZyb20gXCIuL2h0dHAvcmVzcG9uc2VcIjtcbmltcG9ydCB7IHBpcGVUb1NpbmssIFJlc3BvbnNlU2luayB9IGZyb20gXCIuL2h0dHAvc2lua1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxJbWFnZVJlc3BvbnNlLCBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIgfSBmcm9tIFwiLi9pbWFnZVwiO1xuaW1wb3J0IHtcbiAgQWRhcHRlck1hbmlmZXN0LFxuICBkZXBsb3llZE1hbmlmZXN0UGF0aCxcbiAgRlVOQ1RJT05fR1JPVVBfRU5WX1ZBUixcbiAgTUFOSUZFU1RfRklMRV9OQU1FLFxuICBSRVZBTElEQVRFRF9QQUdFX0hPT0ssXG59IGZyb20gXCIuL21hbmlmZXN0XCI7XG5pbXBvcnQgeyBNaWRkbGV3YXJlUnVubmVyIH0gZnJvbSBcIi4vbWlkZGxld2FyZVwiO1xuaW1wb3J0IHtcbiAgbG9hZEVudkZpbGVzLFxuICByZWdpc3Rlckluc3RydW1lbnRhdGlvbixcbiAgc2V0dXBOb2RlRW52aXJvbm1lbnQsXG4gIHVzZU5leHRGcm9tLFxufSBmcm9tIFwiLi9uZXh0LW1vZHVsZXNcIjtcbmltcG9ydCB7IHB1YmxpY0RpcktleSwgcmVzb2x2ZVB1YmxpY0ZpbGVzIH0gZnJvbSBcIi4vcHVibGljLWZpbGVzXCI7XG5pbXBvcnQgeyBzZXJ2ZVMzUHVibGljRmlsZSwgc2VydmVTdGF0aWNGaWxlIH0gZnJvbSBcIi4vc3RhdGljLWZpbGVzXCI7XG5pbXBvcnQgeyBjYXB0dXJlT3V0c2lkZVJlcXVlc3QsIGNhdGNoVXBUYWdzIH0gZnJvbSBcIi4vdGFnLW1hbmlmZXN0XCI7XG5pbXBvcnQgeyBkcmFpbmVkLCBmaXJzdFZhbHVlLCB0b1NlYXJjaCwgd2l0aG91dFBhdGhQcmVmaXggfSBmcm9tIFwiLi91dGlsXCI7XG5cbi8vIEF0IGxvYWQsIGJlZm9yZSBhbnkgcmVxdWVzdDogdGhlIGNvbnRleHQgY2FjaGUgaGFuZGxlciB3b3JrIGVzY2FwZXMgdG8uXG5jYXB0dXJlT3V0c2lkZVJlcXVlc3QoKTtcblxuLyoqIE9uZSByZXF1ZXN0LCBub3JtYWxpemVkIGJ5IGEgc2hlbGwuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG4gIC8qKiBPcmlnaW4tZm9ybSB0YXJnZXQgZXhhY3RseSBhcyByZWNlaXZlZDogcGF0aCArIHF1ZXJ5LCBuZXZlciBhYnNvbHV0ZS4gKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnM7XG4gIHJlYWRvbmx5IGJvZHk/OiBSZWFkYWJsZSB8IEJ1ZmZlcjtcbiAgcmVhZG9ubHkgcmVtb3RlQWRkcmVzcz86IHN0cmluZztcbiAgLyoqIGBmYWxzZWAgYmVoaW5kIGEgVExTLXRlcm1pbmF0aW5nIEFMQi4gT25seSBhZmZlY3RzIHRoZSBzeW50aGVzaXplZCBzb2NrZXQuICovXG4gIHJlYWRvbmx5IGVuY3J5cHRlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBYm9ydGVkIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cy4gV2lyaW5nIGl0IHRvIGByZXMuZGVzdHJveSgpYCBpcyB3aGF0XG4gICAqIG1ha2VzIGByZXF1ZXN0LnNpZ25hbC5vbmFib3J0YCBmaXJlIGluc2lkZSByb3V0ZSBoYW5kbGVycy5cbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogV2hldGhlciBgeC1mb3J3YXJkZWQtaG9zdGAgbmFtZXMgdGhlIGhvc3QgdGhlIGNsaWVudCBhc2tlZCBmb3IuIE9ubHkgdGhlXG4gICAqIHNoZWxsIGNhbiBrbm93OiBpdCBpcyBgdHJ1ZWAgZm9yIGEgRnVuY3Rpb24gVVJMIGV2ZW50IHdob3NlIFNpZ1Y0IExhbWJkYVxuICAgKiB2ZXJpZmllZC4gVGhhdCBpcyBhbnkgSUFNLWF1dGhvcml6ZWQgaW52b2tlciDigJQgaW4gcHJhY3RpY2UgQ2xvdWRGcm9udCdzXG4gICAqIE9yaWdpbiBBY2Nlc3MgQ29udHJvbCwgd2hvc2Ugdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24gb3ZlcndyaXRlcyB0aGUgaGVhZGVyXG4gICAqIHdpdGggdGhlIHZpZXdlcidzIGBIb3N0YCAoQ2xvdWRGcm9udCBoYXMgdG8gcmVwbGFjZSBgSG9zdGAgaXRzZWxmIHdpdGggdGhlXG4gICAqIEZ1bmN0aW9uIFVSTCdzIGRvbWFpbiksIHBsdXMgcHJpbmNpcGFscyBncmFudGVkIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmxgLFxuICAgKiB3aG8gY291bGQgcmVwbGFjZSB0aGUgZnVuY3Rpb24ncyBjb2RlIGFueXdheS4gSXQgaXMgYWxzbyB3aGF0XG4gICAqIGBwcm94eUV4dGVybmFsYCBkcm9wcyBPQUMncyBzaWduYXR1cmUgb24uIEV2ZXJ5d2hlcmUgZWxzZSB0aGUgaGVhZGVyIGlzXG4gICAqIHdoYXRldmVyIHRoZSBjbGllbnQgc2VudCwgYW5kIGl0IGlzXG4gICAqIGlnbm9yZWQsIGFzIGBuZXh0IHN0YXJ0YCBpZ25vcmVzIGl0IHdpdGhvdXQgYGV4cGVyaW1lbnRhbC50cnVzdEhvc3RIZWFkZXJgLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJ1c3RGb3J3YXJkZWRIb3N0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldCBieSB7QGxpbmsgTmV4dGpzUnVudGltZS5oYW5kbGVJbnRlcm5hbGx5fSBmb3IgdGhlIGluLXByb2Nlc3MgcmVxdWVzdHMgaXRcbiAgICogbWFrZXM6IGNhbGxlZCB3aXRoIHRoZSBgUm91dGVJbk90aGVyR3JvdXBFcnJvcmAgdGhlIHJvdXRlIHRocmV3LCBpbnN0ZWFkIG9mXG4gICAqIGxvZ2dpbmcgdGhlIG1pc3JvdXRlZC1yZXF1ZXN0IHdhcm5pbmcsIHdoaWNoIGRlc2NyaWJlcyBhIENsb3VkRnJvbnQgb3IgQVBJXG4gICAqIEdhdGV3YXkgcHJvYmxlbSB0aGlzIGlzIG5vdC5cbiAgICovXG4gIHJlYWRvbmx5IG9uUm91dGVJbk90aGVyR3JvdXA/OiAoZXJyb3I6IFJvdXRlSW5PdGhlckdyb3VwRXJyb3IpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogYFJldmFsaWRhdGVGbmAncyBhcmd1bWVudCAoYG5leHQvZGlzdC9zZXJ2ZXIvbGliL3JvdXRlci11dGlscy9yb3V0ZXItc2VydmVyLWNvbnRleHRgKSxcbiAqIHJlc3RhdGVkIGJlY2F1c2UgdGhhdCBtb2R1bGUgaXMgbm90IHBhcnQgb2YgYG5leHRgJ3MgcHVibGlzaGVkIHR5cGUgc3VyZmFjZS5cbiAqL1xuaW50ZXJmYWNlIFJldmFsaWRhdGVDb25maWcge1xuICByZWFkb25seSB1cmxQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfTtcbiAgcmVhZG9ubHkgb3B0czogeyB1bnN0YWJsZV9vbmx5R2VuZXJhdGVkPzogYm9vbGVhbiB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1J1bnRpbWVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGRlcGxveW1lbnQgcm9vdCDigJQgdGhlIHN0YWdlZCB0cmVlIGV2ZXJ5IG1hbmlmZXN0IGtleVxuICAgKiByZXNvbHZlcyBhZ2FpbnN0LiBgTEFNQkRBX1RBU0tfUk9PVGAgZm9yIEZ1bmN0aW9ucywgdGhlIGltYWdlIGBXT1JLRElSYCBmb3JcbiAgICogQ29udGFpbmVyczsgYm90aCBzaGVsbHMgZGVyaXZlIGl0IGZyb20gdGhlaXIgb3duIGxvY2F0aW9uIGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50Um9vdDogc3RyaW5nO1xuICByZWFkb25seSBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0O1xuICAvKiogYENES19ORVhUSlNfU1RBVElDX0FTU0VUU19CVUNLRVRfTkFNRWAuICovXG4gIHJlYWRvbmx5IGJ1Y2tldD86IHN0cmluZztcbiAgLyoqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWGAuICovXG4gIHJlYWRvbmx5IGJ1Y2tldEtleVByZWZpeD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE5leHRqc1J1bnRpbWUge1xuICBwcml2YXRlIHJlYWRvbmx5IGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50UmVnaXN0cnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtaWRkbGV3YXJlPzogTWlkZGxld2FyZVJ1bm5lcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbWFnZXM6IFJ1bnRpbWVJbWFnZU9wdGltaXplcjtcbiAgLyoqIFRoZSA1MDAgbGFkZGVyOyBzZWUgYHN0YXR1c1RhcmdldHNgLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yVGFyZ2V0Rm9yOiAodXJsOiBVUkwgfCB1bmRlZmluZWQpID0+IFN0YXR1c1RhcmdldDtcbiAgLyoqIFRoZSBhc3NldHMgYnVja2V0LCB3aGVuIGBwdWJsaWMvYCBmaWxlcyBhcmUgc2VydmVkIGZyb20gaXQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHVibGljQnVja2V0Pzogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE5leHRqc1J1bnRpbWVPcHRpb25zKSB7XG4gICAgY29uc3QgeyBtYW5pZmVzdCwgZGVwbG95bWVudFJvb3QgfSA9IG9wdGlvbnM7XG4gICAgdGhpcy5lbnRyeXBvaW50cyA9IG5ldyBFbnRyeXBvaW50UmVnaXN0cnkoZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0KTtcbiAgICAvLyBMaXN0ZWQgb25jZSwgYXQgY29sZCBzdGFydDsgc2VlIGByZXNvbHZlUHVibGljRmlsZXNgLlxuICAgIGNvbnN0IHB1YmxpY0ZpbGVzID0gcmVzb2x2ZVB1YmxpY0ZpbGVzKGRlcGxveW1lbnRSb290LCBtYW5pZmVzdCk7XG4gICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IERpc3BhdGNoZXIoe1xuICAgICAgbWFuaWZlc3QsXG4gICAgICBwdWJsaWNGaWxlczogcHVibGljRmlsZXMuZmlsZXMsXG4gICAgfSk7XG4gICAgLy8gT24gZGlzayBvdGhlcndpc2UsIHdpdGggYC5uZXh0L3N0YXRpY2AuXG4gICAgdGhpcy5wdWJsaWNCdWNrZXQgPSBwdWJsaWNGaWxlcy5pblMzID8gb3B0aW9ucy5idWNrZXQgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5lcnJvclRhcmdldEZvciA9IHN0YXR1c1RhcmdldHMobWFuaWZlc3QsIDUwMCk7XG4gICAgdGhpcy5pbWFnZXMgPSBuZXcgUnVudGltZUltYWdlT3B0aW1pemVyKHtcbiAgICAgIGRlcGxveW1lbnRSb290LFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBidWNrZXQ6IHRoaXMucHVibGljQnVja2V0ID8/IFwiXCIsXG4gICAgICBidWNrZXRLZXlQcmVmaXg6IG9wdGlvbnMuYnVja2V0S2V5UHJlZml4ID8/IFwiXCIsXG4gICAgICBmZXRjaEludGVybmFsOiAoaHJlZiwgcmVxLCBtYXhpbXVtQm9keSkgPT5cbiAgICAgICAgdGhpcy5mZXRjaEludGVybmFsKGhyZWYsIHJlcSwgbWF4aW11bUJvZHkpLFxuICAgIH0pO1xuICAgIC8vIFRoZSBydW5uZXIgaXMgc2hhcmVkIOKAlCBpdCBtZW1vaXplcyB0aGUgbG9hZGVkIG1pZGRsZXdhcmUgbW9kdWxlIOKAlCB3aGlsZSB0aGVcbiAgICAvLyBgaW52b2tlTWlkZGxld2FyZWAgY2FsbGJhY2sgaXQgcHJvZHVjZXMgaXMgcGVyIHJlcXVlc3QuXG4gICAgdGhpcy5taWRkbGV3YXJlID0gbWFuaWZlc3QubWlkZGxld2FyZVxuICAgICAgPyBuZXcgTWlkZGxld2FyZVJ1bm5lcih7XG4gICAgICAgICAgbWlkZGxld2FyZTogbWFuaWZlc3QubWlkZGxld2FyZSxcbiAgICAgICAgICByb290OiBkZXBsb3ltZW50Um9vdCxcbiAgICAgICAgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBtYW5pZmVzdCgpOiBBZGFwdGVyTWFuaWZlc3Qge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWFuaWZlc3Q7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKFxuICAgIHJlcXVlc3Q6IFJ1bnRpbWVSZXF1ZXN0LFxuICAgIHNpbms6IFJlc3BvbnNlU2luayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBtYW5pZmVzdCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHBlbmRpbmc6IEFycmF5PFByb21pc2U8dW5rbm93bj4+ID0gW107XG4gICAgY29uc3Qgd2FpdFVudGlsID0gKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHtcbiAgICAgIHBlbmRpbmcucHVzaChwcm9taXNlKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYm9keSA9IHNwbGl0Qm9keShyZXF1ZXN0LmJvZHksIHRoaXMubWlkZGxld2FyZSAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCByZXEgPSBuZXcgU2hpbUluY29taW5nTWVzc2FnZSh7XG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgIGhlYWRlcnM6IHdpdGhvdXRJbnRlcm5hbEhlYWRlcnMoXG4gICAgICAgIHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgcmVxdWVzdC51cmwsXG4gICAgICAgIG1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCxcbiAgICAgICksXG4gICAgICBib2R5OiBib2R5LmZvclJlcXVlc3QsXG4gICAgICByZW1vdGVBZGRyZXNzOiByZXF1ZXN0LnJlbW90ZUFkZHJlc3MsXG4gICAgICBlbmNyeXB0ZWQ6IHJlcXVlc3QuZW5jcnlwdGVkLFxuICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiByZXF1ZXN0LnRydXN0Rm9yd2FyZGVkSG9zdCxcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSBuZXcgU2hpbVNlcnZlclJlc3BvbnNlKCk7XG4gICAgLy8gTmV4dC5qcyByZWFkcyBgcmVzLnJlcWAgaW4gYSBmZXcgZXJyb3IgcGF0aHMuXG4gICAgcmVzLnJlcSA9IHJlcTtcbiAgICByZXF1ZXN0LnNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHJlcy5kZXN0cm95KCksIHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgcmVqZWN0aW9uIGhhbmRsZXIgaXMgYXR0YWNoZWQgaGVyZSByYXRoZXIgdGhhbiBhdCB0aGUgYGF3YWl0YCBiZWxvdy5cbiAgICAvLyBgcm91dGUoKWAgYXdhaXRzIHJlYWwgSS9PLCBzbyBhIHN0cmVhbSB0aGF0IGJyZWFrcyB3aGlsZSBpdCBydW5zIHdvdWxkXG4gICAgLy8gbGVhdmUgdGhpcyBwcm9taXNlIHJlamVjdGVkIHdpdGggbm8gaGFuZGxlciBhdHRhY2hlZCBmb3IgYSBmdWxsIGV2ZW50LWxvb3BcbiAgICAvLyB0dXJuIOKAlCBhbmQgTm9kZSAyNCBkZWZhdWx0cyB0byBgLS11bmhhbmRsZWQtcmVqZWN0aW9ucz10aHJvd2AsIHdoaWNoIG9uXG4gICAgLy8gdGhlIGNvbnRhaW5lciBzaGVsbCB0YWtlcyB0aGUgd2hvbGUgdGFzayBkb3duIGFuZCBhYm9ydHMgZXZlcnkgb3RoZXJcbiAgICAvLyBpbi1mbGlnaHQgcmVxdWVzdCBvbiBpdC4gQSBtaWQtc3RyZWFtIEVQSVBFIGZyb20gb25lIGNsaWVudCBkaXNjb25uZWN0IGlzXG4gICAgLy8gbm90IGdyb3VuZHMgZm9yIHRoYXQuXG4gICAgLy9cbiAgICAvLyBUaGUgZXJyb3IgaXMgbG9nZ2VkLCBub3QgcmV0aHJvd246IHRoZSBzdHJlYW0gYnJva2UgYWZ0ZXIgKG9yIHdoaWxlKSB0aGVcbiAgICAvLyBoZWFkIHdlbnQgb3V0IOKAlCBhIGNsaWVudCBkaXNjb25uZWN0LCBvciBgc2VuZEVycm9yYCBkZXN0cm95aW5nIGFcbiAgICAvLyBoYWxmLXdyaXR0ZW4gcmVzcG9uc2Ug4oCUIGFuZCBuZWl0aGVyIGlzIGFuIGludm9jYXRpb24gZmFpbHVyZS4gUmV0aHJvd2luZ1xuICAgIC8vIHdvdWxkIG1ha2UgTGFtYmRhIHJldHJ5IGEgcmVxdWVzdCB0aGUgY2xpZW50IGFscmVhZHkgYWJhbmRvbmVkLlxuICAgIGNvbnN0IGZpbmlzaGVkID0gcGlwZVRvU2luayhyZXEsIHJlcywgc2luaywge1xuICAgICAgY29tcHJlc3M6IG1hbmlmZXN0LmNvbmZpZy5jb21wcmVzcyxcbiAgICB9KS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJUaGUgcmVzcG9uc2Ugc3RyZWFtIGRpZCBub3QgY29tcGxldGU6XCIsIGVycm9yKTtcbiAgICB9KTtcblxuICAgIC8vIEZvciB0aGUgZXJyb3IgcGFnZSdzIGxvY2FsZTsgdW5zZXQgd2hlbiB0aGUgdGhyb3cgaXMgYGFic29sdXRlVXJsYCdzLlxuICAgIGxldCB1cmw6IFVSTCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgLy8gQmVmb3JlIGFueXRoaW5nIHBhcnNlcyB0aGUgdGFyZ2V0LCBpbmNsdWRpbmcgYGFic29sdXRlVXJsYCAtIGBuZXcgVVJMYFxuICAgICAgLy8gcmVhZHMgYSBsZWFkaW5nIGAvL2AgYXMgcHJvdG9jb2wtcmVsYXRpdmUgYW5kIHdvdWxkIHRha2UgdGhlIGZpcnN0IHBhdGhcbiAgICAgIC8vIHNlZ21lbnQgZm9yIHRoZSBob3N0LlxuICAgICAgY29uc3QgY29sbGFwc2VkID0gY29sbGFwc2VSZXBlYXRlZFNsYXNoZXMocmVxdWVzdC51cmwpO1xuICAgICAgaWYgKGNvbGxhcHNlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNlbmRSZWRpcmVjdChyZXMsIGNvbGxhcHNlZCwgMzA4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEluc2lkZSB0aGUgdHJ5OiBgYWJzb2x1dGVVcmxgIGJ1aWxkcyBhIGBVUkxgIG91dCBvZiB0aGUgcmVxdWVzdCBsaW5lXG4gICAgICAgIC8vIGFuZCB0aGUgZm9yd2FyZGVkIGhlYWRlcnMsIGFuZCBhIHRocm93IGhlcmUgaGFzIHRvIHJlYWNoIHRoZSBlcnJvclxuICAgICAgICAvLyBsYWRkZXIgbGlrZSBhbnkgb3RoZXIuIE91dHNpZGUgaXQsIG9uIHRoZSBMYW1iZGEgc2hlbGxzIOKAlCB3aG9zZVxuICAgICAgICAvLyBoYW5kbGVycyB3cmFwIG5vdGhpbmcg4oCUIHRoZSBzYW1lIHRocm93IGlzIGFuIGludm9jYXRpb24gZXJyb3IgYW5kIGFcbiAgICAgICAgLy8gNTAyLlxuICAgICAgICB1cmwgPSBhYnNvbHV0ZVVybChyZXF1ZXN0KTtcbiAgICAgICAgYXdhaXQgdGhpcy5yb3V0ZShyZXEsIHJlcywgdXJsLCBib2R5LCB3YWl0VW50aWwsIHJlcXVlc3QpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRFcnJvcihyZXEsIHJlcywgd2FpdFVudGlsLCBlcnJvciwgdXJsKTtcbiAgICB9XG5cbiAgICBhd2FpdCBmaW5pc2hlZDtcblxuICAgIC8vIExhbWJkYSBmcmVlemVzIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgdGhlIG1vbWVudCB0aGUgaGFuZGxlciByZXNvbHZlcyDigJRcbiAgICAvLyB0aGVyZSBpcyBubyBwb3N0LXJlc3BvbnNlIGtlZXBhbGl2ZSDigJQgc28gYmFja2dyb3VuZCB3b3JrIHJlZ2lzdGVyZWQgd2l0aFxuICAgIC8vIGB3YWl0VW50aWxgIChub3RhYmx5IElTUiByZXZhbGlkYXRpb24pIGhhcyB0byBiZSBhd2FpdGVkIGhlcmUuIEFmdGVyIHRoZVxuICAgIC8vIHJlc3BvbnNlIHN0cmVhbSBoYXMgY2xvc2VkLCBzbyBjbGllbnQgbGF0ZW5jeSBpcyB1bmFmZmVjdGVkOyBiaWxsZWRcbiAgICAvLyBkdXJhdGlvbiBleHRlbmRzLCB3aGljaCBpcyB0aGUgY29ycmVjdCB0cmFkZSBhZ2FpbnN0IGEgcmV2YWxpZGF0aW9uIHRoYXRcbiAgICAvLyBuZXZlciBjb21wbGV0ZXMuXG4gICAgLy9cbiAgICAvLyBEcmFpbmVkIHVudGlsIG5vdGhpbmcgbmV3IGFycml2ZXMsIG5vdCBhd2FpdGVkIG9uY2U6IGB3YWl0VW50aWxgIGtlZXBzXG4gICAgLy8gYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSByZXNwb25zZSDigJQgTmV4dCdzIGBBZnRlckNvbnRleHRgIHJlZ2lzdGVycyBpdHNcbiAgICAvLyBjYWxsYmFjayBxdWV1ZSBvbiB0aGUgZmlyc3QgYGFmdGVyKClgLCBhbmQgYW4gYGFmdGVyKHByb21pc2UpYCBtYWRlIGZyb21cbiAgICAvLyBpbnNpZGUgYSBydW5uaW5nIGNhbGxiYWNrLCBvciBhIGJhY2tncm91bmQgcmVnZW5lcmF0aW9uIHRoYXQgaXRzZWxmIGNhbGxzXG4gICAgLy8gYGFmdGVyKClgLCByZWdpc3RlcnMgbW9yZS4gQSBzaW5nbGUgYGFsbFNldHRsZWRgIHNuYXBzaG90cyB0aGUgYXJyYXkgYW5kXG4gICAgLy8gbGV0cyBMYW1iZGEgZnJlZXplIG9uIHRoYXQgbGF0ZSB3b3JrLlxuICAgIGxldCBzZXR0bGVkQ291bnQgPSAwO1xuICAgIHdoaWxlIChzZXR0bGVkQ291bnQgPCBwZW5kaW5nLmxlbmd0aCkge1xuICAgICAgY29uc3QgYmF0Y2ggPSBwZW5kaW5nLnNsaWNlKHNldHRsZWRDb3VudCk7XG4gICAgICBzZXR0bGVkQ291bnQgPSBwZW5kaW5nLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYmF0Y2gpO1xuICAgICAgZm9yIChjb25zdCByZXN1bHQgb2Ygc2V0dGxlZCkge1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkEgd2FpdFVudGlsKCkgcHJvbWlzZSByZWplY3RlZDpcIiwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJvdXRlKFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB1cmw6IFVSTCxcbiAgICBib2R5OiBTcGxpdEJvZHksXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICByZXF1ZXN0OiBSdW50aW1lUmVxdWVzdCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgdXJsLFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnModG9XZWJIZWFkZXJzKHJlcS5oZWFkZXJzKSksXG4gICAgICBib2R5OiBib2R5LmZvckRpc3BhdGNoLFxuICAgICAgaW52b2tlTWlkZGxld2FyZTogdGhpcy5taWRkbGV3YXJlPy5pbnZva2VyRm9yKHtcbiAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsLFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgYm9keS5yZWxlYXNlVW5yZWFkKHJlc3VsdC5raW5kID09PSBcIm1pZGRsZXdhcmUtcmVzcG9uZGVkXCIpO1xuXG4gICAgYXBwbHlIZWFkZXJzKHJlcywgcmVzdWx0LnJlc3BvbnNlSGVhZGVycyk7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzLnN0YXR1c0NvZGUgPSByZXN1bHQuc3RhdHVzO1xuICAgIH1cblxuICAgIHN3aXRjaCAocmVzdWx0LmtpbmQpIHtcbiAgICAgIGNhc2UgXCJlbnRyeXBvaW50XCI6IHtcbiAgICAgICAgbGV0IGhhbmRsZXI6IEVudHJ5cG9pbnRIYW5kbGVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIgPSBhd2FpdCB0aGlzLmVudHJ5cG9pbnRzLmxvYWQocmVzdWx0LmVudHJ5cG9pbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgUm91dGVJbk90aGVyR3JvdXBFcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgICAgIC8vIEEgVVJMIHRoZSBlZGdlIHNlbnQgaGVyZSBvbmx5IGJlY2F1c2Ugb2YgaXRzIGNhc2UgZ29lcyB0byBpdHNcbiAgICAgICAgICAvLyBjYW5vbmljYWwgc3BlbGxpbmcsIHdoaWNoIHRoZSBlZGdlIHJvdXRlcyB0byB0aGUgb3duaW5nIGdyb3VwLlxuICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbCA9IGNhc2VDYW5vbmljYWxQYXRoKFxuICAgICAgICAgICAgdXJsLnBhdGhuYW1lLFxuICAgICAgICAgICAgcmVzdWx0LnJlc29sdmVkUGF0aG5hbWUsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFuaWZlc3QsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY2Fub25pY2FsKSB7XG4gICAgICAgICAgICBzZW5kUmVkaXJlY3QocmVzLCBgJHtjYW5vbmljYWx9JHt1cmwuc2VhcmNofWAsIDMwOCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXF1ZXN0Lm9uUm91dGVJbk90aGVyR3JvdXApIHtcbiAgICAgICAgICAgIC8vIEV4cGxhaW5lZCBieSB0aGUgY2FsbGVyIG9mIGBoYW5kbGVJbnRlcm5hbGx5YCwgd2hpY2gga25vd3Mgd2h5IGl0XG4gICAgICAgICAgICAvLyBoYXBwZW5lZC5cbiAgICAgICAgICAgIHJlcXVlc3Qub25Sb3V0ZUluT3RoZXJHcm91cChlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIExvZ2dlZCwgYmVjYXVzZSBpdCBpcyBhbHNvIHdoYXQgYSBtaXNyb3V0ZWQgZ3JvdXAgbG9va3MgbGlrZTsgc2VlXG4gICAgICAgICAgICAvLyBgUm91dGVJbk90aGVyR3JvdXBFcnJvcmAgZm9yIHdoeSBpdCBpcyBhIDQwNC5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZW5kVW5tYXRjaGVkKFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICAgICAgeyBwYXRobmFtZTogdXJsLnBhdGhuYW1lLCByZXF1ZXN0SGVhZGVyczogcmVzdWx0LnJlcXVlc3RIZWFkZXJzIH0sXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGludm9jYXRpb24gdGFyZ2V0LCBub3QgdGhlIHJlcXVlc3RlZCBVUkw6IGByZXNvbHZlUm91dGVzYCBoYXNcbiAgICAgICAgLy8gYXBwbGllZCByZXdyaXRlcywgc3RyaXBwZWQgaTE4biBwcmVmaXhlcywgYW5kIGFwcGVuZGVkIHRoZSBgbnh0UGBcbiAgICAgICAgLy8gcm91dGUgcGFyYW1zIGFzIHF1ZXJ5IHZhbHVlcy4gVGhhdCBpcyBleGFjdGx5IHRoZSBjb250cmFjdCBOZXh0LmpzXG4gICAgICAgIC8vIGRvY3VtZW50cyBmb3IgYSBwcm94eSBpbiBmcm9udCBvZiBhIGZ1bmN0aW9uIOKAlCBgUm91dGVNb2R1bGUucHJlcGFyZWBcbiAgICAgICAgLy8gcmVjb3ZlcnMgYHBhcmFtc2AgZnJvbSB0aGVzZSBxdWVyeSB2YWx1ZXMg4oCUIHNvIHRoYXQgY29udHJhY3QsIG5vdFxuICAgICAgICAvLyBgcmVxdWVzdE1ldGEucGFyYW1zYCwgaXMgaG93IHBhcmFtcyBnZXQgcGFzc2VkLiBUaGUgb25lIGV4Y2VwdGlvbiBpc1xuICAgICAgICAvLyBhIGNhcHR1cmUgdGhlIGNvbnRyYWN0IHdvdWxkIGNvcnJ1cHQ7IHNlZSBgb3V0T2ZCYW5kUm91dGVQYXJhbXNgLlxuICAgICAgICBjb25zdCBvdXRPZkJhbmQgPSBvdXRPZkJhbmRSb3V0ZVBhcmFtcyhcbiAgICAgICAgICByZXN1bHQuaW52b2NhdGlvblRhcmdldC5xdWVyeSxcbiAgICAgICAgICByZXN1bHQucmVzb2x2ZWRQYXRobmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaW52b2NhdGlvblF1ZXJ5ID1cbiAgICAgICAgICBvdXRPZkJhbmQ/LnF1ZXJ5ID8/IHJlc3VsdC5pbnZvY2F0aW9uVGFyZ2V0LnF1ZXJ5O1xuICAgICAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSByZXN1bHQuaW52b2NhdGlvblRhcmdldDtcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gdG9TZWFyY2goaW52b2NhdGlvblF1ZXJ5KTtcbiAgICAgICAgcmVxLnVybCA9IHNlYXJjaCA/IGAke3BhdGhuYW1lfT8ke3NlYXJjaH1gIDogcGF0aG5hbWU7XG4gICAgICAgIC8vIE1pZGRsZXdhcmUgbWF5IGhhdmUgcmV3cml0dGVuIHJlcXVlc3QgaGVhZGVycyB2aWFcbiAgICAgICAgLy8gYE5leHRSZXNwb25zZS5uZXh0KHsgcmVxdWVzdDogeyBoZWFkZXJzIH0gfSlgLlxuICAgICAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBoYW5kbGVyPlsyXSA9IHtcbiAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgcmVxdWVzdE1ldGE6IHtcbiAgICAgICAgICAgIC8vIFRoZSByZXNvbHZlZCBxdWVyeSwgc3RhdGVkIHJhdGhlciB0aGFuIGxlZnQgdG8gYmUgcmUtZGVyaXZlZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBgUm91dGVNb2R1bGUucHJlcGFyZWAgcnVucyBgaGFuZGxlUmV3cml0ZXNgIGFnYWluc3QgYHJlcS51cmxgXG4gICAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHksIGFuZCBgcmVxLnVybGAgaXMgdGhlICphbHJlYWR5IHJld3JpdHRlbiogdGFyZ2V0LlxuICAgICAgICAgICAgLy8gQSBgYmVmb3JlRmlsZXNgIHJld3JpdGUgd2hvc2UgY29uZGl0aW9uIHN0aWxsIGhvbGRzIGFmdGVyIGl0IGhhc1xuICAgICAgICAgICAgLy8gYmVlbiBhcHBsaWVkIHRoZXJlZm9yZSBnZXRzIGFwcGxpZWQgdHdpY2U6IGluXG4gICAgICAgICAgICAvLyBgdGVzdC9lMmUvbGluay13aXRoLWFwaS1yZXdyaXRlYCB0aGUgcnVsZVxuICAgICAgICAgICAgLy8gYC86cGF0aCguKilgICsgYGhhczogcXVlcnkganNvbj10cnVlYCAtPiBgL2FwaS9qc29uP2Zyb209LzpwYXRoYFxuICAgICAgICAgICAgLy8gbWF0Y2hlZCBgL2FwaS9qc29uP2pzb249dHJ1ZSZmcm9tPS9zb21lL3JvdXRlL2ZvcmAgYSBzZWNvbmQgdGltZVxuICAgICAgICAgICAgLy8gYW5kIG92ZXJ3cm90ZSBgZnJvbWAgd2l0aCBgL2FwaS9qc29uYC4gYG5leHQgc3RhcnRgIGVzY2FwZXMgaXRcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgaXRzIHJvdXRlciBsZWF2ZXMgYHJlcS51cmxgIGFzIHRoZSBVUkwgdGhlIGNsaWVudCBzZW50LCBzb1xuICAgICAgICAgICAgLy8gdGhlIG9uZSBwYXNzIGBwcmVwYXJlYCBtYWtlcyBpcyB0aGUgb25seSBvbmUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gYHByZXBhcmVgIHByZWZlcnMgdGhpcyBtZXRhIG92ZXIgaXRzIG93biBgcGFyc2VkVXJsLnF1ZXJ5YFxuICAgICAgICAgICAgLy8gKFwid2hlbiBkZXBsb3llZCBwcm94aWVzIHdpbGwgYWRkIHF1ZXJ5IHZhbHVlcyBmcm9tIHJlc29sdmluZyB0aGVcbiAgICAgICAgICAgIC8vIHJvdXRlcyB0byBwYXNzIHRvIGZ1bmN0aW9uXCIpLCB3aGljaCBpcyB0aGUgZG9jdW1lbnRlZCBkaXZpc2lvbiBvZlxuICAgICAgICAgICAgLy8gbGFib3VyIGZvciBhIHByb3h5IGluIGZyb250IG9mIGEgZnVuY3Rpb24gLSBhbmQgaXQgaXMgdGhlIHNhbWVcbiAgICAgICAgICAgIC8vIGRpdmlzaW9uIHRoZSBgcmVxLnVybGAgYWJvdmUgcmVsaWVzIG9uLiBTZXR0aW5nIGl0IGRvZXMgbm90IHN0b3BcbiAgICAgICAgICAgIC8vIHRoZSBzZWNvbmQgcmV3cml0ZSBwYXNzLCBpdCBqdXN0IHN0b3BzIHRoYXQgcGFzcyBmcm9tIGJlaW5nIHdoYXRcbiAgICAgICAgICAgIC8vIHRoZSByb3V0ZSBzZWVzLlxuICAgICAgICAgICAgcXVlcnk6IHsgLi4uaW52b2NhdGlvblF1ZXJ5IH0sXG4gICAgICAgICAgICAvLyBTZXQgb25seSBmb3IgYSBjYXB0dXJlIHRoZSBxdWVyeSBjb250cmFjdCBjYW5ub3QgY2FycnksIGFuZCB0aGVuXG4gICAgICAgICAgICAvLyBpbiBwbGFjZSBvZiBpdCByYXRoZXIgdGhhbiBhbG9uZ3NpZGUuXG4gICAgICAgICAgICAuLi4ob3V0T2ZCYW5kID8geyBwYXJhbXM6IG91dE9mQmFuZC5wYXJhbXMgfSA6IHt9KSxcbiAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgYFJvdXRlTW9kdWxlLnByZXBhcmVgIGZhbGxzIGJhY2sgdG9cbiAgICAgICAgICAgIC8vIGBodHRwOi8vbG9jYWxob3N0JHtyZXEudXJsfWAgYW5kIGV2ZXJ5IGFic29sdXRlIFVSTCBhIHJvdXRlXG4gICAgICAgICAgICAvLyBoYW5kbGVyIGJ1aWxkcyBpcyB3cm9uZy4gYHJlbGF0aXZlUHJvamVjdERpcmAgaXMgZGVsaWJlcmF0ZWx5XG4gICAgICAgICAgICAvLyAqbm90KiBwYXNzZWQ6IHRoZSBydW50aW1lIGBjaGRpcmBzIHRvIHRoZSBwcm9qZWN0IGRpciwgc28gdGhlXG4gICAgICAgICAgICAvLyB2YWx1ZSBOZXh0LmpzIGlubGluZWQgYXQgYnVpbGQgdGltZSAoXCJcIikgaXMgYWxyZWFkeSBjb3JyZWN0LCBhbmRcbiAgICAgICAgICAgIC8vIGBhcHAtcGFnZS1ydW50aW1lLmpzYCBpZ25vcmVzIHRoZSByZXF1ZXN0TWV0YSBvdmVycmlkZSBhbnl3YXkuXG4gICAgICAgICAgICBpbml0VVJMOiB1cmwuaHJlZixcbiAgICAgICAgICAgIC8vIEZlZWRzIGByb3V0ZXJTZXJ2ZXJDb250ZXh0Lmhvc3RuYW1lYCAoYHJvdXRlLW1vZHVsZS5qc2BcbiAgICAgICAgICAgIC8vIGBnZXRSb3V0ZXJTZXJ2ZXJDb250ZXh0YCkuIEluY2x1ZGVzIHRoZSBwb3J0LCBiZWNhdXNlIGl0IGlzXG4gICAgICAgICAgICAvLyBjb25jYXRlbmF0ZWQgaW50byBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgaG9zdG5hbWU6IHVybC5ob3N0LFxuICAgICAgICAgICAgLy8gQm90aCByb3V0ZXJzIGNhbGwgdGhpcyBmb3IgYSBgbm90Rm91bmQ6IHRydWVgIC8gYG5vdEZvdW5kKClgIHRoYXRcbiAgICAgICAgICAgIC8vIHRoZSBlbnRyeXBvaW50IGl0c2VsZiBjYW5ub3QgcmVuZGVyLCBhbmQgZmFsbCBiYWNrIHRvXG4gICAgICAgICAgICAvLyBgcmVzLmVuZCgnVGhpcyBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZCcpYCDigJQgbm8gc3RhdHVzLCBubyBhcHAgNDA0XG4gICAgICAgICAgICAvLyBwYWdlIOKAlCB3aGVuIGl0IGlzIGFic2VudC4gVGhlIGByZXFgL2ByZXNgIHRoZXkgcGFzcyBhcmUgdGhlIG9uZXNcbiAgICAgICAgICAgIC8vIGhhbmRlZCBpbiBqdXN0IGFib3ZlLCBzbyB0aGUgY2FwdHVyZWQgcGFpciBpcyB1c2VkIGluc3RlYWQgb2ZcbiAgICAgICAgICAgIC8vIHJlLWRlcml2aW5nIHRoZW0uXG4gICAgICAgICAgICByZW5kZXI0MDQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kTm90Rm91bmQoXG4gICAgICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLm5vdEZvdW5kRm9yKHVybCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gYHJlcy5yZXZhbGlkYXRlKClgIGZyb20gYSBQYWdlcyBBUEkgcm91dGUuIFdpdGhvdXQgaXQsIE5leHQuanNcbiAgICAgICAgICAgIC8vIGZhbGxzIGJhY2sgdG8gYGZldGNoKCdodHRwczovLycgKyByZXEuaGVhZGVycy5ob3N0ICsgdXJsUGF0aClgIOKAlFxuICAgICAgICAgICAgLy8gYW5kIG9ubHkgd2hlbiBgZXhwZXJpbWVudGFsLnRydXN0SG9zdEhlYWRlcmAgaXMgc2V0LCB3aGljaCBpdCBpc1xuICAgICAgICAgICAgLy8gbm90LCBzbyBgcmVzLnJldmFsaWRhdGUoKWAgdGhyZXdcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgIEZhaWxlZCB0byByZXZhbGlkYXRlIC86IEludmFyaWFudDogbWlzc2luZyBpbnRlcm5hbFxuICAgICAgICAgICAgLy8gICByb3V0ZXItc2VydmVyLW1ldGhvZHMgdGhpcyBpcyBhbiBpbnRlcm5hbCBidWdcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBhbmQgYHRlc3QvZTJlL3JldmFsaWRhdGUtcmVhc29uYCBzYXcgYHN0YWxlYCB3aGVyZSBgbmV4dCBzdGFydGBcbiAgICAgICAgICAgIC8vIHJlcG9ydHMgYG9uLWRlbWFuZGA6IHRoZSByb3V0ZSBzdGlsbCByZS1yZW5kZXJlZCwganVzdCBhcyBhblxuICAgICAgICAgICAgLy8gb3JkaW5hcnkgc3RhbGUgcmVnZW5lcmF0aW9uIHJhdGhlciB0aGFuIHRoZSBvbi1kZW1hbmQgb25lIGl0XG4gICAgICAgICAgICAvLyBhc2tlZCBmb3IuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQW5zd2VyaW5nIGl0IGluIHByb2Nlc3MgcmF0aGVyIHRoYW4gYnkgc2V0dGluZ1xuICAgICAgICAgICAgLy8gYHRydXN0SG9zdEhlYWRlcmA6IHRoZSBmZXRjaCBwYXRoIHdvdWxkIGxlYXZlIHRoZSBmdW5jdGlvbiwgY3Jvc3NcbiAgICAgICAgICAgIC8vIENsb3VkRnJvbnQgYW5kIGNvbWUgYmFjayDigJQgYSBzZWNvbmQgYmlsbGVkIGludm9jYXRpb24sIGFcbiAgICAgICAgICAgIC8vIGRlcGVuZGVuY3kgb24gYHgtcHJlcmVuZGVyLXJldmFsaWRhdGVgIHN1cnZpdmluZyB0aGUgZWRnZSwgYW5kIGFcbiAgICAgICAgICAgIC8vIHJlYXNvbiB0byB0cnVzdCBhIGNsaWVudC1zdXBwbGllZCBgSG9zdGAuIE5leHQuanMncyBvd25cbiAgICAgICAgICAgIC8vIG5vbi1zZXJ2ZXJsZXNzIGFuc3dlciBpcyB0aGUgc2FtZSBzaGFwZSBhcyB0aGlzIG9uZVxuICAgICAgICAgICAgLy8gKGBOZXh0U2VydmVyI3JldmFsaWRhdGVgIHJ1bnMgaXRzIHJlcXVlc3QgaGFuZGxlciBhZ2FpbnN0IGFcbiAgICAgICAgICAgIC8vIG1vY2tlZCBgcmVxYC9gcmVzYCkuXG4gICAgICAgICAgICByZXZhbGlkYXRlOiAoY29uZmlnOiBSZXZhbGlkYXRlQ29uZmlnKSA9PlxuICAgICAgICAgICAgICB0aGlzLnJldmFsaWRhdGUoY29uZmlnLCByZXF1ZXN0KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZW5kZXIgPSAoKSA9PiBoYW5kbGVyKHJlcSwgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLCBvcHRpb25zKTtcbiAgICAgICAgLy8gQ2F1Z2h0IHVwIGhlcmUsIG5vdCBpbiBgcmVmcmVzaFRhZ3NgOiBOZXh0LmpzIGF3YWl0cyB0aGF0IGluc2lkZSB0aGVcbiAgICAgICAgLy8gZmlyc3QgYCd1c2UgY2FjaGUnYCBsb29rdXAsIGFuZCBhIHdhaXQgdGhlcmUgY3V0cyB0aGUgc3RhdGljIHN0YWdlXG4gICAgICAgIC8vIHNob3J0LiBPbmx5IGZvciBhIHBhZ2U6IG5vdGhpbmcgZWxzZSBoYXMgYSBzdGF0aWMgc3RhZ2UgdG8gcHJvdGVjdCxcbiAgICAgICAgLy8gYW5kIGEgcm91dGUgaGFuZGxlciB0aGF0IHJlYWRzIHRoZSBjYWNoZSB3YWl0cyBpbiBgcmVmcmVzaFRhZ3NgXG4gICAgICAgIC8vIGluc3RlYWQuXG4gICAgICAgIGF3YWl0IChyZXN1bHQuZW50cnlwb2ludC50eXBlID09PSBcImFwcC1wYWdlXCJcbiAgICAgICAgICA/IGNhdGNoVXBUYWdzKHJlbmRlcilcbiAgICAgICAgICA6IHJlbmRlcigpKTtcbiAgICAgICAgLy8gQSBQYWdlcyBBUEkgcm91dGUgb3ducyB0aGUgZW5kIG9mIGl0cyByZXNwb25zZTogYHN0cmVhbS5waXBlKHJlcylgLFxuICAgICAgICAvLyBhbiBgZXh0ZXJuYWxSZXNvbHZlcmAgcHJveHksIG9yIGEgY2FsbGJhY2sgdGhhdCBjYWxscyBgcmVzLmpzb24oKWBcbiAgICAgICAgLy8gbGF0ZXIgYWxsIHJldHVybiBmcm9tIHRoZSBoYW5kbGVyIGJlZm9yZSB0aGV5IGFyZSBkb25lIHdyaXRpbmcsIGFuZFxuICAgICAgICAvLyBlbmRpbmcgaGVyZSBzZW50IGFuIGVtcHR5IDIwMCBhbmQgbWFkZSB0aGVpciB3cml0ZXMgdGhyb3dcbiAgICAgICAgLy8gYEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EYC4gYG5leHQgc3RhcnRgJ3MgYGFwaVJlc29sdmVyYCBsZWF2ZXMgaXRcbiAgICAgICAgLy8gb3BlbiB0b28g4oCUIG9uZSB0aGF0IG5ldmVyIGVuZHMgc3RhbGxzLCB0aGVyZSBhcyBoZXJlLiBgaGFuZGxlYCBhd2FpdHNcbiAgICAgICAgLy8gdGhlIHJlc3BvbnNlIGl0c2VsZiwgc28gbm90aGluZyBpcyBjdXQgc2hvcnQgYnkgcmV0dXJuaW5nLlxuICAgICAgICBpZiAoIXJlcy53cml0YWJsZUVuZGVkICYmIHJlc3VsdC5lbnRyeXBvaW50LnR5cGUgIT09IFwicGFnZS1hcGlcIikge1xuICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJzdGF0aWMtZmlsZVwiOiB7XG4gICAgICAgIGNvbnN0IHN0YXR1c1BhZ2UgPVxuICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPT09IFwic2VydmVyXCJcbiAgICAgICAgICAgID8gdGhpcy5zdGF0dXNQYWdlU3RhdHVzKHJlc3VsdC5wYXRobmFtZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBgbmV4dCBzdGFydGAgc2VydmVzIGEgYHB1YmxpYy9gIG9yIGBfbmV4dC9zdGF0aWNgIGZpbGUgdG8gR0VUIGFuZFxuICAgICAgICAvLyBIRUFEIG9ubHksIGFuZCBgc2VuZGAgd291bGQgc2VydmUgaXQgdG8gYW55IG1ldGhvZC4gVGhlIHNhbWUgZ29lcyBmb3JcbiAgICAgICAgLy8gYW4gYXV0by1leHBvcnRlZCBQYWdlcyBSb3V0ZXIgcGFnZSAoYGJhc2Utc2VydmVyLmpzYFxuICAgICAgICAvLyBgcmVuZGVyVG9SZXNwb25zZVdpdGhDb21wb25lbnRzSW1wbGA6IGEgc3RyaW5nIGBDb21wb25lbnRgIGFuc3dlcnNcbiAgICAgICAgLy8gYW55dGhpbmcgZWxzZSB3aXRoIGEgNDA1KSwgZXhjZXB0IHRoZSA0MDQgYW5kIDUwMCBwYWdlcy5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlcS5tZXRob2QgIT09IFwiR0VUXCIgJiZcbiAgICAgICAgICByZXEubWV0aG9kICE9PSBcIkhFQURcIiAmJlxuICAgICAgICAgIChyZXN1bHQuc291cmNlICE9PSBcInNlcnZlclwiIHx8XG4gICAgICAgICAgICAoc3RhdHVzUGFnZSA9PT0gdW5kZWZpbmVkICYmIHJlc3VsdC5maWxlUGF0aC5lbmRzV2l0aChcIi5odG1sXCIpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2VuZE1ldGhvZE5vdEFsbG93ZWQocmVzKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gXCJlbnN1cmUgY29ycmVjdCBzdGF0dXMgaXMgc2V0IHdoZW4gdmlzaXRpbmcgYSBzdGF0dXMgcGFnZSBkaXJlY3RseVwiOlxuICAgICAgICAvLyBgbmV4dCBzdGFydGAgYW5zd2VycyBgLzQwNGAgd2l0aCBhIDQwNCBhbmQgYC81MDBgIHdpdGggYSA1MDAsIG5vdCB0aGVcbiAgICAgICAgLy8gMjAwIHRoZWlyIHByZXJlbmRlcmVkIEhUTUwgd291bGQgb3RoZXJ3aXNlIGdvIG91dCB3aXRoLlxuICAgICAgICBpZiAoc3RhdHVzUGFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXNQYWdlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV0YWcgPSB0aGlzLm9wdGlvbnMubWFuaWZlc3QuY29uZmlnLmdlbmVyYXRlRXRhZ3M7XG4gICAgICAgIGNvbnN0IHB1YmxpY0RpciA9IGAke3B1YmxpY0RpcktleSh0aGlzLm9wdGlvbnMubWFuaWZlc3QpfS9gO1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPVxuICAgICAgICAgIChhd2FpdCBzZXJ2ZVN0YXRpY0ZpbGUoXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZGVwbG95bWVudFJvb3QsXG4gICAgICAgICAgICByZXN1bHQuZmlsZVBhdGgsXG4gICAgICAgICAgICB7IGV0YWcgfSxcbiAgICAgICAgICApKSB8fFxuICAgICAgICAgIC8vIExpc3RlZCBidXQgbm90IHN0YWdlZDogYSBMYW1iZGEgcm9vdCwgd2hvc2UgYHB1YmxpYy9gIGlzIGluIFMzLlxuICAgICAgICAgIChyZXN1bHQuc291cmNlID09PSBcInB1YmxpY1wiICYmXG4gICAgICAgICAgICAhIXRoaXMucHVibGljQnVja2V0ICYmXG4gICAgICAgICAgICAoYXdhaXQgc2VydmVTM1B1YmxpY0ZpbGUocmVxLCByZXMsIHtcbiAgICAgICAgICAgICAgYnVja2V0OiB0aGlzLnB1YmxpY0J1Y2tldCxcbiAgICAgICAgICAgICAga2V5UHJlZml4OiB0aGlzLm9wdGlvbnMuYnVja2V0S2V5UHJlZml4ID8/IFwiXCIsXG4gICAgICAgICAgICAgIGZpbGU6IHJlc3VsdC5maWxlUGF0aC5zbGljZShwdWJsaWNEaXIubGVuZ3RoKSxcbiAgICAgICAgICAgICAgZXRhZyxcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIGlmICghc2VydmVkKSB7XG4gICAgICAgICAgLy8gVGhlIHJvdXRpbmcgcnVsZSB0aGF0IG1hdGNoZWQgYSBidWlsZCBhc3NldCBhbHJlYWR5IHNldCBpdHNcbiAgICAgICAgICAvLyB5ZWFyLWxvbmcgYGltbXV0YWJsZWAgQ2FjaGUtQ29udHJvbCwgd2hpY2ggYHNlbmRVbm1hdGNoZWRgXG4gICAgICAgICAgLy8gcmVwbGFjZXM6IHVuZGVyIGl0IHRoZSA0MDQgd291bGQgYmUgY2FjaGVkIGF0IHRoZSBlZGdlIGFuZCBpblxuICAgICAgICAgIC8vIGJyb3dzZXJzIGZvciB0aGF0IGxvbmcsIGFuZCBhIGNodW5rIHRoYXQgc2hvd3MgdXAgb24gdGhlIG5leHRcbiAgICAgICAgICAvLyBkZXBsb3kgd291bGQgc3RheSBtaXNzaW5nLlxuICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZFVubWF0Y2hlZChyZXEsIHJlcywgd2FpdFVudGlsLCByZXN1bHQsIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiaW1hZ2Utb3B0aW1pemF0aW9uXCI6XG4gICAgICAgIGlmICghdGhpcy5pbWFnZXMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRVbm1hdGNoZWQoXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgICB7IHBhdGhuYW1lOiB1cmwucGF0aG5hbWUsIHJlcXVlc3RIZWFkZXJzOiByZXN1bHQucmVxdWVzdEhlYWRlcnMgfSxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBhd2FpdCB0aGlzLmltYWdlcy5oYW5kbGUocmVxLCByZXMsIHJlc3VsdC51cmwsIHdhaXRVbnRpbCk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBcInJlZGlyZWN0XCI6XG4gICAgICAgIHNlbmRSZWRpcmVjdChyZXMsIHJlc3VsdC5sb2NhdGlvbiwgcmVzdWx0LnN0YXR1cyk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBcImV4dGVybmFsLXJld3JpdGVcIjpcbiAgICAgICAgYXdhaXQgcHJveHlFeHRlcm5hbChyZXEsIHJlcywgcmVzdWx0LnVybCwgcmVzdWx0LnJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIFwibWlkZGxld2FyZS1yZXNwb25kZWRcIjpcbiAgICAgICAgYXdhaXQgc2VuZFdlYlJlc3BvbnNlKHJlcywgcmVzdWx0LnJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIFwicmVzcG9uc2VcIjpcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgXCJub3QtZm91bmRcIjpcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kVW5tYXRjaGVkKHJlcSwgcmVzLCB3YWl0VW50aWwsIHJlc3VsdCwgdXJsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiA0MDQgb3IgNTAwIHdoZW4gYHBhdGhuYW1lYCBpcyB0aGUgcHJlcmVuZGVyZWQgYC80MDRgIG9yIGAvNTAwYCBwYWdlIOKAlCB1bmRlclxuICAgKiBgYmFzZVBhdGhgIGFuZCwgaW4gYW4gaTE4biBhcHAsIGFueSBsb2NhbGUgKGAvZnIvNDA0YCkg4oCUIGFuZCBgdW5kZWZpbmVkYFxuICAgKiBvdGhlcndpc2UuIGBuZXh0IHN0YXJ0YCBtYXRjaGVzIHRoZSBwYWdlLCBub3QgdGhlIFVSTCwgc28gdGhlIGxvY2FsZSBkb2VzXG4gICAqIG5vdCBtYXR0ZXIuXG4gICAqL1xuICBwcml2YXRlIHN0YXR1c1BhZ2VTdGF0dXMocGF0aG5hbWU6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgeyBiYXNlUGF0aCwgaTE4biB9ID0gdGhpcy5vcHRpb25zLm1hbmlmZXN0LmNvbmZpZztcbiAgICBsZXQgcGFnZSA9IHdpdGhvdXRQYXRoUHJlZml4KHBhdGhuYW1lLCBiYXNlUGF0aCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IChpMThuIGFzIHsgbG9jYWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdIH0gfCBudWxsKT8ubG9jYWxlcztcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzID8/IFtdKSB7XG4gICAgICBjb25zdCBzdHJpcHBlZCA9IHdpdGhvdXRQYXRoUHJlZml4KHBhZ2UsIGAvJHtsb2NhbGV9YCk7XG4gICAgICBpZiAoc3RyaXBwZWQgIT09IHBhZ2UpIHtcbiAgICAgICAgcGFnZSA9IHN0cmlwcGVkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhZ2UgPT09IFwiLzQwNFwiKSByZXR1cm4gNDA0O1xuICAgIGlmIChwYWdlID09PSBcIi81MDBcIikgcmV0dXJuIDUwMDtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIGBuZXh0IHN0YXJ0YCdzIGFuc3dlciB0byBhIHBhdGggbm90aGluZyBzZXJ2ZXMgKGByb3V0ZXItc2VydmVyLmpzYCwgdGhlXG4gICAqIFwiNDA0IGNhc2VcIiksIGZvciBib3RoIHdheXMgb2YgZ2V0dGluZyBoZXJlOiBkaXNwYXRjaCBtYXRjaGVkIG5vdGhpbmcsIG9yIGl0XG4gICAqIG1hdGNoZWQgYSBidWlsZCBhc3NldCB0aGF0IGlzIG5vdCBpbiB0aGUgcGFja2FnZS5cbiAgICpcbiAgICogTm8tc3RvcmUsIGFsd2F5cy4gQSBwcmVyZW5kZXJlZCBgL19ub3QtZm91bmRgIHdvdWxkIG90aGVyd2lzZSBzZW5kIGl0c1xuICAgKiBjYWNoZSBlbnRyeSdzIHllYXItbG9uZyBgcy1tYXhhZ2VgLCBhbmQgdGhlIENETiB3b3VsZCBrZWVwIHRoZSA0MDQgcGFzdCB0aGVcbiAgICogZGVwbG95IHRoYXQgYWRkcyB0aGUgcm91dGUuIFNldCByYXRoZXIgdGhhbiBmb3JjZWQ6IE5leHQncyBwYWdlIGhhbmRsZXJzXG4gICAqIG9ubHkgd3JpdGUgYSBgQ2FjaGUtQ29udHJvbGAgd2hlbiBub25lIGlzIHNldCAoYHNlbmRSZW5kZXJSZXN1bHRgLFxuICAgKiBgcGFnZXMtaGFuZGxlci5qc2ApLCB3aGljaCBpcyBleGFjdGx5IGhvdyBgbmV4dCBzdGFydGAncyBvd24gbm8tc3RvcmUgaGVyZVxuICAgKiBzdXJ2aXZlcyB0aGUgcmVuZGVyLiBgcmVuZGVyNDA0YCBpcyBub3QgdGhpcyBwYXRoOiBhIGBub3RGb3VuZCgpYCBmcm9tIGFuXG4gICAqIElTUiBwYWdlIGlzIGNhY2hlYWJsZSBmb3IgdGhhdCBwYWdlJ3MgcmV2YWxpZGF0ZSBwZXJpb2QuXG4gICAqXG4gICAqIEEgbWlzc2luZyBgX25leHQvc3RhdGljYCBmaWxlLCBhbmQgYSBHRVQgb3IgSEVBRCB3aG9zZSBgU2VjLUZldGNoLURlc3RgXG4gICAqIHNheXMgaXQgY2Fubm90IGRpc3BsYXkgSFRNTCAoYW4gYDxpbWc+YCwgYSBzY3JpcHQsIGEgZm9udCksIGdldCBhXG4gICAqIHBsYWluLXRleHQgYE5vdCBGb3VuZGAgaW5zdGVhZCBvZiB0aGUgcmVuZGVyZWQgcGFnZSDigJQgbm90aGluZyB3b3VsZCBzaG93XG4gICAqIGl0LCBhbmQgcmVuZGVyaW5nIGl0IGlzIHRoZSBleHBlbnNpdmUgcGFydC5cbiAgICpcbiAgICogRXZlcnl0aGluZyBlbHNlIHJlbmRlcnMgdGhlIGFwcCdzIDQwNCBhcyB0aGUgcGF0aCB0aGF0IHdhcyBhc2tlZCBmb3IsIG5vdFxuICAgKiBhcyBgL19ub3QtZm91bmRgOiB0aGUgQXBwIFJvdXRlciBzZXJpYWxpemVzIHRoZSBjYW5vbmljYWwgVVJMIGludG8gdGhlIFJTQ1xuICAgKiBwYXlsb2FkLCBzbyBhIGNsaWVudCBoeWRyYXRlZCBvZmYgYSBgL19ub3QtZm91bmRgIHBheWxvYWQgcmVwb3J0cyB0aGUgd3JvbmdcbiAgICogYHVzZVBhdGhuYW1lKClgIGFuZCBwdXNoZXMgdGhlIHdyb25nIGhpc3RvcnkgZW50cnkuIEl0IHJlbmRlcnMgd2l0aCB0aGVcbiAgICogcmVxdWVzdCBoZWFkZXJzIG1pZGRsZXdhcmUgc2V0LCB0b28g4oCUIGEgQ1NQIG5vbmNlLCBzYXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRVbm1hdGNoZWQoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHdhaXRVbnRpbDogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQsXG4gICAgcmVzdWx0OiB7IHJlYWRvbmx5IHBhdGhuYW1lOiBzdHJpbmc7IHJlYWRvbmx5IHJlcXVlc3RIZWFkZXJzOiBIZWFkZXJzIH0sXG4gICAgdXJsOiBVUkwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlcy5zZXRIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIsIE5PX1NUT1JFKTtcbiAgICBjb25zdCB7IGJhc2VQYXRoLCBhc3NldFByZWZpeCB9ID0gdGhpcy5vcHRpb25zLm1hbmlmZXN0LmNvbmZpZztcbiAgICBjb25zdCBwYXRobmFtZSA9IHdpdGhvdXRQYXRoUHJlZml4KFxuICAgICAgd2l0aG91dFBhdGhQcmVmaXgocmVzdWx0LnBhdGhuYW1lLCBiYXNlUGF0aCksXG4gICAgICBhc3NldFByZWZpeCxcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvX25leHQvc3RhdGljL1wiKSB8fFxuICAgICAgKChyZXEubWV0aG9kID09PSBcIkdFVFwiIHx8IHJlcS5tZXRob2QgPT09IFwiSEVBRFwiKSAmJlxuICAgICAgICBOT05fSFRNTF9TRUNfRkVUQ0hfREVTVFMuaGFzKFxuICAgICAgICAgIGZpcnN0VmFsdWUocmVxLmhlYWRlcnNbXCJzZWMtZmV0Y2gtZGVzdFwiXSkgPz8gXCJcIixcbiAgICAgICAgKSlcbiAgICApIHtcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgICByZXMuZW5kKFwiTm90IEZvdW5kXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgIGF3YWl0IHRoaXMuc2VuZE5vdEZvdW5kKFxuICAgICAgcmVxLFxuICAgICAgcmVzLFxuICAgICAgd2FpdFVudGlsLFxuICAgICAgdGhpcy5kaXNwYXRjaGVyLm5vdEZvdW5kRm9yKHVybCksXG4gICAgICBgJHtyZXN1bHQucGF0aG5hbWV9JHt1cmwuc2VhcmNofWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgb24tZGVtYW5kIHJldmFsaWRhdGlvbiwgcnVuIGFnYWluc3QgdGhpcyBydW50aW1lIHJhdGhlciB0aGFuIG92ZXIgdGhlXG4gICAqIG5ldHdvcmsuIFdpcmVkIGluIGFzIGByZXF1ZXN0TWV0YS5yZXZhbGlkYXRlYDsgc2VlIHRoZSBjb21tZW50IHRoZXJlLlxuICAgKlxuICAgKiBUaGUgcmVzcG9uc2UgaXMgdGhyb3duIGF3YXkg4oCUIG9ubHkgaXRzIHN0YXR1cyBtYXR0ZXJzIOKAlCBidXQgaXQgZ29lcyB0aHJvdWdoXG4gICAqIHRoZSBmdWxsIHtAbGluayBoYW5kbGV9LCBzbyB0aGUgZW50cnlwb2ludCBzZWVzIGEgcmVxdWVzdCB3aXRoXG4gICAqIGB4LXByZXJlbmRlci1yZXZhbGlkYXRlYCBvbiBpdCBhbmQgd3JpdGVzIHRoZSBmcmVzaCBlbnRyeSB0aHJvdWdoIHRoZSBjYWNoZVxuICAgKiBoYW5kbGVyIGV4YWN0bHkgYXMgYSByZXF1ZXN0IGZyb20gb3V0c2lkZSB3b3VsZC4gYGhhbmRsZWAgYXdhaXRzIGl0cyBvd25cbiAgICogYHdhaXRVbnRpbGAgd29yaywgc28gdGhlIG5ldyBlbnRyeSBpcyBjb21taXR0ZWQgYmVmb3JlIGByZXMucmV2YWxpZGF0ZSgpYFxuICAgKiByZXNvbHZlcywgd2hpY2ggaXMgd2hhdCBjYWxsZXJzIHRoYXQgcmV2YWxpZGF0ZSBhbmQgdGhlbiByZWRpcmVjdCBkZXBlbmQgb24uXG4gICAqXG4gICAqIFRoZSBhY2NlcHQvdGhyb3cgcnVsZSBpcyBgTmV4dFNlcnZlciNyZXZhbGlkYXRlYCdzLCB2ZXJiYXRpbTogYSByZXZhbGlkYXRpb25cbiAgICogaXMgc3VjY2Vzc2Z1bCBpZiBpdCB3YXMgY2FjaGVkIG9yIGFuc3dlcmVkIDIwMCwgYW5kIGBub3RGb3VuZDogdHJ1ZWBcbiAgICogbGVnaXRpbWF0ZWx5IGFuc3dlcnMgNDA0IGZvciBhbiBgdW5zdGFibGVfb25seUdlbmVyYXRlZGAgY2FsbGVyLiBBbnl0aGluZ1xuICAgKiBlbHNlIHRocm93cywgYW5kIGByZXMucmV2YWxpZGF0ZSgpYCB0dXJucyBpdCBpbnRvIGBGYWlsZWQgdG8gcmV2YWxpZGF0ZVxuICAgKiA8cGF0aD46IDxtZXNzYWdlPmAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJldmFsaWRhdGUoXG4gICAgY29uZmlnOiBSZXZhbGlkYXRlQ29uZmlnLFxuICAgIG9yaWdpbjogUnVudGltZVJlcXVlc3QsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgaGVhZCwgb3RoZXJHcm91cCB9ID0gYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbGx5KFxuICAgICAge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIHVybDogY29uZmlnLnVybFBhdGgsXG4gICAgICAgIC8vIFRoZSBjYWxsZXIncyBhdXRob3JpdHksIG5vdCB0aGUgcmV2YWxpZGF0ZWQgcGF0aCdzOiBpdCBpcyB3aGF0XG4gICAgICAgIC8vIGBhYnNvbHV0ZVVybGAgYnVpbGRzIHRoZSByZXF1ZXN0IFVSTCBmcm9tLCBhbmQgYSByZXZhbGlkYXRpb24gaXMgZm9yXG4gICAgICAgIC8vIHRoZSBvcmlnaW4gYmVpbmcgc2VydmVkLiBUaGUgZm9yd2FyZGVkIHBhaXIgd2l0aCBpdCDigJQgYmVoaW5kXG4gICAgICAgIC8vIENsb3VkRnJvbnQgYGhvc3RgIGlzIHRoZSBGdW5jdGlvbiBVUkwsIGFuZCBhIHJlbmRlciB0aGF0IGJ1aWx0IGl0c1xuICAgICAgICAvLyBhYnNvbHV0ZSBVUkxzIGZyb20gdGhhdCB3b3VsZCBjYWNoZSBsaW5rcyB0byB0aGUgcmF3IGZ1bmN0aW9uLlxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uY29uZmlnLmhlYWRlcnMsXG4gICAgICAgICAgaG9zdDogb3JpZ2luLmhlYWRlcnMuaG9zdCxcbiAgICAgICAgICAuLi5waWNrRGVmaW5lZChvcmlnaW4uaGVhZGVycywgW1xuICAgICAgICAgICAgXCJ4LWZvcndhcmRlZC1ob3N0XCIsXG4gICAgICAgICAgICBcIngtZm9yd2FyZGVkLXByb3RvXCIsXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIGVuY3J5cHRlZDogb3JpZ2luLmVuY3J5cHRlZCxcbiAgICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiBvcmlnaW4udHJ1c3RGb3J3YXJkZWRIb3N0LFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0dXMgPSBoZWFkPy5zdGF0dXNDb2RlID8/IDUwMDtcbiAgICBpZiAob3RoZXJHcm91cCkge1xuICAgICAgY29uc3Qgc2VsZiA9IHByb2Nlc3MuZW52W0ZVTkNUSU9OX0dST1VQX0VOVl9WQVJdO1xuICAgICAgLy8gQSBwYWdlIHBhY2thZ2VkIGludG8gYW5vdGhlciBgZnVuY3Rpb25Hcm91cHNgIGdyb3VwOiBpdCBpcyByZW5kZXJlZCBpblxuICAgICAgLy8gcHJvY2VzcywgYW5kIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUgcGFnZSdzIGNvZGUuIENoZWNrZWRcbiAgICAgIC8vIGZpcnN0IGJlY2F1c2UgaXQgcmVuZGVycyBhcyBhIDQwNCwgd2hpY2ggYHVuc3RhYmxlX29ubHlHZW5lcmF0ZWRgXG4gICAgICAvLyB3b3VsZCBvdGhlcndpc2UgYWNjZXB0LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCByZXNwb25zZSAke3N0YXR1c306IFwiJHtjb25maWcudXJsUGF0aH1cIiBiZWxvbmdzIHRvIGAgK1xuICAgICAgICAgIGBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBncm91cCBcIiR7b3RoZXJHcm91cC5vd25lcn1cIiwgYW5kIGAgK1xuICAgICAgICAgIGByZXMucmV2YWxpZGF0ZSgpIGNhbiBvbmx5IHJldmFsaWRhdGUgcGFnZXMgaW4gdGhlIGdyb3VwIGl0IHJ1bnMgYCArXG4gICAgICAgICAgYGluIChcIiR7c2VsZn1cIikuIENhbGwgaXQgZnJvbSBhbiBBUEkgcm91dGUgaW4gZ3JvdXAgYCArXG4gICAgICAgICAgYFwiJHtvdGhlckdyb3VwLm93bmVyfVwiLCBvciB1c2UgcmV2YWxpZGF0ZVBhdGgoKS9yZXZhbGlkYXRlVGFnKCksIGAgK1xuICAgICAgICAgIGB3aGljaCB3b3JrIGZyb20gYW55IGdyb3VwLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBoZWFkPy5oZWFkZXJzW1wieC1uZXh0anMtY2FjaGVcIl0gIT09IFwiUkVWQUxJREFURURcIiAmJlxuICAgICAgc3RhdHVzICE9PSAyMDAgJiZcbiAgICAgICEoc3RhdHVzID09PSA0MDQgJiYgY29uZmlnLm9wdHMudW5zdGFibGVfb25seUdlbmVyYXRlZClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXNwb25zZSAke3N0YXR1c31gKTtcbiAgICB9XG5cbiAgICBhd2FpdCBpbnZhbGlkYXRlUmV2YWxpZGF0ZWRQYWdlKGNvbmZpZy51cmxQYXRoLCB0aGlzLm9wdGlvbnMubWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGltYWdlIG9wdGltaXphdGlvbiBzb3VyY2UgdGhhdCBpcyBub3QgYSBmaWxlOiBgPEltYWdlIHNyYz1cIi9hcGkvYXZhdGFyXCI+YFxuICAgKiBzZXJ2ZWQgYnkgYSByb3V0ZSBoYW5kbGVyLiBXaXJlZCBpbiBhcyB0aGUgb3B0aW1pemVyJ3MgYGZldGNoSW50ZXJuYWxgLCBhbmRcbiAgICogcnVuIGluIHByb2Nlc3MgZm9yIHRoZSByZWFzb25zIHtAbGluayByZXZhbGlkYXRlfSBpcyDigJQgYG5leHQgc3RhcnRgIGZldGNoZXNcbiAgICogdGhlIHNvdXJjZSBmcm9tIGl0c2VsZiBvdmVyIGxvb3BiYWNrLCB3aGljaCBoZXJlIHdvdWxkIGJlIGEgc2Vjb25kIGJpbGxlZFxuICAgKiBpbnZvY2F0aW9uIHRocm91Z2ggQ2xvdWRGcm9udC5cbiAgICpcbiAgICogT25seSB0aGUgYXV0aG9yaXR5IGlzIGZvcndhcmRlZCwgYXMgYG5leHQgc3RhcnRgJ3MgYGZldGNoSW50ZXJuYWxJbWFnZWBcbiAgICogZm9yd2FyZHMgbm9uZSBvZiB0aGUgdmlld2VyJ3MgaGVhZGVyczogdGhlIHNvdXJjZSBpcyBjYWNoZWQgYW5kIHNlcnZlZCB0b1xuICAgKiBldmVyeW9uZSwgc28gaXQgbXVzdCBub3QgZGVwZW5kIG9uIG9uZSB2aWV3ZXIncyBjb29raWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEludGVybmFsKFxuICAgIGhyZWY6IHN0cmluZyxcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgbWF4aW11bUJvZHk6IG51bWJlcixcbiAgKTogUHJvbWlzZTxJbnRlcm5hbEltYWdlUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBSdW50aW1lUmVxdWVzdCA9IHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogaHJlZixcbiAgICAgIGhlYWRlcnM6IHBpY2tEZWZpbmVkKHJlcS5oZWFkZXJzLCBbXG4gICAgICAgIFwiaG9zdFwiLFxuICAgICAgICBcIngtZm9yd2FyZGVkLWhvc3RcIixcbiAgICAgICAgXCJ4LWZvcndhcmRlZC1wcm90b1wiLFxuICAgICAgXSksXG4gICAgICBlbmNyeXB0ZWQ6IChyZXEuc29ja2V0IGFzIHsgZW5jcnlwdGVkPzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkKT8uZW5jcnlwdGVkLFxuICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiByZXEudHJ1c3RGb3J3YXJkZWRIb3N0LFxuICAgIH07XG4gICAgY29uc3QgeyBoZWFkLCBib2R5LCBvdGhlckdyb3VwLCB0b29MYXJnZSB9ID0gYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbGx5KFxuICAgICAgcmVxdWVzdCxcbiAgICAgIHsgbWF4aW11bUJvZHkgfSxcbiAgICApO1xuICAgIGlmICh0b29MYXJnZSkge1xuICAgICAgcmV0dXJuIHsgc3RhdHVzQ29kZTogMCwgaGVhZGVyczoge30sIGJvZHk6IEJ1ZmZlci5hbGxvYygwKSwgdG9vTGFyZ2UgfTtcbiAgICB9XG4gICAgaWYgKG90aGVyR3JvdXApIHtcbiAgICAgIC8vIFRoZSBlZGdlIHNlbmRzIGV2ZXJ5IGAvX25leHQvaW1hZ2VgIHJlcXVlc3QgdG8gdGhlIGRlZmF1bHQgZ3JvdXAsIGFuZFxuICAgICAgLy8gdGhlIHNvdXJjZSBpcyByZW5kZXJlZCBpbiBwcm9jZXNzLCBzbyBhIHJvdXRlIHBhY2thZ2VkIGludG8gYW5vdGhlclxuICAgICAgLy8gZ3JvdXAgaXMgb3V0IG9mIHJlYWNoOiB0aGUgb3B0aW1pemVyIGFuc3dlcnMgKGFuZCBsb2dzKSBhIDUwMi5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1c0NvZGU6IDAsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiBCdWZmZXIuYWxsb2MoMCksXG4gICAgICAgIG90aGVyR3JvdXA6IG90aGVyR3JvdXAub3duZXIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzQ29kZTogaGVhZD8uc3RhdHVzQ29kZSA/PyAwLFxuICAgICAgaGVhZGVyczogaGVhZD8uaGVhZGVycyA/PyB7fSxcbiAgICAgIGJvZHksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgcmVxdWVzdCB0aHJvdWdoIHtAbGluayBoYW5kbGV9LCBhbnN3ZXJlZCB0byB0aGlzIHJ1bnRpbWUgaW5zdGVhZCBvZiBhXG4gICAqIGNsaWVudDogdGhlIGhlYWQsIHRoZSBib2R5IHdoZW4gaXQgaXMgd2FudGVkLCBhbmQgdGhlIGVycm9yIHdoZW4gdGhlIHJvdXRlXG4gICAqIGlzIHBhY2thZ2VkIGludG8gYW5vdGhlciBgZnVuY3Rpb25Hcm91cHNgIGdyb3VwLiBgaGFuZGxlYCBhd2FpdHMgdGhlXG4gICAqIHJlcXVlc3QncyBgd2FpdFVudGlsYCB3b3JrIHRvbywgc28gd2hhdGV2ZXIgdGhlIHJlbmRlciB3cm90ZSBpcyBjb21taXR0ZWQgYnlcbiAgICogdGhlIHRpbWUgdGhpcyByZXNvbHZlcy5cbiAgICpcbiAgICogVGhlIGJvZHkgaXMga2VwdCBvbmx5IHdoZW4gYG1heGltdW1Cb2R5YCBpcyBzZXQuIE9uZSBwYXN0IGl0IGZhaWxzIHRoZVxuICAgKiByZXNwb25zZSBzdHJlYW0sIHdoaWNoIHN0b3BzIHRoZSByb3V0ZSB3cml0aW5nLCBhbmQgY29tZXMgYmFjayBhc1xuICAgKiBgdG9vTGFyZ2VgIHJhdGhlciB0aGFuIGhlbGQgaW4gbWVtb3J5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbnRlcm5hbGx5KFxuICAgIHJlcXVlc3Q6IFJ1bnRpbWVSZXF1ZXN0LFxuICAgIG9wdGlvbnM6IHsgcmVhZG9ubHkgbWF4aW11bUJvZHk/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTx7XG4gICAgaGVhZD86IFJlc3BvbnNlSGVhZDtcbiAgICBib2R5OiBCdWZmZXI7XG4gICAgb3RoZXJHcm91cD86IFJvdXRlSW5PdGhlckdyb3VwRXJyb3I7XG4gICAgdG9vTGFyZ2U6IGJvb2xlYW47XG4gIH0+IHtcbiAgICBsZXQgaGVhZDogUmVzcG9uc2VIZWFkIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgICBsZXQgc2l6ZSA9IDA7XG4gICAgbGV0IHRvb0xhcmdlID0gZmFsc2U7XG4gICAgbGV0IG90aGVyR3JvdXA6IFJvdXRlSW5PdGhlckdyb3VwRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb25Sb3V0ZUluT3RoZXJHcm91cCA9IChlcnJvcjogUm91dGVJbk90aGVyR3JvdXBFcnJvcikgPT4ge1xuICAgICAgb3RoZXJHcm91cCA9IGVycm9yO1xuICAgIH07XG4gICAgYXdhaXQgdGhpcy5oYW5kbGUoXG4gICAgICB7IC4uLnJlcXVlc3QsIG9uUm91dGVJbk90aGVyR3JvdXAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW4ocmVzcG9uc2VIZWFkKSB7XG4gICAgICAgICAgaGVhZCA9IHJlc3BvbnNlSGVhZDtcbiAgICAgICAgICByZXR1cm4gbmV3IFdyaXRhYmxlKHtcbiAgICAgICAgICAgIHdyaXRlKGNodW5rOiBCdWZmZXIsIF9lbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubWF4aW11bUJvZHkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIHNpemUgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgaWYgKHNpemUgPiBvcHRpb25zLm1heGltdW1Cb2R5KSB7XG4gICAgICAgICAgICAgICAgdG9vTGFyZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJPdmVyIGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5XCIpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZCxcbiAgICAgIGJvZHk6IHRvb0xhcmdlID8gQnVmZmVyLmFsbG9jKDApIDogQnVmZmVyLmNvbmNhdChjaHVua3MpLFxuICAgICAgb3RoZXJHcm91cCxcbiAgICAgIHRvb0xhcmdlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXBwIFJvdXRlciBidWlsZHMgYW4gaW52b2NhYmxlIGAvX25vdC1mb3VuZGAsIFBhZ2VzIFJvdXRlciBhIHByZXJlbmRlcmVkXG4gICAqIGA0MDQuaHRtbGAgKHBlciBsb2NhbGUgdW5kZXIgaTE4bikgb3IgZWxzZSBgL19lcnJvcmA7IHNlZSBgc3RhdHVzVGFyZ2V0c2AuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmROb3RGb3VuZChcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICB0YXJnZXQ6IFN0YXR1c1RhcmdldCxcbiAgICAvKipcbiAgICAgKiBXaGF0IHRvIHJlbmRlciB0aGUgNDA0IGFzLiBPbWl0dGVkIGJ5IGByZW5kZXI0MDRgLCB3aGljaCBpcyBjYWxsZWRcbiAgICAgKiBtaWQtcmVuZGVyIHdpdGggYHJlcS51cmxgIGFscmVhZHkgcG9pbnRpbmcgYXQgdGhlIHJvdXRlIHRoYXQgZ2F2ZSB1cCDigJRcbiAgICAgKiB0aGUgcGF0aCBOZXh0LmpzIHdvdWxkIHJlbmRlciB0aGF0IDQwNCBmb3IuXG4gICAgICovXG4gICAgcmVxdWVzdGVkVXJsPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcblxuICAgIGlmICh0YXJnZXQua2luZCA9PT0gXCJlbnRyeXBvaW50XCIpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLmVudHJ5cG9pbnRzLmxvYWQodGFyZ2V0LmVudHJ5cG9pbnQpO1xuICAgICAgcmVxLnVybCA9IHJlcXVlc3RlZFVybCA/PyByZXEudXJsO1xuICAgICAgY29uc3QgcmVuZGVyID0gKCkgPT4gaGFuZGxlcihyZXEsIGFzU2VydmVyUmVzcG9uc2UocmVzKSwgeyB3YWl0VW50aWwgfSk7XG4gICAgICAvLyBBcHAgUm91dGVyJ3MgYC9fbm90LWZvdW5kYCBpcyBhIHBhZ2UgcmVuZGVyIHRvbzogc2VlIGByb3V0ZWAuXG4gICAgICBhd2FpdCAodGFyZ2V0LmVudHJ5cG9pbnQudHlwZSA9PT0gXCJhcHAtcGFnZVwiXG4gICAgICAgID8gY2F0Y2hVcFRhZ3MocmVuZGVyKVxuICAgICAgICA6IHJlbmRlcigpKTtcbiAgICAgIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRhcmdldC5raW5kID09PSBcInN0YXRpYy1maWxlXCIgJiZcbiAgICAgIChhd2FpdCB0aGlzLnNlbmRIdG1sRmlsZShyZXMsIHRhcmdldCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgcmVzLmVuZChcIlRoaXMgcGFnZSBjb3VsZCBub3QgYmUgZm91bmQuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm4gYSB0aHJvd24gZXJyb3IgaW50byBhIHJlc3BvbnNlLCByZW5kZXJpbmcgdGhlIGFwcCdzIGVycm9yIHBhZ2Ugd2hlbiBpdFxuICAgKiBoYXMgb25lLlxuICAgKlxuICAgKiBOZXh0LmpzJ3Mgb3duIHBhZ2UgaGFuZGxlcnMgY2F0Y2gsIHJlcG9ydCBhbmQgdGhlbiAqcmV0aHJvdyogKFwicmV0aHJvdyBzb1xuICAgKiB0aGF0IHdlIGNhbiBoYW5kbGUgc2VydmluZyBlcnJvciBwYWdlXCIsIGBwYWdlcy1oYW5kbGVyLnRzYCksIHdoaWNoIG1ha2VzIHRoZVxuICAgKiBlcnJvciBwYWdlIHRoZSBob3N0J3Mgam9iIOKAlCB0aGUgc2FtZSBkaXZpc2lvbiBvZiBsYWJvciBhcyBgcmVuZGVyNDA0YC4gV2l0aG91dFxuICAgKiB0aGlzIGxhZGRlciBldmVyeSB0aHJvdyBhbnN3ZXJlZCBhIGJhcmUgYHRleHQvcGxhaW5gIDUwMCBhbmQgYSBjdXN0b21cbiAgICogYHBhZ2VzL19lcnJvcmAgd2FzIGRlYWQgY29kZSAoYHRlc3QvZTJlL2FzeW5jLW1vZHVsZXNgLCB3aG9zZSBgL21ha2UtZXJyb3JgXG4gICAqIHRocm93cyBpbiBgZ2V0U2VydmVyU2lkZVByb3BzYCkuXG4gICAqXG4gICAqIE9uY2UgdGhlIGhlYWQgaXMgb3V0IHRoZXJlIGlzIG5vdGhpbmcgdG8gc2F5IOKAlCBkZXN0cm95aW5nIHRoZSBzdHJlYW0gaXMgd2hhdFxuICAgKiB0ZWxscyB0aGUgY2xpZW50IHRoZSByZXNwb25zZSBpcyB0cnVuY2F0ZWQgcmF0aGVyIHRoYW4gY29tcGxldGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRFcnJvcihcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICAvKiogVGhlIHJlcXVlc3QsIGFzIHJlY2VpdmVkOiB3aGljaCBsb2NhbGUncyBwcmVyZW5kZXJlZCA1MDAgdG8gc2VuZC4gKi9cbiAgICB1cmw6IFVSTCB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5lcnJvcihcIlVuaGFuZGxlZCBlcnJvciB3aGlsZSBoYW5kbGluZyB0aGUgcmVxdWVzdDpcIiwgZXJyb3IpO1xuICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgIHJlcy5kZXN0cm95KGFzRXJyb3IoZXJyb3IpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgLy8gQSBmYWlsZWQgcmVuZGVyIG1heSBoYXZlIHNldCBoZWFkZXJzIGRlc2NyaWJpbmcgYSBib2R5IHRoYXQgbmV2ZXJcbiAgICAvLyBhcnJpdmVkLiBFdmVyeSBydW5nIGJlbG93IHNlbmRzIGEgZGlmZmVyZW50IGJvZHksIHNvIHRoZXkgZ28gZmlyc3Q6IGFcbiAgICAvLyBzdGFsZSBgQ29udGVudC1MZW5ndGhgIG9uIGEgNTAwLmh0bWwgb2YgYW5vdGhlciBzaXplIGhhbmdzIHRoZSBjbGllbnQgb3JcbiAgICAvLyBkZXN5bmNzIGEga2VlcC1hbGl2ZSBjb25uZWN0aW9uLlxuICAgIHJlcy5yZW1vdmVIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiKTtcbiAgICByZXMucmVtb3ZlSGVhZGVyKFwiRVRhZ1wiKTtcbiAgICAvLyBFdmVyeSBydW5nLCB0aGUgZXJyb3ItcGFnZSBlbnRyeXBvaW50IGluY2x1ZGVkOiBvdGhlcndpc2UgdGhlIHRocm93aW5nXG4gICAgLy8gcmVuZGVyJ3MgYHMtbWF4YWdlYCAob3IgYSBgaGVhZGVycygpYCBydWxlJ3MpIHJpZGVzIGFsb25nIGFuZCBDbG91ZEZyb250XG4gICAgLy8gY2FjaGVzIHRoZSA1MDAuIGBuZXh0IHN0YXJ0YCBzZXRzIGl0IGJlZm9yZSByZW5kZXJpbmcgdGhlIGVycm9yIHBhZ2UgdG9vLlxuICAgIHJlcy5zZXRIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIsIE5PX1NUT1JFKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmVycm9yVGFyZ2V0Rm9yKHVybCk7XG5cbiAgICBpZiAodGFyZ2V0LmtpbmQgPT09IFwiZW50cnlwb2ludFwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgdGhpcy5lbnRyeXBvaW50cy5sb2FkKHRhcmdldC5lbnRyeXBvaW50KTtcbiAgICAgICAgLy8gYHJlcS51cmxgIGlzIGxlZnQgYWxvbmU6IHRoZSBlcnJvciBwYWdlIHJlbmRlcnMgZm9yIHRoZSBVUkwgdGhhdCB3YXNcbiAgICAgICAgLy8gYXNrZWQgZm9yLCBhbmQgYF9lcnJvcmAncyBgZ2V0SW5pdGlhbFByb3BzYCByZWFkcyB0aGUgc3RhdHVzIG9mZiBgcmVzYCxcbiAgICAgICAgLy8gd2hpY2ggaXMgd2h5IHRoZSA1MDAgYWJvdmUgaXMgc2V0IGZpcnN0LlxuICAgICAgICBhd2FpdCBoYW5kbGVyKHJlcSwgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLCB7IHdhaXRVbnRpbCB9KTtcbiAgICAgICAgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvclBhZ2VFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVGhlIGVycm9yIHBhZ2UgaXRzZWxmIGZhaWxlZCB0byByZW5kZXI6XCIsXG4gICAgICAgICAgZXJyb3JQYWdlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgICByZXMuZGVzdHJveShhc0Vycm9yKGVycm9yUGFnZUVycm9yKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGFyZ2V0LmtpbmQgPT09IFwic3RhdGljLWZpbGVcIiAmJlxuICAgICAgKGF3YWl0IHRoaXMuc2VuZEh0bWxGaWxlKHJlcywgdGFyZ2V0KSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBZ2FpbjogYW4gZXJyb3IgcGFnZSB0aGF0IHRocmV3IG1heSBoYXZlIGRlc2NyaWJlZCBpdHMgb3duIGJvZHkgdG9vLlxuICAgIHJlcy5yZW1vdmVIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiKTtcbiAgICByZXMucmVtb3ZlSGVhZGVyKFwiRVRhZ1wiKTtcbiAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgICByZXMuc2V0SGVhZGVyKFwiQ2FjaGUtQ29udHJvbFwiLCBOT19TVE9SRSk7XG4gICAgcmVzLmVuZChcIkludGVybmFsIFNlcnZlciBFcnJvclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHByZXJlbmRlcmVkIDQwNCBvciA1MDAgcGFnZSwgb3IgYGZhbHNlYCB3aGVuIGl0IGNhbm5vdCBiZSByZWFkIGFuZCB0aGVcbiAgICogY2FsbGVyJ3MgcGxhaW4tdGV4dCBmYWxsYmFjayBzaG91bGQgYW5zd2VyLiBSZWFkIHJhdGhlciB0aGFuIGBzZXJ2ZVN0YXRpY2AsXG4gICAqIHdoaWNoIGtlZXBzIHRoZSBzdGF0dXMgYWxyZWFkeSBzZXQgYnV0IHdvdWxkIGFuc3dlciBhIGBSYW5nZWAgcmVxdWVzdCB3aXRoXG4gICAqIGEgMjA2IG9mIHRoZSBlcnJvciBwYWdlLCBhbmQgYWRkIGBFVGFnYCwgYExhc3QtTW9kaWZpZWRgIGFuZCwgd2hlcmUgbm9uZSBpc1xuICAgKiBzZXQgeWV0LCBhIHB1YmxpYyBgQ2FjaGUtQ29udHJvbGAgdG8gaXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRIdG1sRmlsZShcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB0YXJnZXQ6IHsgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZyB9LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgaHRtbDogQnVmZmVyO1xuICAgIHRyeSB7XG4gICAgICBodG1sID0gYXdhaXQgcmVhZEZpbGUoam9pbih0aGlzLm9wdGlvbnMuZGVwbG95bWVudFJvb3QsIHRhcmdldC5maWxlUGF0aCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHJlcy5lbmQoaHRtbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGF0IG5leHQgc2VuZHMgd2l0aCBhbiBlcnJvciBpdCByZW5kZXJlZCBpdHNlbGYuIFdpdGhvdXQgaXQgYSBgQ2FjaGUtQ29udHJvbGBcbiAqIGxlZnQgYmVoaW5kIGJ5IHRoZSByZW5kZXIgdGhhdCB0aHJldyBjYW4gZ2V0IGEgNTAwIGNhY2hlZCBhdCB0aGUgZWRnZS5cbiAqL1xuY29uc3QgTk9fU1RPUkUgPSBcInByaXZhdGUsIG5vLWNhY2hlLCBuby1zdG9yZSwgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGVcIjtcblxuLyoqXG4gKiBgU2VjLUZldGNoLURlc3RgIHZhbHVlcyB0aGF0IGNhbiBuZXZlciBkaXNwbGF5IGFuIEhUTUwgcmVzcG9uc2UsIGZyb21cbiAqIGBuZXh0L2Rpc3Qvc2VydmVyL2xpYi9pcy1ub24taHRtbC1zZWMtZmV0Y2gtZGVzdC5qc2AuIFJlc3RhdGVkIHJhdGhlciB0aGFuXG4gKiByZXF1aXJlZCwgYmVjYXVzZSB0aGF0IG1vZHVsZSBpcyByZWNlbnQgYW5kIHRoZSBhcHAncyBgbmV4dGAgbWF5IHByZWRhdGUgaXQ6XG4gKiBhIGZhaWxlZCByZXF1aXJlIGhlcmUgd291bGQgdHVybiBldmVyeSA0MDQgaW50byBhIDUwMC4gRXhjbHVkZXMgYGRvY3VtZW50YCxcbiAqIGBpZnJhbWVgIGFuZCB0aGUgbGlrZSwgYW5kIGBlbXB0eWAg4oCUIGBmZXRjaCgpYCwgd2hpY2ggaXMgaG93IFJTQyByZXF1ZXN0cyBnby5cbiAqL1xuY29uc3QgTk9OX0hUTUxfU0VDX0ZFVENIX0RFU1RTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwiYXVkaW9cIixcbiAgXCJhdWRpb3dvcmtsZXRcIixcbiAgXCJmb250XCIsXG4gIFwiaW1hZ2VcIixcbiAgXCJqc29uXCIsXG4gIFwibWFuaWZlc3RcIixcbiAgXCJwYWludHdvcmtsZXRcIixcbiAgXCJyZXBvcnRcIixcbiAgXCJzY3JpcHRcIixcbiAgXCJzZXJ2aWNld29ya2VyXCIsXG4gIFwic2hhcmVkd29ya2VyXCIsXG4gIFwic3R5bGVcIixcbiAgXCJ0cmFja1wiLFxuICBcInZpZGVvXCIsXG4gIFwid2ViaWRlbnRpdHlcIixcbiAgXCJ3b3JrZXJcIixcbiAgXCJ4c2x0XCIsXG5dKTtcblxuLyoqXG4gKiBgSU5URVJOQUxfSEVBREVSU2AgZnJvbSBgbmV4dC9kaXN0L3NlcnZlci9saWIvc2VydmVyLWlwYy91dGlscy5qc2AgKE5leHRcbiAqIDE2LjMpLCB3aGljaCBgbmV4dCBzdGFydGAgZGVsZXRlcyBmcm9tIGV2ZXJ5IHJlcXVlc3QgYmVmb3JlIHJvdXRpbmcgaXRcbiAqIChgZmlsdGVySW50ZXJuYWxIZWFkZXJzYCBpbiBgcm91dGVyLXNlcnZlci5qc2ApLiBUaGV5IGFyZSBzaWduYWxzIGJldHdlZW5cbiAqIE5leHQncyBvd24gcm91dGVyIGFuZCByZW5kZXIgbGF5ZXJzOyBob25vcmluZyBvbmUgYSBjbGllbnQgc2VudCBsZXRzIGl0IHN0ZWVyXG4gKiB0aG9zZSBsYXllcnMg4oCUIGBuZXh0LXJlc3VtZWAgbWFrZXMgYSBQUFIgcGFnZSByZXN1bWUgZnJvbSBhIHBvc3Rwb25lZCBzdGF0ZVxuICogdGhlIGNsaWVudCBzdXBwbGllcy4gUmVzdGF0ZWQgcmF0aGVyIHRoYW4gcmVxdWlyZWQsIGxpa2VcbiAqIHtAbGluayBOT05fSFRNTF9TRUNfRkVUQ0hfREVTVFN9LlxuICovXG5jb25zdCBJTlRFUk5BTF9IRUFERVJTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwieC1taWRkbGV3YXJlLXJld3JpdGVcIixcbiAgXCJ4LW1pZGRsZXdhcmUtcmVkaXJlY3RcIixcbiAgXCJ4LW1pZGRsZXdhcmUtc2V0LWNvb2tpZVwiLFxuICBcIngtbWlkZGxld2FyZS1za2lwXCIsXG4gIFwieC1taWRkbGV3YXJlLW92ZXJyaWRlLWhlYWRlcnNcIixcbiAgXCJ4LW1pZGRsZXdhcmUtbmV4dFwiLFxuICBcIngtbm93LXJvdXRlLW1hdGNoZXNcIixcbiAgXCJ4LW1hdGNoZWQtcGF0aFwiLFxuICBcIngtbmV4dGpzLWRhdGFcIixcbiAgXCJ4LW5leHQtcmVzdW1lLXN0YXRlLWxlbmd0aFwiLFxuICBcIm5leHQtcmVzdW1lXCIsXG5dKTtcblxuLyoqXG4gKiBUaGUgcmVxdWVzdCBoZWFkZXJzIHdpdGgge0BsaW5rIElOVEVSTkFMX0hFQURFUlN9IHJlbW92ZWQsIGFuZCBgeC1uZXh0anMtZGF0YWBcbiAqIHB1dCBiYWNrIGZvciBhIGBfbmV4dC9kYXRhYCByZXF1ZXN0LCB3aGljaCBpcyB3aGF0IGBuZXh0IHN0YXJ0YCdzXG4gKiBgcmVzb2x2ZVJvdXRlc2AgZG9lcyAoYHNldElzTmV4dERhdGFSZXF1ZXN0YCkgcmlnaHQgYWZ0ZXIgc3RyaXBwaW5nIGl0OiB0aGVcbiAqIGhlYWRlciBpcyBpbnRlcm5hbCwgYnV0IE5leHQncyBoYW5kbGVycyBhbmQgbWlkZGxld2FyZSBzdGlsbCByZWFkIGl0IOKAlCBpdCBpc1xuICogaG93IGEgZGF0YSByZXF1ZXN0IGdldHMgYHgtbmV4dGpzLW1hdGNoZWQtcGF0aGAg4oCUIHNvIGEgcmVhbCBkYXRhIHJlcXVlc3QgaGFzXG4gKiB0byBrZWVwIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dEludGVybmFsSGVhZGVycyhcbiAgaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycyxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBJbmNvbWluZ0h0dHBIZWFkZXJzIHtcbiAgY29uc3QgZmlsdGVyZWQ6IEluY29taW5nSHR0cEhlYWRlcnMgPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgaWYgKCFJTlRFUk5BTF9IRUFERVJTLmhhcyhuYW1lKSkge1xuICAgICAgZmlsdGVyZWRbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGF0aG5hbWUgPSB3aXRob3V0UGF0aFByZWZpeCh0YXJnZXQuc3BsaXQoXCI/XCIpWzBdLCBiYXNlUGF0aCk7XG4gIGlmIChwYXRobmFtZS5zdGFydHNXaXRoKFwiL19uZXh0L2RhdGEvXCIpICYmIHBhdGhuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICBmaWx0ZXJlZFtcIngtbmV4dGpzLWRhdGFcIl0gPSBcIjFcIjtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKiBFdmVyeSByb3V0ZSB0byBpbnZhbGlkYXRlLCBlYWNoIG9uY2UsIGluIG9uZSBDbG91ZEZyb250IGludmFsaWRhdGlvbi4gKi9cbnR5cGUgUmV2YWxpZGF0ZWRQYWdlSG9vayA9IChyb3V0ZXM6IHJlYWRvbmx5IHN0cmluZ1tdKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEludmFsaWRhdGUgdGhlIENETiBjb3BpZXMgb2YgYSBwYWdlIGByZXMucmV2YWxpZGF0ZSgpYCBqdXN0IHJlZ2VuZXJhdGVkOiBpdHNcbiAqIEhUTUwgYW5kIFJTQyBwYXlsb2FkLCBhbmQgaXRzIFBhZ2VzIFJvdXRlciBgX25leHQvZGF0YWAgSlNPTi4gV2l0aG91dCB0aGlzIHRoZVxuICogZnJlc2ggZW50cnkgc2F0IGJlaGluZCBDbG91ZEZyb250J3MgY29weSBvZiB0aGUgb2xkIG9uZSBmb3IgdGhlIHBhZ2UncyB3aG9sZVxuICogYHMtbWF4YWdlYCDigJQgYSB5ZWFyLCBmb3IgYW4gb24tZGVtYW5kLW9ubHkgSVNSIHBhZ2UuIGByZXZhbGlkYXRlUGF0aGAgYW5kXG4gKiBgcmV2YWxpZGF0ZVRhZ2AgZ28gdGhyb3VnaCB0aGUgY2FjaGUgaGFuZGxlcidzIGByZXZhbGlkYXRlVGFnYCwgd2hpY2ggYWxyZWFkeVxuICogaW52YWxpZGF0ZXM7IGByZXMucmV2YWxpZGF0ZSgpYCBkb2VzIG5vdCB0b3VjaCBpdC5cbiAqXG4gKiBFdmVyeSByb3V0ZSBpcyB3aXRob3V0IGBiYXNlUGF0aGAsIHdoaWNoIHRoZSBob29rIHByZWZpeGVzLiBBIG5vLW9wIG91dHNpZGVcbiAqIHRoZSBHbG9iYWwgY29uc3RydWN0cywgd2hlcmUgbm8gaG9vayBpcyByZWdpc3RlcmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbnZhbGlkYXRlUmV2YWxpZGF0ZWRQYWdlKFxuICB1cmxQYXRoOiBzdHJpbmcsXG4gIG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3QsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaG9vayA9IChnbG9iYWxUaGlzIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICBSRVZBTElEQVRFRF9QQUdFX0hPT0tcbiAgXSBhcyBSZXZhbGlkYXRlZFBhZ2VIb29rIHwgdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIGhvb2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByb3V0ZSA9IHdpdGhvdXRQYXRoUHJlZml4KFxuICAgIHVybFBhdGguc3BsaXQoXCI/XCIpWzBdLFxuICAgIG1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCxcbiAgKTtcbiAgdHJ5IHtcbiAgICAvLyBPbmUgY2FsbCwgZGVkdXBsaWNhdGVkOiB0aGUgZGVmYXVsdCBsb2NhbGUncyB0d28gcGFpcnMgc2hhcmUgYSBkYXRhXG4gICAgLy8gcm91dGUsIGFuZCBlYWNoIGludmFsaWRhdGlvbiBwYXRoIGNvdW50cyBhZ2FpbnN0IENsb3VkRnJvbnQncyBxdW90YS5cbiAgICBhd2FpdCBob29rKFsuLi5uZXcgU2V0KHJldmFsaWRhdGVkUGFnZVJvdXRlcyhyb3V0ZSwgbWFuaWZlc3QpLmZsYXQoKSldKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBUaGUgcmVnZW5lcmF0aW9uIGl0c2VsZiBzdWNjZWVkZWQ7IHRoZSBlZGdlIGNhdGNoZXMgdXAgYXQgYHMtbWF4YWdlYC5cbiAgICBjb25zb2xlLndhcm4oYENvdWxkIG5vdCBpbnZhbGlkYXRlIHRoZSBDRE4gY29weSBvZiAke3VybFBhdGh9OmAsIGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBgW3JvdXRlLCBkYXRhUm91dGVdYCBwYWlycyBhIHJldmFsaWRhdGVkIHBhZ2UgaXMgY2FjaGVkIHVuZGVyIGF0IHRoZSBlZGdlLlxuICpcbiAqIEluIGFuIGkxOG4gYXBwIHRoZSBOZXh0IGNsaWVudCBhbHdheXMgcHV0cyB0aGUgbG9jYWxlIGluIGEgZGF0YSBocmVmLCB0aGVcbiAqIGRlZmF1bHQgbG9jYWxlIGluY2x1ZGVkIChgL19uZXh0L2RhdGEvPGlkPi9lbi9ibG9nLmpzb25gLCBhbmQgYOKApi9lbi5qc29uYCBmb3JcbiAqIHRoZSByb290KSwgc28gdGhlIHVucHJlZml4ZWQgZGF0YSByb3V0ZSBuYW1lcyBub3RoaW5nIENsb3VkRnJvbnQgaG9sZHMuIFRoZVxuICogcGFnZSBpcyBvbmUgbG9jYWxlJ3Mg4oCUIGByZXMucmV2YWxpZGF0ZShcIi9ibG9nXCIpYCByZWdlbmVyYXRlcyB0aGUgZGVmYXVsdFxuICogbG9jYWxlJ3MsIGBcIi9mci9ibG9nXCJgIEZyZW5jaCDigJQgYW5kIHRoZSBkZWZhdWx0IGxvY2FsZSdzIEhUTUwgaXMgcmVhY2hhYmxlLFxuICogYW5kIGNhY2hlZCwgYm90aCB3aXRoIGFuZCB3aXRob3V0IGl0cyBwcmVmaXgsIHNvIGl0cyB0d28gcGFpcnMgc2hhcmUgYSBkYXRhXG4gKiByb3V0ZSwgd2hpY2ggdGhlIGNhbGxlciBzZW5kcyBvbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV2YWxpZGF0ZWRQYWdlUm91dGVzKFxuICByb3V0ZTogc3RyaW5nLFxuICBtYW5pZmVzdDogUGljazxBZGFwdGVyTWFuaWZlc3QsIFwiYnVpbGRJZFwiIHwgXCJjb25maWdcIj4sXG4pOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGRhdGFSb3V0ZSA9IChwYWdlOiBzdHJpbmcpID0+XG4gICAgYC9fbmV4dC9kYXRhLyR7bWFuaWZlc3QuYnVpbGRJZH0ke1xuICAgICAgcGFnZSA9PT0gXCIvXCIgPyBcIi9pbmRleFwiIDogcGFnZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gICAgfS5qc29uYDtcbiAgY29uc3QgaTE4biA9IG1hbmlmZXN0LmNvbmZpZy5pMThuIGFzIHtcbiAgICByZWFkb25seSBsb2NhbGVzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgcmVhZG9ubHkgZGVmYXVsdExvY2FsZT86IHN0cmluZztcbiAgfSB8IG51bGw7XG4gIGlmICghaTE4bj8uZGVmYXVsdExvY2FsZSkge1xuICAgIHJldHVybiBbW3JvdXRlLCBkYXRhUm91dGUocm91dGUpXV07XG4gIH1cbiAgY29uc3QgeyBkZWZhdWx0TG9jYWxlIH0gPSBpMThuO1xuICBjb25zdCBzZWdtZW50ID0gcm91dGUuc3BsaXQoXCIvXCIpWzFdID8/IFwiXCI7XG4gIGNvbnN0IGxvY2FsZSA9IChpMThuLmxvY2FsZXMgPz8gW10pLmluY2x1ZGVzKHNlZ21lbnQpXG4gICAgPyBzZWdtZW50XG4gICAgOiBkZWZhdWx0TG9jYWxlO1xuICBjb25zdCBwYWdlID1cbiAgICBsb2NhbGUgPT09IHNlZ21lbnQgPyB3aXRob3V0UGF0aFByZWZpeChyb3V0ZSwgYC8ke3NlZ21lbnR9YCkgOiByb3V0ZTtcbiAgY29uc3QgbG9jYWxpemVkID0gcGFnZSA9PT0gXCIvXCIgPyBgLyR7bG9jYWxlfWAgOiBgLyR7bG9jYWxlfSR7cGFnZX1gO1xuICAvLyBUaGUgcm9vdCdzIGRhdGEgcm91dGUgaXMgdGhlIGxvY2FsZSBpdHNlbGYsIG5vdCBgLzxsb2NhbGU+L2luZGV4YC5cbiAgY29uc3QgbG9jYWxpemVkRGF0YSA9IGAvX25leHQvZGF0YS8ke21hbmlmZXN0LmJ1aWxkSWR9JHtsb2NhbGl6ZWQucmVwbGFjZSgvXFwvKyQvLCBcIlwiKX0uanNvbmA7XG4gIHJldHVybiBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGVcbiAgICA/IFtcbiAgICAgICAgW3BhZ2UsIGxvY2FsaXplZERhdGFdLFxuICAgICAgICBbbG9jYWxpemVkLCBsb2NhbGl6ZWREYXRhXSxcbiAgICAgIF1cbiAgICA6IFtbbG9jYWxpemVkLCBsb2NhbGl6ZWREYXRhXV07XG59XG5cbmZ1bmN0aW9uIGFzRXJyb3IoZXJyb3I6IHVua25vd24pOiBFcnJvciB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgbWFuaWZlc3QgYW5kIHBpbiB0aGUgbGF5b3V0IGl0IGRlc2NyaWJlcy5cbiAqXG4gKiBgcHJvY2Vzcy5jd2QoKWAgaXMgbG9hZC1iZWFyaW5nIGFuZCB0aGVyZSBpcyBleGFjdGx5IG9uZSBjaGFuY2UgdG8gZ2V0IGl0XG4gKiByaWdodDogTmV4dC5qcyBpbmxpbmVzIGByZWxhdGl2ZShidWlsZEN3ZCwgcHJvamVjdERpcilgIGludG8gZXZlcnkgZW50cnlwb2ludFxuICogYW5kIHJlc29sdmVzIGl0IGFnYWluc3QgdGhlICpydW50aW1lKiBjd2QgdG8gZmluZFxuICogYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCwgdGhlIHByZXJlbmRlciBtYW5pZmVzdCwgYW5kIHRoZSBhcHAncyBjaHVua3MuXG4gKiBgYXNzZXJ0QnVpbGRDd2RgIGluIGBidWlsZC1vdXRwdXRzLnRzYCBrZWVwcyB0aGF0IGlubGluZWQgdmFsdWUgYFwiXCJgLCBzbyB0aGVcbiAqIHdob2xlIGludmFyaWFudCByZWR1Y2VzIHRvIFwiY3dkIGlzIHRoZSBzdGFnZWQgcHJvamVjdCBkaXJcIiDigJQgYXNzZXJ0ZWQgcmF0aGVyXG4gKiB0aGFuIGFzc3VtZWQsIGJlY2F1c2UgZ2V0dGluZyBpdCB3cm9uZyBwcm9kdWNlcyBhXG4gKiBgQ2Fubm90IGZpbmQgbW9kdWxlIOKApi9yZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAgZnJvbSBpbnNpZGUgY29tcGlsZWQgTmV4dC5qc1xuICogY29kZSB3aXRoIG5vIGluZGljYXRpb24gdGhhdCB0aGUgbGF5b3V0IGlzIHRoZSBwcm9ibGVtLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFJ1bnRpbWUoXG4gIGRlcGxveW1lbnRSb290OiBzdHJpbmcsXG4pOiBQcm9taXNlPE5leHRqc1J1bnRpbWU+IHtcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gZGVwbG95ZWRNYW5pZmVzdFBhdGgoZGVwbG95bWVudFJvb3QpO1xuICBsZXQgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdDtcbiAgdHJ5IHtcbiAgICBtYW5pZmVzdCA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUobWFuaWZlc3RQYXRoLCBcInV0Zi04XCIpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ291bGQgbm90IHJlYWQgdGhlIGNkay1uZXh0anMgYWRhcHRlciBtYW5pZmVzdCBhdCBcIiR7bWFuaWZlc3RQYXRofVwiLiBgICtcbiAgICAgICAgYFRoZSBkZXBsb3ltZW50IHBhY2thZ2UgaXMgaW5jb21wbGV0ZTogc3ludGggY29waWVzIGAgK1xuICAgICAgICBgJHtNQU5JRkVTVF9GSUxFX05BTUV9IGluIG5leHQgdG8gdGhlIGJ1bmRsZWQgcnVudGltZS5gLFxuICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdERpciA9IGpvaW4oZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0LnJlbGF0aXZlUHJvamVjdERpcik7XG4gIGNvbnN0IHByb2JlID0gam9pbihcbiAgICBwcm9qZWN0RGlyLFxuICAgIG1hbmlmZXN0LmNvbmZpZy5kaXN0RGlyLFxuICAgIFwicmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25cIixcbiAgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZWFkRmlsZShwcm9iZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBkZXBsb3ltZW50IHJvb3QgXCIke2RlcGxveW1lbnRSb290fVwiIGRvZXMgbm90IGNvbnRhaW4gdGhlIHN0YWdlZCBgICtcbiAgICAgICAgYE5leHQuanMgcHJvamVjdDogZXhwZWN0ZWQgXCIke3Byb2JlfVwiIHRvIGV4aXN0LiBFdmVyeSBidWlsdCBlbnRyeXBvaW50IGAgK1xuICAgICAgICBgcmVzb2x2ZXMgaXRzIG93biBwYXRocyBhZ2FpbnN0IHByb2Nlc3MuY3dkKCksIHNvIHRoaXMgbGF5b3V0IGlzIHBhcnQgYCArXG4gICAgICAgIGBvZiB0aGUgY29udHJhY3QsIG5vdCBhIGNvbnZlbmllbmNlLmAsXG4gICAgICB7IGNhdXNlOiBlcnJvciB9LFxuICAgICk7XG4gIH1cbiAgLy8gYG5leHQgc3RhcnRgIGZvcmNlcyB0aGlzLCBhbmQgZXh0ZXJuYWxpemVkIHBhY2thZ2VzIChSZWFjdCBmb3IgUGFnZXMgUm91dGVyXG4gIC8vIFNTUiwgYW55dGhpbmcgaW4gYHNlcnZlckV4dGVybmFsUGFja2FnZXNgKSBwaWNrIHRoZWlyIGRldiBvciBwcm9kIGJ1aWxkIGZyb21cbiAgLy8gaXQgYXQgcmVxdWlyZSB0aW1lLiBUaGUgQ29udGFpbmVycyBEb2NrZXJmaWxlcyBzZXQgaXQgYW5kIHRoZSBGdW5jdGlvbnNcbiAgLy8gY29uc3RydWN0cyBkbyB0b287IHRoaXMgY292ZXJzIGEgaGFuZC13aXJlZCBmdW5jdGlvbi4gQmVmb3JlIGFueSBgcmVxdWlyZWAuXG4gIC8vIChgbmV4dGAncyB0eXBpbmdzIGRlY2xhcmUgTk9ERV9FTlYgcmVhZC1vbmx5LilcbiAgKHByb2Nlc3MuZW52IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pLk5PREVfRU5WID8/PSBcInByb2R1Y3Rpb25cIjtcbiAgcHJvY2Vzcy5jaGRpcihwcm9qZWN0RGlyKTtcbiAgLy8gQmVmb3JlIGFueXRoaW5nIGNhbiBzZXJ2ZSBhIHJlcXVlc3Q6IHRoZSBydW50aW1lJ3Mgb3duIGBuZXh0YCBpbXBvcnRzIHJlc29sdmVcbiAgLy8gb3V0IG9mIHRoZSBzdGFnZWQgYXBwLCBub3Qgb3V0IG9mIHRoZSBzaGVsbCdzIGRpcmVjdG9yeS4gU2VlIGBuZXh0LW1vZHVsZXMudHNgLlxuICB1c2VOZXh0RnJvbShwcm9qZWN0RGlyKTtcbiAgLy8gQmVmb3JlIGFueSBlbnRyeXBvaW50IGNhbiByZWFkIHRoZW0gYXQgbW9kdWxlIHNjb3BlLlxuICBsb2FkRW52RmlsZXMocHJvamVjdERpcik7XG4gIC8vIFRoZW4sIGJlZm9yZSBhbnkgZW50cnlwb2ludCAob3IgbWlkZGxld2FyZSkgY2FuIGJlIGxvYWRlZDogTmV4dCdzIG93blxuICAvLyBub2RlLWVudmlyb25tZW50IGJvb3RzdHJhcC4gU2VlIGBzZXR1cE5vZGVFbnZpcm9ubWVudGAuXG4gIHNldHVwTm9kZUVudmlyb25tZW50KCk7XG4gIC8vIEFuZCBsYXN0LCBvbmNlIHRoZSBlbnZpcm9ubWVudCBpcyByZWFkeTogYHJlZ2lzdGVyKClgLCBiZWZvcmUgYW55IGVudHJ5cG9pbnRcbiAgLy8gb3IgbWlkZGxld2FyZSBtb2R1bGUgaXMgZXZhbHVhdGVkLiBTZWUgYHJlZ2lzdGVySW5zdHJ1bWVudGF0aW9uYC5cbiAgYXdhaXQgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb24ocHJvamVjdERpciwgbWFuaWZlc3QuY29uZmlnLmRpc3REaXIpO1xuXG4gIHJldHVybiBuZXcgTmV4dGpzUnVudGltZSh7XG4gICAgZGVwbG95bWVudFJvb3QsXG4gICAgbWFuaWZlc3QsXG4gICAgYnVja2V0OiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfQlVDS0VUX05BTUUsXG4gICAgYnVja2V0S2V5UHJlZml4OiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWCxcbiAgfSk7XG59XG5cbi8qKlxuICogQSBzeW50YWN0aWNhbGx5IHZhbGlkIGBob3N0Wzpwb3J0XWA6IGEgcmVnaXN0ZXJlZCBuYW1lIG9yIGEgYnJhY2tldGVkIElQdjZcbiAqIGxpdGVyYWwsIG9wdGlvbmFsbHkgd2l0aCBhIHBvcnQuIEFueXRoaW5nIGVsc2UgY2Fubm90IGJlIHRoZSBhdXRob3JpdHkgb2YgYVxuICogVVJMLlxuICovXG5jb25zdCBIT1NUX0FVVEhPUklUWSA9IC9eKD86XFxbWzAtOUEtRmEtZjouXStcXF18WzAtOUEtWmEtei5fLV0rKSg/OjpcXGR7MSw1fSk/JC87XG5cbi8qKlxuICogVGhlIGZpcnN0IHZhbHVlIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIGFzIGFuIGF1dGhvcml0eSwgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogYHgtZm9yd2FyZGVkLWhvc3RgIGNhbiBhcnJpdmUgYXMgYSBsaXN0IHdoZW4gbW9yZSB0aGFuIG9uZSBwcm94eSBhcHBlbmRzIHRvXG4gKiBpdC4gVmFsaWRhdGluZyBpcyB3aGF0IGtlZXBzIGEgbWFsZm9ybWVkIHZhbHVlIGZyb20gbWFraW5nIHRoZSBgVVJMYFxuICogY29uc3RydWN0b3IgdGhyb3cg4oCUIHdoaWNoIG9uIHRoZSBMYW1iZGEgc2hlbGxzIGlzIGFuIGludm9jYXRpb24gZXJyb3IgYW5kIGFcbiAqIDUwMiwgbm90IGEgcmVzcG9uc2UuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkQXV0aG9yaXR5KFxuICB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGUgPSBmaXJzdFZhbHVlKHZhbHVlKT8uc3BsaXQoXCIsXCIpWzBdLnRyaW0oKTtcbiAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBIT1NUX0FVVEhPUklUWS50ZXN0KGNhbmRpZGF0ZSkgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogYHJlc29sdmVSb3V0ZXNgIG5lZWRzIGFuIGFic29sdXRlIFVSTCwgYW5kIGl0IGJlY29tZXMgdGhlIG9yaWdpbiBldmVyeVxuICogYWJzb2x1dGUgVVJMIHRoZSBhcHAgYnVpbGRzIHN0YXJ0cyB3aXRoIOKAlCBgcmVxLm5leHRVcmwub3JpZ2luYCBpbiBtaWRkbGV3YXJlLFxuICogYGluaXRVUkxgIGZvciBhIHJvdXRlIGhhbmRsZXIg4oCUIHNvIGl0cyBob3N0IGhhcyB0byBiZSBvbmUgdGhlIGNsaWVudCBjYW5ub3RcbiAqIHBpY2suXG4gKlxuICogVGhhdCBpcyBgSG9zdGAgb24gZXZlcnkgZGVwbG95bWVudCBidXQgb25lOiBDbG91ZEZyb250IGZvcndhcmRzIHRoZSB2aWV3ZXInc1xuICogYEhvc3RgIHRvIGEgY29udGFpbmVyIG9yaWdpbiAoYEFMTF9WSUVXRVJgKSwgYW4gQUxCIHBhc3NlcyBpdCB0aHJvdWdoLCBhbmQgQVBJXG4gKiBHYXRld2F5IHNldHMgaXRzIG93biBkb21haW4uIFRoZSBleGNlcHRpb24gaXMgYSBMYW1iZGEgRnVuY3Rpb24gVVJMLCB3aGVyZVxuICogQ2xvdWRGcm9udCBoYXMgdG8gc2VuZCB0aGUgVVJMJ3Mgb3duIGRvbWFpbiBhcyBgSG9zdGAgYW5kIHB1dHMgdGhlIHZpZXdlcidzIGluXG4gKiBgeC1mb3J3YXJkZWQtaG9zdGA7IHNlZSB7QGxpbmsgUnVudGltZVJlcXVlc3QudHJ1c3RGb3J3YXJkZWRIb3N0fS4gQW55d2hlcmVcbiAqIGVsc2UgdGhlIGhlYWRlciBpcyB0aGUgY2xpZW50J3MsIGFuZCBob25vcmluZyBpdCBsZXQgYSByZXF1ZXN0IHdpdGhcbiAqIGBYLUZvcndhcmRlZC1Ib3N0OiBldmlsLmV4YW1wbGVgIHBvaW50IGEgcGFzc3dvcmQtcmVzZXQgbGluayBhdCBldmlsLmV4YW1wbGUg4oCUXG4gKiBhbmQsIG9uIEdsb2JhbCBDb250YWluZXJzLCBoYXZlIENsb3VkRnJvbnQgY2FjaGUgdGhhdCBwYWdlLCBzaW5jZSB0aGUgaGVhZGVyXG4gKiBpcyBub3QgaW4gaXRzIGNhY2hlIGtleS5cbiAqL1xuZnVuY3Rpb24gYWJzb2x1dGVVcmwocmVxdWVzdDogUnVudGltZVJlcXVlc3QpOiBVUkwge1xuICBjb25zdCBob3N0ID1cbiAgICAocmVxdWVzdC50cnVzdEZvcndhcmRlZEhvc3RcbiAgICAgID8gdmFsaWRBdXRob3JpdHkocmVxdWVzdC5oZWFkZXJzW1wieC1mb3J3YXJkZWQtaG9zdFwiXSlcbiAgICAgIDogdW5kZWZpbmVkKSA/P1xuICAgIHZhbGlkQXV0aG9yaXR5KHJlcXVlc3QuaGVhZGVycy5ob3N0KSA/P1xuICAgIFwibG9jYWxob3N0XCI7XG4gIC8vIEJlaGluZCBDbG91ZEZyb250IG9uIEdsb2JhbCBDb250YWluZXJzIHRoZSBjb250YWluZXIgc2hlbGwgaGFzIGFscmVhZHkgcHV0XG4gIC8vIHRoZSB2aWV3ZXIncyBwcm90b2NvbCBoZXJlOyBzZWUgYHRydXN0Q2xvdWRGcm9udFByb3RvYCBpbiBodHRwL25vZGUtc2VydmVyLnRzLlxuICBjb25zdCBmb3J3YXJkZWRQcm90byA9IGZpcnN0VmFsdWUocmVxdWVzdC5oZWFkZXJzW1wieC1mb3J3YXJkZWQtcHJvdG9cIl0pXG4gICAgPy5zcGxpdChcIixcIilbMF1cbiAgICAudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG4gIC8vIENsaWVudC1zdXBwbGllZCB3aGVyZSBubyBwcm94eSBvdmVyd3JpdGVzIGl0LCBidXQgaGFybWxlc3M6IHRoZSBob3N0IGlzXG4gIC8vIGFscmVhZHkgZml4ZWQsIGFuZCBhbnl0aGluZyBidXQgdGhlc2UgdHdvIHdvdWxkIG5vdCBwYXJzZS5cbiAgY29uc3QgcHJvdG8gPVxuICAgIGZvcndhcmRlZFByb3RvID09PSBcImh0dHBcIiB8fCBmb3J3YXJkZWRQcm90byA9PT0gXCJodHRwc1wiXG4gICAgICA/IGZvcndhcmRlZFByb3RvXG4gICAgICA6IHJlcXVlc3QuZW5jcnlwdGVkID09PSBmYWxzZVxuICAgICAgICA/IFwiaHR0cFwiXG4gICAgICAgIDogXCJodHRwc1wiO1xuICByZXR1cm4gbmV3IFVSTChyZXF1ZXN0LnVybCwgYCR7cHJvdG99Oi8vJHtob3N0fWApO1xufVxuXG5mdW5jdGlvbiBwaWNrRGVmaW5lZChcbiAgaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycyxcbiAgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogSW5jb21pbmdIdHRwSGVhZGVycyB7XG4gIGNvbnN0IHBpY2tlZDogSW5jb21pbmdIdHRwSGVhZGVycyA9IHt9O1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoaGVhZGVyc1tuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwaWNrZWRbbmFtZV0gPSBoZWFkZXJzW25hbWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGlja2VkO1xufVxuXG4vKipcbiAqIGBub3JtYWxpemVSZXBlYXRlZFNsYXNoZXNgIChgbmV4dC9kaXN0L3NoYXJlZC9saWIvdXRpbHMuanNgKSwgYXBwbGllZCB3aGVyZVxuICogTmV4dC5qcyBhcHBsaWVzIGl0OiBiZWZvcmUgcm91dGluZywgYXMgYSAzMDggdG8gdGhlIGNvbGxhcHNlZCBwYXRoLlxuICogYGJhc2Utc2VydmVyLnRzYCBkb2VzIGBpZiAodXJsTm9RdWVyeT8ubWF0Y2goLyhcXFxcfFxcL1xcLykvKSlcbiAqIHJlcy5yZWRpcmVjdChub3JtYWxpemVSZXBlYXRlZFNsYXNoZXMocmVxLnVybCksIDMwOClgLCBzbyBgL2EvL2JgIGFuZCBgL2FcXGJgXG4gKiBib3RoIGFuc3dlciBhIHJlZGlyZWN0IHRvIGAvYS9iYCByYXRoZXIgdGhhbiBhIDQwNCAtIGFuZCBgQG5leHQvcm91dGluZ2Anc1xuICogYHJlc29sdmVSb3V0ZXNgIGRvZXMgbm90IGRvIGl0IGZvciB1cywgd2hpY2ggaXMgaG93IGAvL2AgcmVhY2hlZCB0aGlzIHJ1bnRpbWUgYXNcbiAqIGEgNTAwIGFuZCBgL2FwaS8vanNvbmAgYXMgYSA0MDQuXG4gKlxuICogRW5jb2RlZCBiYWNrc2xhc2hlcyBhcmUgbGVmdCBhbG9uZSwgYXMgTmV4dC5qcyBsZWF2ZXMgdGhlbTogYCU1Q2AgaXMgYSBsaXRlcmFsXG4gKiBjaGFyYWN0ZXIgaW4gYSBwYXRoIHNlZ21lbnQsIG5vdCBhIHNlcGFyYXRvci5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBjb2xsYXBzZSwgd2hpY2ggaXMgdGhlIGNvbW1vbiBjYXNlLlxuICovXG5mdW5jdGlvbiBjb2xsYXBzZVJlcGVhdGVkU2xhc2hlcyh0YXJnZXQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnRzID0gdGFyZ2V0LnNwbGl0KFwiP1wiKTtcbiAgY29uc3QgcGF0aG5hbWUgPSBwYXJ0c1swXTtcbiAgaWYgKCEvXFxcXHxcXC9cXC8vLnRlc3QocGF0aG5hbWUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBxdWVyeSA9IHBhcnRzLmxlbmd0aCA+IDEgPyBgPyR7cGFydHMuc2xpY2UoMSkuam9pbihcIj9cIil9YCA6IFwiXCI7XG4gIHJldHVybiBwYXRobmFtZS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKS5yZXBsYWNlKC9cXC9cXC8rL2csIFwiL1wiKSArIHF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0Qm9keSB7XG4gIC8qKiBXaGF0IGByZXFgIHJlYWRzOiB0aGUgZW50cnlwb2ludCdzIGNvcHkuICovXG4gIHJlYWRvbmx5IGZvclJlcXVlc3Q/OiBSZWFkYWJsZSB8IEJ1ZmZlcjtcbiAgLyoqIFdoYXQgYHJlc29sdmVSb3V0ZXNgIGhhbmRzIG1pZGRsZXdhcmUuICovXG4gIHJlYWRvbmx5IGZvckRpc3BhdGNoOiBSZWFkYWJsZVN0cmVhbTtcbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIGRpc3BhdGNoIGhhcyByZXR1cm5lZCwgd2l0aCB3aGV0aGVyIG1pZGRsZXdhcmUgYW5zd2VyZWQgdGhlXG4gICAqIHJlcXVlc3QgaXRzZWxmLiBMZXRzIGdvIG9mIHdoaWNoZXZlciBjb3B5IG5vdGhpbmcgd2lsbCByZWFkIGFueSBtb3JlLlxuICAgKi9cbiAgcmVsZWFzZVVucmVhZChtaWRkbGV3YXJlUmVzcG9uZGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuLyoqXG4gKiBgcmVzb2x2ZVJvdXRlc2AgaGFuZHMgYHJlcXVlc3RCb2R5YCB0byBtaWRkbGV3YXJlLCB3aGljaCBjb25zdW1lcyBpdCwgd2hpbGUgdGhlXG4gKiBlbnRyeXBvaW50IG5lZWRzIHRoZSBzYW1lIGJ5dGVzIOKAlCB0aGUgc2FtZSBwcm9ibGVtIGBuZXh0LXNlcnZlcmAgc29sdmVzIHdpdGhcbiAqIGBnZXRDbG9uZWFibGVCb2R5KClgLiBPbmx5IHNwbGl0IHdoZW4gdGhlcmUgaXMgbWlkZGxld2FyZSB0byBmZWVkOiB0ZWVpbmcgY29zdHNcbiAqIGEgYnVmZmVyIGNvcHkgb2YgZXZlcnkgdXBsb2FkIG9uIGEgcGF0aCB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBhIHN0cmFpZ2h0IHBpcGUuXG4gKlxuICogQSBgdGVlKClgIGJ1ZmZlcnMsIGZvciB0aGUgYnJhbmNoIHRoYXQgaXMgYmVoaW5kLCBldmVyeSBjaHVuayB0aGUgb3RoZXIgb25lXG4gKiBoYXMgcmVhZCDigJQgc28gYSBicmFuY2ggdGhhdCBpcyBuZXZlciByZWFkIGhvbGRzIHRoZSB3aG9sZSBib2R5LiBNaWRkbGV3YXJlXG4gKiB0aGF0IGRvZXNuJ3QgcmVhZCB0aGUgYm9keSBpcyB0aGUgY29tbW9uIGNhc2UgKGFuZCBpdHMgbWF0Y2hlciBtYXkgbm90IGV2ZW5cbiAqIGhhdmUgcnVuIGl0KSwgYWZ0ZXIgd2hpY2ggdGhlIGVudHJ5cG9pbnQgc3RyZWFtaW5nIGFuIHVwbG9hZCB3b3VsZCBwaWxlIGFsbFxuICogb2YgaXQgdXAgaW4gdGhlIG1pZGRsZXdhcmUgYnJhbmNoOiB0aGUgd2hvbGUgdXBsb2FkIGluIG1lbW9yeSwgb24gYVxuICogY29udGFpbmVyIHRoYXQgc2VydmVzIG90aGVyIHJlcXVlc3RzLiBTbyBvbmNlIGRpc3BhdGNoIHJldHVybnMsIHRoZSBicmFuY2hcbiAqIHdpdGggbm8gcmVhZGVyIGxlZnQgaXMgY2FuY2VsbGVkIOKAlCB0aGUgbWlkZGxld2FyZSBvbmUsIG9yIHRoZSBlbnRyeXBvaW50IG9uZVxuICogd2hlbiBtaWRkbGV3YXJlIGFuc3dlcmVkIGFuZCBgcmVxYCB3aWxsIG5ldmVyIGJlIHJlYWQuIENhbmNlbGxpbmcgb25lXG4gKiBicmFuY2ggbGVhdmVzIHRoZSBzb3VyY2UgYW5kIHRoZSBvdGhlciBicmFuY2ggcnVubmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0Qm9keShcbiAgYm9keTogUmVhZGFibGUgfCBCdWZmZXIgfCB1bmRlZmluZWQsXG4gIGhhc01pZGRsZXdhcmU6IGJvb2xlYW4sXG4pOiBTcGxpdEJvZHkge1xuICBjb25zdCByZWxlYXNlTm90aGluZyA9ICgpOiB2b2lkID0+IHt9O1xuICBpZiAoYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvckRpc3BhdGNoOiBuZXcgQmxvYihbXSkuc3RyZWFtKCksXG4gICAgICByZWxlYXNlVW5yZWFkOiByZWxlYXNlTm90aGluZyxcbiAgICB9O1xuICB9XG4gIGlmICghaGFzTWlkZGxld2FyZSkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JSZXF1ZXN0OiBib2R5LFxuICAgICAgZm9yRGlzcGF0Y2g6IG5ldyBCbG9iKFtdKS5zdHJlYW0oKSxcbiAgICAgIHJlbGVhc2VVbnJlYWQ6IHJlbGVhc2VOb3RoaW5nLFxuICAgIH07XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuICAgIC8vIEFscmVhZHkgZnVsbHkgaW4gbWVtb3J5LCBzbyBcInRlZWluZ1wiIGlzIGp1c3QgcmVhZGluZyBpdCB0d2ljZS5cbiAgICByZXR1cm4ge1xuICAgICAgZm9yUmVxdWVzdDogYm9keSxcbiAgICAgIGZvckRpc3BhdGNoOiBuZXcgQmxvYihbYm9keV0pLnN0cmVhbSgpLFxuICAgICAgcmVsZWFzZVVucmVhZDogcmVsZWFzZU5vdGhpbmcsXG4gICAgfTtcbiAgfVxuICBjb25zdCBbZm9yTWlkZGxld2FyZSwgZm9yRW50cnlwb2ludF0gPSBSZWFkYWJsZS50b1dlYihib2R5KS50ZWUoKTtcbiAgY29uc3QgZm9yUmVxdWVzdCA9IFJlYWRhYmxlLmZyb21XZWIoZm9yRW50cnlwb2ludCBhcyBuZXZlcik7XG4gIHJldHVybiB7XG4gICAgZm9yUmVxdWVzdCxcbiAgICBmb3JEaXNwYXRjaDogZm9yTWlkZGxld2FyZSBhcyBSZWFkYWJsZVN0cmVhbSxcbiAgICByZWxlYXNlVW5yZWFkKG1pZGRsZXdhcmVSZXNwb25kZWQpIHtcbiAgICAgIGlmIChtaWRkbGV3YXJlUmVzcG9uZGVkKSB7XG4gICAgICAgIC8vIGBmcm9tV2ViYCBob2xkcyB0aGUgYnJhbmNoJ3MgcmVhZGVyLCBzbyBpdCBpcyBkZXN0cm95ZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gY2FuY2VsbGVkOyBpdHMgYF9kZXN0cm95YCBjYW5jZWxzIHRoZSByZWFkZXIuXG4gICAgICAgIGZvclJlcXVlc3QuZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIGlmICghZm9yTWlkZGxld2FyZS5sb2NrZWQpIHtcbiAgICAgICAgLy8gTG9ja2VkIG1lYW5zIG1pZGRsZXdhcmUgdG9vayBhIHJlYWRlcjogaXQgaXMgcmVhZGluZywgb3IgaGFzIHJlYWQsXG4gICAgICAgIC8vIHRoZSBib2R5IGl0c2VsZiwgYW5kIGEgbG9ja2VkIHN0cmVhbSBjYW5ub3QgYmUgY2FuY2VsbGVkIGFueXdheS5cbiAgICAgICAgZm9yTWlkZGxld2FyZS5jYW5jZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIGBJbmNvbWluZ0h0dHBIZWFkZXJzYCDihpIgdGhlIGZsYXQgZW50cmllcyBhIGBIZWFkZXJzYCBjb25zdHJ1Y3RvciBhY2NlcHRzLiAqL1xuZnVuY3Rpb24gdG9XZWJIZWFkZXJzKGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnMpOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGVudHJpZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhoZWFkZXJzKSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzaW5nbGUgb2YgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pIHtcbiAgICAgIGVudHJpZXMucHVzaChbbmFtZSwgc2luZ2xlXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIGBoZWFkZXJzKClgIHJ1bGVzLCB0aGUgaW1tdXRhYmxlIGBjYWNoZS1jb250cm9sYCBmb3IgYnVpbGQgYXNzZXRzLCBhbmQgYW55dGhpbmdcbiAqIG1pZGRsZXdhcmUgc2V0IHdpdGggYE5leHRSZXNwb25zZS5uZXh0KHsgaGVhZGVycyB9KWAuIEFwcGxpZWQgYmVmb3JlIHRoZVxuICogZW50cnlwb2ludCBydW5zIHNvIHRoYXQgYSByb3V0ZSBjYW4gc3RpbGwgb3ZlcnJpZGUgaXRzIG93bi5cbiAqL1xuZnVuY3Rpb24gYXBwbHlIZWFkZXJzKHJlczogU2hpbVNlcnZlclJlc3BvbnNlLCBoZWFkZXJzOiBIZWFkZXJzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBoZWFkZXJzLmVudHJpZXMoKSkge1xuICAgIC8vIGBlbnRyaWVzKClgIHlpZWxkcyBgc2V0LWNvb2tpZWAgb25jZSBwZXIgY29va2llLCBzbyBhcHBlbmRpbmcgdGhlIHdob2xlXG4gICAgLy8gYGdldFNldENvb2tpZSgpYCBhcnJheSBoZXJlIHdvdWxkIGVtaXQgTsKyIG9mIHRoZW0g4oCUIHR3byBjb29raWVzIHNldCBieVxuICAgIC8vIG1pZGRsZXdhcmUgYXJyaXZlZCBhcyBbXCJhPTFcIixcImI9MlwiLFwiYT0xXCIsXCJiPTJcIl0uIEhhbmRsZWQgb25jZSwgb3V0c2lkZS5cbiAgICBpZiAobmFtZSA9PT0gXCJzZXQtY29va2llXCIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXMuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbiAgfVxuICBmb3IgKGNvbnN0IGNvb2tpZSBvZiBoZWFkZXJzLmdldFNldENvb2tpZSgpKSB7XG4gICAgcmVzLmFwcGVuZEhlYWRlcihcInNldC1jb29raWVcIiwgY29va2llKTtcbiAgfVxufVxuXG4vKipcbiAqIE1pcnJvcnMgTmV4dC5qcydzIG93biByZWRpcmVjdCByZXNwb25zZSAoYGJhc2Utc2VydmVyLnRzYCk6IHRoZSBkZXN0aW5hdGlvbiBpc1xuICogYWxzbyB0aGUgYm9keSwgYW5kIGEgMzA4IGNhcnJpZXMgYSBgUmVmcmVzaGAgaGVhZGVyIGJlY2F1c2Ugc29tZSBjbGllbnRzIGFuZFxuICogaW50ZXJtZWRpYXJpZXMgc3RpbGwgZG8gbm90IGltcGxlbWVudCAzMDguXG4gKi9cbmZ1bmN0aW9uIHNlbmRSZWRpcmVjdChcbiAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gIGxvY2F0aW9uOiBzdHJpbmcsXG4gIHN0YXR1czogbnVtYmVyLFxuKTogdm9pZCB7XG4gIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzO1xuICByZXMuc2V0SGVhZGVyKFwiTG9jYXRpb25cIiwgbG9jYXRpb24pO1xuICBpZiAoc3RhdHVzID09PSAzMDgpIHtcbiAgICByZXMuc2V0SGVhZGVyKFwiUmVmcmVzaFwiLCBgMDt1cmw9JHtsb2NhdGlvbn1gKTtcbiAgfVxuICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgcmVzLmVuZChsb2NhdGlvbik7XG59XG5cbi8qKlxuICogYG5leHQgc3RhcnRgJ3MgYW5zd2VyIHRvIGEgUE9TVCwgUFVUIG9yIERFTEVURSBmb3IgYSBzdGF0aWMgZmlsZTogNDA1IHdpdGhcbiAqIGBBbGxvdzogR0VULCBIRUFEYCAoYHJvdXRlci1zZXJ2ZXIuanNgKS4gSXQgcmVuZGVycyB0aGF0IHRocm91Z2ggYC9fZXJyb3JgO1xuICogdGhpcyBpcyB0aGUgcGxhaW4tdGV4dCBlcXVpdmFsZW50LCBzaW5jZSB0aGUgc3RhdHVzIGFuZCBgQWxsb3dgIGFyZSB3aGF0IGFcbiAqIGNsaWVudCBhY3RzIG9uLlxuICovXG5mdW5jdGlvbiBzZW5kTWV0aG9kTm90QWxsb3dlZChyZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSk6IHZvaWQge1xuICByZXMuc3RhdHVzQ29kZSA9IDQwNTtcbiAgcmVzLnNldEhlYWRlcihcIkFsbG93XCIsIFwiR0VULCBIRUFEXCIpO1xuICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgcmVzLmVuZChcIk1ldGhvZCBOb3QgQWxsb3dlZFwiKTtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGhlYWRlcnMge0BsaW5rIHByb3h5RXh0ZXJuYWx9IGRvZXMgbm90IGZvcndhcmQuIFRoZSB1cHN0cmVhbSdzIG93blxuICogYEhvc3RgIG11c3Qgd2luOyB0aGUgcmVzdCBkZXNjcmliZSBvdXIgY29ubmVjdGlvbiwgbm90IHRoZSBwcm94aWVkIG9uZSwgYW5kXG4gKiB1bmRpY2kgdGhyb3dzIG9uIG1vc3Qgb2YgdGhlbSwgd2hpY2ggd291bGQgYW5zd2VyIHRoZSByZXF1ZXN0IHdpdGggYSA1MDAuXG4gKiBOZXh0LmpzJ3MgbGlzdCBmb3IgdGhlIHJlcXVlc3RzIGl0IG1ha2VzIHdpdGggdW5kaWNpIChgaXBjRm9yYmlkZGVuSGVhZGVyc2AsXG4gKiBgbmV4dC9kaXN0L3NlcnZlci9saWIvc2VydmVyLWlwYy91dGlscy5qc2ApLCBwbHVzIGBob3N0YCBhbmQgYHVwZ3JhZGVgLCBtaW51c1xuICogYGNvbnRlbnQtZW5jb2RpbmdgOiBOZXh0IHN0cmlwcyB0aGF0IG92ZXIgYSBib2R5IGl0IGhhcyBhbHJlYWR5IGRlY29kZWQsIHdoaWxlXG4gKiB0aGlzIG9uZSBpcyBmb3J3YXJkZWQgYXMgcmVjZWl2ZWQsIHN0aWxsIGVuY29kZWQuXG4gKi9cbmNvbnN0IFBST1hZX0RST1BQRURfSEVBREVSUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIFwiaG9zdFwiLFxuICBcInVwZ3JhZGVcIixcbiAgXCJhY2NlcHQtZW5jb2RpbmdcIixcbiAgXCJrZWVwYWxpdmVcIixcbiAgXCJrZWVwLWFsaXZlXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbiAgXCJjb25uZWN0aW9uXCIsXG4gIFwiZXhwZWN0XCIsXG5dO1xuXG4vKipcbiAqIFRoZSBTaWdWNCBzaWduYXR1cmUgT3JpZ2luIEFjY2VzcyBDb250cm9sIHB1dCBvbiBhIHJlcXVlc3QgdG8gdGhlIEZ1bmN0aW9uXG4gKiBVUkwsIGFsc28gZHJvcHBlZCBieSB7QGxpbmsgcHJveHlFeHRlcm5hbH0gd2hlbiB0aGUgcmVxdWVzdCB3YXMgSUFNLXZlcmlmaWVkOlxuICogZm9yd2FyZGVkLCBpdCB3b3VsZCBsZXQgdGhlIHRoaXJkLXBhcnR5IG9yaWdpbiByZXBsYXkgdGhlIHJlcXVlc3QgYWdhaW5zdFxuICogdGhlIEZ1bmN0aW9uIFVSTC4gQW55d2hlcmUgZWxzZSB0aGVzZSBhcmUgdGhlIGNsaWVudCdzIG93biwgYW5kIGFyZVxuICogZm9yd2FyZGVkIGFzIGBuZXh0IHN0YXJ0YCBmb3J3YXJkcyB0aGVtLlxuICovXG5jb25zdCBTSUdWNF9IRUFERVJTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgXCJhdXRob3JpemF0aW9uXCIsXG4gIFwieC1hbXotZGF0ZVwiLFxuICBcIngtYW16LWNvbnRlbnQtc2hhMjU2XCIsXG4gIFwieC1hbXotc2VjdXJpdHktdG9rZW5cIixcbl07XG5cbi8qKiBBIGBuZXh0LmNvbmZpZ2AgcmV3cml0ZSB3aG9zZSBkZXN0aW5hdGlvbiBpcyBhbm90aGVyIG9yaWdpbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb3h5RXh0ZXJuYWwoXG4gIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gIHVybDogVVJMLFxuICByZXF1ZXN0SGVhZGVyczogSGVhZGVycyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtZXRob2QgPSByZXEubWV0aG9kID8/IFwiR0VUXCI7XG4gIGNvbnN0IGhhc0JvZHkgPSBtZXRob2QgIT09IFwiR0VUXCIgJiYgbWV0aG9kICE9PSBcIkhFQURcIjtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlcXVlc3RIZWFkZXJzKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIFBST1hZX0RST1BQRURfSEVBREVSUykge1xuICAgIGhlYWRlcnMuZGVsZXRlKG5hbWUpO1xuICB9XG4gIGlmIChyZXEudHJ1c3RGb3J3YXJkZWRIb3N0KSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIFNJR1Y0X0hFQURFUlMpIHtcbiAgICAgIGhlYWRlcnMuZGVsZXRlKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zdCB1cHN0cmVhbSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICAgIGJvZHk6IGhhc0JvZHkgPyAoUmVhZGFibGUudG9XZWIocmVxKSBhcyBSZWFkYWJsZVN0cmVhbSkgOiB1bmRlZmluZWQsXG4gICAgcmVkaXJlY3Q6IFwibWFudWFsXCIsXG4gICAgLi4uKGhhc0JvZHkgPyB7IGR1cGxleDogXCJoYWxmXCIgfSA6IHt9KSxcbiAgfSBhcyBSZXF1ZXN0SW5pdCk7XG4gIGF3YWl0IHNlbmRXZWJSZXNwb25zZShyZXMsIHVwc3RyZWFtKTtcbn1cblxuLyoqXG4gKiBIZWFkZXJzIGRlc2NyaWJpbmcgdGhlIGZyYW1pbmcgb2YgYSBib2R5IHRoYXQgaXMgbm8gbG9uZ2VyIHRoZSBib2R5IGJlaW5nXG4gKiBzZW50LCBkcm9wcGVkIGZyb20gZXZlcnkgYFJlc3BvbnNlYCB7QGxpbmsgc2VuZFdlYlJlc3BvbnNlfSBmb3J3YXJkcy5cbiAqXG4gKiBBIHByb3hpZWQgb3JpZ2luJ3MgYFJlc3BvbnNlYCBjYW1lIGJhY2sgZnJvbSBgZmV0Y2hgLCBhbmQgc28sIG9mdGVuLCBkaWRcbiAqIG1pZGRsZXdhcmUncyBvd24gKGByZXR1cm4gZmV0Y2godXBzdHJlYW0pYCBpbiBgcHJveHkudHNgLCBzaW5jZSBtaWRkbGV3YXJlXG4gKiBydW5zIGluIHByb2Nlc3MgYW5kIGl0cyBgZmV0Y2hgIGlzIHVuZGljaSkuIHVuZGljaSBkZWNvZGVzIHRoZSBib2R5IOKAlCBnemlwLFxuICogZGVmbGF0ZSwgYnIsIHpzdGQg4oCUIGFuZCBsZWF2ZXMgYGNvbnRlbnQtZW5jb2RpbmdgIGFuZCBgY29udGVudC1sZW5ndGhgXG4gKiBkZXNjcmliaW5nIHRoZSBlbmNvZGVkIGJ5dGVzIGl0IGFscmVhZHkgdGhyZXcgYXdheS4gRm9yd2FyZGluZyB0aGVtIGVtaXRzXG4gKiBwbGFpbnRleHQgbGFiZWxsZWQgYGd6aXBgICh0aGUgYnJvd3NlciBmYWlscyB0aGUgd2hvbGUgcmVzcG9uc2Ugd2l0aFxuICogYEVSUl9DT05URU5UX0RFQ09ESU5HX0ZBSUxFRGApIHVuZGVyIGEgYENvbnRlbnQtTGVuZ3RoYCB0aGF0IGlzIHRvbyBzaG9ydCxcbiAqIGFuZCBgc2hvdWxkR3ppcGAgdGhlbiBkZWNsaW5lcyB0byBjb21wcmVzcyBpdCBiZWNhdXNlIGBjb250ZW50LWVuY29kaW5nYCBpc1xuICogYWxyZWFkeSBzZXQsIHNvIG5vdGhpbmcgZG93bnN0cmVhbSByZXBhaXJzIGl0LiBgdHJhbnNmZXItZW5jb2RpbmdgIGlzXG4gKiBob3AtYnktaG9wOiBpdCBkZXNjcmliZWQgdGhlIHVwc3RyZWFtIGNvbm5lY3Rpb24sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBTdG9jayBOZXh0LmpzIGRyb3BzIHRoZSBzYW1lIHRocmVlIGZyb20gZXZlcnkgbWlkZGxld2FyZSByZXNwb25zZVxuICogKGBGT1JCSURERU5fSEVBREVSU2AgaW4gYG5leHQvZGlzdC9zZXJ2ZXIvd2ViL3NhbmRib3gvc2FuZGJveC5qc2ApLCBzb1xuICogbWlkZGxld2FyZSBjYW5ub3QgbGFiZWwgYSBib2R5IGl0IGVuY29kZWQgaXRzZWxmIHRoZXJlIGVpdGhlci5cbiAqL1xuY29uc3QgU1RBTEVfRlJBTUlOR19IRUFERVJTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwiY29udGVudC1lbmNvZGluZ1wiLFxuICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbl0pO1xuXG4vKiogU3RyZWFtIGEgYFJlc3BvbnNlYCDigJQgbWlkZGxld2FyZSdzIG93biwgb3IgYSBwcm94aWVkIG9yaWdpbidzIOKAlCBpbnRvIGByZXNgLiAqL1xuYXN5bmMgZnVuY3Rpb24gc2VuZFdlYlJlc3BvbnNlKFxuICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJlcy5zdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzVGV4dCkge1xuICAgIHJlcy5zdGF0dXNNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgfVxuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBTVEFMRV9GUkFNSU5HX0hFQURFUlMpIHtcbiAgICBoZWFkZXJzLmRlbGV0ZShuYW1lKTtcbiAgfVxuICBhcHBseUhlYWRlcnMocmVzLCBoZWFkZXJzKTtcbiAgaWYgKCFyZXNwb25zZS5ib2R5KSB7XG4gICAgcmVzLmVuZCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlc3BvbnNlLmJvZHkgYXMgdW5rbm93biBhcyBBc3luY0l0ZXJhYmxlPFVpbnQ4QXJyYXk+KSB7XG4gICAgLy8gTGVhdmluZyB0aGUgbG9vcCBjYW5jZWxzIHRoZSBib2R5LCB3aGljaCBpcyB3aGF0IHN0b3BzIGEgcHJveGllZCBvcmlnaW5cbiAgICAvLyBmcm9tIGJlaW5nIHJlYWQgdG8gdGhlIGVuZCBmb3IgYSBjbGllbnQgdGhhdCBoYXMgYWxyZWFkeSBnb25lLlxuICAgIGlmIChyZXMuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFBhY2VkIGJ5IHRoZSBjbGllbnQ6IHdpdGhvdXQgd2FpdGluZyBmb3IgYGRyYWluYCwgYSBsYXJnZSBwcm94aWVkIGJvZHlcbiAgICAvLyBoZWFkZWQgZm9yIGEgc2xvdyBjbGllbnQgaXMgYnVmZmVyZWQgd2hvbGUgaW4gbWVtb3J5LlxuICAgIGNvbnN0IGFjY2VwdGVkID0gcmVzLndyaXRlKGNodW5rKTtcbiAgICAvLyBTZXQgYnkgdGhlIHNpbmsgd2hlbiBpdCBjb21wcmVzc2VzLiBXaXRob3V0IGl0IHRoZSBjaHVuayBzaXRzIGluIHpsaWInc1xuICAgIC8vIGJ1ZmZlciwgYW5kIGEgc3RyZWFtZWQgYm9keSDigJQgc2VydmVyLXNlbnQgZXZlbnRzIHRocm91Z2ggYSByZXdyaXRlLCBhXG4gICAgLy8gbWlkZGxld2FyZSBgUmVhZGFibGVTdHJlYW1gIOKAlCByZWFjaGVzIHRoZSBjbGllbnQgYWxsIGF0IG9uY2UsIGF0IHRoZSBlbmQuXG4gICAgLy8gTmV4dC5qcyBmbHVzaGVzIGFmdGVyIGV2ZXJ5IGNodW5rIGZvciB0aGUgc2FtZSByZWFzb24gKGBwaXBlLXJlYWRhYmxlYCkuXG4gICAgcmVzLmZsdXNoPy4oKTtcbiAgICBpZiAoIWFjY2VwdGVkICYmICEoYXdhaXQgZHJhaW5lZChyZXMpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICByZXMuZW5kKCk7XG59XG4iXX0=
|
|
1230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2NvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMitCQSx3REFnQkM7QUFtREQsc0RBK0JDO0FBbUJELGtDQTBEQztBQWlJRCw4QkEyQ0M7QUF0MENELHNEQUFzRDtBQUN0RDs7Ozs7Ozs7Ozs7R0FXRztBQUNILCtDQUE0QztBQUU1Qyx5Q0FBaUM7QUFDakMsNkNBQWlEO0FBQ2pELG1EQUFvRDtBQUNwRCx5Q0FLb0I7QUFDcEIsK0NBSXVCO0FBQ3ZCLDRDQUE0RTtBQUM1RSw4Q0FJeUI7QUFDekIsc0NBQXVEO0FBQ3ZELG1DQUF1RTtBQUN2RSx5Q0FNb0I7QUFDcEIsNkNBQWdEO0FBQ2hELGlEQUt3QjtBQUN4QixpREFBa0U7QUFDbEUsaURBQW9FO0FBQ3BFLGlEQUFvRTtBQUNwRSxpQ0FBMEU7QUFFMUUsMEVBQTBFO0FBQzFFLElBQUEsb0NBQXFCLEdBQUUsQ0FBQztBQStEeEIsTUFBYSxhQUFhO0lBVVk7SUFUbkIsV0FBVyxDQUFxQjtJQUNoQyxVQUFVLENBQWE7SUFDdkIsVUFBVSxDQUFvQjtJQUM5QixNQUFNLENBQXdCO0lBQy9DLDJDQUEyQztJQUMxQixjQUFjLENBQXlDO0lBQ3hFLGtFQUFrRTtJQUNqRCxZQUFZLENBQVU7SUFFdkMsWUFBb0MsT0FBNkI7UUFBN0IsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFDL0QsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGdDQUFrQixDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRSx3REFBd0Q7UUFDeEQsTUFBTSxXQUFXLEdBQUcsSUFBQSxpQ0FBa0IsRUFBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHFCQUFVLENBQUM7WUFDL0IsUUFB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dkMsT0FBTztRQUNULENBQUM7SUFDSCxDQUFDO0lBQ0QsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyoqXG4gKiBUaGUgcnVudGltZSBjb3JlOiBvbmUgYGhhbmRsZShyZXF1ZXN0LCBzaW5rKWAgdGhhdCBib3RoIHNoZWxscyB3cmFwLlxuICpcbiAqIFRoZSBMYW1iZGEgc2hlbGwgKGBsYW1iZGEubXRzYCkgYW5kIHRoZSBjb250YWluZXIgc2hlbGwgKGBzZXJ2ZXIubXRzYCkgZG9cbiAqIG5vdGhpbmcgYnV0IHR1cm4gdGhlaXIgaW5wdXQgaW50byBhIHtAbGluayBSdW50aW1lUmVxdWVzdH0gYW5kIHRoZWlyIG91dHB1dCBpbnRvXG4gKiBhIHtAbGluayBSZXNwb25zZVNpbmt9LiBFdmVyeXRoaW5nIGVsc2Ug4oCUIHN5bnRoZXNpemluZyBgcmVxYC9gcmVzYCwgZGlzcGF0Y2gsXG4gKiBtaWRkbGV3YXJlLCBlbnRyeXBvaW50IGludm9jYXRpb24sIHN0YXRpYyBmaWxlcywgaW1hZ2Ugb3B0aW1pemF0aW9uLCBnemlwLFxuICogYHdhaXRVbnRpbGAg4oCUIGhhcHBlbnMgaGVyZSwgc28gdGhlIGNvbnRhaW5lciBlMmUgc3VpdGUgZXhlcmNpc2VzIHRoZSBzYW1lIGNvZGVcbiAqIExhbWJkYSBydW5zLiBUaGF0IGlzIGRlbGliZXJhdGU6IHRoZSBjb250YWluZXIgcGF0aCB1c2VkIHRvIGdldCByZWFsXG4gKiBgbm9kZTpodHRwYCBvYmplY3RzIGZyb20gTGFtYmRhIFdlYiBBZGFwdGVyLCB3aGljaCBtZWFudCBjb250YWluZXIgdGVzdHMgcHJvdmVkXG4gKiBub3RoaW5nIGFib3V0IExhbWJkYS5cbiAqL1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ0h0dHBIZWFkZXJzIH0gZnJvbSBcIm5vZGU6aHR0cFwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IFJlYWRhYmxlLCBXcml0YWJsZSB9IGZyb20gXCJub2RlOnN0cmVhbVwiO1xuaW1wb3J0IHsgY2FzZUNhbm9uaWNhbFBhdGggfSBmcm9tIFwiLi9jYXNlLXJlZGlyZWN0XCI7XG5pbXBvcnQge1xuICBEaXNwYXRjaGVyLFxuICBvdXRPZkJhbmRSb3V0ZVBhcmFtcyxcbiAgU3RhdHVzVGFyZ2V0LFxuICBzdGF0dXNUYXJnZXRzLFxufSBmcm9tIFwiLi9kaXNwYXRjaFwiO1xuaW1wb3J0IHtcbiAgRW50cnlwb2ludEhhbmRsZXIsXG4gIEVudHJ5cG9pbnRSZWdpc3RyeSxcbiAgUm91dGVJbk90aGVyR3JvdXBFcnJvcixcbn0gZnJvbSBcIi4vZW50cnlwb2ludHNcIjtcbmltcG9ydCB7IFNoaW1JbmNvbWluZ01lc3NhZ2UsIHRvSW5jb21pbmdIdHRwSGVhZGVycyB9IGZyb20gXCIuL2h0dHAvcmVxdWVzdFwiO1xuaW1wb3J0IHtcbiAgYXNTZXJ2ZXJSZXNwb25zZSxcbiAgUmVzcG9uc2VIZWFkLFxuICBTaGltU2VydmVyUmVzcG9uc2UsXG59IGZyb20gXCIuL2h0dHAvcmVzcG9uc2VcIjtcbmltcG9ydCB7IHBpcGVUb1NpbmssIFJlc3BvbnNlU2luayB9IGZyb20gXCIuL2h0dHAvc2lua1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxJbWFnZVJlc3BvbnNlLCBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIgfSBmcm9tIFwiLi9pbWFnZVwiO1xuaW1wb3J0IHtcbiAgQWRhcHRlck1hbmlmZXN0LFxuICBkZXBsb3llZE1hbmlmZXN0UGF0aCxcbiAgRlVOQ1RJT05fR1JPVVBfRU5WX1ZBUixcbiAgTUFOSUZFU1RfRklMRV9OQU1FLFxuICBSRVZBTElEQVRFRF9QQUdFX0hPT0ssXG59IGZyb20gXCIuL21hbmlmZXN0XCI7XG5pbXBvcnQgeyBNaWRkbGV3YXJlUnVubmVyIH0gZnJvbSBcIi4vbWlkZGxld2FyZVwiO1xuaW1wb3J0IHtcbiAgbG9hZEVudkZpbGVzLFxuICByZWdpc3Rlckluc3RydW1lbnRhdGlvbixcbiAgc2V0dXBOb2RlRW52aXJvbm1lbnQsXG4gIHVzZU5leHRGcm9tLFxufSBmcm9tIFwiLi9uZXh0LW1vZHVsZXNcIjtcbmltcG9ydCB7IHB1YmxpY0RpcktleSwgcmVzb2x2ZVB1YmxpY0ZpbGVzIH0gZnJvbSBcIi4vcHVibGljLWZpbGVzXCI7XG5pbXBvcnQgeyBzZXJ2ZVMzUHVibGljRmlsZSwgc2VydmVTdGF0aWNGaWxlIH0gZnJvbSBcIi4vc3RhdGljLWZpbGVzXCI7XG5pbXBvcnQgeyBjYXB0dXJlT3V0c2lkZVJlcXVlc3QsIGNhdGNoVXBUYWdzIH0gZnJvbSBcIi4vdGFnLW1hbmlmZXN0XCI7XG5pbXBvcnQgeyBkcmFpbmVkLCBmaXJzdFZhbHVlLCB0b1NlYXJjaCwgd2l0aG91dFBhdGhQcmVmaXggfSBmcm9tIFwiLi91dGlsXCI7XG5cbi8vIEF0IGxvYWQsIGJlZm9yZSBhbnkgcmVxdWVzdDogdGhlIGNvbnRleHQgY2FjaGUgaGFuZGxlciB3b3JrIGVzY2FwZXMgdG8uXG5jYXB0dXJlT3V0c2lkZVJlcXVlc3QoKTtcblxuLyoqIE9uZSByZXF1ZXN0LCBub3JtYWxpemVkIGJ5IGEgc2hlbGwuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG4gIC8qKiBPcmlnaW4tZm9ybSB0YXJnZXQgZXhhY3RseSBhcyByZWNlaXZlZDogcGF0aCArIHF1ZXJ5LCBuZXZlciBhYnNvbHV0ZS4gKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnM7XG4gIHJlYWRvbmx5IGJvZHk/OiBSZWFkYWJsZSB8IEJ1ZmZlcjtcbiAgcmVhZG9ubHkgcmVtb3RlQWRkcmVzcz86IHN0cmluZztcbiAgLyoqIGBmYWxzZWAgYmVoaW5kIGEgVExTLXRlcm1pbmF0aW5nIEFMQi4gT25seSBhZmZlY3RzIHRoZSBzeW50aGVzaXplZCBzb2NrZXQuICovXG4gIHJlYWRvbmx5IGVuY3J5cHRlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBYm9ydGVkIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cy4gV2lyaW5nIGl0IHRvIGByZXMuZGVzdHJveSgpYCBpcyB3aGF0XG4gICAqIG1ha2VzIGByZXF1ZXN0LnNpZ25hbC5vbmFib3J0YCBmaXJlIGluc2lkZSByb3V0ZSBoYW5kbGVycy5cbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogV2hldGhlciBgeC1mb3J3YXJkZWQtaG9zdGAgbmFtZXMgdGhlIGhvc3QgdGhlIGNsaWVudCBhc2tlZCBmb3IuIE9ubHkgdGhlXG4gICAqIHNoZWxsIGNhbiBrbm93OiBpdCBpcyBgdHJ1ZWAgZm9yIGEgRnVuY3Rpb24gVVJMIGV2ZW50IHdob3NlIFNpZ1Y0IExhbWJkYVxuICAgKiB2ZXJpZmllZC4gVGhhdCBpcyBhbnkgSUFNLWF1dGhvcml6ZWQgaW52b2tlciDigJQgaW4gcHJhY3RpY2UgQ2xvdWRGcm9udCdzXG4gICAqIE9yaWdpbiBBY2Nlc3MgQ29udHJvbCwgd2hvc2Ugdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24gb3ZlcndyaXRlcyB0aGUgaGVhZGVyXG4gICAqIHdpdGggdGhlIHZpZXdlcidzIGBIb3N0YCAoQ2xvdWRGcm9udCBoYXMgdG8gcmVwbGFjZSBgSG9zdGAgaXRzZWxmIHdpdGggdGhlXG4gICAqIEZ1bmN0aW9uIFVSTCdzIGRvbWFpbiksIHBsdXMgcHJpbmNpcGFscyBncmFudGVkIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmxgLFxuICAgKiB3aG8gY291bGQgcmVwbGFjZSB0aGUgZnVuY3Rpb24ncyBjb2RlIGFueXdheS4gSXQgaXMgYWxzbyB3aGF0XG4gICAqIGBwcm94eUV4dGVybmFsYCBkcm9wcyBPQUMncyBzaWduYXR1cmUgb24uIEV2ZXJ5d2hlcmUgZWxzZSB0aGUgaGVhZGVyIGlzXG4gICAqIHdoYXRldmVyIHRoZSBjbGllbnQgc2VudCwgYW5kIGl0IGlzXG4gICAqIGlnbm9yZWQsIGFzIGBuZXh0IHN0YXJ0YCBpZ25vcmVzIGl0IHdpdGhvdXQgYGV4cGVyaW1lbnRhbC50cnVzdEhvc3RIZWFkZXJgLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJ1c3RGb3J3YXJkZWRIb3N0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldCBieSB7QGxpbmsgTmV4dGpzUnVudGltZS5oYW5kbGVJbnRlcm5hbGx5fSBmb3IgdGhlIGluLXByb2Nlc3MgcmVxdWVzdHMgaXRcbiAgICogbWFrZXM6IGNhbGxlZCB3aXRoIHRoZSBgUm91dGVJbk90aGVyR3JvdXBFcnJvcmAgdGhlIHJvdXRlIHRocmV3LCBpbnN0ZWFkIG9mXG4gICAqIGxvZ2dpbmcgdGhlIG1pc3JvdXRlZC1yZXF1ZXN0IHdhcm5pbmcsIHdoaWNoIGRlc2NyaWJlcyBhIENsb3VkRnJvbnQgb3IgQVBJXG4gICAqIEdhdGV3YXkgcHJvYmxlbSB0aGlzIGlzIG5vdC5cbiAgICovXG4gIHJlYWRvbmx5IG9uUm91dGVJbk90aGVyR3JvdXA/OiAoZXJyb3I6IFJvdXRlSW5PdGhlckdyb3VwRXJyb3IpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogYFJldmFsaWRhdGVGbmAncyBhcmd1bWVudCAoYG5leHQvZGlzdC9zZXJ2ZXIvbGliL3JvdXRlci11dGlscy9yb3V0ZXItc2VydmVyLWNvbnRleHRgKSxcbiAqIHJlc3RhdGVkIGJlY2F1c2UgdGhhdCBtb2R1bGUgaXMgbm90IHBhcnQgb2YgYG5leHRgJ3MgcHVibGlzaGVkIHR5cGUgc3VyZmFjZS5cbiAqL1xuaW50ZXJmYWNlIFJldmFsaWRhdGVDb25maWcge1xuICByZWFkb25seSB1cmxQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfTtcbiAgcmVhZG9ubHkgb3B0czogeyB1bnN0YWJsZV9vbmx5R2VuZXJhdGVkPzogYm9vbGVhbiB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1J1bnRpbWVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGRlcGxveW1lbnQgcm9vdCDigJQgdGhlIHN0YWdlZCB0cmVlIGV2ZXJ5IG1hbmlmZXN0IGtleVxuICAgKiByZXNvbHZlcyBhZ2FpbnN0LiBgTEFNQkRBX1RBU0tfUk9PVGAgZm9yIEZ1bmN0aW9ucywgdGhlIGltYWdlIGBXT1JLRElSYCBmb3JcbiAgICogQ29udGFpbmVyczsgYm90aCBzaGVsbHMgZGVyaXZlIGl0IGZyb20gdGhlaXIgb3duIGxvY2F0aW9uIGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50Um9vdDogc3RyaW5nO1xuICByZWFkb25seSBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0O1xuICAvKiogYENES19ORVhUSlNfU1RBVElDX0FTU0VUU19CVUNLRVRfTkFNRWAuICovXG4gIHJlYWRvbmx5IGJ1Y2tldD86IHN0cmluZztcbiAgLyoqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWGAuICovXG4gIHJlYWRvbmx5IGJ1Y2tldEtleVByZWZpeD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE5leHRqc1J1bnRpbWUge1xuICBwcml2YXRlIHJlYWRvbmx5IGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50UmVnaXN0cnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtaWRkbGV3YXJlPzogTWlkZGxld2FyZVJ1bm5lcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbWFnZXM6IFJ1bnRpbWVJbWFnZU9wdGltaXplcjtcbiAgLyoqIFRoZSA1MDAgbGFkZGVyOyBzZWUgYHN0YXR1c1RhcmdldHNgLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yVGFyZ2V0Rm9yOiAodXJsOiBVUkwgfCB1bmRlZmluZWQpID0+IFN0YXR1c1RhcmdldDtcbiAgLyoqIFRoZSBhc3NldHMgYnVja2V0LCB3aGVuIGBwdWJsaWMvYCBmaWxlcyBhcmUgc2VydmVkIGZyb20gaXQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHVibGljQnVja2V0Pzogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE5leHRqc1J1bnRpbWVPcHRpb25zKSB7XG4gICAgY29uc3QgeyBtYW5pZmVzdCwgZGVwbG95bWVudFJvb3QgfSA9IG9wdGlvbnM7XG4gICAgdGhpcy5lbnRyeXBvaW50cyA9IG5ldyBFbnRyeXBvaW50UmVnaXN0cnkoZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0KTtcbiAgICAvLyBMaXN0ZWQgb25jZSwgYXQgY29sZCBzdGFydDsgc2VlIGByZXNvbHZlUHVibGljRmlsZXNgLlxuICAgIGNvbnN0IHB1YmxpY0ZpbGVzID0gcmVzb2x2ZVB1YmxpY0ZpbGVzKGRlcGxveW1lbnRSb290LCBtYW5pZmVzdCk7XG4gICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IERpc3BhdGNoZXIoe1xuICAgICAgbWFuaWZlc3QsXG4gICAgICBwdWJsaWNGaWxlczogcHVibGljRmlsZXMuZmlsZXMsXG4gICAgfSk7XG4gICAgLy8gT24gZGlzayBvdGhlcndpc2UsIHdpdGggYC5uZXh0L3N0YXRpY2AuXG4gICAgdGhpcy5wdWJsaWNCdWNrZXQgPSBwdWJsaWNGaWxlcy5pblMzID8gb3B0aW9ucy5idWNrZXQgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5lcnJvclRhcmdldEZvciA9IHN0YXR1c1RhcmdldHMobWFuaWZlc3QsIDUwMCk7XG4gICAgdGhpcy5pbWFnZXMgPSBuZXcgUnVudGltZUltYWdlT3B0aW1pemVyKHtcbiAgICAgIGRlcGxveW1lbnRSb290LFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBidWNrZXQ6IHRoaXMucHVibGljQnVja2V0ID8/IFwiXCIsXG4gICAgICBidWNrZXRLZXlQcmVmaXg6IG9wdGlvbnMuYnVja2V0S2V5UHJlZml4ID8/IFwiXCIsXG4gICAgICBmZXRjaEludGVybmFsOiAoaHJlZiwgcmVxLCBtYXhpbXVtQm9keSkgPT5cbiAgICAgICAgdGhpcy5mZXRjaEludGVybmFsKGhyZWYsIHJlcSwgbWF4aW11bUJvZHkpLFxuICAgIH0pO1xuICAgIC8vIFRoZSBydW5uZXIgaXMgc2hhcmVkIOKAlCBpdCBtZW1vaXplcyB0aGUgbG9hZGVkIG1pZGRsZXdhcmUgbW9kdWxlIOKAlCB3aGlsZSB0aGVcbiAgICAvLyBgaW52b2tlTWlkZGxld2FyZWAgY2FsbGJhY2sgaXQgcHJvZHVjZXMgaXMgcGVyIHJlcXVlc3QuXG4gICAgdGhpcy5taWRkbGV3YXJlID0gbWFuaWZlc3QubWlkZGxld2FyZVxuICAgICAgPyBuZXcgTWlkZGxld2FyZVJ1bm5lcih7XG4gICAgICAgICAgbWlkZGxld2FyZTogbWFuaWZlc3QubWlkZGxld2FyZSxcbiAgICAgICAgICByb290OiBkZXBsb3ltZW50Um9vdCxcbiAgICAgICAgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBtYW5pZmVzdCgpOiBBZGFwdGVyTWFuaWZlc3Qge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWFuaWZlc3Q7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKFxuICAgIHJlcXVlc3Q6IFJ1bnRpbWVSZXF1ZXN0LFxuICAgIHNpbms6IFJlc3BvbnNlU2luayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBtYW5pZmVzdCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHBlbmRpbmc6IEFycmF5PFByb21pc2U8dW5rbm93bj4+ID0gW107XG4gICAgY29uc3Qgd2FpdFVudGlsID0gKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHtcbiAgICAgIHBlbmRpbmcucHVzaChwcm9taXNlKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYm9keSA9IHNwbGl0Qm9keShyZXF1ZXN0LmJvZHksIHRoaXMubWlkZGxld2FyZSAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCByZXEgPSBuZXcgU2hpbUluY29taW5nTWVzc2FnZSh7XG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgIGhlYWRlcnM6IHdpdGhvdXRJbnRlcm5hbEhlYWRlcnMoXG4gICAgICAgIHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgcmVxdWVzdC51cmwsXG4gICAgICAgIG1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCxcbiAgICAgICksXG4gICAgICBib2R5OiBib2R5LmZvclJlcXVlc3QsXG4gICAgICByZW1vdGVBZGRyZXNzOiByZXF1ZXN0LnJlbW90ZUFkZHJlc3MsXG4gICAgICBlbmNyeXB0ZWQ6IHJlcXVlc3QuZW5jcnlwdGVkLFxuICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiByZXF1ZXN0LnRydXN0Rm9yd2FyZGVkSG9zdCxcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSBuZXcgU2hpbVNlcnZlclJlc3BvbnNlKCk7XG4gICAgLy8gTmV4dC5qcyByZWFkcyBgcmVzLnJlcWAgaW4gYSBmZXcgZXJyb3IgcGF0aHMuXG4gICAgcmVzLnJlcSA9IHJlcTtcbiAgICByZXF1ZXN0LnNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHJlcy5kZXN0cm95KCksIHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgcmVqZWN0aW9uIGhhbmRsZXIgaXMgYXR0YWNoZWQgaGVyZSByYXRoZXIgdGhhbiBhdCB0aGUgYGF3YWl0YCBiZWxvdy5cbiAgICAvLyBgcm91dGUoKWAgYXdhaXRzIHJlYWwgSS9PLCBzbyBhIHN0cmVhbSB0aGF0IGJyZWFrcyB3aGlsZSBpdCBydW5zIHdvdWxkXG4gICAgLy8gbGVhdmUgdGhpcyBwcm9taXNlIHJlamVjdGVkIHdpdGggbm8gaGFuZGxlciBhdHRhY2hlZCBmb3IgYSBmdWxsIGV2ZW50LWxvb3BcbiAgICAvLyB0dXJuIOKAlCBhbmQgTm9kZSAyNCBkZWZhdWx0cyB0byBgLS11bmhhbmRsZWQtcmVqZWN0aW9ucz10aHJvd2AsIHdoaWNoIG9uXG4gICAgLy8gdGhlIGNvbnRhaW5lciBzaGVsbCB0YWtlcyB0aGUgd2hvbGUgdGFzayBkb3duIGFuZCBhYm9ydHMgZXZlcnkgb3RoZXJcbiAgICAvLyBpbi1mbGlnaHQgcmVxdWVzdCBvbiBpdC4gQSBtaWQtc3RyZWFtIEVQSVBFIGZyb20gb25lIGNsaWVudCBkaXNjb25uZWN0IGlzXG4gICAgLy8gbm90IGdyb3VuZHMgZm9yIHRoYXQuXG4gICAgLy9cbiAgICAvLyBUaGUgZXJyb3IgaXMgbG9nZ2VkLCBub3QgcmV0aHJvd246IHRoZSBzdHJlYW0gYnJva2UgYWZ0ZXIgKG9yIHdoaWxlKSB0aGVcbiAgICAvLyBoZWFkIHdlbnQgb3V0IOKAlCBhIGNsaWVudCBkaXNjb25uZWN0LCBvciBgc2VuZEVycm9yYCBkZXN0cm95aW5nIGFcbiAgICAvLyBoYWxmLXdyaXR0ZW4gcmVzcG9uc2Ug4oCUIGFuZCBuZWl0aGVyIGlzIGFuIGludm9jYXRpb24gZmFpbHVyZS4gUmV0aHJvd2luZ1xuICAgIC8vIHdvdWxkIG1ha2UgTGFtYmRhIHJldHJ5IGEgcmVxdWVzdCB0aGUgY2xpZW50IGFscmVhZHkgYWJhbmRvbmVkLlxuICAgIGNvbnN0IGZpbmlzaGVkID0gcGlwZVRvU2luayhyZXEsIHJlcywgc2luaywge1xuICAgICAgY29tcHJlc3M6IG1hbmlmZXN0LmNvbmZpZy5jb21wcmVzcyxcbiAgICB9KS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJUaGUgcmVzcG9uc2Ugc3RyZWFtIGRpZCBub3QgY29tcGxldGU6XCIsIGVycm9yKTtcbiAgICB9KTtcblxuICAgIC8vIEZvciB0aGUgZXJyb3IgcGFnZSdzIGxvY2FsZTsgdW5zZXQgd2hlbiB0aGUgdGhyb3cgaXMgYGFic29sdXRlVXJsYCdzLlxuICAgIGxldCB1cmw6IFVSTCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgLy8gQmVmb3JlIGFueXRoaW5nIHBhcnNlcyB0aGUgdGFyZ2V0LCBpbmNsdWRpbmcgYGFic29sdXRlVXJsYCAtIGBuZXcgVVJMYFxuICAgICAgLy8gcmVhZHMgYSBsZWFkaW5nIGAvL2AgYXMgcHJvdG9jb2wtcmVsYXRpdmUgYW5kIHdvdWxkIHRha2UgdGhlIGZpcnN0IHBhdGhcbiAgICAgIC8vIHNlZ21lbnQgZm9yIHRoZSBob3N0LlxuICAgICAgY29uc3QgY29sbGFwc2VkID0gY29sbGFwc2VSZXBlYXRlZFNsYXNoZXMocmVxdWVzdC51cmwpO1xuICAgICAgaWYgKGNvbGxhcHNlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNlbmRSZWRpcmVjdChyZXMsIGNvbGxhcHNlZCwgMzA4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEluc2lkZSB0aGUgdHJ5OiBgYWJzb2x1dGVVcmxgIGJ1aWxkcyBhIGBVUkxgIG91dCBvZiB0aGUgcmVxdWVzdCBsaW5lXG4gICAgICAgIC8vIGFuZCB0aGUgZm9yd2FyZGVkIGhlYWRlcnMsIGFuZCBhIHRocm93IGhlcmUgaGFzIHRvIHJlYWNoIHRoZSBlcnJvclxuICAgICAgICAvLyBsYWRkZXIgbGlrZSBhbnkgb3RoZXIuIE91dHNpZGUgaXQsIG9uIHRoZSBMYW1iZGEgc2hlbGxzIOKAlCB3aG9zZVxuICAgICAgICAvLyBoYW5kbGVycyB3cmFwIG5vdGhpbmcg4oCUIHRoZSBzYW1lIHRocm93IGlzIGFuIGludm9jYXRpb24gZXJyb3IgYW5kIGFcbiAgICAgICAgLy8gNTAyLlxuICAgICAgICB1cmwgPSBhYnNvbHV0ZVVybChyZXF1ZXN0KTtcbiAgICAgICAgYXdhaXQgdGhpcy5yb3V0ZShyZXEsIHJlcywgdXJsLCBib2R5LCB3YWl0VW50aWwsIHJlcXVlc3QpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRFcnJvcihyZXEsIHJlcywgd2FpdFVudGlsLCBlcnJvciwgdXJsKTtcbiAgICB9XG5cbiAgICBhd2FpdCBmaW5pc2hlZDtcblxuICAgIC8vIExhbWJkYSBmcmVlemVzIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgdGhlIG1vbWVudCB0aGUgaGFuZGxlciByZXNvbHZlcyDigJRcbiAgICAvLyB0aGVyZSBpcyBubyBwb3N0LXJlc3BvbnNlIGtlZXBhbGl2ZSDigJQgc28gYmFja2dyb3VuZCB3b3JrIHJlZ2lzdGVyZWQgd2l0aFxuICAgIC8vIGB3YWl0VW50aWxgIChub3RhYmx5IElTUiByZXZhbGlkYXRpb24pIGhhcyB0byBiZSBhd2FpdGVkIGhlcmUuIEFmdGVyIHRoZVxuICAgIC8vIHJlc3BvbnNlIHN0cmVhbSBoYXMgY2xvc2VkLCBzbyBjbGllbnQgbGF0ZW5jeSBpcyB1bmFmZmVjdGVkOyBiaWxsZWRcbiAgICAvLyBkdXJhdGlvbiBleHRlbmRzLCB3aGljaCBpcyB0aGUgY29ycmVjdCB0cmFkZSBhZ2FpbnN0IGEgcmV2YWxpZGF0aW9uIHRoYXRcbiAgICAvLyBuZXZlciBjb21wbGV0ZXMuXG4gICAgLy9cbiAgICAvLyBEcmFpbmVkIHVudGlsIG5vdGhpbmcgbmV3IGFycml2ZXMsIG5vdCBhd2FpdGVkIG9uY2U6IGB3YWl0VW50aWxgIGtlZXBzXG4gICAgLy8gYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSByZXNwb25zZSDigJQgTmV4dCdzIGBBZnRlckNvbnRleHRgIHJlZ2lzdGVycyBpdHNcbiAgICAvLyBjYWxsYmFjayBxdWV1ZSBvbiB0aGUgZmlyc3QgYGFmdGVyKClgLCBhbmQgYW4gYGFmdGVyKHByb21pc2UpYCBtYWRlIGZyb21cbiAgICAvLyBpbnNpZGUgYSBydW5uaW5nIGNhbGxiYWNrLCBvciBhIGJhY2tncm91bmQgcmVnZW5lcmF0aW9uIHRoYXQgaXRzZWxmIGNhbGxzXG4gICAgLy8gYGFmdGVyKClgLCByZWdpc3RlcnMgbW9yZS4gQSBzaW5nbGUgYGFsbFNldHRsZWRgIHNuYXBzaG90cyB0aGUgYXJyYXkgYW5kXG4gICAgLy8gbGV0cyBMYW1iZGEgZnJlZXplIG9uIHRoYXQgbGF0ZSB3b3JrLlxuICAgIGxldCBzZXR0bGVkQ291bnQgPSAwO1xuICAgIHdoaWxlIChzZXR0bGVkQ291bnQgPCBwZW5kaW5nLmxlbmd0aCkge1xuICAgICAgY29uc3QgYmF0Y2ggPSBwZW5kaW5nLnNsaWNlKHNldHRsZWRDb3VudCk7XG4gICAgICBzZXR0bGVkQ291bnQgPSBwZW5kaW5nLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYmF0Y2gpO1xuICAgICAgZm9yIChjb25zdCByZXN1bHQgb2Ygc2V0dGxlZCkge1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkEgd2FpdFVudGlsKCkgcHJvbWlzZSByZWplY3RlZDpcIiwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJvdXRlKFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB1cmw6IFVSTCxcbiAgICBib2R5OiBTcGxpdEJvZHksXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICByZXF1ZXN0OiBSdW50aW1lUmVxdWVzdCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgdXJsLFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnModG9XZWJIZWFkZXJzKHJlcS5oZWFkZXJzKSksXG4gICAgICBib2R5OiBib2R5LmZvckRpc3BhdGNoLFxuICAgICAgaW52b2tlTWlkZGxld2FyZTogdGhpcy5taWRkbGV3YXJlPy5pbnZva2VyRm9yKHtcbiAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsLFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgYm9keS5yZWxlYXNlVW5yZWFkKHJlc3VsdC5raW5kID09PSBcIm1pZGRsZXdhcmUtcmVzcG9uZGVkXCIpO1xuXG4gICAgYXBwbHlIZWFkZXJzKHJlcywgcmVzdWx0LnJlc3BvbnNlSGVhZGVycyk7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzLnN0YXR1c0NvZGUgPSByZXN1bHQuc3RhdHVzO1xuICAgIH1cblxuICAgIHN3aXRjaCAocmVzdWx0LmtpbmQpIHtcbiAgICAgIGNhc2UgXCJlbnRyeXBvaW50XCI6IHtcbiAgICAgICAgbGV0IGhhbmRsZXI6IEVudHJ5cG9pbnRIYW5kbGVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIgPSBhd2FpdCB0aGlzLmVudHJ5cG9pbnRzLmxvYWQocmVzdWx0LmVudHJ5cG9pbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgUm91dGVJbk90aGVyR3JvdXBFcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgICAgIC8vIEEgVVJMIHRoZSBlZGdlIHNlbnQgaGVyZSBvbmx5IGJlY2F1c2Ugb2YgaXRzIGNhc2UgZ29lcyB0byBpdHNcbiAgICAgICAgICAvLyBjYW5vbmljYWwgc3BlbGxpbmcsIHdoaWNoIHRoZSBlZGdlIHJvdXRlcyB0byB0aGUgb3duaW5nIGdyb3VwLlxuICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbCA9IGNhc2VDYW5vbmljYWxQYXRoKFxuICAgICAgICAgICAgdXJsLnBhdGhuYW1lLFxuICAgICAgICAgICAgcmVzdWx0LnJlc29sdmVkUGF0aG5hbWUsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFuaWZlc3QsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY2Fub25pY2FsKSB7XG4gICAgICAgICAgICBzZW5kUmVkaXJlY3QocmVzLCBgJHtjYW5vbmljYWx9JHt1cmwuc2VhcmNofWAsIDMwOCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXF1ZXN0Lm9uUm91dGVJbk90aGVyR3JvdXApIHtcbiAgICAgICAgICAgIC8vIEV4cGxhaW5lZCBieSB0aGUgY2FsbGVyIG9mIGBoYW5kbGVJbnRlcm5hbGx5YCwgd2hpY2gga25vd3Mgd2h5IGl0XG4gICAgICAgICAgICAvLyBoYXBwZW5lZC5cbiAgICAgICAgICAgIHJlcXVlc3Qub25Sb3V0ZUluT3RoZXJHcm91cChlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIExvZ2dlZCwgYmVjYXVzZSBpdCBpcyBhbHNvIHdoYXQgYSBtaXNyb3V0ZWQgZ3JvdXAgbG9va3MgbGlrZTsgc2VlXG4gICAgICAgICAgICAvLyBgUm91dGVJbk90aGVyR3JvdXBFcnJvcmAgZm9yIHdoeSBpdCBpcyBhIDQwNC5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZW5kVW5tYXRjaGVkKFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICAgICAgeyBwYXRobmFtZTogdXJsLnBhdGhuYW1lLCByZXF1ZXN0SGVhZGVyczogcmVzdWx0LnJlcXVlc3RIZWFkZXJzIH0sXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGludm9jYXRpb24gdGFyZ2V0LCBub3QgdGhlIHJlcXVlc3RlZCBVUkw6IGByZXNvbHZlUm91dGVzYCBoYXNcbiAgICAgICAgLy8gYXBwbGllZCByZXdyaXRlcywgc3RyaXBwZWQgaTE4biBwcmVmaXhlcywgYW5kIGFwcGVuZGVkIHRoZSBgbnh0UGBcbiAgICAgICAgLy8gcm91dGUgcGFyYW1zIGFzIHF1ZXJ5IHZhbHVlcy4gVGhhdCBpcyBleGFjdGx5IHRoZSBjb250cmFjdCBOZXh0LmpzXG4gICAgICAgIC8vIGRvY3VtZW50cyBmb3IgYSBwcm94eSBpbiBmcm9udCBvZiBhIGZ1bmN0aW9uIOKAlCBgUm91dGVNb2R1bGUucHJlcGFyZWBcbiAgICAgICAgLy8gcmVjb3ZlcnMgYHBhcmFtc2AgZnJvbSB0aGVzZSBxdWVyeSB2YWx1ZXMg4oCUIHNvIHRoYXQgY29udHJhY3QsIG5vdFxuICAgICAgICAvLyBgcmVxdWVzdE1ldGEucGFyYW1zYCwgaXMgaG93IHBhcmFtcyBnZXQgcGFzc2VkLiBUaGUgb25lIGV4Y2VwdGlvbiBpc1xuICAgICAgICAvLyBhIGNhcHR1cmUgdGhlIGNvbnRyYWN0IHdvdWxkIGNvcnJ1cHQ7IHNlZSBgb3V0T2ZCYW5kUm91dGVQYXJhbXNgLlxuICAgICAgICBjb25zdCBvdXRPZkJhbmQgPSBvdXRPZkJhbmRSb3V0ZVBhcmFtcyhcbiAgICAgICAgICByZXN1bHQuaW52b2NhdGlvblRhcmdldC5xdWVyeSxcbiAgICAgICAgICByZXN1bHQucmVzb2x2ZWRQYXRobmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaW52b2NhdGlvblF1ZXJ5ID1cbiAgICAgICAgICBvdXRPZkJhbmQ/LnF1ZXJ5ID8/IHJlc3VsdC5pbnZvY2F0aW9uVGFyZ2V0LnF1ZXJ5O1xuICAgICAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSByZXN1bHQuaW52b2NhdGlvblRhcmdldDtcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gdG9TZWFyY2goaW52b2NhdGlvblF1ZXJ5KTtcbiAgICAgICAgcmVxLnVybCA9IHNlYXJjaCA/IGAke3BhdGhuYW1lfT8ke3NlYXJjaH1gIDogcGF0aG5hbWU7XG4gICAgICAgIC8vIE1pZGRsZXdhcmUgbWF5IGhhdmUgcmV3cml0dGVuIHJlcXVlc3QgaGVhZGVycyB2aWFcbiAgICAgICAgLy8gYE5leHRSZXNwb25zZS5uZXh0KHsgcmVxdWVzdDogeyBoZWFkZXJzIH0gfSlgLlxuICAgICAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBoYW5kbGVyPlsyXSA9IHtcbiAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgcmVxdWVzdE1ldGE6IHtcbiAgICAgICAgICAgIC8vIFRoZSByZXNvbHZlZCBxdWVyeSwgc3RhdGVkIHJhdGhlciB0aGFuIGxlZnQgdG8gYmUgcmUtZGVyaXZlZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBgUm91dGVNb2R1bGUucHJlcGFyZWAgcnVucyBgaGFuZGxlUmV3cml0ZXNgIGFnYWluc3QgYHJlcS51cmxgXG4gICAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHksIGFuZCBgcmVxLnVybGAgaXMgdGhlICphbHJlYWR5IHJld3JpdHRlbiogdGFyZ2V0LlxuICAgICAgICAgICAgLy8gQSBgYmVmb3JlRmlsZXNgIHJld3JpdGUgd2hvc2UgY29uZGl0aW9uIHN0aWxsIGhvbGRzIGFmdGVyIGl0IGhhc1xuICAgICAgICAgICAgLy8gYmVlbiBhcHBsaWVkIHRoZXJlZm9yZSBnZXRzIGFwcGxpZWQgdHdpY2U6IGluXG4gICAgICAgICAgICAvLyBgdGVzdC9lMmUvbGluay13aXRoLWFwaS1yZXdyaXRlYCB0aGUgcnVsZVxuICAgICAgICAgICAgLy8gYC86cGF0aCguKilgICsgYGhhczogcXVlcnkganNvbj10cnVlYCAtPiBgL2FwaS9qc29uP2Zyb209LzpwYXRoYFxuICAgICAgICAgICAgLy8gbWF0Y2hlZCBgL2FwaS9qc29uP2pzb249dHJ1ZSZmcm9tPS9zb21lL3JvdXRlL2ZvcmAgYSBzZWNvbmQgdGltZVxuICAgICAgICAgICAgLy8gYW5kIG92ZXJ3cm90ZSBgZnJvbWAgd2l0aCBgL2FwaS9qc29uYC4gYG5leHQgc3RhcnRgIGVzY2FwZXMgaXRcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgaXRzIHJvdXRlciBsZWF2ZXMgYHJlcS51cmxgIGFzIHRoZSBVUkwgdGhlIGNsaWVudCBzZW50LCBzb1xuICAgICAgICAgICAgLy8gdGhlIG9uZSBwYXNzIGBwcmVwYXJlYCBtYWtlcyBpcyB0aGUgb25seSBvbmUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gYHByZXBhcmVgIHByZWZlcnMgdGhpcyBtZXRhIG92ZXIgaXRzIG93biBgcGFyc2VkVXJsLnF1ZXJ5YFxuICAgICAgICAgICAgLy8gKFwid2hlbiBkZXBsb3llZCBwcm94aWVzIHdpbGwgYWRkIHF1ZXJ5IHZhbHVlcyBmcm9tIHJlc29sdmluZyB0aGVcbiAgICAgICAgICAgIC8vIHJvdXRlcyB0byBwYXNzIHRvIGZ1bmN0aW9uXCIpLCB3aGljaCBpcyB0aGUgZG9jdW1lbnRlZCBkaXZpc2lvbiBvZlxuICAgICAgICAgICAgLy8gbGFib3VyIGZvciBhIHByb3h5IGluIGZyb250IG9mIGEgZnVuY3Rpb24gLSBhbmQgaXQgaXMgdGhlIHNhbWVcbiAgICAgICAgICAgIC8vIGRpdmlzaW9uIHRoZSBgcmVxLnVybGAgYWJvdmUgcmVsaWVzIG9uLiBTZXR0aW5nIGl0IGRvZXMgbm90IHN0b3BcbiAgICAgICAgICAgIC8vIHRoZSBzZWNvbmQgcmV3cml0ZSBwYXNzLCBpdCBqdXN0IHN0b3BzIHRoYXQgcGFzcyBmcm9tIGJlaW5nIHdoYXRcbiAgICAgICAgICAgIC8vIHRoZSByb3V0ZSBzZWVzLlxuICAgICAgICAgICAgcXVlcnk6IHsgLi4uaW52b2NhdGlvblF1ZXJ5IH0sXG4gICAgICAgICAgICAvLyBTZXQgb25seSBmb3IgYSBjYXB0dXJlIHRoZSBxdWVyeSBjb250cmFjdCBjYW5ub3QgY2FycnksIGFuZCB0aGVuXG4gICAgICAgICAgICAvLyBpbiBwbGFjZSBvZiBpdCByYXRoZXIgdGhhbiBhbG9uZ3NpZGUuXG4gICAgICAgICAgICAuLi4ob3V0T2ZCYW5kID8geyBwYXJhbXM6IG91dE9mQmFuZC5wYXJhbXMgfSA6IHt9KSxcbiAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgYFJvdXRlTW9kdWxlLnByZXBhcmVgIGZhbGxzIGJhY2sgdG9cbiAgICAgICAgICAgIC8vIGBodHRwOi8vbG9jYWxob3N0JHtyZXEudXJsfWAgYW5kIGV2ZXJ5IGFic29sdXRlIFVSTCBhIHJvdXRlXG4gICAgICAgICAgICAvLyBoYW5kbGVyIGJ1aWxkcyBpcyB3cm9uZy4gYHJlbGF0aXZlUHJvamVjdERpcmAgaXMgZGVsaWJlcmF0ZWx5XG4gICAgICAgICAgICAvLyAqbm90KiBwYXNzZWQ6IHRoZSBydW50aW1lIGBjaGRpcmBzIHRvIHRoZSBwcm9qZWN0IGRpciwgc28gdGhlXG4gICAgICAgICAgICAvLyB2YWx1ZSBOZXh0LmpzIGlubGluZWQgYXQgYnVpbGQgdGltZSAoXCJcIikgaXMgYWxyZWFkeSBjb3JyZWN0LCBhbmRcbiAgICAgICAgICAgIC8vIGBhcHAtcGFnZS1ydW50aW1lLmpzYCBpZ25vcmVzIHRoZSByZXF1ZXN0TWV0YSBvdmVycmlkZSBhbnl3YXkuXG4gICAgICAgICAgICBpbml0VVJMOiB1cmwuaHJlZixcbiAgICAgICAgICAgIC8vIEZlZWRzIGByb3V0ZXJTZXJ2ZXJDb250ZXh0Lmhvc3RuYW1lYCAoYHJvdXRlLW1vZHVsZS5qc2BcbiAgICAgICAgICAgIC8vIGBnZXRSb3V0ZXJTZXJ2ZXJDb250ZXh0YCkuIEluY2x1ZGVzIHRoZSBwb3J0LCBiZWNhdXNlIGl0IGlzXG4gICAgICAgICAgICAvLyBjb25jYXRlbmF0ZWQgaW50byBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgaG9zdG5hbWU6IHVybC5ob3N0LFxuICAgICAgICAgICAgLy8gQm90aCByb3V0ZXJzIGNhbGwgdGhpcyBmb3IgYSBgbm90Rm91bmQ6IHRydWVgIC8gYG5vdEZvdW5kKClgIHRoYXRcbiAgICAgICAgICAgIC8vIHRoZSBlbnRyeXBvaW50IGl0c2VsZiBjYW5ub3QgcmVuZGVyLCBhbmQgZmFsbCBiYWNrIHRvXG4gICAgICAgICAgICAvLyBgcmVzLmVuZCgnVGhpcyBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZCcpYCDigJQgbm8gc3RhdHVzLCBubyBhcHAgNDA0XG4gICAgICAgICAgICAvLyBwYWdlIOKAlCB3aGVuIGl0IGlzIGFic2VudC4gVGhlIGByZXFgL2ByZXNgIHRoZXkgcGFzcyBhcmUgdGhlIG9uZXNcbiAgICAgICAgICAgIC8vIGhhbmRlZCBpbiBqdXN0IGFib3ZlLCBzbyB0aGUgY2FwdHVyZWQgcGFpciBpcyB1c2VkIGluc3RlYWQgb2ZcbiAgICAgICAgICAgIC8vIHJlLWRlcml2aW5nIHRoZW0uXG4gICAgICAgICAgICByZW5kZXI0MDQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kTm90Rm91bmQoXG4gICAgICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLm5vdEZvdW5kRm9yKHVybCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gYHJlcy5yZXZhbGlkYXRlKClgIGZyb20gYSBQYWdlcyBBUEkgcm91dGUuIFdpdGhvdXQgaXQsIE5leHQuanNcbiAgICAgICAgICAgIC8vIGZhbGxzIGJhY2sgdG8gYGZldGNoKCdodHRwczovLycgKyByZXEuaGVhZGVycy5ob3N0ICsgdXJsUGF0aClgIOKAlFxuICAgICAgICAgICAgLy8gYW5kIG9ubHkgd2hlbiBgZXhwZXJpbWVudGFsLnRydXN0SG9zdEhlYWRlcmAgaXMgc2V0LCB3aGljaCBpdCBpc1xuICAgICAgICAgICAgLy8gbm90LCBzbyBgcmVzLnJldmFsaWRhdGUoKWAgdGhyZXdcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgIEZhaWxlZCB0byByZXZhbGlkYXRlIC86IEludmFyaWFudDogbWlzc2luZyBpbnRlcm5hbFxuICAgICAgICAgICAgLy8gICByb3V0ZXItc2VydmVyLW1ldGhvZHMgdGhpcyBpcyBhbiBpbnRlcm5hbCBidWdcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBhbmQgYHRlc3QvZTJlL3JldmFsaWRhdGUtcmVhc29uYCBzYXcgYHN0YWxlYCB3aGVyZSBgbmV4dCBzdGFydGBcbiAgICAgICAgICAgIC8vIHJlcG9ydHMgYG9uLWRlbWFuZGA6IHRoZSByb3V0ZSBzdGlsbCByZS1yZW5kZXJlZCwganVzdCBhcyBhblxuICAgICAgICAgICAgLy8gb3JkaW5hcnkgc3RhbGUgcmVnZW5lcmF0aW9uIHJhdGhlciB0aGFuIHRoZSBvbi1kZW1hbmQgb25lIGl0XG4gICAgICAgICAgICAvLyBhc2tlZCBmb3IuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQW5zd2VyaW5nIGl0IGluIHByb2Nlc3MgcmF0aGVyIHRoYW4gYnkgc2V0dGluZ1xuICAgICAgICAgICAgLy8gYHRydXN0SG9zdEhlYWRlcmA6IHRoZSBmZXRjaCBwYXRoIHdvdWxkIGxlYXZlIHRoZSBmdW5jdGlvbiwgY3Jvc3NcbiAgICAgICAgICAgIC8vIENsb3VkRnJvbnQgYW5kIGNvbWUgYmFjayDigJQgYSBzZWNvbmQgYmlsbGVkIGludm9jYXRpb24sIGFcbiAgICAgICAgICAgIC8vIGRlcGVuZGVuY3kgb24gYHgtcHJlcmVuZGVyLXJldmFsaWRhdGVgIHN1cnZpdmluZyB0aGUgZWRnZSwgYW5kIGFcbiAgICAgICAgICAgIC8vIHJlYXNvbiB0byB0cnVzdCBhIGNsaWVudC1zdXBwbGllZCBgSG9zdGAuIE5leHQuanMncyBvd25cbiAgICAgICAgICAgIC8vIG5vbi1zZXJ2ZXJsZXNzIGFuc3dlciBpcyB0aGUgc2FtZSBzaGFwZSBhcyB0aGlzIG9uZVxuICAgICAgICAgICAgLy8gKGBOZXh0U2VydmVyI3JldmFsaWRhdGVgIHJ1bnMgaXRzIHJlcXVlc3QgaGFuZGxlciBhZ2FpbnN0IGFcbiAgICAgICAgICAgIC8vIG1vY2tlZCBgcmVxYC9gcmVzYCkuXG4gICAgICAgICAgICByZXZhbGlkYXRlOiAoY29uZmlnOiBSZXZhbGlkYXRlQ29uZmlnKSA9PlxuICAgICAgICAgICAgICB0aGlzLnJldmFsaWRhdGUoY29uZmlnLCByZXF1ZXN0KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZW5kZXIgPSAoKSA9PiBoYW5kbGVyKHJlcSwgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLCBvcHRpb25zKTtcbiAgICAgICAgLy8gQ2F1Z2h0IHVwIGhlcmUsIG5vdCBpbiBgcmVmcmVzaFRhZ3NgOiBOZXh0LmpzIGF3YWl0cyB0aGF0IGluc2lkZSB0aGVcbiAgICAgICAgLy8gZmlyc3QgYCd1c2UgY2FjaGUnYCBsb29rdXAsIGFuZCBhIHdhaXQgdGhlcmUgY3V0cyB0aGUgc3RhdGljIHN0YWdlXG4gICAgICAgIC8vIHNob3J0LiBPbmx5IGZvciBhIHBhZ2U6IG5vdGhpbmcgZWxzZSBoYXMgYSBzdGF0aWMgc3RhZ2UgdG8gcHJvdGVjdCxcbiAgICAgICAgLy8gYW5kIGEgcm91dGUgaGFuZGxlciB0aGF0IHJlYWRzIHRoZSBjYWNoZSB3YWl0cyBpbiBgcmVmcmVzaFRhZ3NgXG4gICAgICAgIC8vIGluc3RlYWQuXG4gICAgICAgIGF3YWl0IChyZXN1bHQuZW50cnlwb2ludC50eXBlID09PSBcImFwcC1wYWdlXCJcbiAgICAgICAgICA/IGNhdGNoVXBUYWdzKHJlbmRlcilcbiAgICAgICAgICA6IHJlbmRlcigpKTtcbiAgICAgICAgLy8gQSBQYWdlcyBBUEkgcm91dGUgb3ducyB0aGUgZW5kIG9mIGl0cyByZXNwb25zZTogYHN0cmVhbS5waXBlKHJlcylgLFxuICAgICAgICAvLyBhbiBgZXh0ZXJuYWxSZXNvbHZlcmAgcHJveHksIG9yIGEgY2FsbGJhY2sgdGhhdCBjYWxscyBgcmVzLmpzb24oKWBcbiAgICAgICAgLy8gbGF0ZXIgYWxsIHJldHVybiBmcm9tIHRoZSBoYW5kbGVyIGJlZm9yZSB0aGV5IGFyZSBkb25lIHdyaXRpbmcsIGFuZFxuICAgICAgICAvLyBlbmRpbmcgaGVyZSBzZW50IGFuIGVtcHR5IDIwMCBhbmQgbWFkZSB0aGVpciB3cml0ZXMgdGhyb3dcbiAgICAgICAgLy8gYEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EYC4gYG5leHQgc3RhcnRgJ3MgYGFwaVJlc29sdmVyYCBsZWF2ZXMgaXRcbiAgICAgICAgLy8gb3BlbiB0b28g4oCUIG9uZSB0aGF0IG5ldmVyIGVuZHMgc3RhbGxzLCB0aGVyZSBhcyBoZXJlLiBgaGFuZGxlYCBhd2FpdHNcbiAgICAgICAgLy8gdGhlIHJlc3BvbnNlIGl0c2VsZiwgc28gbm90aGluZyBpcyBjdXQgc2hvcnQgYnkgcmV0dXJuaW5nLlxuICAgICAgICBpZiAoIXJlcy53cml0YWJsZUVuZGVkICYmIHJlc3VsdC5lbnRyeXBvaW50LnR5cGUgIT09IFwicGFnZS1hcGlcIikge1xuICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJzdGF0aWMtZmlsZVwiOiB7XG4gICAgICAgIGNvbnN0IHN0YXR1c1BhZ2UgPVxuICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPT09IFwic2VydmVyXCJcbiAgICAgICAgICAgID8gdGhpcy5zdGF0dXNQYWdlU3RhdHVzKHJlc3VsdC5wYXRobmFtZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBgbmV4dCBzdGFydGAgc2VydmVzIGEgYHB1YmxpYy9gIG9yIGBfbmV4dC9zdGF0aWNgIGZpbGUgdG8gR0VUIGFuZFxuICAgICAgICAvLyBIRUFEIG9ubHksIGFuZCBgc2VuZGAgd291bGQgc2VydmUgaXQgdG8gYW55IG1ldGhvZC4gVGhlIHNhbWUgZ29lcyBmb3JcbiAgICAgICAgLy8gYW4gYXV0by1leHBvcnRlZCBQYWdlcyBSb3V0ZXIgcGFnZSAoYGJhc2Utc2VydmVyLmpzYFxuICAgICAgICAvLyBgcmVuZGVyVG9SZXNwb25zZVdpdGhDb21wb25lbnRzSW1wbGA6IGEgc3RyaW5nIGBDb21wb25lbnRgIGFuc3dlcnNcbiAgICAgICAgLy8gYW55dGhpbmcgZWxzZSB3aXRoIGEgNDA1KSwgZXhjZXB0IHRoZSA0MDQgYW5kIDUwMCBwYWdlcy5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlcS5tZXRob2QgIT09IFwiR0VUXCIgJiZcbiAgICAgICAgICByZXEubWV0aG9kICE9PSBcIkhFQURcIiAmJlxuICAgICAgICAgIChyZXN1bHQuc291cmNlICE9PSBcInNlcnZlclwiIHx8XG4gICAgICAgICAgICAoc3RhdHVzUGFnZSA9PT0gdW5kZWZpbmVkICYmIHJlc3VsdC5maWxlUGF0aC5lbmRzV2l0aChcIi5odG1sXCIpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2VuZE1ldGhvZE5vdEFsbG93ZWQocmVzKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gXCJlbnN1cmUgY29ycmVjdCBzdGF0dXMgaXMgc2V0IHdoZW4gdmlzaXRpbmcgYSBzdGF0dXMgcGFnZSBkaXJlY3RseVwiOlxuICAgICAgICAvLyBgbmV4dCBzdGFydGAgYW5zd2VycyBgLzQwNGAgd2l0aCBhIDQwNCBhbmQgYC81MDBgIHdpdGggYSA1MDAsIG5vdCB0aGVcbiAgICAgICAgLy8gMjAwIHRoZWlyIHByZXJlbmRlcmVkIEhUTUwgd291bGQgb3RoZXJ3aXNlIGdvIG91dCB3aXRoLlxuICAgICAgICBpZiAoc3RhdHVzUGFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXNQYWdlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV0YWcgPSB0aGlzLm9wdGlvbnMubWFuaWZlc3QuY29uZmlnLmdlbmVyYXRlRXRhZ3M7XG4gICAgICAgIGNvbnN0IHB1YmxpY0RpciA9IGAke3B1YmxpY0RpcktleSh0aGlzLm9wdGlvbnMubWFuaWZlc3QpfS9gO1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPVxuICAgICAgICAgIChhd2FpdCBzZXJ2ZVN0YXRpY0ZpbGUoXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZGVwbG95bWVudFJvb3QsXG4gICAgICAgICAgICByZXN1bHQuZmlsZVBhdGgsXG4gICAgICAgICAgICB7IGV0YWcgfSxcbiAgICAgICAgICApKSB8fFxuICAgICAgICAgIC8vIExpc3RlZCBidXQgbm90IHN0YWdlZDogYSBMYW1iZGEgcm9vdCwgd2hvc2UgYHB1YmxpYy9gIGlzIGluIFMzLlxuICAgICAgICAgIChyZXN1bHQuc291cmNlID09PSBcInB1YmxpY1wiICYmXG4gICAgICAgICAgICAhIXRoaXMucHVibGljQnVja2V0ICYmXG4gICAgICAgICAgICAoYXdhaXQgc2VydmVTM1B1YmxpY0ZpbGUocmVxLCByZXMsIHtcbiAgICAgICAgICAgICAgYnVja2V0OiB0aGlzLnB1YmxpY0J1Y2tldCxcbiAgICAgICAgICAgICAga2V5UHJlZml4OiB0aGlzLm9wdGlvbnMuYnVja2V0S2V5UHJlZml4ID8/IFwiXCIsXG4gICAgICAgICAgICAgIGZpbGU6IHJlc3VsdC5maWxlUGF0aC5zbGljZShwdWJsaWNEaXIubGVuZ3RoKSxcbiAgICAgICAgICAgICAgZXRhZyxcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIGlmICghc2VydmVkKSB7XG4gICAgICAgICAgLy8gVGhlIHJvdXRpbmcgcnVsZSB0aGF0IG1hdGNoZWQgYSBidWlsZCBhc3NldCBhbHJlYWR5IHNldCBpdHNcbiAgICAgICAgICAvLyB5ZWFyLWxvbmcgYGltbXV0YWJsZWAgQ2FjaGUtQ29udHJvbCwgd2hpY2ggYHNlbmRVbm1hdGNoZWRgXG4gICAgICAgICAgLy8gcmVwbGFjZXM6IHVuZGVyIGl0IHRoZSA0MDQgd291bGQgYmUgY2FjaGVkIGF0IHRoZSBlZGdlIGFuZCBpblxuICAgICAgICAgIC8vIGJyb3dzZXJzIGZvciB0aGF0IGxvbmcsIGFuZCBhIGNodW5rIHRoYXQgc2hvd3MgdXAgb24gdGhlIG5leHRcbiAgICAgICAgICAvLyBkZXBsb3kgd291bGQgc3RheSBtaXNzaW5nLlxuICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZFVubWF0Y2hlZChyZXEsIHJlcywgd2FpdFVudGlsLCByZXN1bHQsIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiaW1hZ2Utb3B0aW1pemF0aW9uXCI6XG4gICAgICAgIGlmICghdGhpcy5pbWFnZXMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRVbm1hdGNoZWQoXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgICB7IHBhdGhuYW1lOiB1cmwucGF0aG5hbWUsIHJlcXVlc3RIZWFkZXJzOiByZXN1bHQucmVxdWVzdEhlYWRlcnMgfSxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBhd2FpdCB0aGlzLmltYWdlcy5oYW5kbGUocmVxLCByZXMsIHJlc3VsdC51cmwsIHdhaXRVbnRpbCk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBcInJlZGlyZWN0XCI6XG4gICAgICAgIHNlbmRSZWRpcmVjdChyZXMsIHJlc3VsdC5sb2NhdGlvbiwgcmVzdWx0LnN0YXR1cyk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBcImV4dGVybmFsLXJld3JpdGVcIjpcbiAgICAgICAgYXdhaXQgcHJveHlFeHRlcm5hbChyZXEsIHJlcywgcmVzdWx0LnVybCwgcmVzdWx0LnJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIFwibWlkZGxld2FyZS1yZXNwb25kZWRcIjpcbiAgICAgICAgYXdhaXQgc2VuZFdlYlJlc3BvbnNlKHJlcywgcmVzdWx0LnJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIFwicmVzcG9uc2VcIjpcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgXCJub3QtZm91bmRcIjpcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kVW5tYXRjaGVkKHJlcSwgcmVzLCB3YWl0VW50aWwsIHJlc3VsdCwgdXJsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiA0MDQgb3IgNTAwIHdoZW4gYHBhdGhuYW1lYCBpcyB0aGUgcHJlcmVuZGVyZWQgYC80MDRgIG9yIGAvNTAwYCBwYWdlIOKAlCB1bmRlclxuICAgKiBgYmFzZVBhdGhgIGFuZCwgaW4gYW4gaTE4biBhcHAsIGFueSBsb2NhbGUgKGAvZnIvNDA0YCkg4oCUIGFuZCBgdW5kZWZpbmVkYFxuICAgKiBvdGhlcndpc2UuIGBuZXh0IHN0YXJ0YCBtYXRjaGVzIHRoZSBwYWdlLCBub3QgdGhlIFVSTCwgc28gdGhlIGxvY2FsZSBkb2VzXG4gICAqIG5vdCBtYXR0ZXIuXG4gICAqL1xuICBwcml2YXRlIHN0YXR1c1BhZ2VTdGF0dXMocGF0aG5hbWU6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgeyBiYXNlUGF0aCwgaTE4biB9ID0gdGhpcy5vcHRpb25zLm1hbmlmZXN0LmNvbmZpZztcbiAgICBsZXQgcGFnZSA9IHdpdGhvdXRQYXRoUHJlZml4KHBhdGhuYW1lLCBiYXNlUGF0aCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IChpMThuIGFzIHsgbG9jYWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdIH0gfCBudWxsKT8ubG9jYWxlcztcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzID8/IFtdKSB7XG4gICAgICBjb25zdCBzdHJpcHBlZCA9IHdpdGhvdXRQYXRoUHJlZml4KHBhZ2UsIGAvJHtsb2NhbGV9YCk7XG4gICAgICBpZiAoc3RyaXBwZWQgIT09IHBhZ2UpIHtcbiAgICAgICAgcGFnZSA9IHN0cmlwcGVkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhZ2UgPT09IFwiLzQwNFwiKSByZXR1cm4gNDA0O1xuICAgIGlmIChwYWdlID09PSBcIi81MDBcIikgcmV0dXJuIDUwMDtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIGBuZXh0IHN0YXJ0YCdzIGFuc3dlciB0byBhIHBhdGggbm90aGluZyBzZXJ2ZXMgKGByb3V0ZXItc2VydmVyLmpzYCwgdGhlXG4gICAqIFwiNDA0IGNhc2VcIiksIGZvciBib3RoIHdheXMgb2YgZ2V0dGluZyBoZXJlOiBkaXNwYXRjaCBtYXRjaGVkIG5vdGhpbmcsIG9yIGl0XG4gICAqIG1hdGNoZWQgYSBidWlsZCBhc3NldCB0aGF0IGlzIG5vdCBpbiB0aGUgcGFja2FnZS5cbiAgICpcbiAgICogTm8tc3RvcmUsIGFsd2F5cy4gQSBwcmVyZW5kZXJlZCBgL19ub3QtZm91bmRgIHdvdWxkIG90aGVyd2lzZSBzZW5kIGl0c1xuICAgKiBjYWNoZSBlbnRyeSdzIHllYXItbG9uZyBgcy1tYXhhZ2VgLCBhbmQgdGhlIENETiB3b3VsZCBrZWVwIHRoZSA0MDQgcGFzdCB0aGVcbiAgICogZGVwbG95IHRoYXQgYWRkcyB0aGUgcm91dGUuIFNldCByYXRoZXIgdGhhbiBmb3JjZWQ6IE5leHQncyBwYWdlIGhhbmRsZXJzXG4gICAqIG9ubHkgd3JpdGUgYSBgQ2FjaGUtQ29udHJvbGAgd2hlbiBub25lIGlzIHNldCAoYHNlbmRSZW5kZXJSZXN1bHRgLFxuICAgKiBgcGFnZXMtaGFuZGxlci5qc2ApLCB3aGljaCBpcyBleGFjdGx5IGhvdyBgbmV4dCBzdGFydGAncyBvd24gbm8tc3RvcmUgaGVyZVxuICAgKiBzdXJ2aXZlcyB0aGUgcmVuZGVyLiBgcmVuZGVyNDA0YCBpcyBub3QgdGhpcyBwYXRoOiBhIGBub3RGb3VuZCgpYCBmcm9tIGFuXG4gICAqIElTUiBwYWdlIGlzIGNhY2hlYWJsZSBmb3IgdGhhdCBwYWdlJ3MgcmV2YWxpZGF0ZSBwZXJpb2QuXG4gICAqXG4gICAqIEEgbWlzc2luZyBgX25leHQvc3RhdGljYCBmaWxlLCBhbmQgYSBHRVQgb3IgSEVBRCB3aG9zZSBgU2VjLUZldGNoLURlc3RgXG4gICAqIHNheXMgaXQgY2Fubm90IGRpc3BsYXkgSFRNTCAoYW4gYDxpbWc+YCwgYSBzY3JpcHQsIGEgZm9udCksIGdldCBhXG4gICAqIHBsYWluLXRleHQgYE5vdCBGb3VuZGAgaW5zdGVhZCBvZiB0aGUgcmVuZGVyZWQgcGFnZSDigJQgbm90aGluZyB3b3VsZCBzaG93XG4gICAqIGl0LCBhbmQgcmVuZGVyaW5nIGl0IGlzIHRoZSBleHBlbnNpdmUgcGFydC5cbiAgICpcbiAgICogRXZlcnl0aGluZyBlbHNlIHJlbmRlcnMgdGhlIGFwcCdzIDQwNCBhcyB0aGUgcGF0aCB0aGF0IHdhcyBhc2tlZCBmb3IsIG5vdFxuICAgKiBhcyBgL19ub3QtZm91bmRgOiB0aGUgQXBwIFJvdXRlciBzZXJpYWxpemVzIHRoZSBjYW5vbmljYWwgVVJMIGludG8gdGhlIFJTQ1xuICAgKiBwYXlsb2FkLCBzbyBhIGNsaWVudCBoeWRyYXRlZCBvZmYgYSBgL19ub3QtZm91bmRgIHBheWxvYWQgcmVwb3J0cyB0aGUgd3JvbmdcbiAgICogYHVzZVBhdGhuYW1lKClgIGFuZCBwdXNoZXMgdGhlIHdyb25nIGhpc3RvcnkgZW50cnkuIEl0IHJlbmRlcnMgd2l0aCB0aGVcbiAgICogcmVxdWVzdCBoZWFkZXJzIG1pZGRsZXdhcmUgc2V0LCB0b28g4oCUIGEgQ1NQIG5vbmNlLCBzYXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRVbm1hdGNoZWQoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHdhaXRVbnRpbDogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQsXG4gICAgcmVzdWx0OiB7IHJlYWRvbmx5IHBhdGhuYW1lOiBzdHJpbmc7IHJlYWRvbmx5IHJlcXVlc3RIZWFkZXJzOiBIZWFkZXJzIH0sXG4gICAgdXJsOiBVUkwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlcy5zZXRIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIsIE5PX1NUT1JFKTtcbiAgICBjb25zdCB7IGJhc2VQYXRoLCBhc3NldFByZWZpeCB9ID0gdGhpcy5vcHRpb25zLm1hbmlmZXN0LmNvbmZpZztcbiAgICBjb25zdCBwYXRobmFtZSA9IHdpdGhvdXRQYXRoUHJlZml4KFxuICAgICAgd2l0aG91dFBhdGhQcmVmaXgocmVzdWx0LnBhdGhuYW1lLCBiYXNlUGF0aCksXG4gICAgICBhc3NldFByZWZpeCxcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvX25leHQvc3RhdGljL1wiKSB8fFxuICAgICAgKChyZXEubWV0aG9kID09PSBcIkdFVFwiIHx8IHJlcS5tZXRob2QgPT09IFwiSEVBRFwiKSAmJlxuICAgICAgICBOT05fSFRNTF9TRUNfRkVUQ0hfREVTVFMuaGFzKFxuICAgICAgICAgIGZpcnN0VmFsdWUocmVxLmhlYWRlcnNbXCJzZWMtZmV0Y2gtZGVzdFwiXSkgPz8gXCJcIixcbiAgICAgICAgKSlcbiAgICApIHtcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgICByZXMuZW5kKFwiTm90IEZvdW5kXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgIGF3YWl0IHRoaXMuc2VuZE5vdEZvdW5kKFxuICAgICAgcmVxLFxuICAgICAgcmVzLFxuICAgICAgd2FpdFVudGlsLFxuICAgICAgdGhpcy5kaXNwYXRjaGVyLm5vdEZvdW5kRm9yKHVybCksXG4gICAgICBgJHtyZXN1bHQucGF0aG5hbWV9JHt1cmwuc2VhcmNofWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgb24tZGVtYW5kIHJldmFsaWRhdGlvbiwgcnVuIGFnYWluc3QgdGhpcyBydW50aW1lIHJhdGhlciB0aGFuIG92ZXIgdGhlXG4gICAqIG5ldHdvcmsuIFdpcmVkIGluIGFzIGByZXF1ZXN0TWV0YS5yZXZhbGlkYXRlYDsgc2VlIHRoZSBjb21tZW50IHRoZXJlLlxuICAgKlxuICAgKiBUaGUgcmVzcG9uc2UgaXMgdGhyb3duIGF3YXkg4oCUIG9ubHkgaXRzIHN0YXR1cyBtYXR0ZXJzIOKAlCBidXQgaXQgZ29lcyB0aHJvdWdoXG4gICAqIHRoZSBmdWxsIHtAbGluayBoYW5kbGV9LCBzbyB0aGUgZW50cnlwb2ludCBzZWVzIGEgcmVxdWVzdCB3aXRoXG4gICAqIGB4LXByZXJlbmRlci1yZXZhbGlkYXRlYCBvbiBpdCBhbmQgd3JpdGVzIHRoZSBmcmVzaCBlbnRyeSB0aHJvdWdoIHRoZSBjYWNoZVxuICAgKiBoYW5kbGVyIGV4YWN0bHkgYXMgYSByZXF1ZXN0IGZyb20gb3V0c2lkZSB3b3VsZC4gYGhhbmRsZWAgYXdhaXRzIGl0cyBvd25cbiAgICogYHdhaXRVbnRpbGAgd29yaywgc28gdGhlIG5ldyBlbnRyeSBpcyBjb21taXR0ZWQgYmVmb3JlIGByZXMucmV2YWxpZGF0ZSgpYFxuICAgKiByZXNvbHZlcywgd2hpY2ggaXMgd2hhdCBjYWxsZXJzIHRoYXQgcmV2YWxpZGF0ZSBhbmQgdGhlbiByZWRpcmVjdCBkZXBlbmQgb24uXG4gICAqXG4gICAqIFRoZSBhY2NlcHQvdGhyb3cgcnVsZSBpcyBgTmV4dFNlcnZlciNyZXZhbGlkYXRlYCdzLCB2ZXJiYXRpbTogYSByZXZhbGlkYXRpb25cbiAgICogaXMgc3VjY2Vzc2Z1bCBpZiBpdCB3YXMgY2FjaGVkIG9yIGFuc3dlcmVkIDIwMCwgYW5kIGBub3RGb3VuZDogdHJ1ZWBcbiAgICogbGVnaXRpbWF0ZWx5IGFuc3dlcnMgNDA0IGZvciBhbiBgdW5zdGFibGVfb25seUdlbmVyYXRlZGAgY2FsbGVyLiBBbnl0aGluZ1xuICAgKiBlbHNlIHRocm93cywgYW5kIGByZXMucmV2YWxpZGF0ZSgpYCB0dXJucyBpdCBpbnRvIGBGYWlsZWQgdG8gcmV2YWxpZGF0ZVxuICAgKiA8cGF0aD46IDxtZXNzYWdlPmAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJldmFsaWRhdGUoXG4gICAgY29uZmlnOiBSZXZhbGlkYXRlQ29uZmlnLFxuICAgIG9yaWdpbjogUnVudGltZVJlcXVlc3QsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgaGVhZCwgb3RoZXJHcm91cCB9ID0gYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbGx5KFxuICAgICAge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIHVybDogY29uZmlnLnVybFBhdGgsXG4gICAgICAgIC8vIFRoZSBjYWxsZXIncyBhdXRob3JpdHksIG5vdCB0aGUgcmV2YWxpZGF0ZWQgcGF0aCdzOiBpdCBpcyB3aGF0XG4gICAgICAgIC8vIGBhYnNvbHV0ZVVybGAgYnVpbGRzIHRoZSByZXF1ZXN0IFVSTCBmcm9tLCBhbmQgYSByZXZhbGlkYXRpb24gaXMgZm9yXG4gICAgICAgIC8vIHRoZSBvcmlnaW4gYmVpbmcgc2VydmVkLiBUaGUgZm9yd2FyZGVkIHBhaXIgd2l0aCBpdCDigJQgYmVoaW5kXG4gICAgICAgIC8vIENsb3VkRnJvbnQgYGhvc3RgIGlzIHRoZSBGdW5jdGlvbiBVUkwsIGFuZCBhIHJlbmRlciB0aGF0IGJ1aWx0IGl0c1xuICAgICAgICAvLyBhYnNvbHV0ZSBVUkxzIGZyb20gdGhhdCB3b3VsZCBjYWNoZSBsaW5rcyB0byB0aGUgcmF3IGZ1bmN0aW9uLlxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uY29uZmlnLmhlYWRlcnMsXG4gICAgICAgICAgaG9zdDogb3JpZ2luLmhlYWRlcnMuaG9zdCxcbiAgICAgICAgICAuLi5waWNrRGVmaW5lZChvcmlnaW4uaGVhZGVycywgW1xuICAgICAgICAgICAgXCJ4LWZvcndhcmRlZC1ob3N0XCIsXG4gICAgICAgICAgICBcIngtZm9yd2FyZGVkLXByb3RvXCIsXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIGVuY3J5cHRlZDogb3JpZ2luLmVuY3J5cHRlZCxcbiAgICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiBvcmlnaW4udHJ1c3RGb3J3YXJkZWRIb3N0LFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0dXMgPSBoZWFkPy5zdGF0dXNDb2RlID8/IDUwMDtcbiAgICBpZiAob3RoZXJHcm91cCkge1xuICAgICAgY29uc3Qgc2VsZiA9IHByb2Nlc3MuZW52W0ZVTkNUSU9OX0dST1VQX0VOVl9WQVJdO1xuICAgICAgLy8gQSBwYWdlIHBhY2thZ2VkIGludG8gYW5vdGhlciBgZnVuY3Rpb25Hcm91cHNgIGdyb3VwOiBpdCBpcyByZW5kZXJlZCBpblxuICAgICAgLy8gcHJvY2VzcywgYW5kIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUgcGFnZSdzIGNvZGUuIENoZWNrZWRcbiAgICAgIC8vIGZpcnN0IGJlY2F1c2UgaXQgcmVuZGVycyBhcyBhIDQwNCwgd2hpY2ggYHVuc3RhYmxlX29ubHlHZW5lcmF0ZWRgXG4gICAgICAvLyB3b3VsZCBvdGhlcndpc2UgYWNjZXB0LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCByZXNwb25zZSAke3N0YXR1c306IFwiJHtjb25maWcudXJsUGF0aH1cIiBiZWxvbmdzIHRvIGAgK1xuICAgICAgICAgIGBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBncm91cCBcIiR7b3RoZXJHcm91cC5vd25lcn1cIiwgYW5kIGAgK1xuICAgICAgICAgIGByZXMucmV2YWxpZGF0ZSgpIGNhbiBvbmx5IHJldmFsaWRhdGUgcGFnZXMgaW4gdGhlIGdyb3VwIGl0IHJ1bnMgYCArXG4gICAgICAgICAgYGluIChcIiR7c2VsZn1cIikuIENhbGwgaXQgZnJvbSBhbiBBUEkgcm91dGUgaW4gZ3JvdXAgYCArXG4gICAgICAgICAgYFwiJHtvdGhlckdyb3VwLm93bmVyfVwiLCBvciB1c2UgcmV2YWxpZGF0ZVBhdGgoKS9yZXZhbGlkYXRlVGFnKCksIGAgK1xuICAgICAgICAgIGB3aGljaCB3b3JrIGZyb20gYW55IGdyb3VwLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBoZWFkPy5oZWFkZXJzW1wieC1uZXh0anMtY2FjaGVcIl0gIT09IFwiUkVWQUxJREFURURcIiAmJlxuICAgICAgc3RhdHVzICE9PSAyMDAgJiZcbiAgICAgICEoc3RhdHVzID09PSA0MDQgJiYgY29uZmlnLm9wdHMudW5zdGFibGVfb25seUdlbmVyYXRlZClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXNwb25zZSAke3N0YXR1c31gKTtcbiAgICB9XG5cbiAgICBhd2FpdCBpbnZhbGlkYXRlUmV2YWxpZGF0ZWRQYWdlKGNvbmZpZy51cmxQYXRoLCB0aGlzLm9wdGlvbnMubWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGltYWdlIG9wdGltaXphdGlvbiBzb3VyY2UgdGhhdCBpcyBub3QgYSBmaWxlOiBgPEltYWdlIHNyYz1cIi9hcGkvYXZhdGFyXCI+YFxuICAgKiBzZXJ2ZWQgYnkgYSByb3V0ZSBoYW5kbGVyLiBXaXJlZCBpbiBhcyB0aGUgb3B0aW1pemVyJ3MgYGZldGNoSW50ZXJuYWxgLCBhbmRcbiAgICogcnVuIGluIHByb2Nlc3MgZm9yIHRoZSByZWFzb25zIHtAbGluayByZXZhbGlkYXRlfSBpcyDigJQgYG5leHQgc3RhcnRgIGZldGNoZXNcbiAgICogdGhlIHNvdXJjZSBmcm9tIGl0c2VsZiBvdmVyIGxvb3BiYWNrLCB3aGljaCBoZXJlIHdvdWxkIGJlIGEgc2Vjb25kIGJpbGxlZFxuICAgKiBpbnZvY2F0aW9uIHRocm91Z2ggQ2xvdWRGcm9udC5cbiAgICpcbiAgICogT25seSB0aGUgYXV0aG9yaXR5IGlzIGZvcndhcmRlZCwgYXMgYG5leHQgc3RhcnRgJ3MgYGZldGNoSW50ZXJuYWxJbWFnZWBcbiAgICogZm9yd2FyZHMgbm9uZSBvZiB0aGUgdmlld2VyJ3MgaGVhZGVyczogdGhlIHNvdXJjZSBpcyBjYWNoZWQgYW5kIHNlcnZlZCB0b1xuICAgKiBldmVyeW9uZSwgc28gaXQgbXVzdCBub3QgZGVwZW5kIG9uIG9uZSB2aWV3ZXIncyBjb29raWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEludGVybmFsKFxuICAgIGhyZWY6IHN0cmluZyxcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgbWF4aW11bUJvZHk6IG51bWJlcixcbiAgKTogUHJvbWlzZTxJbnRlcm5hbEltYWdlUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBSdW50aW1lUmVxdWVzdCA9IHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogaHJlZixcbiAgICAgIGhlYWRlcnM6IHBpY2tEZWZpbmVkKHJlcS5oZWFkZXJzLCBbXG4gICAgICAgIFwiaG9zdFwiLFxuICAgICAgICBcIngtZm9yd2FyZGVkLWhvc3RcIixcbiAgICAgICAgXCJ4LWZvcndhcmRlZC1wcm90b1wiLFxuICAgICAgXSksXG4gICAgICBlbmNyeXB0ZWQ6IChyZXEuc29ja2V0IGFzIHsgZW5jcnlwdGVkPzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkKT8uZW5jcnlwdGVkLFxuICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiByZXEudHJ1c3RGb3J3YXJkZWRIb3N0LFxuICAgIH07XG4gICAgY29uc3QgeyBoZWFkLCBib2R5LCBvdGhlckdyb3VwLCB0b29MYXJnZSB9ID0gYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbGx5KFxuICAgICAgcmVxdWVzdCxcbiAgICAgIHsgbWF4aW11bUJvZHkgfSxcbiAgICApO1xuICAgIGlmICh0b29MYXJnZSkge1xuICAgICAgcmV0dXJuIHsgc3RhdHVzQ29kZTogMCwgaGVhZGVyczoge30sIGJvZHk6IEJ1ZmZlci5hbGxvYygwKSwgdG9vTGFyZ2UgfTtcbiAgICB9XG4gICAgaWYgKG90aGVyR3JvdXApIHtcbiAgICAgIC8vIFRoZSBlZGdlIHNlbmRzIGV2ZXJ5IGAvX25leHQvaW1hZ2VgIHJlcXVlc3QgdG8gdGhlIGRlZmF1bHQgZ3JvdXAsIGFuZFxuICAgICAgLy8gdGhlIHNvdXJjZSBpcyByZW5kZXJlZCBpbiBwcm9jZXNzLCBzbyBhIHJvdXRlIHBhY2thZ2VkIGludG8gYW5vdGhlclxuICAgICAgLy8gZ3JvdXAgaXMgb3V0IG9mIHJlYWNoOiB0aGUgb3B0aW1pemVyIGFuc3dlcnMgKGFuZCBsb2dzKSBhIDUwMi5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1c0NvZGU6IDAsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiBCdWZmZXIuYWxsb2MoMCksXG4gICAgICAgIG90aGVyR3JvdXA6IG90aGVyR3JvdXAub3duZXIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzQ29kZTogaGVhZD8uc3RhdHVzQ29kZSA/PyAwLFxuICAgICAgaGVhZGVyczogaGVhZD8uaGVhZGVycyA/PyB7fSxcbiAgICAgIGJvZHksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgcmVxdWVzdCB0aHJvdWdoIHtAbGluayBoYW5kbGV9LCBhbnN3ZXJlZCB0byB0aGlzIHJ1bnRpbWUgaW5zdGVhZCBvZiBhXG4gICAqIGNsaWVudDogdGhlIGhlYWQsIHRoZSBib2R5IHdoZW4gaXQgaXMgd2FudGVkLCBhbmQgdGhlIGVycm9yIHdoZW4gdGhlIHJvdXRlXG4gICAqIGlzIHBhY2thZ2VkIGludG8gYW5vdGhlciBgZnVuY3Rpb25Hcm91cHNgIGdyb3VwLiBgaGFuZGxlYCBhd2FpdHMgdGhlXG4gICAqIHJlcXVlc3QncyBgd2FpdFVudGlsYCB3b3JrIHRvbywgc28gd2hhdGV2ZXIgdGhlIHJlbmRlciB3cm90ZSBpcyBjb21taXR0ZWQgYnlcbiAgICogdGhlIHRpbWUgdGhpcyByZXNvbHZlcy5cbiAgICpcbiAgICogVGhlIGJvZHkgaXMga2VwdCBvbmx5IHdoZW4gYG1heGltdW1Cb2R5YCBpcyBzZXQuIE9uZSBwYXN0IGl0IGZhaWxzIHRoZVxuICAgKiByZXNwb25zZSBzdHJlYW0sIHdoaWNoIHN0b3BzIHRoZSByb3V0ZSB3cml0aW5nLCBhbmQgY29tZXMgYmFjayBhc1xuICAgKiBgdG9vTGFyZ2VgIHJhdGhlciB0aGFuIGhlbGQgaW4gbWVtb3J5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbnRlcm5hbGx5KFxuICAgIHJlcXVlc3Q6IFJ1bnRpbWVSZXF1ZXN0LFxuICAgIG9wdGlvbnM6IHsgcmVhZG9ubHkgbWF4aW11bUJvZHk/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTx7XG4gICAgaGVhZD86IFJlc3BvbnNlSGVhZDtcbiAgICBib2R5OiBCdWZmZXI7XG4gICAgb3RoZXJHcm91cD86IFJvdXRlSW5PdGhlckdyb3VwRXJyb3I7XG4gICAgdG9vTGFyZ2U6IGJvb2xlYW47XG4gIH0+IHtcbiAgICBsZXQgaGVhZDogUmVzcG9uc2VIZWFkIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgICBsZXQgc2l6ZSA9IDA7XG4gICAgbGV0IHRvb0xhcmdlID0gZmFsc2U7XG4gICAgbGV0IG90aGVyR3JvdXA6IFJvdXRlSW5PdGhlckdyb3VwRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb25Sb3V0ZUluT3RoZXJHcm91cCA9IChlcnJvcjogUm91dGVJbk90aGVyR3JvdXBFcnJvcikgPT4ge1xuICAgICAgb3RoZXJHcm91cCA9IGVycm9yO1xuICAgIH07XG4gICAgYXdhaXQgdGhpcy5oYW5kbGUoXG4gICAgICB7IC4uLnJlcXVlc3QsIG9uUm91dGVJbk90aGVyR3JvdXAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW4ocmVzcG9uc2VIZWFkKSB7XG4gICAgICAgICAgaGVhZCA9IHJlc3BvbnNlSGVhZDtcbiAgICAgICAgICByZXR1cm4gbmV3IFdyaXRhYmxlKHtcbiAgICAgICAgICAgIHdyaXRlKGNodW5rOiBCdWZmZXIsIF9lbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubWF4aW11bUJvZHkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIHNpemUgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgaWYgKHNpemUgPiBvcHRpb25zLm1heGltdW1Cb2R5KSB7XG4gICAgICAgICAgICAgICAgdG9vTGFyZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJPdmVyIGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5XCIpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZCxcbiAgICAgIGJvZHk6IHRvb0xhcmdlID8gQnVmZmVyLmFsbG9jKDApIDogQnVmZmVyLmNvbmNhdChjaHVua3MpLFxuICAgICAgb3RoZXJHcm91cCxcbiAgICAgIHRvb0xhcmdlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXBwIFJvdXRlciBidWlsZHMgYW4gaW52b2NhYmxlIGAvX25vdC1mb3VuZGAsIFBhZ2VzIFJvdXRlciBhIHByZXJlbmRlcmVkXG4gICAqIGA0MDQuaHRtbGAgKHBlciBsb2NhbGUgdW5kZXIgaTE4bikgb3IgZWxzZSBgL19lcnJvcmA7IHNlZSBgc3RhdHVzVGFyZ2V0c2AuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmROb3RGb3VuZChcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICB0YXJnZXQ6IFN0YXR1c1RhcmdldCxcbiAgICAvKipcbiAgICAgKiBXaGF0IHRvIHJlbmRlciB0aGUgNDA0IGFzLiBPbWl0dGVkIGJ5IGByZW5kZXI0MDRgLCB3aGljaCBpcyBjYWxsZWRcbiAgICAgKiBtaWQtcmVuZGVyIHdpdGggYHJlcS51cmxgIGFscmVhZHkgcG9pbnRpbmcgYXQgdGhlIHJvdXRlIHRoYXQgZ2F2ZSB1cCDigJRcbiAgICAgKiB0aGUgcGF0aCBOZXh0LmpzIHdvdWxkIHJlbmRlciB0aGF0IDQwNCBmb3IuXG4gICAgICovXG4gICAgcmVxdWVzdGVkVXJsPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcblxuICAgIGlmICh0YXJnZXQua2luZCA9PT0gXCJlbnRyeXBvaW50XCIpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLmVudHJ5cG9pbnRzLmxvYWQodGFyZ2V0LmVudHJ5cG9pbnQpO1xuICAgICAgcmVxLnVybCA9IHJlcXVlc3RlZFVybCA/PyByZXEudXJsO1xuICAgICAgY29uc3QgcmVuZGVyID0gKCkgPT4gaGFuZGxlcihyZXEsIGFzU2VydmVyUmVzcG9uc2UocmVzKSwgeyB3YWl0VW50aWwgfSk7XG4gICAgICAvLyBBcHAgUm91dGVyJ3MgYC9fbm90LWZvdW5kYCBpcyBhIHBhZ2UgcmVuZGVyIHRvbzogc2VlIGByb3V0ZWAuXG4gICAgICBhd2FpdCAodGFyZ2V0LmVudHJ5cG9pbnQudHlwZSA9PT0gXCJhcHAtcGFnZVwiXG4gICAgICAgID8gY2F0Y2hVcFRhZ3MocmVuZGVyKVxuICAgICAgICA6IHJlbmRlcigpKTtcbiAgICAgIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRhcmdldC5raW5kID09PSBcInN0YXRpYy1maWxlXCIgJiZcbiAgICAgIChhd2FpdCB0aGlzLnNlbmRIdG1sRmlsZShyZXMsIHRhcmdldCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgcmVzLmVuZChcIlRoaXMgcGFnZSBjb3VsZCBub3QgYmUgZm91bmQuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm4gYSB0aHJvd24gZXJyb3IgaW50byBhIHJlc3BvbnNlLCByZW5kZXJpbmcgdGhlIGFwcCdzIGVycm9yIHBhZ2Ugd2hlbiBpdFxuICAgKiBoYXMgb25lLlxuICAgKlxuICAgKiBOZXh0LmpzJ3Mgb3duIHBhZ2UgaGFuZGxlcnMgY2F0Y2gsIHJlcG9ydCBhbmQgdGhlbiAqcmV0aHJvdyogKFwicmV0aHJvdyBzb1xuICAgKiB0aGF0IHdlIGNhbiBoYW5kbGUgc2VydmluZyBlcnJvciBwYWdlXCIsIGBwYWdlcy1oYW5kbGVyLnRzYCksIHdoaWNoIG1ha2VzIHRoZVxuICAgKiBlcnJvciBwYWdlIHRoZSBob3N0J3Mgam9iIOKAlCB0aGUgc2FtZSBkaXZpc2lvbiBvZiBsYWJvciBhcyBgcmVuZGVyNDA0YC4gV2l0aG91dFxuICAgKiB0aGlzIGxhZGRlciBldmVyeSB0aHJvdyBhbnN3ZXJlZCBhIGJhcmUgYHRleHQvcGxhaW5gIDUwMCBhbmQgYSBjdXN0b21cbiAgICogYHBhZ2VzL19lcnJvcmAgd2FzIGRlYWQgY29kZSAoYHRlc3QvZTJlL2FzeW5jLW1vZHVsZXNgLCB3aG9zZSBgL21ha2UtZXJyb3JgXG4gICAqIHRocm93cyBpbiBgZ2V0U2VydmVyU2lkZVByb3BzYCkuXG4gICAqXG4gICAqIE9uY2UgdGhlIGhlYWQgaXMgb3V0IHRoZXJlIGlzIG5vdGhpbmcgdG8gc2F5IOKAlCBkZXN0cm95aW5nIHRoZSBzdHJlYW0gaXMgd2hhdFxuICAgKiB0ZWxscyB0aGUgY2xpZW50IHRoZSByZXNwb25zZSBpcyB0cnVuY2F0ZWQgcmF0aGVyIHRoYW4gY29tcGxldGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRFcnJvcihcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICAvKiogVGhlIHJlcXVlc3QsIGFzIHJlY2VpdmVkOiB3aGljaCBsb2NhbGUncyBwcmVyZW5kZXJlZCA1MDAgdG8gc2VuZC4gKi9cbiAgICB1cmw6IFVSTCB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5lcnJvcihcIlVuaGFuZGxlZCBlcnJvciB3aGlsZSBoYW5kbGluZyB0aGUgcmVxdWVzdDpcIiwgZXJyb3IpO1xuICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgIHJlcy5kZXN0cm95KGFzRXJyb3IoZXJyb3IpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgLy8gQSBmYWlsZWQgcmVuZGVyIG1heSBoYXZlIHNldCBoZWFkZXJzIGRlc2NyaWJpbmcgYSBib2R5IHRoYXQgbmV2ZXJcbiAgICAvLyBhcnJpdmVkLiBFdmVyeSBydW5nIGJlbG93IHNlbmRzIGEgZGlmZmVyZW50IGJvZHksIHNvIHRoZXkgZ28gZmlyc3Q6IGFcbiAgICAvLyBzdGFsZSBgQ29udGVudC1MZW5ndGhgIG9uIGEgNTAwLmh0bWwgb2YgYW5vdGhlciBzaXplIGhhbmdzIHRoZSBjbGllbnQgb3JcbiAgICAvLyBkZXN5bmNzIGEga2VlcC1hbGl2ZSBjb25uZWN0aW9uLlxuICAgIHJlcy5yZW1vdmVIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiKTtcbiAgICByZXMucmVtb3ZlSGVhZGVyKFwiRVRhZ1wiKTtcbiAgICAvLyBFdmVyeSBydW5nLCB0aGUgZXJyb3ItcGFnZSBlbnRyeXBvaW50IGluY2x1ZGVkOiBvdGhlcndpc2UgdGhlIHRocm93aW5nXG4gICAgLy8gcmVuZGVyJ3MgYHMtbWF4YWdlYCAob3IgYSBgaGVhZGVycygpYCBydWxlJ3MpIHJpZGVzIGFsb25nIGFuZCBDbG91ZEZyb250XG4gICAgLy8gY2FjaGVzIHRoZSA1MDAuIGBuZXh0IHN0YXJ0YCBzZXRzIGl0IGJlZm9yZSByZW5kZXJpbmcgdGhlIGVycm9yIHBhZ2UgdG9vLlxuICAgIHJlcy5zZXRIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIsIE5PX1NUT1JFKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmVycm9yVGFyZ2V0Rm9yKHVybCk7XG5cbiAgICBpZiAodGFyZ2V0LmtpbmQgPT09IFwiZW50cnlwb2ludFwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgdGhpcy5lbnRyeXBvaW50cy5sb2FkKHRhcmdldC5lbnRyeXBvaW50KTtcbiAgICAgICAgLy8gYHJlcS51cmxgIGlzIGxlZnQgYWxvbmU6IHRoZSBlcnJvciBwYWdlIHJlbmRlcnMgZm9yIHRoZSBVUkwgdGhhdCB3YXNcbiAgICAgICAgLy8gYXNrZWQgZm9yLCBhbmQgYF9lcnJvcmAncyBgZ2V0SW5pdGlhbFByb3BzYCByZWFkcyB0aGUgc3RhdHVzIG9mZiBgcmVzYCxcbiAgICAgICAgLy8gd2hpY2ggaXMgd2h5IHRoZSA1MDAgYWJvdmUgaXMgc2V0IGZpcnN0LlxuICAgICAgICBhd2FpdCBoYW5kbGVyKHJlcSwgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLCB7IHdhaXRVbnRpbCB9KTtcbiAgICAgICAgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvclBhZ2VFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVGhlIGVycm9yIHBhZ2UgaXRzZWxmIGZhaWxlZCB0byByZW5kZXI6XCIsXG4gICAgICAgICAgZXJyb3JQYWdlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgICByZXMuZGVzdHJveShhc0Vycm9yKGVycm9yUGFnZUVycm9yKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGFyZ2V0LmtpbmQgPT09IFwic3RhdGljLWZpbGVcIiAmJlxuICAgICAgKGF3YWl0IHRoaXMuc2VuZEh0bWxGaWxlKHJlcywgdGFyZ2V0KSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBZ2FpbjogYW4gZXJyb3IgcGFnZSB0aGF0IHRocmV3IG1heSBoYXZlIGRlc2NyaWJlZCBpdHMgb3duIGJvZHkgdG9vLlxuICAgIHJlcy5yZW1vdmVIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiKTtcbiAgICByZXMucmVtb3ZlSGVhZGVyKFwiRVRhZ1wiKTtcbiAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgICByZXMuc2V0SGVhZGVyKFwiQ2FjaGUtQ29udHJvbFwiLCBOT19TVE9SRSk7XG4gICAgcmVzLmVuZChcIkludGVybmFsIFNlcnZlciBFcnJvclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHByZXJlbmRlcmVkIDQwNCBvciA1MDAgcGFnZSwgb3IgYGZhbHNlYCB3aGVuIGl0IGNhbm5vdCBiZSByZWFkIGFuZCB0aGVcbiAgICogY2FsbGVyJ3MgcGxhaW4tdGV4dCBmYWxsYmFjayBzaG91bGQgYW5zd2VyLiBSZWFkIHJhdGhlciB0aGFuIGBzZXJ2ZVN0YXRpY2AsXG4gICAqIHdoaWNoIGtlZXBzIHRoZSBzdGF0dXMgYWxyZWFkeSBzZXQgYnV0IHdvdWxkIGFuc3dlciBhIGBSYW5nZWAgcmVxdWVzdCB3aXRoXG4gICAqIGEgMjA2IG9mIHRoZSBlcnJvciBwYWdlLCBhbmQgYWRkIGBFVGFnYCwgYExhc3QtTW9kaWZpZWRgIGFuZCwgd2hlcmUgbm9uZSBpc1xuICAgKiBzZXQgeWV0LCBhIHB1YmxpYyBgQ2FjaGUtQ29udHJvbGAgdG8gaXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRIdG1sRmlsZShcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB0YXJnZXQ6IHsgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZyB9LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgaHRtbDogQnVmZmVyO1xuICAgIHRyeSB7XG4gICAgICBodG1sID0gYXdhaXQgcmVhZEZpbGUoam9pbih0aGlzLm9wdGlvbnMuZGVwbG95bWVudFJvb3QsIHRhcmdldC5maWxlUGF0aCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHJlcy5lbmQoaHRtbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGF0IG5leHQgc2VuZHMgd2l0aCBhbiBlcnJvciBpdCByZW5kZXJlZCBpdHNlbGYuIFdpdGhvdXQgaXQgYSBgQ2FjaGUtQ29udHJvbGBcbiAqIGxlZnQgYmVoaW5kIGJ5IHRoZSByZW5kZXIgdGhhdCB0aHJldyBjYW4gZ2V0IGEgNTAwIGNhY2hlZCBhdCB0aGUgZWRnZS5cbiAqL1xuY29uc3QgTk9fU1RPUkUgPSBcInByaXZhdGUsIG5vLWNhY2hlLCBuby1zdG9yZSwgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGVcIjtcblxuLyoqXG4gKiBgU2VjLUZldGNoLURlc3RgIHZhbHVlcyB0aGF0IGNhbiBuZXZlciBkaXNwbGF5IGFuIEhUTUwgcmVzcG9uc2UsIGZyb21cbiAqIGBuZXh0L2Rpc3Qvc2VydmVyL2xpYi9pcy1ub24taHRtbC1zZWMtZmV0Y2gtZGVzdC5qc2AuIFJlc3RhdGVkIHJhdGhlciB0aGFuXG4gKiByZXF1aXJlZCwgYmVjYXVzZSB0aGF0IG1vZHVsZSBpcyByZWNlbnQgYW5kIHRoZSBhcHAncyBgbmV4dGAgbWF5IHByZWRhdGUgaXQ6XG4gKiBhIGZhaWxlZCByZXF1aXJlIGhlcmUgd291bGQgdHVybiBldmVyeSA0MDQgaW50byBhIDUwMC4gRXhjbHVkZXMgYGRvY3VtZW50YCxcbiAqIGBpZnJhbWVgIGFuZCB0aGUgbGlrZSwgYW5kIGBlbXB0eWAg4oCUIGBmZXRjaCgpYCwgd2hpY2ggaXMgaG93IFJTQyByZXF1ZXN0cyBnby5cbiAqL1xuY29uc3QgTk9OX0hUTUxfU0VDX0ZFVENIX0RFU1RTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwiYXVkaW9cIixcbiAgXCJhdWRpb3dvcmtsZXRcIixcbiAgXCJmb250XCIsXG4gIFwiaW1hZ2VcIixcbiAgXCJqc29uXCIsXG4gIFwibWFuaWZlc3RcIixcbiAgXCJwYWludHdvcmtsZXRcIixcbiAgXCJyZXBvcnRcIixcbiAgXCJzY3JpcHRcIixcbiAgXCJzZXJ2aWNld29ya2VyXCIsXG4gIFwic2hhcmVkd29ya2VyXCIsXG4gIFwic3R5bGVcIixcbiAgXCJ0cmFja1wiLFxuICBcInZpZGVvXCIsXG4gIFwid2ViaWRlbnRpdHlcIixcbiAgXCJ3b3JrZXJcIixcbiAgXCJ4c2x0XCIsXG5dKTtcblxuLyoqXG4gKiBgSU5URVJOQUxfSEVBREVSU2AgZnJvbSBgbmV4dC9kaXN0L3NlcnZlci9saWIvc2VydmVyLWlwYy91dGlscy5qc2AgKE5leHRcbiAqIDE2LjMpLCB3aGljaCBgbmV4dCBzdGFydGAgZGVsZXRlcyBmcm9tIGV2ZXJ5IHJlcXVlc3QgYmVmb3JlIHJvdXRpbmcgaXRcbiAqIChgZmlsdGVySW50ZXJuYWxIZWFkZXJzYCBpbiBgcm91dGVyLXNlcnZlci5qc2ApLiBUaGV5IGFyZSBzaWduYWxzIGJldHdlZW5cbiAqIE5leHQncyBvd24gcm91dGVyIGFuZCByZW5kZXIgbGF5ZXJzOyBob25vcmluZyBvbmUgYSBjbGllbnQgc2VudCBsZXRzIGl0IHN0ZWVyXG4gKiB0aG9zZSBsYXllcnMg4oCUIGBuZXh0LXJlc3VtZWAgbWFrZXMgYSBQUFIgcGFnZSByZXN1bWUgZnJvbSBhIHBvc3Rwb25lZCBzdGF0ZVxuICogdGhlIGNsaWVudCBzdXBwbGllcy4gUmVzdGF0ZWQgcmF0aGVyIHRoYW4gcmVxdWlyZWQsIGxpa2VcbiAqIHtAbGluayBOT05fSFRNTF9TRUNfRkVUQ0hfREVTVFN9LlxuICovXG5jb25zdCBJTlRFUk5BTF9IRUFERVJTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwieC1taWRkbGV3YXJlLXJld3JpdGVcIixcbiAgXCJ4LW1pZGRsZXdhcmUtcmVkaXJlY3RcIixcbiAgXCJ4LW1pZGRsZXdhcmUtc2V0LWNvb2tpZVwiLFxuICBcIngtbWlkZGxld2FyZS1za2lwXCIsXG4gIFwieC1taWRkbGV3YXJlLW92ZXJyaWRlLWhlYWRlcnNcIixcbiAgXCJ4LW1pZGRsZXdhcmUtbmV4dFwiLFxuICBcIngtbm93LXJvdXRlLW1hdGNoZXNcIixcbiAgXCJ4LW1hdGNoZWQtcGF0aFwiLFxuICBcIngtbmV4dGpzLWRhdGFcIixcbiAgXCJ4LW5leHQtcmVzdW1lLXN0YXRlLWxlbmd0aFwiLFxuICBcIm5leHQtcmVzdW1lXCIsXG5dKTtcblxuLyoqXG4gKiBUaGUgcmVxdWVzdCBoZWFkZXJzIHdpdGgge0BsaW5rIElOVEVSTkFMX0hFQURFUlN9IHJlbW92ZWQsIGFuZCBgeC1uZXh0anMtZGF0YWBcbiAqIHB1dCBiYWNrIGZvciBhIGBfbmV4dC9kYXRhYCByZXF1ZXN0LCB3aGljaCBpcyB3aGF0IGBuZXh0IHN0YXJ0YCdzXG4gKiBgcmVzb2x2ZVJvdXRlc2AgZG9lcyAoYHNldElzTmV4dERhdGFSZXF1ZXN0YCkgcmlnaHQgYWZ0ZXIgc3RyaXBwaW5nIGl0OiB0aGVcbiAqIGhlYWRlciBpcyBpbnRlcm5hbCwgYnV0IE5leHQncyBoYW5kbGVycyBhbmQgbWlkZGxld2FyZSBzdGlsbCByZWFkIGl0IOKAlCBpdCBpc1xuICogaG93IGEgZGF0YSByZXF1ZXN0IGdldHMgYHgtbmV4dGpzLW1hdGNoZWQtcGF0aGAg4oCUIHNvIGEgcmVhbCBkYXRhIHJlcXVlc3QgaGFzXG4gKiB0byBrZWVwIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dEludGVybmFsSGVhZGVycyhcbiAgaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycyxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBJbmNvbWluZ0h0dHBIZWFkZXJzIHtcbiAgY29uc3QgZmlsdGVyZWQ6IEluY29taW5nSHR0cEhlYWRlcnMgPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgaWYgKCFJTlRFUk5BTF9IRUFERVJTLmhhcyhuYW1lKSkge1xuICAgICAgZmlsdGVyZWRbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGF0aG5hbWUgPSB3aXRob3V0UGF0aFByZWZpeCh0YXJnZXQuc3BsaXQoXCI/XCIpWzBdLCBiYXNlUGF0aCk7XG4gIGlmIChwYXRobmFtZS5zdGFydHNXaXRoKFwiL19uZXh0L2RhdGEvXCIpICYmIHBhdGhuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICBmaWx0ZXJlZFtcIngtbmV4dGpzLWRhdGFcIl0gPSBcIjFcIjtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKiBFdmVyeSByb3V0ZSB0byBpbnZhbGlkYXRlLCBlYWNoIG9uY2UsIGluIG9uZSBDbG91ZEZyb250IGludmFsaWRhdGlvbi4gKi9cbnR5cGUgUmV2YWxpZGF0ZWRQYWdlSG9vayA9IChyb3V0ZXM6IHJlYWRvbmx5IHN0cmluZ1tdKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEludmFsaWRhdGUgdGhlIENETiBjb3BpZXMgb2YgYSBwYWdlIGByZXMucmV2YWxpZGF0ZSgpYCBqdXN0IHJlZ2VuZXJhdGVkOiBpdHNcbiAqIEhUTUwgYW5kIFJTQyBwYXlsb2FkLCBhbmQgaXRzIFBhZ2VzIFJvdXRlciBgX25leHQvZGF0YWAgSlNPTi4gV2l0aG91dCB0aGlzIHRoZVxuICogZnJlc2ggZW50cnkgc2F0IGJlaGluZCBDbG91ZEZyb250J3MgY29weSBvZiB0aGUgb2xkIG9uZSBmb3IgdGhlIHBhZ2UncyB3aG9sZVxuICogYHMtbWF4YWdlYCDigJQgYSB5ZWFyLCBmb3IgYW4gb24tZGVtYW5kLW9ubHkgSVNSIHBhZ2UuIGByZXZhbGlkYXRlUGF0aGAgYW5kXG4gKiBgcmV2YWxpZGF0ZVRhZ2AgZ28gdGhyb3VnaCB0aGUgY2FjaGUgaGFuZGxlcidzIGByZXZhbGlkYXRlVGFnYCwgd2hpY2ggYWxyZWFkeVxuICogaW52YWxpZGF0ZXM7IGByZXMucmV2YWxpZGF0ZSgpYCBkb2VzIG5vdCB0b3VjaCBpdC5cbiAqXG4gKiBFdmVyeSByb3V0ZSBpcyB3aXRob3V0IGBiYXNlUGF0aGAsIHdoaWNoIHRoZSBob29rIHByZWZpeGVzLiBBIG5vLW9wIG91dHNpZGVcbiAqIHRoZSBHbG9iYWwgY29uc3RydWN0cywgd2hlcmUgbm8gaG9vayBpcyByZWdpc3RlcmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbnZhbGlkYXRlUmV2YWxpZGF0ZWRQYWdlKFxuICB1cmxQYXRoOiBzdHJpbmcsXG4gIG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3QsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaG9vayA9IChnbG9iYWxUaGlzIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICBSRVZBTElEQVRFRF9QQUdFX0hPT0tcbiAgXSBhcyBSZXZhbGlkYXRlZFBhZ2VIb29rIHwgdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIGhvb2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByb3V0ZSA9IHdpdGhvdXRQYXRoUHJlZml4KFxuICAgIHVybFBhdGguc3BsaXQoXCI/XCIpWzBdLFxuICAgIG1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCxcbiAgKTtcbiAgdHJ5IHtcbiAgICAvLyBPbmUgY2FsbCwgZGVkdXBsaWNhdGVkOiB0aGUgZGVmYXVsdCBsb2NhbGUncyB0d28gcGFpcnMgc2hhcmUgYSBkYXRhXG4gICAgLy8gcm91dGUsIGFuZCBlYWNoIGludmFsaWRhdGlvbiBwYXRoIGNvdW50cyBhZ2FpbnN0IENsb3VkRnJvbnQncyBxdW90YS5cbiAgICBhd2FpdCBob29rKFsuLi5uZXcgU2V0KHJldmFsaWRhdGVkUGFnZVJvdXRlcyhyb3V0ZSwgbWFuaWZlc3QpLmZsYXQoKSldKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBUaGUgcmVnZW5lcmF0aW9uIGl0c2VsZiBzdWNjZWVkZWQ7IHRoZSBlZGdlIGNhdGNoZXMgdXAgYXQgYHMtbWF4YWdlYC5cbiAgICBjb25zb2xlLndhcm4oYENvdWxkIG5vdCBpbnZhbGlkYXRlIHRoZSBDRE4gY29weSBvZiAke3VybFBhdGh9OmAsIGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBgW3JvdXRlLCBkYXRhUm91dGVdYCBwYWlycyBhIHJldmFsaWRhdGVkIHBhZ2UgaXMgY2FjaGVkIHVuZGVyIGF0IHRoZSBlZGdlLlxuICpcbiAqIEluIGFuIGkxOG4gYXBwIHRoZSBOZXh0IGNsaWVudCBhbHdheXMgcHV0cyB0aGUgbG9jYWxlIGluIGEgZGF0YSBocmVmLCB0aGVcbiAqIGRlZmF1bHQgbG9jYWxlIGluY2x1ZGVkIChgL19uZXh0L2RhdGEvPGlkPi9lbi9ibG9nLmpzb25gLCBhbmQgYOKApi9lbi5qc29uYCBmb3JcbiAqIHRoZSByb290KSwgc28gdGhlIHVucHJlZml4ZWQgZGF0YSByb3V0ZSBuYW1lcyBub3RoaW5nIENsb3VkRnJvbnQgaG9sZHMuIFRoZVxuICogcGFnZSBpcyBvbmUgbG9jYWxlJ3Mg4oCUIGByZXMucmV2YWxpZGF0ZShcIi9ibG9nXCIpYCByZWdlbmVyYXRlcyB0aGUgZGVmYXVsdFxuICogbG9jYWxlJ3MsIGBcIi9mci9ibG9nXCJgIEZyZW5jaCDigJQgYW5kIHRoZSBkZWZhdWx0IGxvY2FsZSdzIEhUTUwgaXMgcmVhY2hhYmxlLFxuICogYW5kIGNhY2hlZCwgYm90aCB3aXRoIGFuZCB3aXRob3V0IGl0cyBwcmVmaXgsIHNvIGl0cyB0d28gcGFpcnMgc2hhcmUgYSBkYXRhXG4gKiByb3V0ZSwgd2hpY2ggdGhlIGNhbGxlciBzZW5kcyBvbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV2YWxpZGF0ZWRQYWdlUm91dGVzKFxuICByb3V0ZTogc3RyaW5nLFxuICBtYW5pZmVzdDogUGljazxBZGFwdGVyTWFuaWZlc3QsIFwiYnVpbGRJZFwiIHwgXCJjb25maWdcIj4sXG4pOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGRhdGFSb3V0ZSA9IChwYWdlOiBzdHJpbmcpID0+XG4gICAgYC9fbmV4dC9kYXRhLyR7bWFuaWZlc3QuYnVpbGRJZH0ke1xuICAgICAgcGFnZSA9PT0gXCIvXCIgPyBcIi9pbmRleFwiIDogcGFnZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gICAgfS5qc29uYDtcbiAgY29uc3QgaTE4biA9IG1hbmlmZXN0LmNvbmZpZy5pMThuIGFzIHtcbiAgICByZWFkb25seSBsb2NhbGVzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgcmVhZG9ubHkgZGVmYXVsdExvY2FsZT86IHN0cmluZztcbiAgfSB8IG51bGw7XG4gIGlmICghaTE4bj8uZGVmYXVsdExvY2FsZSkge1xuICAgIHJldHVybiBbW3JvdXRlLCBkYXRhUm91dGUocm91dGUpXV07XG4gIH1cbiAgY29uc3QgeyBkZWZhdWx0TG9jYWxlIH0gPSBpMThuO1xuICBjb25zdCBzZWdtZW50ID0gcm91dGUuc3BsaXQoXCIvXCIpWzFdID8/IFwiXCI7XG4gIGNvbnN0IGxvY2FsZSA9IChpMThuLmxvY2FsZXMgPz8gW10pLmluY2x1ZGVzKHNlZ21lbnQpXG4gICAgPyBzZWdtZW50XG4gICAgOiBkZWZhdWx0TG9jYWxlO1xuICBjb25zdCBwYWdlID1cbiAgICBsb2NhbGUgPT09IHNlZ21lbnQgPyB3aXRob3V0UGF0aFByZWZpeChyb3V0ZSwgYC8ke3NlZ21lbnR9YCkgOiByb3V0ZTtcbiAgY29uc3QgbG9jYWxpemVkID0gcGFnZSA9PT0gXCIvXCIgPyBgLyR7bG9jYWxlfWAgOiBgLyR7bG9jYWxlfSR7cGFnZX1gO1xuICAvLyBUaGUgcm9vdCdzIGRhdGEgcm91dGUgaXMgdGhlIGxvY2FsZSBpdHNlbGYsIG5vdCBgLzxsb2NhbGU+L2luZGV4YC5cbiAgY29uc3QgbG9jYWxpemVkRGF0YSA9IGAvX25leHQvZGF0YS8ke21hbmlmZXN0LmJ1aWxkSWR9JHtsb2NhbGl6ZWQucmVwbGFjZSgvXFwvKyQvLCBcIlwiKX0uanNvbmA7XG4gIHJldHVybiBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGVcbiAgICA/IFtcbiAgICAgICAgW3BhZ2UsIGxvY2FsaXplZERhdGFdLFxuICAgICAgICBbbG9jYWxpemVkLCBsb2NhbGl6ZWREYXRhXSxcbiAgICAgIF1cbiAgICA6IFtbbG9jYWxpemVkLCBsb2NhbGl6ZWREYXRhXV07XG59XG5cbmZ1bmN0aW9uIGFzRXJyb3IoZXJyb3I6IHVua25vd24pOiBFcnJvciB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgbWFuaWZlc3QgYW5kIHBpbiB0aGUgbGF5b3V0IGl0IGRlc2NyaWJlcy5cbiAqXG4gKiBgcHJvY2Vzcy5jd2QoKWAgaXMgbG9hZC1iZWFyaW5nIGFuZCB0aGVyZSBpcyBleGFjdGx5IG9uZSBjaGFuY2UgdG8gZ2V0IGl0XG4gKiByaWdodDogTmV4dC5qcyBpbmxpbmVzIGByZWxhdGl2ZShidWlsZEN3ZCwgcHJvamVjdERpcilgIGludG8gZXZlcnkgZW50cnlwb2ludFxuICogYW5kIHJlc29sdmVzIGl0IGFnYWluc3QgdGhlICpydW50aW1lKiBjd2QgdG8gZmluZFxuICogYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCwgdGhlIHByZXJlbmRlciBtYW5pZmVzdCwgYW5kIHRoZSBhcHAncyBjaHVua3MuXG4gKiBgYXNzZXJ0QnVpbGRDd2RgIGluIGBidWlsZC1vdXRwdXRzLnRzYCBrZWVwcyB0aGF0IGlubGluZWQgdmFsdWUgYFwiXCJgLCBzbyB0aGVcbiAqIHdob2xlIGludmFyaWFudCByZWR1Y2VzIHRvIFwiY3dkIGlzIHRoZSBzdGFnZWQgcHJvamVjdCBkaXJcIiDigJQgYXNzZXJ0ZWQgcmF0aGVyXG4gKiB0aGFuIGFzc3VtZWQsIGJlY2F1c2UgZ2V0dGluZyBpdCB3cm9uZyBwcm9kdWNlcyBhXG4gKiBgQ2Fubm90IGZpbmQgbW9kdWxlIOKApi9yZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAgZnJvbSBpbnNpZGUgY29tcGlsZWQgTmV4dC5qc1xuICogY29kZSB3aXRoIG5vIGluZGljYXRpb24gdGhhdCB0aGUgbGF5b3V0IGlzIHRoZSBwcm9ibGVtLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFJ1bnRpbWUoXG4gIGRlcGxveW1lbnRSb290OiBzdHJpbmcsXG4pOiBQcm9taXNlPE5leHRqc1J1bnRpbWU+IHtcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gZGVwbG95ZWRNYW5pZmVzdFBhdGgoZGVwbG95bWVudFJvb3QpO1xuICBsZXQgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdDtcbiAgdHJ5IHtcbiAgICBtYW5pZmVzdCA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUobWFuaWZlc3RQYXRoLCBcInV0Zi04XCIpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ291bGQgbm90IHJlYWQgdGhlIGNkay1uZXh0anMgYWRhcHRlciBtYW5pZmVzdCBhdCBcIiR7bWFuaWZlc3RQYXRofVwiLiBgICtcbiAgICAgICAgYFRoZSBkZXBsb3ltZW50IHBhY2thZ2UgaXMgaW5jb21wbGV0ZTogc3ludGggY29waWVzIGAgK1xuICAgICAgICBgJHtNQU5JRkVTVF9GSUxFX05BTUV9IGluIG5leHQgdG8gdGhlIGJ1bmRsZWQgcnVudGltZS5gLFxuICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdERpciA9IGpvaW4oZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0LnJlbGF0aXZlUHJvamVjdERpcik7XG4gIGNvbnN0IHByb2JlID0gam9pbihcbiAgICBwcm9qZWN0RGlyLFxuICAgIG1hbmlmZXN0LmNvbmZpZy5kaXN0RGlyLFxuICAgIFwicmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25cIixcbiAgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZWFkRmlsZShwcm9iZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBkZXBsb3ltZW50IHJvb3QgXCIke2RlcGxveW1lbnRSb290fVwiIGRvZXMgbm90IGNvbnRhaW4gdGhlIHN0YWdlZCBgICtcbiAgICAgICAgYE5leHQuanMgcHJvamVjdDogZXhwZWN0ZWQgXCIke3Byb2JlfVwiIHRvIGV4aXN0LiBFdmVyeSBidWlsdCBlbnRyeXBvaW50IGAgK1xuICAgICAgICBgcmVzb2x2ZXMgaXRzIG93biBwYXRocyBhZ2FpbnN0IHByb2Nlc3MuY3dkKCksIHNvIHRoaXMgbGF5b3V0IGlzIHBhcnQgYCArXG4gICAgICAgIGBvZiB0aGUgY29udHJhY3QsIG5vdCBhIGNvbnZlbmllbmNlLmAsXG4gICAgICB7IGNhdXNlOiBlcnJvciB9LFxuICAgICk7XG4gIH1cbiAgLy8gYG5leHQgc3RhcnRgIGZvcmNlcyB0aGlzLCBhbmQgZXh0ZXJuYWxpemVkIHBhY2thZ2VzIChSZWFjdCBmb3IgUGFnZXMgUm91dGVyXG4gIC8vIFNTUiwgYW55dGhpbmcgaW4gYHNlcnZlckV4dGVybmFsUGFja2FnZXNgKSBwaWNrIHRoZWlyIGRldiBvciBwcm9kIGJ1aWxkIGZyb21cbiAgLy8gaXQgYXQgcmVxdWlyZSB0aW1lLiBUaGUgQ29udGFpbmVycyBEb2NrZXJmaWxlcyBzZXQgaXQgYW5kIHRoZSBGdW5jdGlvbnNcbiAgLy8gY29uc3RydWN0cyBkbyB0b287IHRoaXMgY292ZXJzIGEgaGFuZC13aXJlZCBmdW5jdGlvbi4gQmVmb3JlIGFueSBgcmVxdWlyZWAuXG4gIC8vIChgbmV4dGAncyB0eXBpbmdzIGRlY2xhcmUgTk9ERV9FTlYgcmVhZC1vbmx5LilcbiAgKHByb2Nlc3MuZW52IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pLk5PREVfRU5WID8/PSBcInByb2R1Y3Rpb25cIjtcbiAgcHJvY2Vzcy5jaGRpcihwcm9qZWN0RGlyKTtcbiAgLy8gQmVmb3JlIGFueXRoaW5nIGNhbiBzZXJ2ZSBhIHJlcXVlc3Q6IHRoZSBydW50aW1lJ3Mgb3duIGBuZXh0YCBpbXBvcnRzIHJlc29sdmVcbiAgLy8gb3V0IG9mIHRoZSBzdGFnZWQgYXBwLCBub3Qgb3V0IG9mIHRoZSBzaGVsbCdzIGRpcmVjdG9yeS4gU2VlIGBuZXh0LW1vZHVsZXMudHNgLlxuICB1c2VOZXh0RnJvbShwcm9qZWN0RGlyKTtcbiAgLy8gQmVmb3JlIGFueSBlbnRyeXBvaW50IGNhbiByZWFkIHRoZW0gYXQgbW9kdWxlIHNjb3BlLlxuICBsb2FkRW52RmlsZXMocHJvamVjdERpcik7XG4gIC8vIFRoZW4sIGJlZm9yZSBhbnkgZW50cnlwb2ludCAob3IgbWlkZGxld2FyZSkgY2FuIGJlIGxvYWRlZDogTmV4dCdzIG93blxuICAvLyBub2RlLWVudmlyb25tZW50IGJvb3RzdHJhcC4gU2VlIGBzZXR1cE5vZGVFbnZpcm9ubWVudGAuXG4gIHNldHVwTm9kZUVudmlyb25tZW50KCk7XG4gIC8vIEFuZCBsYXN0LCBvbmNlIHRoZSBlbnZpcm9ubWVudCBpcyByZWFkeTogYHJlZ2lzdGVyKClgLCBiZWZvcmUgYW55IGVudHJ5cG9pbnRcbiAgLy8gb3IgbWlkZGxld2FyZSBtb2R1bGUgaXMgZXZhbHVhdGVkLiBTZWUgYHJlZ2lzdGVySW5zdHJ1bWVudGF0aW9uYC5cbiAgYXdhaXQgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb24ocHJvamVjdERpciwgbWFuaWZlc3QuY29uZmlnLmRpc3REaXIpO1xuXG4gIHJldHVybiBuZXcgTmV4dGpzUnVudGltZSh7XG4gICAgZGVwbG95bWVudFJvb3QsXG4gICAgbWFuaWZlc3QsXG4gICAgYnVja2V0OiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfQlVDS0VUX05BTUUsXG4gICAgYnVja2V0S2V5UHJlZml4OiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWCxcbiAgfSk7XG59XG5cbi8qKlxuICogQSBzeW50YWN0aWNhbGx5IHZhbGlkIGBob3N0Wzpwb3J0XWA6IGEgcmVnaXN0ZXJlZCBuYW1lIG9yIGEgYnJhY2tldGVkIElQdjZcbiAqIGxpdGVyYWwsIG9wdGlvbmFsbHkgd2l0aCBhIHBvcnQuIEFueXRoaW5nIGVsc2UgY2Fubm90IGJlIHRoZSBhdXRob3JpdHkgb2YgYVxuICogVVJMLlxuICovXG5jb25zdCBIT1NUX0FVVEhPUklUWSA9IC9eKD86XFxbWzAtOUEtRmEtZjouXStcXF18WzAtOUEtWmEtei5fLV0rKSg/OjpcXGR7MSw1fSk/JC87XG5cbi8qKlxuICogVGhlIGZpcnN0IHZhbHVlIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIGFzIGFuIGF1dGhvcml0eSwgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogYHgtZm9yd2FyZGVkLWhvc3RgIGNhbiBhcnJpdmUgYXMgYSBsaXN0IHdoZW4gbW9yZSB0aGFuIG9uZSBwcm94eSBhcHBlbmRzIHRvXG4gKiBpdC4gVmFsaWRhdGluZyBpcyB3aGF0IGtlZXBzIGEgbWFsZm9ybWVkIHZhbHVlIGZyb20gbWFraW5nIHRoZSBgVVJMYFxuICogY29uc3RydWN0b3IgdGhyb3cg4oCUIHdoaWNoIG9uIHRoZSBMYW1iZGEgc2hlbGxzIGlzIGFuIGludm9jYXRpb24gZXJyb3IgYW5kIGFcbiAqIDUwMiwgbm90IGEgcmVzcG9uc2UuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkQXV0aG9yaXR5KFxuICB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGUgPSBmaXJzdFZhbHVlKHZhbHVlKT8uc3BsaXQoXCIsXCIpWzBdLnRyaW0oKTtcbiAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBIT1NUX0FVVEhPUklUWS50ZXN0KGNhbmRpZGF0ZSkgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogYHJlc29sdmVSb3V0ZXNgIG5lZWRzIGFuIGFic29sdXRlIFVSTCwgYW5kIGl0IGJlY29tZXMgdGhlIG9yaWdpbiBldmVyeVxuICogYWJzb2x1dGUgVVJMIHRoZSBhcHAgYnVpbGRzIHN0YXJ0cyB3aXRoIOKAlCBgcmVxLm5leHRVcmwub3JpZ2luYCBpbiBtaWRkbGV3YXJlLFxuICogYGluaXRVUkxgIGZvciBhIHJvdXRlIGhhbmRsZXIg4oCUIHNvIGl0cyBob3N0IGhhcyB0byBiZSBvbmUgdGhlIGNsaWVudCBjYW5ub3RcbiAqIHBpY2suXG4gKlxuICogVGhhdCBpcyBgSG9zdGAgb24gZXZlcnkgZGVwbG95bWVudCBidXQgb25lOiBDbG91ZEZyb250IGZvcndhcmRzIHRoZSB2aWV3ZXInc1xuICogYEhvc3RgIHRvIGEgY29udGFpbmVyIG9yaWdpbiAoYEFMTF9WSUVXRVJgKSwgYW4gQUxCIHBhc3NlcyBpdCB0aHJvdWdoLCBhbmQgQVBJXG4gKiBHYXRld2F5IHNldHMgaXRzIG93biBkb21haW4uIFRoZSBleGNlcHRpb24gaXMgYSBMYW1iZGEgRnVuY3Rpb24gVVJMLCB3aGVyZVxuICogQ2xvdWRGcm9udCBoYXMgdG8gc2VuZCB0aGUgVVJMJ3Mgb3duIGRvbWFpbiBhcyBgSG9zdGAgYW5kIHB1dHMgdGhlIHZpZXdlcidzIGluXG4gKiBgeC1mb3J3YXJkZWQtaG9zdGA7IHNlZSB7QGxpbmsgUnVudGltZVJlcXVlc3QudHJ1c3RGb3J3YXJkZWRIb3N0fS4gQW55d2hlcmVcbiAqIGVsc2UgdGhlIGhlYWRlciBpcyB0aGUgY2xpZW50J3MsIGFuZCBob25vcmluZyBpdCBsZXQgYSByZXF1ZXN0IHdpdGhcbiAqIGBYLUZvcndhcmRlZC1Ib3N0OiBldmlsLmV4YW1wbGVgIHBvaW50IGEgcGFzc3dvcmQtcmVzZXQgbGluayBhdCBldmlsLmV4YW1wbGUg4oCUXG4gKiBhbmQsIG9uIEdsb2JhbCBDb250YWluZXJzLCBoYXZlIENsb3VkRnJvbnQgY2FjaGUgdGhhdCBwYWdlLCBzaW5jZSB0aGUgaGVhZGVyXG4gKiBpcyBub3QgaW4gaXRzIGNhY2hlIGtleS5cbiAqL1xuZnVuY3Rpb24gYWJzb2x1dGVVcmwocmVxdWVzdDogUnVudGltZVJlcXVlc3QpOiBVUkwge1xuICBjb25zdCBob3N0ID1cbiAgICAocmVxdWVzdC50cnVzdEZvcndhcmRlZEhvc3RcbiAgICAgID8gdmFsaWRBdXRob3JpdHkocmVxdWVzdC5oZWFkZXJzW1wieC1mb3J3YXJkZWQtaG9zdFwiXSlcbiAgICAgIDogdW5kZWZpbmVkKSA/P1xuICAgIHZhbGlkQXV0aG9yaXR5KHJlcXVlc3QuaGVhZGVycy5ob3N0KSA/P1xuICAgIFwibG9jYWxob3N0XCI7XG4gIC8vIEJlaGluZCBDbG91ZEZyb250IG9uIEdsb2JhbCBDb250YWluZXJzIHRoZSBjb250YWluZXIgc2hlbGwgaGFzIGFscmVhZHkgcHV0XG4gIC8vIHRoZSB2aWV3ZXIncyBwcm90b2NvbCBoZXJlOyBzZWUgYHRydXN0Q2xvdWRGcm9udFByb3RvYCBpbiBodHRwL25vZGUtc2VydmVyLnRzLlxuICBjb25zdCBmb3J3YXJkZWRQcm90byA9IGZpcnN0VmFsdWUocmVxdWVzdC5oZWFkZXJzW1wieC1mb3J3YXJkZWQtcHJvdG9cIl0pXG4gICAgPy5zcGxpdChcIixcIilbMF1cbiAgICAudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG4gIC8vIENsaWVudC1zdXBwbGllZCB3aGVyZSBubyBwcm94eSBvdmVyd3JpdGVzIGl0LCBidXQgaGFybWxlc3M6IHRoZSBob3N0IGlzXG4gIC8vIGFscmVhZHkgZml4ZWQsIGFuZCBhbnl0aGluZyBidXQgdGhlc2UgdHdvIHdvdWxkIG5vdCBwYXJzZS5cbiAgY29uc3QgcHJvdG8gPVxuICAgIGZvcndhcmRlZFByb3RvID09PSBcImh0dHBcIiB8fCBmb3J3YXJkZWRQcm90byA9PT0gXCJodHRwc1wiXG4gICAgICA/IGZvcndhcmRlZFByb3RvXG4gICAgICA6IHJlcXVlc3QuZW5jcnlwdGVkID09PSBmYWxzZVxuICAgICAgICA/IFwiaHR0cFwiXG4gICAgICAgIDogXCJodHRwc1wiO1xuICByZXR1cm4gbmV3IFVSTChyZXF1ZXN0LnVybCwgYCR7cHJvdG99Oi8vJHtob3N0fWApO1xufVxuXG5mdW5jdGlvbiBwaWNrRGVmaW5lZChcbiAgaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycyxcbiAgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogSW5jb21pbmdIdHRwSGVhZGVycyB7XG4gIGNvbnN0IHBpY2tlZDogSW5jb21pbmdIdHRwSGVhZGVycyA9IHt9O1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoaGVhZGVyc1tuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwaWNrZWRbbmFtZV0gPSBoZWFkZXJzW25hbWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGlja2VkO1xufVxuXG4vKipcbiAqIGBub3JtYWxpemVSZXBlYXRlZFNsYXNoZXNgIChgbmV4dC9kaXN0L3NoYXJlZC9saWIvdXRpbHMuanNgKSwgYXBwbGllZCB3aGVyZVxuICogTmV4dC5qcyBhcHBsaWVzIGl0OiBiZWZvcmUgcm91dGluZywgYXMgYSAzMDggdG8gdGhlIGNvbGxhcHNlZCBwYXRoLlxuICogYGJhc2Utc2VydmVyLnRzYCBkb2VzIGBpZiAodXJsTm9RdWVyeT8ubWF0Y2goLyhcXFxcfFxcL1xcLykvKSlcbiAqIHJlcy5yZWRpcmVjdChub3JtYWxpemVSZXBlYXRlZFNsYXNoZXMocmVxLnVybCksIDMwOClgLCBzbyBgL2EvL2JgIGFuZCBgL2FcXGJgXG4gKiBib3RoIGFuc3dlciBhIHJlZGlyZWN0IHRvIGAvYS9iYCByYXRoZXIgdGhhbiBhIDQwNCAtIGFuZCBgQG5leHQvcm91dGluZ2Anc1xuICogYHJlc29sdmVSb3V0ZXNgIGRvZXMgbm90IGRvIGl0IGZvciB1cywgd2hpY2ggaXMgaG93IGAvL2AgcmVhY2hlZCB0aGlzIHJ1bnRpbWUgYXNcbiAqIGEgNTAwIGFuZCBgL2FwaS8vanNvbmAgYXMgYSA0MDQuXG4gKlxuICogRW5jb2RlZCBiYWNrc2xhc2hlcyBhcmUgbGVmdCBhbG9uZSwgYXMgTmV4dC5qcyBsZWF2ZXMgdGhlbTogYCU1Q2AgaXMgYSBsaXRlcmFsXG4gKiBjaGFyYWN0ZXIgaW4gYSBwYXRoIHNlZ21lbnQsIG5vdCBhIHNlcGFyYXRvci5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBjb2xsYXBzZSwgd2hpY2ggaXMgdGhlIGNvbW1vbiBjYXNlLlxuICovXG5mdW5jdGlvbiBjb2xsYXBzZVJlcGVhdGVkU2xhc2hlcyh0YXJnZXQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnRzID0gdGFyZ2V0LnNwbGl0KFwiP1wiKTtcbiAgY29uc3QgcGF0aG5hbWUgPSBwYXJ0c1swXTtcbiAgaWYgKCEvXFxcXHxcXC9cXC8vLnRlc3QocGF0aG5hbWUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBxdWVyeSA9IHBhcnRzLmxlbmd0aCA+IDEgPyBgPyR7cGFydHMuc2xpY2UoMSkuam9pbihcIj9cIil9YCA6IFwiXCI7XG4gIHJldHVybiBwYXRobmFtZS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKS5yZXBsYWNlKC9cXC9cXC8rL2csIFwiL1wiKSArIHF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0Qm9keSB7XG4gIC8qKiBXaGF0IGByZXFgIHJlYWRzOiB0aGUgZW50cnlwb2ludCdzIGNvcHkuICovXG4gIHJlYWRvbmx5IGZvclJlcXVlc3Q/OiBSZWFkYWJsZSB8IEJ1ZmZlcjtcbiAgLyoqIFdoYXQgYHJlc29sdmVSb3V0ZXNgIGhhbmRzIG1pZGRsZXdhcmUuICovXG4gIHJlYWRvbmx5IGZvckRpc3BhdGNoOiBSZWFkYWJsZVN0cmVhbTtcbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIGRpc3BhdGNoIGhhcyByZXR1cm5lZCwgd2l0aCB3aGV0aGVyIG1pZGRsZXdhcmUgYW5zd2VyZWQgdGhlXG4gICAqIHJlcXVlc3QgaXRzZWxmLiBMZXRzIGdvIG9mIHdoaWNoZXZlciBjb3B5IG5vdGhpbmcgd2lsbCByZWFkIGFueSBtb3JlLlxuICAgKi9cbiAgcmVsZWFzZVVucmVhZChtaWRkbGV3YXJlUmVzcG9uZGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuLyoqXG4gKiBgcmVzb2x2ZVJvdXRlc2AgaGFuZHMgYHJlcXVlc3RCb2R5YCB0byBtaWRkbGV3YXJlLCB3aGljaCBjb25zdW1lcyBpdCwgd2hpbGUgdGhlXG4gKiBlbnRyeXBvaW50IG5lZWRzIHRoZSBzYW1lIGJ5dGVzIOKAlCB0aGUgc2FtZSBwcm9ibGVtIGBuZXh0LXNlcnZlcmAgc29sdmVzIHdpdGhcbiAqIGBnZXRDbG9uZWFibGVCb2R5KClgLiBPbmx5IHNwbGl0IHdoZW4gdGhlcmUgaXMgbWlkZGxld2FyZSB0byBmZWVkOiB0ZWVpbmcgY29zdHNcbiAqIGEgYnVmZmVyIGNvcHkgb2YgZXZlcnkgdXBsb2FkIG9uIGEgcGF0aCB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBhIHN0cmFpZ2h0IHBpcGUuXG4gKlxuICogQSBgdGVlKClgIGJ1ZmZlcnMsIGZvciB0aGUgYnJhbmNoIHRoYXQgaXMgYmVoaW5kLCBldmVyeSBjaHVuayB0aGUgb3RoZXIgb25lXG4gKiBoYXMgcmVhZCDigJQgc28gYSBicmFuY2ggdGhhdCBpcyBuZXZlciByZWFkIGhvbGRzIHRoZSB3aG9sZSBib2R5LiBNaWRkbGV3YXJlXG4gKiB0aGF0IGRvZXNuJ3QgcmVhZCB0aGUgYm9keSBpcyB0aGUgY29tbW9uIGNhc2UgKGFuZCBpdHMgbWF0Y2hlciBtYXkgbm90IGV2ZW5cbiAqIGhhdmUgcnVuIGl0KSwgYWZ0ZXIgd2hpY2ggdGhlIGVudHJ5cG9pbnQgc3RyZWFtaW5nIGFuIHVwbG9hZCB3b3VsZCBwaWxlIGFsbFxuICogb2YgaXQgdXAgaW4gdGhlIG1pZGRsZXdhcmUgYnJhbmNoOiB0aGUgd2hvbGUgdXBsb2FkIGluIG1lbW9yeSwgb24gYVxuICogY29udGFpbmVyIHRoYXQgc2VydmVzIG90aGVyIHJlcXVlc3RzLiBTbyBvbmNlIGRpc3BhdGNoIHJldHVybnMsIHRoZSBicmFuY2hcbiAqIHdpdGggbm8gcmVhZGVyIGxlZnQgaXMgY2FuY2VsbGVkIOKAlCB0aGUgbWlkZGxld2FyZSBvbmUsIG9yIHRoZSBlbnRyeXBvaW50IG9uZVxuICogd2hlbiBtaWRkbGV3YXJlIGFuc3dlcmVkIGFuZCBgcmVxYCB3aWxsIG5ldmVyIGJlIHJlYWQuIENhbmNlbGxpbmcgb25lXG4gKiBicmFuY2ggbGVhdmVzIHRoZSBzb3VyY2UgYW5kIHRoZSBvdGhlciBicmFuY2ggcnVubmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0Qm9keShcbiAgYm9keTogUmVhZGFibGUgfCBCdWZmZXIgfCB1bmRlZmluZWQsXG4gIGhhc01pZGRsZXdhcmU6IGJvb2xlYW4sXG4pOiBTcGxpdEJvZHkge1xuICBjb25zdCByZWxlYXNlTm90aGluZyA9ICgpOiB2b2lkID0+IHt9O1xuICBpZiAoYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvckRpc3BhdGNoOiBuZXcgQmxvYihbXSkuc3RyZWFtKCksXG4gICAgICByZWxlYXNlVW5yZWFkOiByZWxlYXNlTm90aGluZyxcbiAgICB9O1xuICB9XG4gIGlmICghaGFzTWlkZGxld2FyZSkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JSZXF1ZXN0OiBib2R5LFxuICAgICAgZm9yRGlzcGF0Y2g6IG5ldyBCbG9iKFtdKS5zdHJlYW0oKSxcbiAgICAgIHJlbGVhc2VVbnJlYWQ6IHJlbGVhc2VOb3RoaW5nLFxuICAgIH07XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuICAgIC8vIEFscmVhZHkgZnVsbHkgaW4gbWVtb3J5LCBzbyBcInRlZWluZ1wiIGlzIGp1c3QgcmVhZGluZyBpdCB0d2ljZS5cbiAgICByZXR1cm4ge1xuICAgICAgZm9yUmVxdWVzdDogYm9keSxcbiAgICAgIGZvckRpc3BhdGNoOiBuZXcgQmxvYihbYm9keV0pLnN0cmVhbSgpLFxuICAgICAgcmVsZWFzZVVucmVhZDogcmVsZWFzZU5vdGhpbmcsXG4gICAgfTtcbiAgfVxuICBjb25zdCBbZm9yTWlkZGxld2FyZSwgZm9yRW50cnlwb2ludF0gPSBSZWFkYWJsZS50b1dlYihib2R5KS50ZWUoKTtcbiAgY29uc3QgZm9yUmVxdWVzdCA9IFJlYWRhYmxlLmZyb21XZWIoZm9yRW50cnlwb2ludCBhcyBuZXZlcik7XG4gIHJldHVybiB7XG4gICAgZm9yUmVxdWVzdCxcbiAgICBmb3JEaXNwYXRjaDogZm9yTWlkZGxld2FyZSBhcyBSZWFkYWJsZVN0cmVhbSxcbiAgICByZWxlYXNlVW5yZWFkKG1pZGRsZXdhcmVSZXNwb25kZWQpIHtcbiAgICAgIGlmIChtaWRkbGV3YXJlUmVzcG9uZGVkKSB7XG4gICAgICAgIC8vIGBmcm9tV2ViYCBob2xkcyB0aGUgYnJhbmNoJ3MgcmVhZGVyLCBzbyBpdCBpcyBkZXN0cm95ZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gY2FuY2VsbGVkOyBpdHMgYF9kZXN0cm95YCBjYW5jZWxzIHRoZSByZWFkZXIuXG4gICAgICAgIGZvclJlcXVlc3QuZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIGlmICghZm9yTWlkZGxld2FyZS5sb2NrZWQpIHtcbiAgICAgICAgLy8gTG9ja2VkIG1lYW5zIG1pZGRsZXdhcmUgdG9vayBhIHJlYWRlcjogaXQgaXMgcmVhZGluZywgb3IgaGFzIHJlYWQsXG4gICAgICAgIC8vIHRoZSBib2R5IGl0c2VsZiwgYW5kIGEgbG9ja2VkIHN0cmVhbSBjYW5ub3QgYmUgY2FuY2VsbGVkIGFueXdheS5cbiAgICAgICAgZm9yTWlkZGxld2FyZS5jYW5jZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIGBJbmNvbWluZ0h0dHBIZWFkZXJzYCDihpIgdGhlIGZsYXQgZW50cmllcyBhIGBIZWFkZXJzYCBjb25zdHJ1Y3RvciBhY2NlcHRzLiAqL1xuZnVuY3Rpb24gdG9XZWJIZWFkZXJzKGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnMpOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGVudHJpZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhoZWFkZXJzKSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzaW5nbGUgb2YgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pIHtcbiAgICAgIGVudHJpZXMucHVzaChbbmFtZSwgc2luZ2xlXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIGBoZWFkZXJzKClgIHJ1bGVzLCB0aGUgaW1tdXRhYmxlIGBjYWNoZS1jb250cm9sYCBmb3IgYnVpbGQgYXNzZXRzLCBhbmQgYW55dGhpbmdcbiAqIG1pZGRsZXdhcmUgc2V0IHdpdGggYE5leHRSZXNwb25zZS5uZXh0KHsgaGVhZGVycyB9KWAuIEFwcGxpZWQgYmVmb3JlIHRoZVxuICogZW50cnlwb2ludCBydW5zIHNvIHRoYXQgYSByb3V0ZSBjYW4gc3RpbGwgb3ZlcnJpZGUgaXRzIG93bi5cbiAqL1xuZnVuY3Rpb24gYXBwbHlIZWFkZXJzKHJlczogU2hpbVNlcnZlclJlc3BvbnNlLCBoZWFkZXJzOiBIZWFkZXJzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBoZWFkZXJzLmVudHJpZXMoKSkge1xuICAgIC8vIGBlbnRyaWVzKClgIHlpZWxkcyBgc2V0LWNvb2tpZWAgb25jZSBwZXIgY29va2llLCBzbyBhcHBlbmRpbmcgdGhlIHdob2xlXG4gICAgLy8gYGdldFNldENvb2tpZSgpYCBhcnJheSBoZXJlIHdvdWxkIGVtaXQgTsKyIG9mIHRoZW0g4oCUIHR3byBjb29raWVzIHNldCBieVxuICAgIC8vIG1pZGRsZXdhcmUgYXJyaXZlZCBhcyBbXCJhPTFcIixcImI9MlwiLFwiYT0xXCIsXCJiPTJcIl0uIEhhbmRsZWQgb25jZSwgb3V0c2lkZS5cbiAgICBpZiAobmFtZSA9PT0gXCJzZXQtY29va2llXCIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXMuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbiAgfVxuICBmb3IgKGNvbnN0IGNvb2tpZSBvZiBoZWFkZXJzLmdldFNldENvb2tpZSgpKSB7XG4gICAgcmVzLmFwcGVuZEhlYWRlcihcInNldC1jb29raWVcIiwgY29va2llKTtcbiAgfVxufVxuXG4vKipcbiAqIE1pcnJvcnMgTmV4dC5qcydzIG93biByZWRpcmVjdCByZXNwb25zZSAoYGJhc2Utc2VydmVyLnRzYCk6IHRoZSBkZXN0aW5hdGlvbiBpc1xuICogYWxzbyB0aGUgYm9keSwgYW5kIGEgMzA4IGNhcnJpZXMgYSBgUmVmcmVzaGAgaGVhZGVyIGJlY2F1c2Ugc29tZSBjbGllbnRzIGFuZFxuICogaW50ZXJtZWRpYXJpZXMgc3RpbGwgZG8gbm90IGltcGxlbWVudCAzMDguXG4gKi9cbmZ1bmN0aW9uIHNlbmRSZWRpcmVjdChcbiAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gIGxvY2F0aW9uOiBzdHJpbmcsXG4gIHN0YXR1czogbnVtYmVyLFxuKTogdm9pZCB7XG4gIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzO1xuICByZXMuc2V0SGVhZGVyKFwiTG9jYXRpb25cIiwgbG9jYXRpb24pO1xuICBpZiAoc3RhdHVzID09PSAzMDgpIHtcbiAgICByZXMuc2V0SGVhZGVyKFwiUmVmcmVzaFwiLCBgMDt1cmw9JHtsb2NhdGlvbn1gKTtcbiAgfVxuICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgcmVzLmVuZChsb2NhdGlvbik7XG59XG5cbi8qKlxuICogYG5leHQgc3RhcnRgJ3MgYW5zd2VyIHRvIGEgUE9TVCwgUFVUIG9yIERFTEVURSBmb3IgYSBzdGF0aWMgZmlsZTogNDA1IHdpdGhcbiAqIGBBbGxvdzogR0VULCBIRUFEYCAoYHJvdXRlci1zZXJ2ZXIuanNgKS4gSXQgcmVuZGVycyB0aGF0IHRocm91Z2ggYC9fZXJyb3JgO1xuICogdGhpcyBpcyB0aGUgcGxhaW4tdGV4dCBlcXVpdmFsZW50LCBzaW5jZSB0aGUgc3RhdHVzIGFuZCBgQWxsb3dgIGFyZSB3aGF0IGFcbiAqIGNsaWVudCBhY3RzIG9uLlxuICovXG5mdW5jdGlvbiBzZW5kTWV0aG9kTm90QWxsb3dlZChyZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSk6IHZvaWQge1xuICByZXMuc3RhdHVzQ29kZSA9IDQwNTtcbiAgcmVzLnNldEhlYWRlcihcIkFsbG93XCIsIFwiR0VULCBIRUFEXCIpO1xuICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgcmVzLmVuZChcIk1ldGhvZCBOb3QgQWxsb3dlZFwiKTtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGhlYWRlcnMge0BsaW5rIHByb3h5RXh0ZXJuYWx9IGRvZXMgbm90IGZvcndhcmQuIFRoZSB1cHN0cmVhbSdzIG93blxuICogYEhvc3RgIG11c3Qgd2luOyB0aGUgcmVzdCBkZXNjcmliZSBvdXIgY29ubmVjdGlvbiwgbm90IHRoZSBwcm94aWVkIG9uZSwgYW5kXG4gKiB1bmRpY2kgdGhyb3dzIG9uIG1vc3Qgb2YgdGhlbSwgd2hpY2ggd291bGQgYW5zd2VyIHRoZSByZXF1ZXN0IHdpdGggYSA1MDAuXG4gKiBOZXh0LmpzJ3MgbGlzdCBmb3IgdGhlIHJlcXVlc3RzIGl0IG1ha2VzIHdpdGggdW5kaWNpIChgaXBjRm9yYmlkZGVuSGVhZGVyc2AsXG4gKiBgbmV4dC9kaXN0L3NlcnZlci9saWIvc2VydmVyLWlwYy91dGlscy5qc2ApLCBwbHVzIGBob3N0YCBhbmQgYHVwZ3JhZGVgLCBtaW51c1xuICogYGNvbnRlbnQtZW5jb2RpbmdgOiBOZXh0IHN0cmlwcyB0aGF0IG92ZXIgYSBib2R5IGl0IGhhcyBhbHJlYWR5IGRlY29kZWQsIHdoaWxlXG4gKiB0aGlzIG9uZSBpcyBmb3J3YXJkZWQgYXMgcmVjZWl2ZWQsIHN0aWxsIGVuY29kZWQuXG4gKi9cbmNvbnN0IFBST1hZX0RST1BQRURfSEVBREVSUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIFwiaG9zdFwiLFxuICBcInVwZ3JhZGVcIixcbiAgXCJhY2NlcHQtZW5jb2RpbmdcIixcbiAgXCJrZWVwYWxpdmVcIixcbiAgXCJrZWVwLWFsaXZlXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbiAgXCJjb25uZWN0aW9uXCIsXG4gIFwiZXhwZWN0XCIsXG5dO1xuXG4vKipcbiAqIFRoZSBTaWdWNCBzaWduYXR1cmUgT3JpZ2luIEFjY2VzcyBDb250cm9sIHB1dCBvbiBhIHJlcXVlc3QgdG8gdGhlIEZ1bmN0aW9uXG4gKiBVUkwsIGFsc28gZHJvcHBlZCBieSB7QGxpbmsgcHJveHlFeHRlcm5hbH0gd2hlbiB0aGUgcmVxdWVzdCB3YXMgSUFNLXZlcmlmaWVkOlxuICogZm9yd2FyZGVkLCBpdCB3b3VsZCBsZXQgdGhlIHRoaXJkLXBhcnR5IG9yaWdpbiByZXBsYXkgdGhlIHJlcXVlc3QgYWdhaW5zdFxuICogdGhlIEZ1bmN0aW9uIFVSTC4gQW55d2hlcmUgZWxzZSB0aGVzZSBhcmUgdGhlIGNsaWVudCdzIG93biwgYW5kIGFyZVxuICogZm9yd2FyZGVkIGFzIGBuZXh0IHN0YXJ0YCBmb3J3YXJkcyB0aGVtLlxuICovXG5jb25zdCBTSUdWNF9IRUFERVJTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgXCJhdXRob3JpemF0aW9uXCIsXG4gIFwieC1hbXotZGF0ZVwiLFxuICBcIngtYW16LWNvbnRlbnQtc2hhMjU2XCIsXG4gIFwieC1hbXotc2VjdXJpdHktdG9rZW5cIixcbl07XG5cbi8qKiBBIGBuZXh0LmNvbmZpZ2AgcmV3cml0ZSB3aG9zZSBkZXN0aW5hdGlvbiBpcyBhbm90aGVyIG9yaWdpbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb3h5RXh0ZXJuYWwoXG4gIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gIHVybDogVVJMLFxuICByZXF1ZXN0SGVhZGVyczogSGVhZGVycyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtZXRob2QgPSByZXEubWV0aG9kID8/IFwiR0VUXCI7XG4gIGNvbnN0IGhhc0JvZHkgPSBtZXRob2QgIT09IFwiR0VUXCIgJiYgbWV0aG9kICE9PSBcIkhFQURcIjtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlcXVlc3RIZWFkZXJzKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIFBST1hZX0RST1BQRURfSEVBREVSUykge1xuICAgIGhlYWRlcnMuZGVsZXRlKG5hbWUpO1xuICB9XG4gIGlmIChyZXEudHJ1c3RGb3J3YXJkZWRIb3N0KSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIFNJR1Y0X0hFQURFUlMpIHtcbiAgICAgIGhlYWRlcnMuZGVsZXRlKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zdCB1cHN0cmVhbSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICAgIGJvZHk6IGhhc0JvZHkgPyAoUmVhZGFibGUudG9XZWIocmVxKSBhcyBSZWFkYWJsZVN0cmVhbSkgOiB1bmRlZmluZWQsXG4gICAgcmVkaXJlY3Q6IFwibWFudWFsXCIsXG4gICAgLi4uKGhhc0JvZHkgPyB7IGR1cGxleDogXCJoYWxmXCIgfSA6IHt9KSxcbiAgfSBhcyBSZXF1ZXN0SW5pdCk7XG4gIGF3YWl0IHNlbmRXZWJSZXNwb25zZShyZXMsIHVwc3RyZWFtKTtcbn1cblxuLyoqXG4gKiBIZWFkZXJzIGRlc2NyaWJpbmcgdGhlIGZyYW1pbmcgb2YgYSBib2R5IHRoYXQgaXMgbm8gbG9uZ2VyIHRoZSBib2R5IGJlaW5nXG4gKiBzZW50LCBkcm9wcGVkIGZyb20gZXZlcnkgYFJlc3BvbnNlYCB7QGxpbmsgc2VuZFdlYlJlc3BvbnNlfSBmb3J3YXJkcy5cbiAqXG4gKiBBIHByb3hpZWQgb3JpZ2luJ3MgYFJlc3BvbnNlYCBjYW1lIGJhY2sgZnJvbSBgZmV0Y2hgLCBhbmQgc28sIG9mdGVuLCBkaWRcbiAqIG1pZGRsZXdhcmUncyBvd24gKGByZXR1cm4gZmV0Y2godXBzdHJlYW0pYCBpbiBgcHJveHkudHNgLCBzaW5jZSBtaWRkbGV3YXJlXG4gKiBydW5zIGluIHByb2Nlc3MgYW5kIGl0cyBgZmV0Y2hgIGlzIHVuZGljaSkuIHVuZGljaSBkZWNvZGVzIHRoZSBib2R5IOKAlCBnemlwLFxuICogZGVmbGF0ZSwgYnIsIHpzdGQg4oCUIGFuZCBsZWF2ZXMgYGNvbnRlbnQtZW5jb2RpbmdgIGFuZCBgY29udGVudC1sZW5ndGhgXG4gKiBkZXNjcmliaW5nIHRoZSBlbmNvZGVkIGJ5dGVzIGl0IGFscmVhZHkgdGhyZXcgYXdheS4gRm9yd2FyZGluZyB0aGVtIGVtaXRzXG4gKiBwbGFpbnRleHQgbGFiZWxsZWQgYGd6aXBgICh0aGUgYnJvd3NlciBmYWlscyB0aGUgd2hvbGUgcmVzcG9uc2Ugd2l0aFxuICogYEVSUl9DT05URU5UX0RFQ09ESU5HX0ZBSUxFRGApIHVuZGVyIGEgYENvbnRlbnQtTGVuZ3RoYCB0aGF0IGlzIHRvbyBzaG9ydCxcbiAqIGFuZCBgc2hvdWxkR3ppcGAgdGhlbiBkZWNsaW5lcyB0byBjb21wcmVzcyBpdCBiZWNhdXNlIGBjb250ZW50LWVuY29kaW5nYCBpc1xuICogYWxyZWFkeSBzZXQsIHNvIG5vdGhpbmcgZG93bnN0cmVhbSByZXBhaXJzIGl0LiBgdHJhbnNmZXItZW5jb2RpbmdgIGlzXG4gKiBob3AtYnktaG9wOiBpdCBkZXNjcmliZWQgdGhlIHVwc3RyZWFtIGNvbm5lY3Rpb24sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBTdG9jayBOZXh0LmpzIGRyb3BzIHRoZSBzYW1lIHRocmVlIGZyb20gZXZlcnkgbWlkZGxld2FyZSByZXNwb25zZVxuICogKGBGT1JCSURERU5fSEVBREVSU2AgaW4gYG5leHQvZGlzdC9zZXJ2ZXIvd2ViL3NhbmRib3gvc2FuZGJveC5qc2ApLCBzb1xuICogbWlkZGxld2FyZSBjYW5ub3QgbGFiZWwgYSBib2R5IGl0IGVuY29kZWQgaXRzZWxmIHRoZXJlIGVpdGhlci5cbiAqL1xuY29uc3QgU1RBTEVfRlJBTUlOR19IRUFERVJTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwiY29udGVudC1lbmNvZGluZ1wiLFxuICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbl0pO1xuXG4vKiogU3RyZWFtIGEgYFJlc3BvbnNlYCDigJQgbWlkZGxld2FyZSdzIG93biwgb3IgYSBwcm94aWVkIG9yaWdpbidzIOKAlCBpbnRvIGByZXNgLiAqL1xuYXN5bmMgZnVuY3Rpb24gc2VuZFdlYlJlc3BvbnNlKFxuICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJlcy5zdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzVGV4dCkge1xuICAgIHJlcy5zdGF0dXNNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgfVxuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBTVEFMRV9GUkFNSU5HX0hFQURFUlMpIHtcbiAgICBoZWFkZXJzLmRlbGV0ZShuYW1lKTtcbiAgfVxuICBhcHBseUhlYWRlcnMocmVzLCBoZWFkZXJzKTtcbiAgaWYgKCFyZXNwb25zZS5ib2R5KSB7XG4gICAgcmVzLmVuZCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlc3BvbnNlLmJvZHkgYXMgdW5rbm93biBhcyBBc3luY0l0ZXJhYmxlPFVpbnQ4QXJyYXk+KSB7XG4gICAgLy8gTGVhdmluZyB0aGUgbG9vcCBjYW5jZWxzIHRoZSBib2R5LCB3aGljaCBpcyB3aGF0IHN0b3BzIGEgcHJveGllZCBvcmlnaW5cbiAgICAvLyBmcm9tIGJlaW5nIHJlYWQgdG8gdGhlIGVuZCBmb3IgYSBjbGllbnQgdGhhdCBoYXMgYWxyZWFkeSBnb25lLlxuICAgIGlmIChyZXMuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFBhY2VkIGJ5IHRoZSBjbGllbnQ6IHdpdGhvdXQgd2FpdGluZyBmb3IgYGRyYWluYCwgYSBsYXJnZSBwcm94aWVkIGJvZHlcbiAgICAvLyBoZWFkZWQgZm9yIGEgc2xvdyBjbGllbnQgaXMgYnVmZmVyZWQgd2hvbGUgaW4gbWVtb3J5LlxuICAgIC8vIE5vIGZsdXNoIG5lZWRlZCB3aGVuIHRoZSBzaW5rIGNvbXByZXNzZXM6IGl0cyBnemlwIHN0YWdlIHN5bmMtZmx1c2hlc1xuICAgIC8vIGV2ZXJ5IGNodW5rLCBzbyBhIHN0cmVhbWVkIGJvZHkgKHNlcnZlci1zZW50IGV2ZW50cyB0aHJvdWdoIGEgcmV3cml0ZSwgYVxuICAgIC8vIG1pZGRsZXdhcmUgYFJlYWRhYmxlU3RyZWFtYCkgcmVhY2hlcyB0aGUgY2xpZW50IGNodW5rIGJ5IGNodW5rLlxuICAgIGNvbnN0IGFjY2VwdGVkID0gcmVzLndyaXRlKGNodW5rKTtcbiAgICBpZiAoIWFjY2VwdGVkICYmICEoYXdhaXQgZHJhaW5lZChyZXMpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICByZXMuZW5kKCk7XG59XG4iXX0=
|
|
@@ -32,12 +32,6 @@ export declare class ShimServerResponse extends Transform {
|
|
|
32
32
|
useChunkedEncodingByDefault: boolean;
|
|
33
33
|
/** Set by Next.js in a few places; never read by us. */
|
|
34
34
|
req?: unknown;
|
|
35
|
-
/**
|
|
36
|
-
* Installed by the runtime core when it inserts gzip, so that Next.js's
|
|
37
|
-
* per-chunk `if ("flush" in res) res.flush()` actually reaches the
|
|
38
|
-
* compressor. Without it, streamed HTML sits in zlib's buffer.
|
|
39
|
-
*/
|
|
40
|
-
flush?: () => void;
|
|
41
35
|
/** Lowercased name → original casing + value, mirroring Node's own store. */
|
|
42
36
|
private readonly headerStore;
|
|
43
37
|
constructor();
|