@dbx-tools/appkit-mastra 0.9.118 → 0.9.120
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -108
- package/index.ts +3 -6
- package/lib/index.d.ts +3 -6
- package/lib/index.js +3 -5
- package/lib/src/agents.js +4 -5
- package/lib/src/chart.js +4 -4
- package/lib/src/chat.js +2 -2
- package/lib/src/config.d.ts +24 -19
- package/lib/src/config.js +6 -6
- package/lib/src/defaults.js +4 -4
- package/lib/src/genie.d.ts +3 -1
- package/lib/src/genie.js +18 -14
- package/lib/src/memory.d.ts +2 -22
- package/lib/src/memory.js +2 -32
- package/lib/src/mlflow.d.ts +3 -10
- package/lib/src/mlflow.js +6 -6
- package/lib/src/monty-sandbox.js +2 -2
- package/lib/src/plugin.d.ts +2 -19
- package/lib/src/plugin.js +14 -72
- package/lib/src/remote-skills.d.ts +32 -28
- package/lib/src/remote-skills.js +113 -33
- package/lib/src/server.js +2 -2
- package/lib/src/workspaces.d.ts +4 -7
- package/lib/src/workspaces.js +59 -56
- package/lib/src/writer.js +2 -2
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +16 -24
- package/src/agents.ts +3 -4
- package/src/chart.ts +3 -3
- package/src/chat.ts +1 -1
- package/src/config.ts +33 -24
- package/src/defaults.ts +3 -3
- package/src/genie.ts +18 -15
- package/src/memory.ts +2 -32
- package/src/mlflow.ts +7 -15
- package/src/monty-sandbox.ts +1 -1
- package/src/plugin.ts +15 -70
- package/src/remote-skills.ts +168 -42
- package/src/server.ts +1 -1
- package/src/workspaces.ts +62 -78
- package/src/writer.ts +1 -1
- package/lib/src/sandbox.d.ts +0 -107
- package/lib/src/sandbox.js +0 -461
- package/src/sandbox.ts +0 -556
package/lib/src/chart.js
CHANGED
|
@@ -436,7 +436,7 @@ async function writeChart(entry, userKey) {
|
|
|
436
436
|
catch (err) {
|
|
437
437
|
logger.warn("write-error", {
|
|
438
438
|
chartId: entry.chartId,
|
|
439
|
-
error: errorUtils.
|
|
439
|
+
error: errorUtils.toError(err),
|
|
440
440
|
});
|
|
441
441
|
}
|
|
442
442
|
}
|
|
@@ -454,7 +454,7 @@ async function readChart(chartId, userKey) {
|
|
|
454
454
|
catch (err) {
|
|
455
455
|
logger.warn("read-error", {
|
|
456
456
|
chartId,
|
|
457
|
-
error: errorUtils.
|
|
457
|
+
error: errorUtils.toError(err),
|
|
458
458
|
});
|
|
459
459
|
return undefined;
|
|
460
460
|
}
|
|
@@ -506,7 +506,7 @@ async function runPrepareChart(chartId, opts) {
|
|
|
506
506
|
});
|
|
507
507
|
}
|
|
508
508
|
catch (err) {
|
|
509
|
-
logger.warn("error", { chartId, error: errorUtils.
|
|
509
|
+
logger.warn("error", { chartId, error: errorUtils.toError(err) });
|
|
510
510
|
// The entry's `error` is rendered in the chat, so only an AppKitError's
|
|
511
511
|
// own message travels; anything else could carry upstream provider detail.
|
|
512
512
|
const errText = err instanceof AppKitError ? err.message : CHART_FAILED_MESSAGE;
|
|
@@ -1025,4 +1025,4 @@ export function buildRenderDataTool(config) {
|
|
|
1025
1025
|
},
|
|
1026
1026
|
});
|
|
1027
1027
|
}
|
|
1028
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxFQUNILE1BQU0sRUFDTixXQUFXLEdBRVosTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBZ0MsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUxQyw2RUFBNkU7QUFFN0U7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXBDLHNEQUFzRDtBQUN0RCxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztBQUU3QyxtRUFBbUU7QUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUM7QUFFeEMsdURBQXVEO0FBQ3ZELE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRXRDLG9FQUFvRTtBQUNwRSxNQUFN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QUM7WUFDckM7Ozs7Ozs7O09BUUM7WUFDRDs7Ozs7Ozs7OztPQVVDO1lBQ0Q7Ozs7O09BS0M7U0FDRixDQUFDO1FBQ0YsV0FBVyxFQUFFLHlCQUF5QjtRQUN0QyxZQUFZLEVBQUUscUJBQXFCO1FBQ25DLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9CLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQTRCLENBQUM7WUFDbEUsTUFBTSxHQUFHLEdBQUcsTUFBeUQsQ0FBQztZQUN0RSxPQUFPLFlBQVksQ0FBQztnQkFDbEIsTUFBTTtnQkFDTixPQUFPLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUM7Z0JBQzVDLEtBQUs7Z0JBQ0wsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3ZFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGFydCBwbGFubmVyICsgY2hhcnQgY2FjaGUuXG4gKlxuICogU2VsZi1jb250YWluZWQgY2hhcnQgc3Vic3lzdGVtIHdpdGggdHdvIGxheWVyczpcbiAqXG4gKiAgIDEuIElubmVyIHBsYW5uZXIgYWdlbnQgKHByaXZhdGUpLiBQdXJlIGRhdGFzZXQtaW4gL1xuICogICAgICBgRUNoYXJ0c09wdGlvbmAtb3V0IGJyYWluLiBEcml2ZW4gYnkge0BsaW5rIHByZXBhcmVDaGFydH07XG4gKiAgICAgIGNhbGxlcnMgbmV2ZXIgaW5zdGFudGlhdGUgaXQgZGlyZWN0bHkuXG4gKiAgIDIuIHtAbGluayBwcmVwYXJlQ2hhcnR9OiBvcmNoZXN0cmF0aW9uIG9uIHRvcCBvZiB0aGUgcGxhbm5lci5cbiAqICAgICAgTWludHMgYSBgY2hhcnRJZGAsIGNhY2hlcyBhbiBlbXB0eSBgeyBjaGFydElkIH1gIHJlY29yZFxuICogICAgICBzeW5jaHJvbm91c2x5LCB0aGVuIHJlc29sdmVzIHRoZSBkYXRhc2V0IGFuZCBydW5zIHRoZVxuICogICAgICBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGUgdGVybWluYWwgZW50cnkgc2V0dGxlcyB3aXRoXG4gKiAgICAgIGVpdGhlciBgcmVzdWx0YCAoc3VjY2Vzcykgb3IgYGVycm9yYCAoZmFpbHVyZSkuIEJvdGhcbiAqICAgICAgdW5kZWZpbmVkIG1lYW5zIHRoZSBlbnRyeSBpcyBzdGlsbCBwcm9jZXNzaW5nLlxuICpcbiAqIFRoZSBjYWNoZSBzdXJmYWNlICh7QGxpbmsgZmV0Y2hDaGFydH0pIGlzIHRoZSBvbmx5IHN0YXRlIHRoZVxuICogSFRUUCByb3V0ZSBhbmQgdGhlIGNoYXJ0LXByb2R1Y2luZyB0b29scyBzaGFyZS4gYHByZXBhcmVDaGFydGBcbiAqIGlzIGRhdGFzZXQtYWdub3N0aWMgLSBjYWxsZXJzIHN1cHBseSBhIGByZXNvbHZlRGF0YWAgY2FsbGJhY2tcbiAqIHRoYXQgZmV0Y2hlcyB0aGUgcm93cyBob3dldmVyIHRoZXkgbGlrZSAoR2VuaWUgc3RhdGVtZW50LCBpbmxpbmVcbiAqIGRhdGFzZXQsIGN1c3RvbSBBUEkpLiBUaGUgbW9kdWxlIGhhcyBubyBrbm93bGVkZ2Ugb2YgR2VuaWUgb3JcbiAqIHN0YXRlbWVudCBpZHM7IHRob3NlIGNvbmNlcm5zIGxpdmUgaW4gdGhlIHRvb2xzIHRoYXQgd3JhcCBpdC5cbiAqXG4gKiBXaXJlLWZvcm1hdCBzY2hlbWFzIGxpdmUgaW4gYEBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYWAgc29cbiAqIHRoZSBkZW1vIGNsaWVudCBhbmQgYW55IG90aGVyIFVJIGNvbnN1bWVyIHNoYXJlIHRoZSBleGFjdCBzYW1lXG4gKiBzaGFwZSB0aGlzIG1vZHVsZSByZWFkcyBhbmQgd3JpdGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBBcHBLaXRFcnJvciwgQ2FjaGVNYW5hZ2VyLCBFeGVjdXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGFzeW5jVXRpbHMsXG4gIGVycm9yVXRpbHMsXG4gIGhhc2gsXG4gIGpzb24sXG4gIGxvZyxcbiAgb2JqZWN0LFxuICBzdHJpbmdVdGlscyxcbiAgdHlwZSBCcmFuZENvbnRleHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBtYXJrZXJzLCB3aXJlLCB0eXBlIENoYXJ0LCB0eXBlIENoYXJ0UmVzdWx0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgcmVzb2x2ZVVzZXJLZXksIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBidWlsZE1vZGVsIH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9jaGFydFwiKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUVEwgZm9yIGNhY2hlZCBjaGFydCBlbnRyaWVzLiBPbmUgaG91ciBiYWxhbmNlcyBcImxvbmcgZW5vdWdoIGZvclxuICogdGhlIGhvc3QgVUkgdG8gZmV0Y2ggdGhlIGNoYXJ0IHdlbGwgYWZ0ZXIgdGhlIG1vZGVsIGZpbmlzaGVkXG4gKiB0YWxraW5nXCIgYWdhaW5zdCBcInNob3J0IGVub3VnaCB0aGF0IGFiYW5kb25lZCBjaGFydCBpZHMgZG9uJ3RcbiAqIHBpbiBzdG9yYWdlXCIuIE1hdGNoZXMgdGhlIHR5cGljYWwgRGF0YWJyaWNrcyBPQk8gdG9rZW4gbGlmZXRpbWVcbiAqIHNvIGFueSBkYXRhIHJlLXJlc29sdXRpb24gc3RheXMgaW5zaWRlIHRoZSBvcmlnaW5hbCBhdXRoIHdpbmRvdy5cbiAqL1xuY29uc3QgQ0hBUlRfQ0FDSEVfVFRMX1NFQyA9IDYwICogNjA7XG5cbi8qKiBDYWNoZSBuYW1lc3BhY2U7IGtlZXBzIHRoZSBjaGFydCBrZXlzcGFjZSB0aWR5LiAqL1xuY29uc3QgQ0hBUlRfQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6Y2hhcnRcIjtcblxuLyoqIERlZmF1bHQgc2VydmVyLXNpZGUgbG9uZy1wb2xsIGJ1ZGdldCBmb3Ige0BsaW5rIGZldGNoQ2hhcnR9LiAqL1xuY29uc3QgREVGQVVMVF9GRVRDSF9USU1FT1VUX01TID0gNjBfMDAwO1xuXG4vKiogRGVmYXVsdCBpbnRlci1wb2xsIHNsZWVwIGZvciB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5jb25zdCBERUZBVUxUX0ZFVENIX0lOVEVSVkFMX01TID0gMjUwO1xuXG4vKiogU3RhYmxlIHRleHQgc3RvcmVkIG9uIGEgY2hhcnQgZW50cnkgd2hvc2UgcGxhbm5lciBydW4gZmFpbGVkLiAqL1xuY29uc3QgQ0hBUlRfRkFJTEVEX01FU1NBR0UgPSBcIkNoYXJ0IGdlbmVyYXRpb24gZmFpbGVkXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2NoZW1hcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHNlcmllcyBkYXRhIHBvaW50LiBXaWRlIHZhcmlhbnQgc2V0IHNvIHRoZSBwbGFubmVyIGFnZW50IGNhblxuICogZmFpdGhmdWxseSBwYXNzIHRocm91Z2ggd2hhdGV2ZXIgdGhlIFNRTCByb3cgc2V0IGNvbnRhaW5lZFxuICogKG51bWJlcnMsIHN0cmluZ2lmaWVkIG51bWJlcnMsIG51bGxzIGZvciBtaXNzaW5nIG1lYXN1cmVtZW50cyxcbiAqIGBbeCwgeV1gIHR1cGxlcyBmb3Igc2NhdHRlciwgYFt4LCB5LCB2YWx1ZV1gIHRyaXBsZXMgZm9yIGhlYXRtYXAsXG4gKiBge25hbWUsIHZhbHVlfWAgc2xpY2VzIGZvciBwaWUgLyBmdW5uZWwgLyB0cmVlbWFwKSB3aXRob3V0IHRoZVxuICogc3RydWN0dXJlZC1vdXRwdXQgZ3VhcmQgcmVqZWN0aW5nIHRoZSB3aG9sZSBwbGFuLlxuICpcbiAqIFRocmVlIGxheWVycyBvZiB0b2xlcmFuY2U6XG4gKlxuICogICAxLiB7QGxpbmsgei5wcmVwcm9jZXNzfSBub3JtYWxpemVzIHdpcmUgc2hhcGVzIEJFRk9SRSB1bmlvblxuICogICAgICBkaXNwYXRjaDogc3RyaW5naWZpZWQgbnVtYmVycyBwYXJzZSB0byBudW1iZXJzLCBmaW5pdGVcbiAqICAgICAgY2hlY2tzIHJlamVjdCBgTmFOYCAvIGBJbmZpbml0eWAsIDItLzMtZWxlbWVudCBhcnJheXMgY29lcmNlXG4gKiAgICAgIHR1cGxlIGNvbXBvbmVudHMsIGFuZCBge3ZhbHVlfWAgb2JqZWN0cyB3aXRoIG1pc3NpbmcgL1xuICogICAgICBzdHJpbmdpZmllZCBgdmFsdWVgIGdldCBjb2VyY2VkIG9yIHJlamVjdGVkIHVuaWZvcm1seS5cbiAqICAgICAgQW55dGhpbmcgbm90IGhhbmRsZWFibGUgYmVjb21lcyBgbnVsbGAuXG4gKiAgIDIuIFRoZSB1bmlvbiBhY2NlcHRzIGBudWxsYCBhcyBhIGZpcnN0LWNsYXNzIHZhcmlhbnQuIEVjaGFydHNcbiAqICAgICAgcmVuZGVycyBudWxsIGFzIGEgZ2FwIG9uIGJhciAvIGxpbmUgLyBhcmVhICh3aGljaCBpcyB0aGVcbiAqICAgICAgcmlnaHQgdmlzdWFsIHNpZ25hbCBmb3IgXCJtaXNzaW5nIHJlYWRpbmdcIikuIFNjYXR0ZXIsIGhlYXRtYXAsXG4gKiAgICAgIGFuZCBzbGljZSBjaGFydHMgZmlsdGVyIG51bGxzIGluIHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufVxuICogICAgICBiZWNhdXNlIEVjaGFydHMgY3Jhc2hlcyBvbiBudWxsIHR1cGxlcyAvIHNsaWNlcy5cbiAqICAgMy4ge0BsaW5rIHoudW5pb24jY2F0Y2h9IGJhY2tzdG9wcyB0aGUgd2hvbGUgdGhpbmc6IGlmXG4gKiAgICAgIHByZXByb2Nlc3Mgc29tZWhvdyBwcm9kdWNlcyBhIHNoYXBlIHRoYXQgc3RpbGwgZG9lc24ndFxuICogICAgICBtYXRjaCBhbnkgdmFyaWFudCwgdGhlIGJhZCBpdGVtIGJlY29tZXMgYG51bGxgIGluc3RlYWQgb2ZcbiAqICAgICAgdGFraW5nIGRvd24gdGhlIGVudGlyZSBjaGFydCB3aXRoIGFcbiAqICAgICAgYFN0cnVjdHVyZWQgb3V0cHV0IHZhbGlkYXRpb24gZmFpbGVkYCBlcnJvci5cbiAqL1xuY29uc3QgY2hhcnREYXRhUG9pbnRTY2hlbWEgPSB6XG4gIC5wcmVwcm9jZXNzKFxuICAgICh2KSA9PiB7XG4gICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHYpID8gdiA6IG51bGw7XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdC50b051bWJlcih2KSA/PyBudWxsO1xuICAgICAgfVxuICAgICAgLy8gU2NhdHRlciBgW3gsIHldYCBvciBoZWF0bWFwIGBbeEluZGV4LCB5SW5kZXgsIHZhbHVlXWAuIENvZXJjZVxuICAgICAgLy8gc3RyaW5naWZpZWQgY29tcG9uZW50czsgcmVqZWN0IGlmIGFueSBjb21wb25lbnQgaXMgbm9uLWZpbml0ZS5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpICYmICh2Lmxlbmd0aCA9PT0gMiB8fCB2Lmxlbmd0aCA9PT0gMykpIHtcbiAgICAgICAgY29uc3QgbnVtcyA9IHYubWFwKChjKSA9PiBvYmplY3QudG9OdW1iZXIoYykpO1xuICAgICAgICByZXR1cm4gbnVtcy5ldmVyeSgobikgPT4gbiAhPT0gdW5kZWZpbmVkKSA/IG51bXMgOiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgXCJ2YWx1ZVwiIGluIHYpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gdiBhcyB7IG5hbWU/OiB1bmtub3duOyB2YWx1ZTogdW5rbm93biB9O1xuICAgICAgICBjb25zdCB2YWwgPSBvYmplY3QudG9OdW1iZXIob2JqLnZhbHVlKTtcbiAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gQ29lcmNlIG51bWVyaWMgLyBib29sZWFuIC8gbnVsbGlzaCBuYW1lcyB0byBzdHJpbmdzIHNvIGFcbiAgICAgICAgLy8gcGllIHNsaWNlIGtleWVkIG9uIGEgeWVhciAoYDIwMjRgKSBvciBjYXRlZ29yeSBpZCBpc1xuICAgICAgICAvLyBhY2NlcHRlZCB3aXRob3V0IHJvdW5kLXRyaXBwaW5nIHRocm91Z2ggdGhlIGNhdGNoIGFybS5cbiAgICAgICAgY29uc3QgcmF3TmFtZSA9IG9iai5uYW1lO1xuICAgICAgICBjb25zdCBuYW1lID0gdHlwZW9mIHJhd05hbWUgPT09IFwic3RyaW5nXCIgPyByYXdOYW1lIDogcmF3TmFtZSA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhyYXdOYW1lKTtcbiAgICAgICAgcmV0dXJuIHsgbmFtZSwgdmFsdWU6IHZhbCB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICB6LnVuaW9uKFtcbiAgICAgIHoubnVtYmVyKCksXG4gICAgICB6Lm51bGwoKSxcbiAgICAgIC8vIGBbeCwgeV1gIHNjYXR0ZXIgb3IgYFt4LCB5LCB2YWx1ZV1gIGhlYXRtYXAgY2VsbC4gTW9kZWxsZWQgYXMgYVxuICAgICAgLy8gbGVuZ3RoLWNvbnN0cmFpbmVkIGhvbW9nZW5lb3VzIGFycmF5IHJhdGhlciB0aGFuIGB6LnR1cGxlYDpcbiAgICAgIC8vIFpvZCBlbWl0cyBhIHR1cGxlIGFzIEpTT04gU2NoZW1hIDIwMjAtMTIgYHByZWZpeEl0ZW1zYCwgYW5kXG4gICAgICAvLyBEYXRhYnJpY2tzJyBHZW1pbmkgZW5kcG9pbnRzIHJlamVjdCBhIGByZXNwb25zZV9qc29uX3NjaGVtYWBcbiAgICAgIC8vIGNvbnRhaW5pbmcgaXQgKFwibXVzdCBiZSBhIGJvb2xlYW4gb3IgYW4gb2JqZWN0XCIsIHNpbmNlXG4gICAgICAvLyBgaXRlbXNgIGlzIGFic2VudCkuIGBtaW5JdGVtc2AgLyBgbWF4SXRlbXNgICsgYGl0ZW1zYCBpcyB3aGF0XG4gICAgICAvLyBldmVyeSBwcm92aWRlciB1bmRlcnN0YW5kcy5cbiAgICAgIHouYXJyYXkoei5udW1iZXIoKSkubWluKDIpLm1heCgzKSxcbiAgICAgIHoub2JqZWN0KHsgbmFtZTogei5zdHJpbmcoKSwgdmFsdWU6IHoubnVtYmVyKCkgfSksXG4gICAgXSksXG4gIClcbiAgLmNhdGNoKG51bGwpO1xuXG4vKiogUGVyLXNlcmllcyBtYXJrIHR5cGUgdXNlZCBieSBgY29tYm9gIGNoYXJ0cyAoYmFyICsgbGluZSBvdmVybGF5KS4gKi9cbmNvbnN0IHNlcmllc01hcmtUeXBlU2NoZW1hID0gelxuICAudW5pb24oW3oubGl0ZXJhbChcImJhclwiKSwgei5saXRlcmFsKFwibGluZVwiKSwgei5saXRlcmFsKFwiYXJlYVwiKV0pXG4gIC5kZXNjcmliZShcbiAgICBcIk1hcmsgdHlwZSBmb3IgdGhpcyBzZXJpZXMuIFJlcXVpcmVkIGZvciBgY29tYm9gIChtaXggYmFyIGFuZCBsaW5lL2FyZWEpOyB1c2UgbnVsbCBmb3Igb3RoZXIgY2hhcnQgdHlwZXMuXCIsXG4gICk7XG5cbi8qKlxuICogQ29tcGFjdCwgbW9kZWwtZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgYW4gRWNoYXJ0cyBzcGVjLiBUaGVcbiAqIHBsYW5uZXIgYWdlbnQgZW1pdHMgdGhpczsge0BsaW5rIHBsYW5Ub0VjaGFydHNPcHRpb259IGV4cGFuZHMgaXRcbiAqIGludG8gYSByZWFsIGBFQ2hhcnRzT3B0aW9uYCBKU09OLiBUd28gbGF5ZXJzIGJlY2F1c2UgbGV0dGluZyB0aGVcbiAqIG1vZGVsIGZpbGwgaW4gYSBmdWxseS10eXBlZCBgRUNoYXJ0c09wdGlvbmAgaXMgYnJpdHRsZSAoaHVuZHJlZHNcbiAqIG9mIG9wdGlvbmFsIGZpZWxkcywgZGVlcCB1bmlvbnMsIHZlcnNpb24tZGVwZW5kZW50IHNoYXBlcykuIEFcbiAqIHNtYWxsIFwiY2hhcnQgcGxhblwiIHNjaGVtYSBpcyBtdWNoIG1vcmUgcmVsaWFibGUgZm9yIGEgZmFzdCBtb2RlbFxuICogYW5kIGtlZXBzIGFuaW1hdGlvbiAvIHRvb2x0aXAgLyBzdHlsaW5nIGRlZmF1bHRzIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBjaGFydHMuXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFydFBsYW5TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGNoYXJ0VHlwZTogd2lyZS5DaGFydFR5cGVTY2hlbWEsXG4gIHRpdGxlOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm51bGxhYmxlKClcbiAgICAuZGVmYXVsdChudWxsKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBTaG9ydCB0aXRsZSBzaG93biBhYm92ZSB0aGUgY2hhcnQuIFVzZSBudWxsIHRvIGZhbGwgYmFjayB0byB0aGVcbiAgICAgICAgXFxgdGl0bGVcXGAgYXJndW1lbnQgdGhlIGNhbGxlciBwYXNzZWQgaW4uXG4gICAgICBgKSxcbiAgICApLFxuICB4QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm51bGxhYmxlKClcbiAgICAuZGVmYXVsdChudWxsKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBBeGlzIGxhYmVsIGZvciB0aGUgcHJpbWFyeSAodXN1YWxseSBib3R0b20gLyB2YWx1ZSkgYXhpcy5cbiAgICAgICAgVXNlZCBmb3IgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGxcbiAgICAgICAgLyBzY2F0dGVyIC8gaGVhdG1hcDsgdXNlIG51bGwgZm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXAgLyByYWRhci5cbiAgICAgIGApLFxuICAgICksXG4gIHlBeGlzTGFiZWw6IHpcbiAgICAuc3RyaW5nKClcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgZm9yIHRoZSBzZWNvbmRhcnkgKHVzdWFsbHkgbGVmdCkgYXhpcy4gVXNlZCBmb3JcbiAgICAgICAgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGwgL1xuICAgICAgICBzY2F0dGVyIC8gaGVhdG1hcDsgdXNlIG51bGwgZm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXAgLyByYWRhci5cbiAgICAgIGApLFxuICAgICksXG4gIGNhdGVnb3JpZXM6IHpcbiAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFByaW1hcnkgY2F0ZWdvcnkgbGFiZWxzLiBGb3IgXFxgYmFyXFxgIC8gXFxgaG9yaXpvbnRhbEJhclxcYCAvXG4gICAgICAgIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgIC8gXFxgY29tYm9cXGAgLyBcXGB3YXRlcmZhbGxcXGA6IG9uZSBsYWJlbCBwZXJcbiAgICAgICAgZGF0YSBwb2ludC4gRm9yIFxcYGhlYXRtYXBcXGA6IHgtYXhpcyBjYXRlZ29yaWVzLiBGb3IgXFxgcmFkYXJcXGA6XG4gICAgICAgIGluZGljYXRvciBuYW1lcy4gVXNlIG51bGwgZm9yIFxcYHNjYXR0ZXJcXGAgKFxcYFt4LCB5XVxcYCB0dXBsZXMpIGFuZFxuICAgICAgICBzbGljZSBjaGFydHMgKFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvIFxcYHRyZWVtYXBcXGAsIGVhY2ggc2xpY2VcbiAgICAgICAgY2FycmllcyBpdHMgb3duIFxcYG5hbWVcXGApLlxuICAgICAgYCksXG4gICAgKSxcbiAgeUNhdGVnb3JpZXM6IHpcbiAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFktYXhpcyAocm93KSBsYWJlbHMgZm9yIFxcYGhlYXRtYXBcXGAuIFVzZSBudWxsIHdoZW4gdGhlXG4gICAgICAgIHJvdyBsYWJlbHMgY29tZSBmcm9tIHRoZSBzZXJpZXMgbmFtZXMsIHdoaWNoIGlzIHRoZSBwcmVmZXJyZWRcbiAgICAgICAgd2F5IHRvIGJ1aWxkIGEgaGVhdG1hcC4gVXNlIG51bGwgZm9yIGV2ZXJ5IG90aGVyIGNoYXJ0IHR5cGUuXG4gICAgICBgKSxcbiAgICApLFxuICBzZXJpZXM6IHpcbiAgICAuYXJyYXkoXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIG5hbWU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBMZWdlbmQgbmFtZSBmb3IgdGhpcyBzZXJpZXMuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICAgIHR5cGU6IHNlcmllc01hcmtUeXBlU2NoZW1hLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgICAgICAgeUF4aXNJbmRleDogelxuICAgICAgICAgIC51bmlvbihbei5saXRlcmFsKDApLCB6LmxpdGVyYWwoMSldKVxuICAgICAgICAgIC5udWxsYWJsZSgpXG4gICAgICAgICAgLmRlZmF1bHQobnVsbClcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBcIldoaWNoIHktYXhpcyB0byBiaW5kICgwID0gbGVmdCwgMSA9IHJpZ2h0KS4gVXNlIG9uIGBjb21ib2Agd2hlbiBzZXJpZXMgaGF2ZSBkaWZmZXJlbnQgdW5pdHMgb3Igc2NhbGVzOyB1c2UgbnVsbCBvdGhlcndpc2UuXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgZGF0YTogei5hcnJheShjaGFydERhdGFQb2ludFNjaGVtYSkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBEYXRhIHBvaW50cy4gRm9yIGNhdGVnb3J5IGNoYXJ0cyAoXFxgYmFyXFxgIC8gXFxgaG9yaXpvbnRhbEJhclxcYFxuICAgICAgICAgICAgLyBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCAvIFxcYGNvbWJvXFxgIC8gXFxgd2F0ZXJmYWxsXFxgIC8gXFxgcmFkYXJcXGApLFxuICAgICAgICAgICAgYW4gYXJyYXkgb2YgbnVtYmVycyBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGA7IGZvclxuICAgICAgICAgICAgXFxgd2F0ZXJmYWxsXFxgIHRob3NlIG51bWJlcnMgYXJlIHNpZ25lZCBkZWx0YXMgKG9uZSBzZXJpZXNcbiAgICAgICAgICAgIG9ubHkgLSBuZXZlciBhIGN1bXVsYXRpdmUgYmFzZSBzZXJpZXMpLiBGb3IgXFxgaGVhdG1hcFxcYCxcbiAgICAgICAgICAgIG9uZSBzZXJpZXMgcGVyIG1hdHJpeCByb3csIGhvbGRpbmcgdGhhdCByb3cncyBudW1iZXJzXG4gICAgICAgICAgICBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGAuIEZvciBcXGBzY2F0dGVyXFxgLCBhbiBhcnJheSBvZlxuICAgICAgICAgICAgXFxgW3gsIHldXFxgIG51bWVyaWMgdHVwbGVzLiBGb3IgXFxgcGllXFxgIC8gXFxgZnVubmVsXFxgIC9cbiAgICAgICAgICAgIFxcYHRyZWVtYXBcXGAsIGFuIGFycmF5IG9mIFxcYHtuYW1lLCB2YWx1ZX1cXGAgb2JqZWN0cy5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgIClcbiAgICAuZGVmYXVsdChbXSlcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgT25lIG9yIG1vcmUgc2VyaWVzIHRvIHBsb3QuIFJlcXVpcmVkIGZvciBldmVyeSBjaGFydCB0eXBlXG4gICAgICAgIGV4Y2VwdCBcXGBjdXN0b21cXGAsIHdoaWNoIGNhcnJpZXMgaXRzIHNlcmllcyBpbnNpZGUgXFxgb3B0aW9uXFxgLlxuICAgICAgICBTbGljZSBjaGFydHMgKFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvIFxcYHRyZWVtYXBcXGApIGFuZFxuICAgICAgICBcXGB3YXRlcmZhbGxcXGAgLyBcXGBoZWF0bWFwXFxgIHVzZSBleGFjdGx5IG9uZSBzZXJpZXM7IFxcYGJhclxcYCAvXG4gICAgICAgIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgIC8gXFxgY29tYm9cXGAgLyBcXGByYWRhclxcYCAvIFxcYHNjYXR0ZXJcXGAgY2FuXG4gICAgICAgIGNhcnJ5IG11bHRpcGxlIHNlcmllcy5cbiAgICAgIGApLFxuICAgICksXG4gIG9wdGlvbjogelxuICAgIC5zdHJpbmcoKVxuICAgIC5udWxsYWJsZSgpXG4gICAgLmRlZmF1bHQobnVsbClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgUmVxdWlyZWQgZm9yIFxcYGN1c3RvbVxcYDsgdXNlIG51bGwgZm9yIGV2ZXJ5IG90aGVyIGNoYXJ0IHR5cGUuIEFcbiAgICAgICAgQ09NUExFVEUgRWNoYXJ0cyBvcHRpb24sIGFzIGEgSlNPTiBvYmplY3QgZW5jb2RlZCBpbiBhIHN0cmluZzpcbiAgICAgICAgXFxgc2VyaWVzXFxgIChlYWNoIHdpdGggaXRzIG93biBcXGB0eXBlXFxgIGFuZCB0aGF0IHNlcmllcycgb3duIGRhdGFcbiAgICAgICAgc2hhcGUpIHBsdXMgd2hhdGV2ZXIgZWxzZSB0aGUgY2hhcnQgbmVlZHMgLSBhIGNvb3JkaW5hdGUgc3lzdGVtLFxuICAgICAgICBcXGB2aXN1YWxNYXBcXGAsIGF4ZXMuIFBsYWluIEpTT04gdmFsdWVzIG9ubHksIG5ldmVyIGEgSmF2YVNjcmlwdFxuICAgICAgICBmdW5jdGlvbi4gQSBjZW50ZXJlZCB0aXRsZSBpcyBmaWxsZWQgaW4gd2hlbiB0aGUgb2JqZWN0IG9taXRzXG4gICAgICAgIG9uZS5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxudHlwZSBDaGFydFBsYW4gPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5TY2hlbWE+O1xudHlwZSBDaGFydFBsYW5JbnB1dCA9IHouaW5wdXQ8dHlwZW9mIGNoYXJ0UGxhblNjaGVtYT47XG5cbi8qKlxuICogQ2Fub25pY2FsIHBsYW5uZXIgaW5wdXQgc2hhcGUuIFRvb2xzIHRoYXQgc291cmNlIHJvd3MgZnJvbSBhblxuICogaW5saW5lIGRhdGFzZXQgKGByZW5kZXJfZGF0YWApIHVzZSBpdCBhcyB0aGVpciBgaW5wdXRTY2hlbWFgXG4gKiB2ZXJiYXRpbTsgdG9vbHMgdGhhdCByZXNvbHZlIHJvd3MgZnJvbSBhIHJlbW90ZSAoYHByZXBhcmVfY2hhcnRgXG4gKiBvdmVyIGEgR2VuaWUgc3RhdGVtZW50KSBgb21pdCh7IGRhdGEgfSlgIGFuZCBgZXh0ZW5kYCB3aXRoIHRoZWlyXG4gKiBvd24gaWRlbnRpZmllciBmaWVsZCwgc28gdGhlIGZpZWxkLWxldmVsIGAuZGVzY3JpYmUoKWAgdGV4dFxuICogc3RheXMgYSBzaW5nbGUgc291cmNlIG9mIHRydXRoLiBTZXJ2ZXItb25seSAtIHRoZSBVSSBuZXZlclxuICogc2VlcyBhIHBsYW5uZXIgcmVxdWVzdCwgb25seSB0aGUgcmVzb2x2ZWQge0BsaW5rIENoYXJ0fS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHRpdGxlOiB6LnN0cmluZygpLmRlc2NyaWJlKFxuICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBDb25jaXNlIHRpdGxlIHNob3duIGFib3ZlIHRoZSBjaGFydCAoZS5nLiBcIlRvcCAxMCBTS1VzIGJ5IFJldmVudWVcIikuXG4gICAgICBgKSxcbiAgKSxcbiAgZGVzY3JpcHRpb246IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUtbGluZSBpbnRlbnQgdGhlIGNoYXJ0LXBsYW5uZXIgdXNlcyB3aGVuIHBpY2tpbmcgYSBjaGFydCB0eXBlXG4gICAgICAgIGFuZCBheGlzIGVuY29kaW5ncyAoZS5nLiBcImNvbXBhcmUgcXVhcnRlcmx5IHJldmVudWUgYWNyb3NzXG4gICAgICAgIHJlZ2lvbnNcIiwgXCJoaWdobGlnaHQgdGhlIHN0ZWVwIGRyb3AgYWZ0ZXIgcG9zaXRpb24gNVwiKS4gTm90IHNob3duXG4gICAgICAgIHRvIHRoZSB1c2VyLlxuICAgICAgYCksXG4gICAgKSxcbiAgZGF0YTogelxuICAgIC5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpXG4gICAgLm5vbmVtcHR5KFwiRGF0YSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHJvd1wiKVxuICAgIC5yZWFkb25seSgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFRhYnVsYXIgZGF0YXNldCB0byBjaGFydC4gT25lIG9iamVjdCBwZXIgcm93LCBrZXllZCBieSBjb2x1bW5cbiAgICAgICAgbmFtZS4gVmFsdWVzIG1heSBiZSBzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucywgb3IgbnVsbC4gVGhlXG4gICAgICAgIGNoYXJ0LXBsYW5uZXIgZGVjaWRlcyB3aGljaCBjb2x1bW5zIGFyZSBjYXRlZ29yaWVzIHZzLiBudW1lcmljXG4gICAgICAgIHNlcmllcy4gQ2FwIGF0IGEgZmV3IGh1bmRyZWQgcm93cyBmb3IgbGVnaWJpbGl0eTsgc2FtcGxlIC9cbiAgICAgICAgYWdncmVnYXRlIGxhcmdlciBkYXRhc2V0cyBmaXJzdC5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxuLyoqIFZhbGlkYXRlZCB0aXRsZSwgZGVzY3JpcHRpb24sIGFuZCB0YWJ1bGFyIHJvd3MgcGFzc2VkIHRvIHRoZSBjaGFydC1wbGFubmluZyBtb2RlbC4gKi9cbmV4cG9ydCB0eXBlIENoYXJ0UGxhbm5lclJlcXVlc3QgPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hPjtcblxuLyoqXG4gKiBBZ2VudC1mYWNpbmcgcmVzdWx0IG9mIGVpdGhlciBjaGFydC1wcm9kdWNpbmcgdG9vbC5cbiAqXG4gKiBgbWFya2VyYCBpcyBkZWxpYmVyYXRlbHkgcmVkdW5kYW50IHdpdGggYGNoYXJ0SWRgOiB0aGUgaG9zdCBzdGlsbCBrZXlzIHRoZVxuICogY2FjaGUgYnkgaWQsIHdoaWxlIHRoZSBtb2RlbCBnZXRzIHRoZSBleGFjdCBvcGFxdWUgdG9rZW4gdG8gY29weSBpbnRvIHByb3NlXG4gKiBhbmQgaGFzIG5vIHJlYXNvbiB0byBpbnZlbnQgb3IgcmV0eXBlIGEgVVVJRC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoYXJ0VG9vbE91dHB1dFNjaGVtYSA9IHdpcmUuQ2hhcnRTY2hlbWEucGljayh7IGNoYXJ0SWQ6IHRydWUgfSkuZXh0ZW5kKHtcbiAgbWFya2VyOiB6XG4gICAgLnN0cmluZygpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJFeGFjdCBlbWJlZCBtYXJrZXIuIENvcHkgdGhpcyBjb21wbGV0ZSB2YWx1ZSB2ZXJiYXRpbSBvbnRvIGl0cyBvd24gbGluZTsgbmV2ZXIgY29uc3RydWN0IGEgbWFya2VyIGZyb20gY2hhcnRJZC5cIixcbiAgICApLFxufSk7XG5cbi8qKiBSZXN1bHQgcmV0dXJuZWQgc3luY2hyb25vdXNseSB3aGlsZSBjaGFydCBwbGFubmluZyBjb250aW51ZXMgaW4gdGhlIGJhY2tncm91bmQuICovXG5leHBvcnQgdHlwZSBDaGFydFRvb2xPdXRwdXQgPSB6LmluZmVyPHR5cGVvZiBjaGFydFRvb2xPdXRwdXRTY2hlbWE+O1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGxhbm5lciBpbnN0cnVjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRm9ybWF0IHtAbGluayB3aXJlLkNoYXJ0VHlwZVNjaGVtYX0ncyB2YXJpYW50cyBhcyBhIHNpbmdsZVxuICogaHVtYW4tZnJpZW5kbHkgc3RyaW5nIG9mIGBgIGA8dmFsdWU+YCBmb3IgPGRlc2NyaXB0aW9uPiBgYFxuICogY2xhdXNlcyBqb2luZWQgYnkgc2VtaWNvbG9ucywgZHJhd24gZnJvbSBlYWNoIHZhcmlhbnQncyBvd25cbiAqIGAuZGVzY3JpYmUoKWAgc28gdGhlIHBsYW5uZXIgcHJvbXB0IHN0YXlzIGluIGxvY2stc3RlcCB3aXRoXG4gKiB0aGUgc2NoZW1hIGJ5IGNvbnN0cnVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0Q2hhcnRUeXBlUGlja2VyKCk6IHN0cmluZyB7XG4gIHJldHVybiB3aXJlLkNoYXJ0VHlwZVNjaGVtYS5vcHRpb25zXG4gICAgLm1hcCgob3B0KSA9PiBgXFxgJHtvcHQudmFsdWV9XFxgIGZvciAke29wdC5kZXNjcmlwdGlvbiA/PyBcIlwifWApXG4gICAgLmpvaW4oXCI7IFwiKTtcbn1cblxuLyoqXG4gKiBTeXN0ZW0gcHJvbXB0IGZvciB0aGUgaW5uZXIgY2hhcnQtcGxhbm5pbmcgYWdlbnQuIFR1bmVkIGZvciBhXG4gKiBmYXN0LXRpZXIgbW9kZWwgKEhhaWt1LCBHUFQtNS1taW5pLCBHZW1pbmkgRmxhc2ggTGl0ZSkuXG4gKi9cbmNvbnN0IENIQVJUX1BMQU5ORVJfSU5TVFJVQ1RJT05TID0gc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gIFlvdSBkZXNpZ24gQXBhY2hlIEVjaGFydHMgdmlzdWFsaXphdGlvbnMuIFRoZSB1c2VyIGdpdmVzIHlvdSBhXG4gIHRhYnVsYXIgZGF0YXNldCAocm93cyBvZiBvYmplY3RzKSBwbHVzIGEgdGl0bGUgYW5kIGFuIG9wdGlvbmFsXG4gIGRlc2NyaXB0aW9uIG9mIHRoZSBpbnRlbnQuIFlvdSBwcm9kdWNlIGEgc21hbGwgY2hhcnQgcGxhbiAoY2hhcnRcbiAgdHlwZSwgYXhpcyBsYWJlbHMsIGNhdGVnb3JpZXMsIHNlcmllcykgdGhhdCBiZXN0IGNvbnZleXMgdGhlIGRhdGEuXG5cbiAgRGVjaXNpb24gZ3VpZGUuIFBpY2sgdGhlIGNoYXJ0IHR5cGUgd2hvc2UgZGF0YSBzaGFwZSBtYXRjaGVzIHRoZVxuICBkYXRhc2V0IGFuZCB0aGUgdXNlcidzIGludGVudDogJHtmb3JtYXRDaGFydFR5cGVQaWNrZXIoKX0uXG5cbiAgV2hlbiBpbiBkb3VidCBiZXR3ZWVuIGJhciBhbmQgbGluZSwgcHJlZmVyIGJhciBmb3IgdW5vcmRlcmVkXG4gIGNhdGVnb3JpZXMgYW5kIGxpbmUgZm9yIG9yZGVyZWQgb25lcyAoZGF0ZXMsIHRpbWUgYnVja2V0cywgcmFua3MpLlxuICBQcmVmZXIgXFxgaG9yaXpvbnRhbEJhclxcYCB3aGVuIGNhdGVnb3J5IGxhYmVscyBhcmUgbG9uZy4gUHJlZmVyXG4gIFxcYGNvbWJvXFxgIHdoZW4gb25lIG1lYXN1cmUgaXMgYSBjb3VudC92b2x1bWUgYW5kIGFub3RoZXIgaXMgYVxuICByYXRlL3RyZW5kLiBQcmVmZXIgXFxgd2F0ZXJmYWxsXFxgIGZvciBicmlkZ2VzIG9mIHNpZ25lZCBkZWx0YXMuXG4gIFByZWZlciBcXGBzY2F0dGVyXFxgIHdoZW4gY29ycmVsYXRpbmcgdHdvIG51bWVyaWMgZmllbGRzIChub1xuICBjYXRlZ29yeSBheGlzKS4gUHJlZmVyIFxcYGhlYXRtYXBcXGAgZm9yIGEgY2F0ZWdvcnkgeCBjYXRlZ29yeVxuICBtYXRyaXguIFByZWZlciBcXGByYWRhclxcYCBmb3Igc2NvcmluZyB0aGUgc2FtZSBlbnRpdGllcyBhY3Jvc3MgYVxuICBmaXhlZCBzZXQgb2YgZGltZW5zaW9ucy4gTmV2ZXIgcGljayBwaWUgZm9yIG1vcmUgdGhhbiA3IHNsaWNlc1xuICAodXNlIFxcYHRyZWVtYXBcXGAgaW5zdGVhZCkuIFByZWZlciBcXGBmdW5uZWxcXGAgZm9yIG9yZGVyZWQgY29udmVyc2lvblxuICBzdGFnZXMuXG5cbiAgRm9yIGJhciAvIGhvcml6b250YWxCYXIgLyBsaW5lIC8gYXJlYSAvIGNvbWJvIC8gd2F0ZXJmYWxsOiBwaWNrIG9uZVxuICBjb2x1bW4gYXMgdGhlIGNhdGVnb3J5IGF4aXMgKHVzdWFsbHkgdGhlIG9ubHkgc3RyaW5nLXZhbHVlZCBjb2x1bW4pXG4gIGFuZCBvbmUgb3IgbW9yZSBudW1lcmljIGNvbHVtbnMgYXMgc2VyaWVzLiBTb3J0IGNhdGVnb3JpZXMgYnkgdGhlXG4gIHByaW1hcnkgc2VyaWVzIHZhbHVlIGRlc2NlbmRpbmcgdW5sZXNzIHRoZSBkYXRhIGlzIG5hdHVyYWxseSBvcmRlcmVkXG4gIChkYXRlcywgcmFua3MsIGZ1bm5lbCBzdGFnZXMsIHdhdGVyZmFsbCBzdGVwcykuIEZvciBcXGBjb21ib1xcYCwgc2V0XG4gIGVhY2ggc2VyaWVzJyBcXGB0eXBlXFxgIHRvIFxcYGJhclxcYCwgXFxgbGluZVxcYCwgb3IgXFxgYXJlYVxcYCwgYW5kIHVzZVxuICBcXGB5QXhpc0luZGV4OiAxXFxgIHdoZW4gYSBzZXJpZXMgbmVlZHMgYSBzZWNvbmQgc2NhbGUuXG5cbiAgRm9yIHdhdGVyZmFsbCwgZW1pdCBleGFjdGx5IE9ORSBzZXJpZXMgaG9sZGluZyB0aGUgc2lnbmVkIHN0ZXAgdmFsdWVzXG4gIChkZWx0YXMpLCBvbmUgcGVyIGNhdGVnb3J5LCBpbiBvcmRlciAtIHBvc2l0aXZlIGZvciBhIHJpc2UsIG5lZ2F0aXZlXG4gIGZvciBhIGRyb3AuIERvIE5PVCBhZGQgYSBjdW11bGF0aXZlIC8gcnVubmluZy10b3RhbCAvIGJhc2Ugc2VyaWVzIGFuZFxuICBkbyBOT1QgY29udmVydCB0aGUgZGVsdGFzIGludG8gcnVubmluZyB0b3RhbHMgeW91cnNlbGY7IHRoZSBydW5uaW5nXG4gIHRvdGFsIGlzIGNvbXB1dGVkIGZvciB5b3UsIGFuZCBhIGhhbmQtYnVpbHQgYmFzZSBzZXJpZXMgcmVuZGVycyBhcyBhXG4gIHBsYWluIGJhciBjaGFydCBpbnN0ZWFkIG9mIGEgYnJpZGdlLlxuXG4gIEZvciBwaWUgLyBmdW5uZWwgLyB0cmVlbWFwOiBwaWNrIHRoZSBjYXRlZ29yeSBjb2x1bW4gZm9yIHNsaWNlIG5hbWVzXG4gIGFuZCBvbmUgbnVtZXJpYyBjb2x1bW4gZm9yIHNsaWNlIHZhbHVlcy4gRW1pdCBhIHNpbmdsZSBzZXJpZXMgb2ZcbiAgXFxge25hbWUsIHZhbHVlfVxcYCBvYmplY3RzLlxuXG4gIEZvciBzY2F0dGVyOiBwaWNrIHR3byBudW1lcmljIGNvbHVtbnMgYW5kIGVtaXQgXFxgW3gsIHldXFxgIHR1cGxlcyBpblxuICBvbmUgb3IgbW9yZSBzZXJpZXMgKG9uZSBzZXJpZXMgcGVyIGdyb3VwIGlmIGEgZ3JvdXBpbmcgY29sdW1uIGV4aXN0cykuXG5cbiAgRm9yIGhlYXRtYXA6IHBpY2sgdHdvIGNhdGVnb3J5IGNvbHVtbnMgYW5kIG9uZSBudW1lcmljIG1lYXN1cmUuIFB1dFxuICB0aGUgeC1heGlzIGNhdGVnb3JpZXMgaW4gXFxgY2F0ZWdvcmllc1xcYCwgdGhlbiBlbWl0IE9ORSBTRVJJRVMgUEVSIFJPV1xuICBvZiB0aGUgbWF0cml4IC0gdGhlIHNlcmllcyBcXGBuYW1lXFxgIGlzIHRoZSByb3cgbGFiZWwgYW5kIFxcYGRhdGFcXGAgaXNcbiAgdGhlIHJvdydzIG51bWJlcnMsIG9uZSBwZXIgZW50cnkgaW4gXFxgY2F0ZWdvcmllc1xcYCwgaW4gdGhlIHNhbWUgb3JkZXIuXG4gIERvIG5vdCBjb21wdXRlIGNlbGwgaW5kaWNlcy5cblxuICBGb3IgcmFkYXI6IFxcYGNhdGVnb3JpZXNcXGAgYXJlIHRoZSBpbmRpY2F0b3IgbmFtZXM7IGVhY2ggc2VyaWVzIGlzIGFuXG4gIGFycmF5IG9mIG51bWJlcnMgKG9uZSB2YWx1ZSBwZXIgaW5kaWNhdG9yKS5cblxuICBGb3IgYW55dGhpbmcgdGhlIHR5cGVzIGFib3ZlIGNhbm5vdCBleHByZXNzIC0gYSBzYW5rZXksIGJveHBsb3QsXG4gIGNhbmRsZXN0aWNrLCBzdW5idXJzdCwgZ2F1Z2UsIG5ldHdvcmsgZ3JhcGgsIGNhbGVuZGFyLCBwYXJhbGxlbC1cbiAgY29vcmRpbmF0ZXMgcGxvdCwgb3IgYW55IG90aGVyIEVjaGFydHMgc2VyaWVzIC0gdXNlIFxcYGN1c3RvbVxcYCBhbmRcbiAgaGFuZC13cml0ZSB0aGUgd2hvbGUgRWNoYXJ0cyBvcHRpb24gaW50byBcXGBvcHRpb25cXGAgYXMgYSBKU09OIHN0cmluZy5cbiAgSW5jbHVkZSBldmVyeSBwYXJ0IHRoYXQgY2hhcnQgbmVlZHM6IHRoZSBzZXJpZXMgd2l0aCB0aGVpciBvd25cbiAgXFxgdHlwZVxcYCBhbmQgZGF0YSBzaGFwZSwgcGx1cyBhbnkgY29vcmRpbmF0ZSBzeXN0ZW0sIFxcYHZpc3VhbE1hcFxcYCxcbiAgb3IgYXhlcy4gTGVhdmUgXFxgc2VyaWVzXFxgLCBcXGBjYXRlZ29yaWVzXFxgLCBhbmQgdGhlIGF4aXMgbGFiZWxzIG91dDtcbiAgdGhleSBhcmUgaWdub3JlZCBmb3IgXFxgY3VzdG9tXFxgLiBQcmVmZXIgYSBsaXN0ZWQgdHlwZSB3aGVuZXZlciBvbmVcbiAgZ2VudWluZWx5IGZpdHMgLSBcXGBjdXN0b21cXGAgZ2l2ZXMgdXAgdGhlIHNoYXJlZCB0b29sdGlwLCBsZWdlbmQsIGFuZFxuICBncmlkIGRlZmF1bHRzLCBzbyBpdCBpcyB0aGUgYW5zd2VyIGZvciBhbiB1bnN1cHBvcnRlZCBjaGFydCBzaGFwZSxcbiAgbm90IGEgd2F5IHRvIHJlc3R5bGUgYSBzdXBwb3J0ZWQgb25lLlxuXG4gIEtlZXAgc2VyaWVzIG5hbWVzIGh1bWFuLXJlYWRhYmxlICh1c2UgdGhlIGNvbHVtbiBuYW1lOyB0aXRsZSBjYXNlIGl0XG4gIGxpZ2h0bHkgaWYgbmVlZGVkKS4gS2VlcCB0aXRsZXMgY29uY2lzZTsgZG8gbm90IHJlcGVhdCB0aGUgdXNlcidzXG4gIHRpdGxlIGluIHhBeGlzTGFiZWwgLyB5QXhpc0xhYmVsLlxuYCk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBsYW5uZXIgYWdlbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBPbmUgcGxhbm5lciBgQWdlbnRgIHBlciBwbHVnaW4gY29uZmlnLiBDYWNoZWQgb24gY29uZmlnIG9iamVjdFxuICogaWRlbnRpdHkgc28gY2FsbGVycyBjYW4gYHByZXBhcmVDaGFydCh7IGNvbmZpZywgLi4uIH0pYCBmcm9tIGFcbiAqIGhvdCBwYXRoIHdpdGhvdXQgcGF5aW5nIHRoZSBBZ2VudC1jb25zdHJ1Y3RvciBjb3N0IGV2ZXJ5IGNhbGwuXG4gKiBgV2Vha01hcGAgbGV0cyByZXRpcmVkIGNvbmZpZ3MgKGUuZy4gdGVzdCByZWNvbmZpZ3VyYXRpb25zKVxuICogcmVsZWFzZSB0aGVpciBhZ2VudCB3aXRob3V0IG1hbnVhbCBldmljdGlvbi5cbiAqL1xuY29uc3QgcGxhbm5lckFnZW50cyA9IG5ldyBXZWFrTWFwPE1hc3RyYVBsdWdpbkNvbmZpZywgQWdlbnQ+KCk7XG5cbmZ1bmN0aW9uIGdldFBsYW5uZXJBZ2VudChjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IEFnZW50IHtcbiAgbGV0IGFnZW50ID0gcGxhbm5lckFnZW50cy5nZXQoY29uZmlnKTtcbiAgaWYgKCFhZ2VudCkge1xuICAgIGFnZW50ID0gbmV3IEFnZW50KHtcbiAgICAgIGlkOiBcImNoYXJ0X3BsYW5uZXJcIixcbiAgICAgIG5hbWU6IFwiQ2hhcnQgUGxhbm5lclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUGlja3MgY2hhcnQgdHlwZSBhbmQgYXhpcyBlbmNvZGluZ3MgZm9yIGEgZGF0YXNldC5cIixcbiAgICAgIGluc3RydWN0aW9uczogQ0hBUlRfUExBTk5FUl9JTlNUUlVDVElPTlMsXG4gICAgICBtb2RlbDogKHsgcmVxdWVzdENvbnRleHQgfSkgPT5cbiAgICAgICAgYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsQ2xhc3M6IG1vZGVsLk1vZGVsQ2xhc3MuQ2hhdEZhc3QgfSksXG4gICAgfSk7XG4gICAgcGxhbm5lckFnZW50cy5zZXQoY29uZmlnLCBhZ2VudCk7XG4gIH1cbiAgcmV0dXJuIGFnZW50O1xufVxuXG4vKipcbiAqIFJ1biB0aGUgcGxhbm5lciBhZ2FpbnN0IGByZXF1ZXN0YCBhbmQgcmV0dXJuIHRoZSByZXNvbHZlZFxuICogRWNoYXJ0cyBzcGVjLiBUaHJvd3Mgb24gcGxhbm5lciBmYWlsdXJlIC0ge0BsaW5rIHByZXBhcmVDaGFydH1cbiAqIGNhdGNoZXMgYW5kIHN0YXNoZXMgdGhlIGVycm9yIGluIHRoZSBjYWNoZSBlbnRyeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQ2hhcnRQbGFubmVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdDogQ2hhcnRQbGFubmVyUmVxdWVzdCxcbiAgb3B0aW9uczogeyByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0OyBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsIH0gPSB7fSxcbik6IFByb21pc2U8Q2hhcnRSZXN1bHQ+IHtcbiAgY29uc3QgeyB0aXRsZSwgZGVzY3JpcHRpb24sIGRhdGEgfSA9IHJlcXVlc3Q7XG4gIGNvbnN0IHsgcmVxdWVzdENvbnRleHQsIGFib3J0U2lnbmFsIH0gPSBvcHRpb25zO1xuICBjb25zdCBwcm9tcHQgPSBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKHtcbiAgICBUaXRsZTogdGl0bGUsXG4gICAgLi4uKGRlc2NyaXB0aW9uID8geyBEZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICBcIkRhdGFzZXQgKEpTT04sIG9uZSByb3cgcGVyIG9iamVjdClcIjogSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMiksXG4gIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRQbGFubmVyQWdlbnQoY29uZmlnKS5nZW5lcmF0ZShwcm9tcHQsIHtcbiAgICBzdHJ1Y3R1cmVkT3V0cHV0OiB7IHNjaGVtYTogY2hhcnRQbGFuU2NoZW1hIH0sXG4gICAgLi4uKHJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgIC4uLihhYm9ydFNpZ25hbCA/IHsgYWJvcnRTaWduYWwgfSA6IHt9KSxcbiAgfSk7XG4gIGNvbnN0IHBsYW4gPSBjaGFydFBsYW5TY2hlbWEucGFyc2UocmVzdWx0Lm9iamVjdCk7XG4gIGNvbnN0IG9wdGlvbiA9IHBsYW5Ub0VjaGFydHNPcHRpb24ocGxhbiwgdGl0bGUsIGNvbmZpZy5icmFuZCk7XG4gIHJldHVybiB7IGNoYXJ0VHlwZTogcGxhbi5jaGFydFR5cGUsIG9wdGlvbiB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2FjaGUgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIGNhY2hlIGtleSBmb3IgYSBgY2hhcnRJZGAgb3duZWQgYnkgYHVzZXJLZXlgLlxuICpcbiAqIFRoZSBpZGVudGl0eSBpcyBwYXJ0IG9mIHRoZSBrZXksIG5vdCBhIGZpbHRlciBhcHBsaWVkIGFmdGVyIHRoZSByZWFkLCBzbyBhXG4gKiBjaGFydCBpZCBndWVzc2VkIG9yIGNvcGllZCBmcm9tIGFub3RoZXIgdXNlcidzIHRyYW5zY3JpcHQgcmVzb2x2ZXMgdG8gYVxuICogZGlmZmVyZW50IGtleSBhbmQgc2ltcGx5IG1pc3Nlcy4gVGhhdCBtaXNzIGlzIHdoYXQgdGhlIEhUVFAgcm91dGUgdHVybnMgaW50b1xuICogYSA0MDQsIHdoaWNoIGlzIGFsc28gdGhlIGFuc3dlciB0aGF0IGxlYWtzIHRoZSBsZWFzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hhcnRDYWNoZUtleShjaGFydElkOiBzdHJpbmcsIHVzZXJLZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiAoYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkpLmdlbmVyYXRlS2V5KFtDSEFSVF9DQUNIRV9OQU1FU1BBQ0UsIGNoYXJ0SWRdLCB1c2VyS2V5KTtcbn1cblxuLyoqXG4gKiBQZXJzaXN0IGEge0BsaW5rIENoYXJ0fSBlbnRyeSB1bmRlciBpdHMgYGNoYXJ0SWRgLCBvd25lZCBieSBgdXNlcktleWAuXG4gKiBSZWZyZXNoZXMgdGhlIFRUTCBvbiBldmVyeSB3cml0ZS4gQ2FjaGUtbGF5ZXIgZmFpbHVyZXMgYXJlIGxvZ2dlZCBhbmRcbiAqIHN3YWxsb3dlZCBzbyBiYWNrZ3JvdW5kIHJ1bm5lcnMgbmV2ZXIgdGhyb3cgaW50byB0aGVcbiAqIHVuaGFuZGxlZC1yZWplY3Rpb24gc3RyZWFtLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNoYXJ0KGVudHJ5OiBDaGFydCwgdXNlcktleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2hhcnRDYWNoZUtleShlbnRyeS5jaGFydElkLCB1c2VyS2V5KTtcbiAgICBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuc2V0KGtleSwgZW50cnksIHtcbiAgICAgIHR0bDogQ0hBUlRfQ0FDSEVfVFRMX1NFQyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJ3cml0ZS1lcnJvclwiLCB7XG4gICAgICBjaGFydElkOiBlbnRyeS5jaGFydElkLFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMb29rIHVwIGEgY2hhcnQgYHVzZXJLZXlgIG93bnMuIFJldHVybnMgYHVuZGVmaW5lZGAgb24gbWlzcywgb25cbiAqIGV4cGlyeSwgd2hlbiBhbm90aGVyIGlkZW50aXR5IG93bnMgdGhlIGlkLCBvciB3aGVuIHRoZSBjYWNoZSBsYXllciBpc1xuICogdW5oZWFsdGh5IC0gbmV2ZXIgdGhyb3dzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkQ2hhcnQoY2hhcnRJZDogc3RyaW5nLCB1c2VyS2V5OiBzdHJpbmcpOiBQcm9taXNlPENoYXJ0IHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2hhcnRDYWNoZUtleShjaGFydElkLCB1c2VyS2V5KTtcbiAgICBjb25zdCB2ID0gYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmdldDxDaGFydD4oa2V5KTtcbiAgICByZXR1cm4gdiA/PyB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwicmVhZC1lcnJvclwiLCB7XG4gICAgICBjaGFydElkLFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJlcGFyZUNoYXJ0IG9yY2hlc3RyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIElucHV0cyB0byB7QGxpbmsgcHJlcGFyZUNoYXJ0fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZUNoYXJ0T3B0aW9ucyB7XG4gIC8qKiBQbHVnaW4gY29uZmlnOyByZXNvbHZlcyB0aGUgcGxhbm5lciBhZ2VudCdzIG1vZGVsLiAqL1xuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZztcbiAgLyoqXG4gICAqIElkZW50aXR5IHRoYXQgb3ducyB0aGUgbWludGVkIGNoYXJ0LiBPbmx5IGEge0BsaW5rIGZldGNoQ2hhcnR9IGNhbGxcbiAgICogY2FycnlpbmcgdGhlIHNhbWUga2V5IHJlc29sdmVzIGl0LiBVc2Uge0BsaW5rIHJlc29sdmVVc2VyS2V5fS5cbiAgICovXG4gIHVzZXJLZXk6IHN0cmluZztcbiAgLyoqIERpc3BsYXkgdGl0bGUgZm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50LiAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGludGVudCBoaW50IGZvcndhcmRlZCB0byB0aGUgcGxhbm5lciBhZ2VudC4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcm93cyB0byBjaGFydC4gQ2FsbGVkIG9uY2UsIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgKiBBbnkgdGhyb3duIGVycm9yIGxhbmRzIGluIHRoZSBjYWNoZSBhcyB0aGUgZW50cnkncyBgZXJyb3JgXG4gICAqIGZpZWxkIChuZXZlciBwcm9wYWdhdGVkIHRvIHRoZSBjYWxsZXIgb2Yge0BsaW5rIHByZXBhcmVDaGFydH0pLlxuICAgKiBBbiBlbXB0eSBgcm93c2AgYXJyYXkgaXMgcmVqZWN0ZWQgYXMgYFwiZGF0YXNldCBoYXMgbm8gcm93cztcbiAgICogbm90aGluZyB0byBjaGFydFwiYC5cbiAgICovXG4gIHJlc29sdmVEYXRhOiAoc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8eyByb3dzOiBSZWFkb25seUFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB9PjtcbiAgLyoqXG4gICAqIFBlci1yZXF1ZXN0IGBSZXF1ZXN0Q29udGV4dGAuIEZvcndhcmRlZCB0byB0aGUgcGxhbm5lciBhZ2VudCBzb1xuICAgKiB1c2VyLXNjb3BlZCBtb2RlbCByZXNvbHV0aW9uIChPQk8pIHN0YXlzIGluIGVmZmVjdC5cbiAgICovXG4gIHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQ7XG4gIC8qKlxuICAgKiBDb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24uIEZvcndhcmRlZCB0byBgcmVzb2x2ZURhdGFgIGFuZCB0aGVcbiAgICogcGxhbm5lciBhZ2VudC4gTm90ZTogdGhlIGNoYXJ0IHRhc2sgY29udGludWVzIHJ1bm5pbmcgaW4gdGhlXG4gICAqIGJhY2tncm91bmQgYWZ0ZXIgdGhlIHBhcmVudCByZXF1ZXN0IGVuZHMsIHNvIGV4dGVybmFsIGFib3J0XG4gICAqIHNpZ25hbHMgYXJlIGJlc3QtZWZmb3J0OyB0eXBpY2FsIHVzZSBpcyB0byBsZWF2ZSB0aGlzIHVuc2V0XG4gICAqIGFuZCBsZXQgdGhlIDFoIFRUTCBjYXAgc3RhbGUgZW50cmllcy5cbiAgICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIE1pbnQgYSBgY2hhcnRJZGAsIGNhY2hlIGFuIGVtcHR5IGB7IGNoYXJ0SWQgfWAgcGxhY2Vob2xkZXJcbiAqIHN5bmNocm9ub3VzbHksIGFuZCBraWNrIG9mZiBhIGJhY2tncm91bmQgdGFzayB0aGF0IHJlc29sdmVzIHRoZVxuICogZGF0YXNldCBhbmQgcnVucyB0aGUgcGxhbm5lci4gUmV0dXJucyB0aGUgYGNoYXJ0SWRgIG9uY2UgdGhlXG4gKiBwbGFjZWhvbGRlciBsYW5kcyBzbyB0aGUgZmlyc3Qge0BsaW5rIGZldGNoQ2hhcnR9IGNhbGwgYWx3YXlzXG4gKiBzZWVzIGFuIGVudHJ5IChubyBzcHVyaW91cyA0MDQgcmFjZSkuXG4gKlxuICogVGhlIGJhY2tncm91bmQgdGFzayBzd2FsbG93cyBpdHMgb3duIGZhaWx1cmVzIGFuZCB3cml0ZXMgdGhlbVxuICogYXMgYGVycm9yYCBlbnRyaWVzLCBzbyBjYWxsZXJzIG5ldmVyIHNlZSBhIHJlamVjdGVkIHByb21pc2UuXG4gKiBDYWNoZSBzdGF0ZSBtYWNoaW5lOlxuICpcbiAqICAgLSBqdXN0IGFmdGVyIHRoaXMgY2FsbCByZXR1cm5zOiBgeyBjaGFydElkIH1gIChwcm9jZXNzaW5nKVxuICogICAtIG9uIHBsYW5uZXIgc3VjY2VzczogICAgICAgICAgIGB7IGNoYXJ0SWQsIHJlc3VsdCB9YFxuICogICAtIG9uIGRhdGEgLyBwbGFubmVyIGZhaWx1cmU6ICAgIGB7IGNoYXJ0SWQsIGVycm9yIH1gXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVwYXJlQ2hhcnQob3B0czogUHJlcGFyZUNoYXJ0T3B0aW9ucyk6IFByb21pc2U8Q2hhcnRUb29sT3V0cHV0PiB7XG4gIGNvbnN0IGNoYXJ0SWQgPSBoYXNoLmlkKCk7XG4gIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkIH0sIG9wdHMudXNlcktleSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInF1ZXVlZFwiLCB7IGNoYXJ0SWQgfSk7XG4gIC8vIEZpcmUtYW5kLWZvcmdldC4gRmFpbHVyZXMgbGFuZCBpbiB0aGUgY2FjaGUgYXMgYGVycm9yYCBlbnRyaWVzO1xuICAvLyBuZXZlciBlc2NhcGUgaW50byBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICB2b2lkIHJ1blByZXBhcmVDaGFydChjaGFydElkLCBvcHRzKTtcbiAgcmV0dXJuIHsgY2hhcnRJZCwgbWFya2VyOiBtYXJrZXJzLmZvcm1hdE1hcmtlcihcImNoYXJ0XCIsIGNoYXJ0SWQpIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blByZXBhcmVDaGFydChjaGFydElkOiBzdHJpbmcsIG9wdHM6IFByZXBhcmVDaGFydE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgb3B0cy5yZXNvbHZlRGF0YShvcHRzLnNpZ25hbCk7XG4gICAgaWYgKGRhdGEucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIkRhdGFzZXQgaGFzIG5vIHJvd3M7IG5vdGhpbmcgdG8gY2hhcnRcIik7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bkNoYXJ0UGxhbm5lcihcbiAgICAgIG9wdHMuY29uZmlnLFxuICAgICAge1xuICAgICAgICB0aXRsZTogb3B0cy50aXRsZSA/PyBcIkNoYXJ0XCIsXG4gICAgICAgIC4uLihvcHRzLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogb3B0cy5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICBkYXRhOiBkYXRhLnJvd3MgYXMgQ2hhcnRQbGFubmVyUmVxdWVzdFtcImRhdGFcIl0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAuLi4ob3B0cy5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IG9wdHMucmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdHMuc2lnbmFsID8geyBhYm9ydFNpZ25hbDogb3B0cy5zaWduYWwgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBhd2FpdCB3cml0ZUNoYXJ0KHsgY2hhcnRJZCwgcmVzdWx0IH0sIG9wdHMudXNlcktleSk7XG4gICAgbG9nZ2VyLmluZm8oXCJkb25lXCIsIHtcbiAgICAgIGNoYXJ0SWQsXG4gICAgICBjaGFydFR5cGU6IHJlc3VsdC5jaGFydFR5cGUsXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZXJyb3JcIiwgeyBjaGFydElkLCBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAvLyBUaGUgZW50cnkncyBgZXJyb3JgIGlzIHJlbmRlcmVkIGluIHRoZSBjaGF0LCBzbyBvbmx5IGFuIEFwcEtpdEVycm9yJ3NcbiAgICAvLyBvd24gbWVzc2FnZSB0cmF2ZWxzOyBhbnl0aGluZyBlbHNlIGNvdWxkIGNhcnJ5IHVwc3RyZWFtIHByb3ZpZGVyIGRldGFpbC5cbiAgICBjb25zdCBlcnJUZXh0ID0gZXJyIGluc3RhbmNlb2YgQXBwS2l0RXJyb3IgPyBlcnIubWVzc2FnZSA6IENIQVJUX0ZBSUxFRF9NRVNTQUdFO1xuICAgIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkLCBlcnJvcjogZXJyVGV4dCB9LCBvcHRzLnVzZXJLZXkpO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbG9uZy1wb2xsIGZldGNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIElucHV0cyB0byB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoQ2hhcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkZW50aXR5IHRoZSBjaGFydCBtdXN0IGJlbG9uZyB0by4gQSBjaGFydCBtaW50ZWQgdW5kZXIgYSBkaWZmZXJlbnQga2V5XG4gICAqIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gdW5rbm93biBpZC4gVXNlIHtAbGluayByZXNvbHZlVXNlcktleX0uXG4gICAqL1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBwb2xsaW5nIGJ1ZGdldCBpbiBtcy4gV2hlbiB0aGUgZW50cnkgc3RheXMgaW5cbiAgICogdGhlIHByb2Nlc3Npbmcgc3RhdGUgcGFzdCB0aGlzIHdpbmRvdywgdGhlIGhlbHBlciByZXR1cm5zIHRoZVxuICAgKiBsYXN0IHNlZW4gdmFsdWUgKHN0aWxsIHByb2Nlc3NpbmcpIHNvIHRoZSBjbGllbnQgY2FuIHJlLXBvbGwuXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0ZFVENIX1RJTUVPVVRfTVN9ICg2MHMpLlxuICAgKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogUG9sbCBpbnRlcnZhbCBpbiBtcy4gRGVmYXVsdHMgdG9cbiAgICoge0BsaW5rIERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVN9ICgyNTBtcykuXG4gICAqL1xuICBpbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uIGhhbmRsZSAoZS5nLiByZXF1ZXN0IGByZXEuc2lnbmFsYCkuICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIExvbmctcG9sbCB0aGUgY2hhcnQgY2FjaGUgdW50aWwgdGhlIGVudHJ5IHNldHRsZXMgKGByZXN1bHRgIG9yXG4gKiBgZXJyb3JgIHNldCksIHRoZSBlbnRyeSBpcyBtaXNzaW5nLCBvciB0aGUgc2VydmVyLXNpZGUgdGltZW91dFxuICogZWxhcHNlcy5cbiAqXG4gKiBSZXR1cm5zOlxuICogICAtIHRoZSByZXNvbHZlZCB7QGxpbmsgQ2hhcnR9IHdoZW4gaXQgc2V0dGxlZCwgZXJyb3JlZCwgb3JcbiAqICAgICBzdGF5ZWQgaW4gcHJvY2Vzc2luZyBwYXN0IGB0aW1lb3V0TXNgIChzbyB0aGUgY2xpZW50IGNhblxuICogICAgIHJlLXBvbGwpO1xuICogICAtIGB1bmRlZmluZWRgIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3NpbmcsIGV4cGlyZWQsIG9yIG93bmVkIGJ5XG4gKiAgICAgYW5vdGhlciBpZGVudGl0eSAodGhlIGNvbnN1bWVyIHNob3VsZCB0cmVhdCBhcyA0MDQpLlxuICpcbiAqIGBzaWduYWxgIGxldHMgdGhlIGNhbGxlciBjYW5jZWwgYWhlYWQgb2YgdGltZW91dCAoZS5nLiB0aGUgSFRUUFxuICogcmVxdWVzdCBjbG9zZWQpLiBDYW5jZWxsYXRpb24gcHJvcGFnYXRlcyB0byB0aGUgaW50ZXItcG9sbCBzbGVlcFxuICogc28gdGhlIGhlbHBlciByZXR1cm5zIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDaGFydChcbiAgY2hhcnRJZDogc3RyaW5nLFxuICBvcHRpb25zOiBGZXRjaENoYXJ0T3B0aW9ucyxcbik6IFByb21pc2U8Q2hhcnQgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucy50aW1lb3V0TXMgPz8gREVGQVVMVF9GRVRDSF9USU1FT1VUX01TO1xuICBjb25zdCBpbnRlcnZhbE1zID0gb3B0aW9ucy5pbnRlcnZhbE1zID8/IERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNcztcblxuICBsZXQgbGFzdDogQ2hhcnQgfCB1bmRlZmluZWQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgb3B0aW9ucy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgbGFzdCA9IGF3YWl0IHJlYWRDaGFydChjaGFydElkLCBvcHRpb25zLnVzZXJLZXkpO1xuICAgIGlmICghbGFzdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAobGFzdC5yZXN1bHQgIT09IHVuZGVmaW5lZCB8fCBsYXN0LmVycm9yICE9PSB1bmRlZmluZWQpIHJldHVybiBsYXN0O1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IGRlYWRsaW5lIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAocmVtYWluaW5nIDw9IDApIHJldHVybiBsYXN0O1xuICAgIGF3YWl0IGFzeW5jVXRpbHMuc2xlZXAoTWF0aC5taW4oaW50ZXJ2YWxNcywgcmVtYWluaW5nKSwgb3B0aW9ucy5zaWduYWwpO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVjaGFydHMgdGhlbWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUaGUgc2xpY2Ugb2YgYW4gRWNoYXJ0cyBvcHRpb24gdGhhdCBjYXJyaWVzIGJyYW5kIGlkZW50aXR5OiB0aGUgc2VyaWVzXG4gKiBjb2xvciBjeWNsZSBhbmQgdGhlIGJhc2UgZm9udCBzdGFjay4gRGVyaXZlZCBmcm9tIGEge0BsaW5rIEJyYW5kQ29udGV4dH1cbiAqIGJ5IHtAbGluayBicmFuZENoYXJ0VGhlbWV9IGFuZCBtZXJnZWQgaW50byBldmVyeSBzcGVjIGJ5XG4gKiB7QGxpbmsgcGxhblRvRWNoYXJ0c09wdGlvbn0uXG4gKlxuICogRGVsaWJlcmF0ZWx5IGNhcnJpZXMgbm8gdGV4dCBDT0xPUi4gQSBzcGVjIGlzIHBsYW5uZWQgaGVyZSwgb24gdGhlXG4gKiBzZXJ2ZXIsIGFuZCByZWFkIGxhdGVyIGluIGEgYnJvd3NlciB3aG9zZSBsaWdodC9kYXJrIHRoZW1lIHRoaXMgY29kZVxuICogY2Fubm90IGtub3c7IGJha2luZyBpbiB0aGUgYnJhbmQncyBzaW5nbGUgKGxpZ2h0KSBmb3JlZ3JvdW5kIHByb2R1Y2VkXG4gKiBuZWFyLWJsYWNrIGxhYmVscyB0aGF0IGRpc2FwcGVhcmVkIGFnYWluc3QgYSBkYXJrIGNoYXQgc3VyZmFjZS4gVGhlXG4gKiByZW5kZXJlciByZXNvbHZlcyBjaHJvbWUgY29sb3JzIGZyb20gQXBwS2l0J3MgbGl2ZSBDU1MgdG9rZW5zIGluc3RlYWRcbiAqIChgQGRieC10b29scy91aS1tYXN0cmFgJ3MgYGNoYXJ0LXRoZW1lYCArIGBub3JtYWxpemVDaGFydE9wdGlvbmApLFxuICogbGVhdmluZyB0aGlzIHRoZW1lIHRoZSBwYXJ0cyB0aGF0IHJlYWQgdGhlIHNhbWUgaW4gZWl0aGVyIG1vZGUuXG4gKi9cbmludGVyZmFjZSBDaGFydFRoZW1lIHtcbiAgY29sb3I6IHN0cmluZ1tdO1xuICB0ZXh0U3R5bGU6IHsgZm9udEZhbWlseTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQXBwS2l0J3MgY2F0ZWdvcmljYWwgY2hhcnQgcGFsZXR0ZSAoYC0tY2hhcnQtY2F0LTFgIC4uIGAtLWNoYXJ0LWNhdC04YCBmcm9tXG4gKiBgQGRhdGFicmlja3MvYXBwa2l0LXVpYCksIGFzIGhleC4gU2VydmVyLXJlbmRlcmVkIGNoYXJ0IHNwZWNzIGNhbm5vdCByZWFkIHRoZVxuICogYnJvd3NlcidzIENTUyBjdXN0b20gcHJvcGVydGllcywgc28gdGhlIHZhbHVlcyBhcmUgbWlycm9yZWQgaGVyZSB0byBrZWVwIGFcbiAqIGdlbmVyYXRlZCBjaGFydCB2aXN1YWxseSBjb25zaXN0ZW50IHdpdGggdGhlIEFwcEtpdC1zdHlsZWQgVUkgYXJvdW5kIGl0LlxuICogS2VlcCBpbiBzeW5jIHdpdGggQXBwS2l0J3Mgc3R5bGVzaGVldCBpZiBpdCBjaGFuZ2VzLlxuICovXG5jb25zdCBBUFBLSVRfQ0hBUlRfUEFMRVRURSA9IFtcbiAgXCIjMjQ2M0VCXCIsIC8vIGJsdWVcbiAgXCIjMkVCODhBXCIsIC8vIHRlYWxcbiAgXCIjQUI0N0JEXCIsIC8vIHB1cnBsZVxuICBcIiNGNjlFMjNcIiwgLy8gYW1iZXJcbiAgXCIjREQyQzREXCIsIC8vIHJvc2VcbiAgXCIjMUJBM0JCXCIsIC8vIGN5YW5cbiAgXCIjOUI2MUQxXCIsIC8vIGxhdmVuZGVyXG4gIFwiIzM0QjI2MlwiLCAvLyBlbWVyYWxkXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIEV4cGFuZCB0d28gYnJhbmQgaGV4IGNvbG9ycyBpbnRvIGEgbGVnaWJsZSBjYXRlZ29yaWNhbCBjeWNsZS4gRWNoYXJ0c1xuICogcmVwZWF0cyB0aGUgYGNvbG9yYCBhcnJheSBhY3Jvc3Mgc2VyaWVzIC8gY2F0ZWdvcmllcywgc28gYSBnb29kIGRlZmF1bHRcbiAqIG5lZWRzIHNldmVyYWwgZGlzdGluY3QgaHVlcywgbm90IHR3by4gV2Ugc2VlZCB3aXRoIHRoZSBicmFuZCBwcmltYXJ5IGFuZFxuICogYWNjZW50ICh0aGUgaWRlbnRpdHkgY29sb3JzKSBhbmQgZm9sbG93IHdpdGggQXBwS2l0J3Mgb3duIGNhdGVnb3JpY2FsIGNoYXJ0XG4gKiBwYWxldHRlLCBzbyBtdWx0aS1zZXJpZXMgLyBtYW55LXNsaWNlIGNoYXJ0cyBzdGF5IHJlYWRhYmxlIGFuZCBtYXRjaCB0aGVcbiAqIHN1cnJvdW5kaW5nIEFwcEtpdCBVSSB3aGlsZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBtYXJrcyBsYW5kIG9uLWJyYW5kLlxuICovXG5mdW5jdGlvbiBicmFuZENvbG9yQ3ljbGUocHJpbWFyeTogc3RyaW5nLCBhY2NlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc3ByZWFkID0gQVBQS0lUX0NIQVJUX1BBTEVUVEU7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcmV0dXJuIFtwcmltYXJ5LCBhY2NlbnQsIC4uLnNwcmVhZF0uZmlsdGVyKChjKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYy50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQoa2V5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGVyaXZlIGFuIEVjaGFydHMge0BsaW5rIENoYXJ0VGhlbWV9IGZyb20gYSBicmFuZCBjb250ZXh0OiB0aGUgcHJpbWFyeSArXG4gKiBhY2NlbnQgY29sb3JzIHNlZWQgdGhlIHNlcmllcyBjeWNsZSBhbmQgdGhlIHNhbnMgc3RhY2sgYmVjb21lcyB0aGUgYmFzZVxuICogZm9udC4gVGV4dCBjb2xvcnMgYXJlIHRoZSByZW5kZXJlcidzIGpvYiAtIHNlZSB7QGxpbmsgQ2hhcnRUaGVtZX0uXG4gKi9cbmZ1bmN0aW9uIGJyYW5kQ2hhcnRUaGVtZShicmFuZDogQnJhbmRDb250ZXh0KTogQ2hhcnRUaGVtZSB7XG4gIHJldHVybiB7XG4gICAgY29sb3I6IGJyYW5kQ29sb3JDeWNsZShicmFuZC5jb2xvcnMucHJpbWFyeSwgYnJhbmQuY29sb3JzLmFjY2VudCksXG4gICAgdGV4dFN0eWxlOiB7IGZvbnRGYW1pbHk6IGJyYW5kLnR5cG9ncmFwaHkuc2FucyB9LFxuICB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlY2hhcnRzIGV4cGFuc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG50eXBlIE5hbWVkU2xpY2UgPSB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IG51bWJlciB9O1xudHlwZSBTY2F0dGVyUG9pbnQgPSBbbnVtYmVyLCBudW1iZXJdO1xudHlwZSBIZWF0bWFwQ2VsbCA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuLyoqIEtlZXAgb25seSBge25hbWUsIHZhbHVlfWAgc2xpY2VzOyBkcm9wIG51bGxzIC8gYmFyZSBudW1iZXJzIC8gdHVwbGVzLiAqL1xuZnVuY3Rpb24gbmFtZWRTbGljZXMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogTmFtZWRTbGljZVtdIHtcbiAgcmV0dXJuIGRhdGEuZmlsdGVyKFxuICAgIChkKTogZCBpcyBOYW1lZFNsaWNlID0+IGQgIT09IG51bGwgJiYgdHlwZW9mIGQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZCksXG4gICk7XG59XG5cbi8qKiBLZWVwIG9ubHkgZmluaXRlIG51bWJlcnMgKGNhdGVnb3J5IC8gcmFkYXIgLyB3YXRlcmZhbGwgc2VyaWVzKS4gKi9cbmZ1bmN0aW9uIG51bWVyaWNQb2ludHMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogbnVtYmVyW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoKGQpOiBkIGlzIG51bWJlciA9PiB0eXBlb2YgZCA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUoZCkpO1xufVxuXG4vKiogS2VlcCBvbmx5IGBbeCwgeV1gIHNjYXR0ZXIgdHVwbGVzLiAqL1xuZnVuY3Rpb24gc2NhdHRlclBvaW50cyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBTY2F0dGVyUG9pbnRbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcihcbiAgICAoZCk6IGQgaXMgU2NhdHRlclBvaW50ID0+IEFycmF5LmlzQXJyYXkoZCkgJiYgZC5sZW5ndGggPT09IDIsXG4gICkgYXMgU2NhdHRlclBvaW50W107XG59XG5cbi8qKiBLZWVwIG9ubHkgYFt4SW5kZXgsIHlJbmRleCwgdmFsdWVdYCBoZWF0bWFwIGNlbGxzLiAqL1xuZnVuY3Rpb24gaGVhdG1hcENlbGxzKGRhdGE6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdW1wiZGF0YVwiXSk6IEhlYXRtYXBDZWxsW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoKGQpOiBkIGlzIEhlYXRtYXBDZWxsID0+IEFycmF5LmlzQXJyYXkoZCkgJiYgZC5sZW5ndGggPT09IDMpIGFzIEhlYXRtYXBDZWxsW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGhlYXRtYXAncyBjZWxscyBhbmQgcm93IGxhYmVscyBmcm9tIGVpdGhlciBzaGFwZSB0aGVcbiAqIHBsYW5uZXIgbWF5IHByb2R1Y2UuXG4gKlxuICogVGhlIGRvY3VtZW50ZWQgc2hhcGUgaXMgT05FIHNlcmllcyBvZiBgW3hJbmRleCwgeUluZGV4LCB2YWx1ZV1gXG4gKiB0cmlwbGVzLCBidXQgaW5kZXggYXJpdGhtZXRpYyBpcyBleGFjdGx5IHRoZSBraW5kIG9mIGJvb2trZWVwaW5nIGFcbiAqIGZhc3QgbW9kZWwgZ2V0cyB3cm9uZywgYW5kIHRoZSBmYWlsdXJlIGlzIHNpbGVudCAoZXZlcnkgY2VsbCBpc1xuICogZHJvcHBlZCBhbmQgdGhlIGdyaWQgcmVuZGVycyBlbXB0eSkuIFNvIHRoZSByb3ctcGVyLXNlcmllcyBzaGFwZSBpdFxuICogYWxyZWFkeSBwcm9kdWNlcyByZWxpYWJseSBmb3IgYmFyIGNoYXJ0cyAtIG9uZSBzZXJpZXMgcGVyIG1hdHJpeFxuICogcm93LCBudW1iZXJzIGFsaWduZWQgdG8gYGNhdGVnb3JpZXNgIC0gaXMgYWNjZXB0ZWQgdG9vIGFuZCB0dXJuZWRcbiAqIGludG8gdHJpcGxlcyBoZXJlLlxuICpcbiAqIFJvdyBvcmRlciByZWFkcyB0b3AtdG8tYm90dG9tOiBFY2hhcnRzJyBjYXRlZ29yeSB5LWF4aXMgY291bnRzIGluZGV4XG4gKiAwIGZyb20gdGhlIEJPVFRPTSwgc28gYSByb3ctZGVyaXZlZCBtYXRyaXggcmV2ZXJzZXMgYm90aCB0aGUgYXhpc1xuICogbGFiZWxzIGFuZCB0aGUgcm93IGluZGljZXMsIHB1dHRpbmcgdGhlIGZpcnN0IHNlcmllcyBhdCB0aGUgdG9wIHRoZVxuICogd2F5IHRoZSBtb2RlbCBsaXN0ZWQgaXQuXG4gKi9cbmZ1bmN0aW9uIGhlYXRtYXBNYXRyaXgocGxhbjogQ2hhcnRQbGFuKTogeyBjZWxsczogSGVhdG1hcENlbGxbXTsgeUNhdGVnb3JpZXM6IHN0cmluZ1tdIH0ge1xuICBjb25zdCB0cmlwbGVzID0gaGVhdG1hcENlbGxzKHBsYW4uc2VyaWVzWzBdPy5kYXRhID8/IFtdKTtcbiAgaWYgKHRyaXBsZXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7IGNlbGxzOiB0cmlwbGVzLCB5Q2F0ZWdvcmllczogcGxhbi55Q2F0ZWdvcmllcyA/PyBbXSB9O1xuICB9XG4gIGNvbnN0IHJvd3MgPSBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7IG5hbWU6IHMubmFtZSwgdmFsdWVzOiBudW1lcmljUG9pbnRzKHMuZGF0YSkgfSkpO1xuICBjb25zdCBsYWJlbHMgPSBwbGFuLnlDYXRlZ29yaWVzID8/IHJvd3MubWFwKChyKSA9PiByLm5hbWUpO1xuICBjb25zdCBsYXN0Um93ID0gcm93cy5sZW5ndGggLSAxO1xuICByZXR1cm4ge1xuICAgIGNlbGxzOiByb3dzLmZsYXRNYXAoKHJvdywgcm93SW5kZXgpID0+XG4gICAgICByb3cudmFsdWVzLm1hcCgodmFsdWUsIGNvbHVtbkluZGV4KTogSGVhdG1hcENlbGwgPT4gW2NvbHVtbkluZGV4LCBsYXN0Um93IC0gcm93SW5kZXgsIHZhbHVlXSksXG4gICAgKSxcbiAgICB5Q2F0ZWdvcmllczogWy4uLmxhYmVsc10ucmV2ZXJzZSgpLFxuICB9O1xufVxuXG4vKiogU2VxdWVudGlhbCBsaWdodC10by1icmFuZCByYW1wIGZvciBoZWF0bWFwIGludGVuc2l0eS4gKi9cbmNvbnN0IEhFQVRNQVBfUkFNUCA9IFtcIiNFQUYxRkVcIiwgXCIjOUNCREY3XCIsIFwiIzRDODZFRVwiLCBcIiMyNDYzRUJcIiwgXCIjMTQzODdGXCJdO1xuXG4vKiogQWJvdmUgdGhpcyBtYW55IGNlbGxzLCBwcmludGVkIHZhbHVlcyBvdmVybGFwIGFuZCBhcmUgc3VwcHJlc3NlZC4gKi9cbmNvbnN0IEhFQVRNQVBfTEFCRUxfTUFYX0NFTExTID0gNjA7XG5cbi8qKiBSaXNpbmcgc3RlcCBmaWxsIChlbWVyYWxkKSBhbmQgZmFsbGluZyBzdGVwIGZpbGwgKHJvc2UpLiAqL1xuY29uc3QgV0FURVJGQUxMX0lOQ1JFQVNFX0NPTE9SID0gXCIjMkVCODhBXCI7XG5jb25zdCBXQVRFUkZBTExfREVDUkVBU0VfQ09MT1IgPSBcIiNERDJDNERcIjtcblxuLyoqIFNlcmllcyBuYW1lcyB0aGUgd2F0ZXJmYWxsIGV4cGFuc2lvbiBlbWl0cy4gKi9cbmNvbnN0IFdBVEVSRkFMTF9IRUxQRVJfTkFNRSA9IFwiUnVubmluZyB0b3RhbFwiO1xuY29uc3QgV0FURVJGQUxMX0lOQ1JFQVNFX05BTUUgPSBcIkluY3JlYXNlXCI7XG5jb25zdCBXQVRFUkZBTExfREVDUkVBU0VfTkFNRSA9IFwiRGVjcmVhc2VcIjtcblxuLyoqXG4gKiBBIG1vZGVsIGFza2VkIGZvciBhIGJyaWRnZSBvZnRlbiBidWlsZHMgdGhlIHJ1bm5pbmcgdG90YWwgaXRzZWxmIGFuZFxuICogaGFuZHMgYmFjayBhIGN1bXVsYXRpdmUtYmFzZSBzZXJpZXMgYWxvbmdzaWRlIHRoZSBkZWx0YXMgLSB3aGljaFxuICogcmVuZGVycyBhcyB0d28gcGxhaW4gYmFyIHNlcmllcywgbm90IGEgd2F0ZXJmYWxsICh0aGUgYmFzZSBiYXJzIGFyZVxuICogdGhlIHRhbGwgb25lcykuIFRoZSBiYXNlIGlzIHJlY29nbml6YWJsZSBieSBuYW1lLCBzbyBpdCBpcyBkcm9wcGVkXG4gKiBoZXJlIGFuZCB0aGUgcnVubmluZyB0b3RhbCByZWNvbXB1dGVkIGZyb20gdGhlIGRlbHRhcy5cbiAqL1xuY29uc3QgV0FURVJGQUxMX0JBU0VfTkFNRSA9IC9cXGIoYmFzZXxjdW11bGF0aXZlfHJ1bm5pbmd8aGVscGVyfHRvdGFsfHN0YXJ0KGluZyk/KVxcYi9pO1xuXG4vKipcbiAqIFBpY2sgdGhlIHNpZ25lZC1kZWx0YSBzZXJpZXMgb3V0IG9mIGEgd2F0ZXJmYWxsIHBsYW4sIGlnbm9yaW5nIGFueVxuICogY3VtdWxhdGl2ZS1iYXNlIHNlcmllcyB0aGUgcGxhbm5lciBidWlsdCBieSBoYW5kXG4gKiAoe0BsaW5rIFdBVEVSRkFMTF9CQVNFX05BTUV9KS4gRmFsbHMgYmFjayB0byB0aGUgZmlyc3Qgc2VyaWVzIHdoZW5cbiAqIGV2ZXJ5IG5hbWUgbG9va3MgbGlrZSBhIGJhc2UsIHNpbmNlIGRyb3BwaW5nIHRoZW0gYWxsIHdvdWxkIGxlYXZlXG4gKiBub3RoaW5nIHRvIHBsb3QuXG4gKi9cbmZ1bmN0aW9uIHdhdGVyZmFsbERlbHRhU2VyaWVzKFxuICBzZXJpZXM6IENoYXJ0UGxhbltcInNlcmllc1wiXSxcbik6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNlcmllcy5maW5kKChzKSA9PiAhV0FURVJGQUxMX0JBU0VfTkFNRS50ZXN0KHMubmFtZSkpID8/IHNlcmllc1swXTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgc3RhY2tlZCB0cmFuc3BhcmVudC1iYXNlICsgaW5jcmVhc2UgKyBkZWNyZWFzZSBzZXJpZXMgdGhhdFxuICogRWNoYXJ0cyB1c2VzIGZvciBhIHdhdGVyZmFsbCAoaXQgaGFzIG5vIG5hdGl2ZSB3YXRlcmZhbGwgdHlwZSkuXG4gKiBWYWx1ZXMgYXJlIHNpZ25lZCBkZWx0YXM7IHRoZSB0cmFuc3BhcmVudCBoZWxwZXIgY2FycmllcyB0aGUgcnVubmluZ1xuICogdG90YWwgc28gZWFjaCB2aXNpYmxlIGJhciBzdGFydHMgd2hlcmUgdGhlIHByZXZpb3VzIG9uZSBlbmRlZC5cbiAqXG4gKiBUaGUgaGVscGVyIGlzIGBzaWxlbnRgLCBzbyB3aXRoIGFuIGl0ZW0tdHJpZ2dlcmVkIHRvb2x0aXAgaXQgaXNcbiAqIGludmlzaWJsZSB0byBib3RoIHRoZSBleWUgYW5kIHRoZSBwb2ludGVyIC0gdGhlIGFsdGVybmF0aXZlLCBhbiBheGlzXG4gKiB0b29sdGlwIHRoYXQgaGlkZXMgdGhlIGhlbHBlciByb3csIG5lZWRzIGEgZnVuY3Rpb24gZm9ybWF0dGVyLCBhbmRcbiAqIHRoaXMgc3BlYyBoYXMgdG8gc3Vydml2ZSBKU09OIHNlcmlhbGl6YXRpb24gdG8gdGhlIGJyb3dzZXIuXG4gKi9cbmZ1bmN0aW9uIHdhdGVyZmFsbFNlcmllcyh2YWx1ZXM6IG51bWJlcltdKTogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgaGVscGVyczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgaW5jcmVhc2VzOiBBcnJheTxudW1iZXIgfCBcIi1cIj4gPSBbXTtcbiAgY29uc3QgZGVjcmVhc2VzOiBBcnJheTxudW1iZXIgfCBcIi1cIj4gPSBbXTtcbiAgbGV0IGN1bXVsYXRpdmUgPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZSA+PSAwKSB7XG4gICAgICBoZWxwZXJzLnB1c2goY3VtdWxhdGl2ZSk7XG4gICAgICBpbmNyZWFzZXMucHVzaCh2YWx1ZSk7XG4gICAgICBkZWNyZWFzZXMucHVzaChcIi1cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlbHBlcnMucHVzaChjdW11bGF0aXZlICsgdmFsdWUpO1xuICAgICAgaW5jcmVhc2VzLnB1c2goXCItXCIpO1xuICAgICAgZGVjcmVhc2VzLnB1c2goLXZhbHVlKTtcbiAgICB9XG4gICAgY3VtdWxhdGl2ZSArPSB2YWx1ZTtcbiAgfVxuICBjb25zdCB0cmFuc3BhcmVudCA9IHsgYm9yZGVyQ29sb3I6IFwidHJhbnNwYXJlbnRcIiwgY29sb3I6IFwidHJhbnNwYXJlbnRcIiB9O1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9IRUxQRVJfTkFNRSxcbiAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICBzdGFjazogXCJ0b3RhbFwiLFxuICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgaXRlbVN0eWxlOiB0cmFuc3BhcmVudCxcbiAgICAgIGVtcGhhc2lzOiB7IGl0ZW1TdHlsZTogdHJhbnNwYXJlbnQgfSxcbiAgICAgIGRhdGE6IGhlbHBlcnMsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBXQVRFUkZBTExfSU5DUkVBU0VfTkFNRSxcbiAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICBzdGFjazogXCJ0b3RhbFwiLFxuICAgICAgaXRlbVN0eWxlOiB7IGNvbG9yOiBXQVRFUkZBTExfSU5DUkVBU0VfQ09MT1IgfSxcbiAgICAgIGRhdGE6IGluY3JlYXNlcyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9ERUNSRUFTRV9OQU1FLFxuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIHN0YWNrOiBcInRvdGFsXCIsXG4gICAgICBpdGVtU3R5bGU6IHsgY29sb3I6IFdBVEVSRkFMTF9ERUNSRUFTRV9DT0xPUiB9LFxuICAgICAgZGF0YTogZGVjcmVhc2VzLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICogRXhwYW5kIGEge0BsaW5rIENoYXJ0UGxhbn0gaW50byBhIGZ1bGwgRWNoYXJ0cyBgRUNoYXJ0c09wdGlvbmBcbiAqIEpTT04uIENlbnRyYWxpemVkIGhlcmUgc28gdGhlIHBsYW5uZXIgYWdlbnQgb25seSBmaWxscyBpbiB0aGVcbiAqIGNvbXBhY3QgcGxhbiBzaGFwZTsgdG9vbHRpcCAvIGFuaW1hdGlvbiAvIGNvbG9yIC8gZ3JpZCBkZWZhdWx0c1xuICogc3RheSBjb25zaXN0ZW50IGFjcm9zcyBjaGFydHMgYW5kIGFyZSBlYXN5IHRvIHR1bmUgd2l0aG91dFxuICogcmV0cmFpbmluZyBtb2RlbCBiZWhhdmlvdXIuXG4gKlxuICogV2hlbiBgYnJhbmRgIGlzIHNldCwgdGhlIHJlc29sdmVkIHNwZWMgaXMgdGhlbWVkIHdpdGggdGhlIGJyYW5kJ3Mgc2VyaWVzXG4gKiBjb2xvciBjeWNsZSBhbmQgYmFzZSB0ZXh0IHN0eWxlIChzZWUge0BsaW5rIGJyYW5kQ2hhcnRUaGVtZX0pOyBvdGhlcndpc2VcbiAqIEVjaGFydHMnIGRlZmF1bHRzIGFwcGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGxhblRvRWNoYXJ0c09wdGlvbihcbiAgaW5wdXQ6IENoYXJ0UGxhbklucHV0LFxuICBmYWxsYmFja1RpdGxlOiBzdHJpbmcsXG4gIGJyYW5kPzogQnJhbmRDb250ZXh0LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBwbGFuID0gY2hhcnRQbGFuU2NoZW1hLnBhcnNlKGlucHV0KTtcbiAgY29uc3QgYmFzZVRpdGxlID0gcGxhbi50aXRsZSA/PyBmYWxsYmFja1RpdGxlO1xuICBjb25zdCBncmlkID0geyBsZWZ0OiA0OCwgcmlnaHQ6IDI0LCB0b3A6IDU2LCBib3R0b206IDQ4LCBjb250YWluTGFiZWw6IHRydWUgfTtcbiAgY29uc3QgdGhlbWUgPSBicmFuZCA/IGJyYW5kQ2hhcnRUaGVtZShicmFuZCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRoZW1lZCA9IChvcHRpb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgICB0aGVtZSA/IHsgLi4udGhlbWUsIC4uLm9wdGlvbiB9IDogb3B0aW9uO1xuICBjb25zdCB0aXRsZSA9IHsgdGV4dDogYmFzZVRpdGxlLCBsZWZ0OiBcImNlbnRlclwiIH07XG4gIGNvbnN0IGxlZ2VuZCA9IHsgYm90dG9tOiAwIH07XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgLy8gVGhlIG9wdGlvbiBhcnJpdmVzIGFzIGEgSlNPTiBTVFJJTkcsIG5vdCBhIG5lc3RlZCBvYmplY3Q6IHRoaXMgcGxhbiBpc1xuICAgIC8vIHRoZSBwbGFubmVyJ3MgcHJvdmlkZXItZW5mb3JjZWQgc3RydWN0dXJlZCBvdXRwdXQsIGFuZCBhIGZyZWUtZm9ybVxuICAgIC8vIG9iamVjdCBiZWNvbWVzIGFuIHVuY29uc3RyYWluZWQgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCBzY2hlbWEgdGhhdFxuICAgIC8vIHN0cmljdCBPcGVuQUkgYW5kIEdlbWluaSBlbmRwb2ludHMgcmVqZWN0IC0gd2hpY2ggd291bGQgYnJlYWsgRVZFUllcbiAgICAvLyBjaGFydCwgbm90IGp1c3QgdGhpcyBvbmUgKHNhbWUgY2xhc3Mgb2YgaGF6YXJkIGFzIHRoZSBgcHJlZml4SXRlbXNgXG4gICAgLy8gbm90ZSBvbiBgY2hhcnREYXRhUG9pbnRTY2hlbWFgKS4gQSBtYWxmb3JtZWQgc3RyaW5nIGNvc3RzIG9uZSBjaGFydC5cbiAgICAvLyBOb3RoaW5nIGhlcmUgaXMgZXZhbCdkOyBhIHN0cmluZy12YWx1ZWQgRWNoYXJ0cyBmb3JtYXR0ZXIgaXMgYVxuICAgIC8vIHRlbXBsYXRlLCBub3QgY29kZS5cbiAgICBjb25zdCBvcHRpb24gPSBqc29uLnBhcnNlUmVjb3JkKHBsYW4ub3B0aW9uKTtcbiAgICBpZiAoIW9wdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGFydFR5cGUgXCJjdXN0b21cIiBuZWVkcyBhbiBgb3B0aW9uYCBob2xkaW5nIGEgSlNPTiBvYmplY3QnKTtcbiAgICB9XG4gICAgLy8gVGl0bGUgaXMgdGhlIG9uZSBkZWZhdWx0IHdvcnRoIGZpbGxpbmc6IGV2ZXJ5IG90aGVyIGJyYW5jaCBndWFyYW50ZWVzXG4gICAgLy8gb25lIGFuZCB0aGUgcmVuZGVyZXIgcmVzZXJ2ZXMgZ3JpZCBzcGFjZSBmb3IgaXQuIEEgdGl0bGUgdGhlIG1vZGVsIHNldFxuICAgIC8vIHdpbnMsIGFzIGRvZXMgZXZlcnkgb3RoZXIgZmllbGQgaXQgZGVjbGFyZWQuXG4gICAgcmV0dXJuIHRoZW1lZCh7IHRpdGxlLCAuLi5vcHRpb24gfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwicGllXCIgfHwgcGxhbi5jaGFydFR5cGUgPT09IFwiZnVubmVsXCIgfHwgcGxhbi5jaGFydFR5cGUgPT09IFwidHJlZW1hcFwiKSB7XG4gICAgY29uc3Qgc2xpY2VzID0gbmFtZWRTbGljZXMocGxhbi5zZXJpZXNbMF0/LmRhdGEgPz8gW10pO1xuICAgIGNvbnN0IHNlcmllc1R5cGUgPSBwbGFuLmNoYXJ0VHlwZTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kOiBzZXJpZXNUeXBlID09PSBcInRyZWVtYXBcIiA/IHVuZGVmaW5lZCA6IGxlZ2VuZCxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcGxhbi5zZXJpZXNbMF0/Lm5hbWUgPz8gYmFzZVRpdGxlLFxuICAgICAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICAgICAgLi4uKHNlcmllc1R5cGUgPT09IFwicGllXCIgPyB7IHJhZGl1czogW1wiMzUlXCIsIFwiNjUlXCJdIH0gOiB7fSksXG4gICAgICAgICAgLi4uKHNlcmllc1R5cGUgPT09IFwiZnVubmVsXCIgPyB7IHNvcnQ6IFwiZGVzY2VuZGluZ1wiIH0gOiB7fSksXG4gICAgICAgICAgZGF0YTogc2xpY2VzLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJzY2F0dGVyXCIpIHtcbiAgICAvLyBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCBzY2F0dGVyIHBvaW50cyAtIGtlZXAgb25seSB2YWxpZFxuICAgIC8vIGBbeCwgeV1gIHR1cGxlcy4gQmFyZSBudW1iZXJzIC8gb2JqZWN0cyAvIG51bGxzIGZyb20gYVxuICAgIC8vIG1pc21hdGNoZWQgcGxhbiBnZXQgZHJvcHBlZCBzaWxlbnRseS5cbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kLFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi54QXhpc0xhYmVsIH0sXG4gICAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgdHlwZTogXCJzY2F0dGVyXCIsXG4gICAgICAgIGRhdGE6IHNjYXR0ZXJQb2ludHMocy5kYXRhKSxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJoZWF0bWFwXCIpIHtcbiAgICBjb25zdCB7IGNlbGxzLCB5Q2F0ZWdvcmllcyB9ID0gaGVhdG1hcE1hdHJpeChwbGFuKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBjZWxscy5tYXAoKGMpID0+IGNbMl0pO1xuICAgIGNvbnN0IG1pbiA9IHZhbHVlcy5sZW5ndGggPiAwID8gTWF0aC5taW4oLi4udmFsdWVzKSA6IDA7XG4gICAgY29uc3QgbWF4ID0gdmFsdWVzLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi52YWx1ZXMpIDogMTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyBwb3NpdGlvbjogXCJ0b3BcIiB9LFxuICAgICAgLy8gVGhlIHZpc3VhbE1hcCByYW1wIHNpdHMgYmVsb3cgdGhlIHBsb3QsIHNvIHRoZSBncmlkIGdpdmVzIHVwXG4gICAgICAvLyBtb3JlIGJvdHRvbSByb29tIHRoYW4gYW4gYXhpcy1vbmx5IGNoYXJ0IG5lZWRzLlxuICAgICAgZ3JpZDogeyAuLi5ncmlkLCBib3R0b206IDcyIH0sXG4gICAgICB4QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgICAgICBzcGxpdEFyZWE6IHsgc2hvdzogdHJ1ZSB9LFxuICAgICAgfSxcbiAgICAgIHlBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogeUNhdGVnb3JpZXMsXG4gICAgICAgIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCxcbiAgICAgICAgc3BsaXRBcmVhOiB7IHNob3c6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgICB2aXN1YWxNYXA6IHtcbiAgICAgICAgLy8gRWNoYXJ0cyBoaWRlcyBldmVyeSBjZWxsIHdoZW4gbWluID09PSBtYXggKGEgdW5pZm9ybSBtYXRyaXgpLFxuICAgICAgICAvLyBzbyBhIGRlZ2VuZXJhdGUgcmFuZ2UgaXMgd2lkZW5lZCBieSBvbmUuXG4gICAgICAgIG1pbixcbiAgICAgICAgbWF4OiBtYXggPiBtaW4gPyBtYXggOiBtaW4gKyAxLFxuICAgICAgICBjYWxjdWxhYmxlOiB0cnVlLFxuICAgICAgICBvcmllbnQ6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICBsZWZ0OiBcImNlbnRlclwiLFxuICAgICAgICBib3R0b206IDgsXG4gICAgICAgIGluUmFuZ2U6IHsgY29sb3I6IEhFQVRNQVBfUkFNUCB9LFxuICAgICAgfSxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcGxhbi5zZXJpZXNbMF0/Lm5hbWUgPz8gYmFzZVRpdGxlLFxuICAgICAgICAgIHR5cGU6IFwiaGVhdG1hcFwiLFxuICAgICAgICAgIGRhdGE6IGNlbGxzLFxuICAgICAgICAgIC8vIFByaW50ZWQgY2VsbCB2YWx1ZXMgYXJlIHVucmVhZGFibGUgb25jZSB0aGUgZ3JpZCBpcyBkZW5zZS5cbiAgICAgICAgICBsYWJlbDogeyBzaG93OiBjZWxscy5sZW5ndGggPD0gSEVBVE1BUF9MQUJFTF9NQVhfQ0VMTFMgfSxcbiAgICAgICAgICBlbXBoYXNpczogeyBpdGVtU3R5bGU6IHsgc2hhZG93Qmx1cjogMTAsIHNoYWRvd0NvbG9yOiBcInJnYmEoMCwgMCwgMCwgMC4zKVwiIH0gfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwicmFkYXJcIikge1xuICAgIGNvbnN0IGluZGljYXRvcnMgPSAocGxhbi5jYXRlZ29yaWVzID8/IFtdKS5tYXAoKG5hbWUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwZWFrID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIC4uLnBsYW4uc2VyaWVzLm1hcCgocykgPT4ge1xuICAgICAgICAgIGNvbnN0IG51bXMgPSBudW1lcmljUG9pbnRzKHMuZGF0YSk7XG4gICAgICAgICAgcmV0dXJuIG51bXNbaW5kZXhdID8/IDA7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IG5hbWUsIG1heDogcGVhayA+IDAgPyBwZWFrIDogMSB9O1xuICAgIH0pO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiaXRlbVwiIH0sXG4gICAgICBsZWdlbmQsXG4gICAgICByYWRhcjogeyBpbmRpY2F0b3I6IGluZGljYXRvcnMgfSxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJyYWRhclwiLFxuICAgICAgICAgIGRhdGE6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBudW1lcmljUG9pbnRzKHMuZGF0YSksXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJ3YXRlcmZhbGxcIikge1xuICAgIGNvbnN0IHZhbHVlcyA9IG51bWVyaWNQb2ludHMod2F0ZXJmYWxsRGVsdGFTZXJpZXMocGxhbi5zZXJpZXMpPy5kYXRhID8/IFtdKTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgLy8gSXRlbS10cmlnZ2VyZWQgc28gdGhlIHRyYW5zcGFyZW50IGBzaWxlbnRgIG9mZnNldCBiYXJzIG5ldmVyXG4gICAgICAvLyBzdXJmYWNlIGluIGEgdG9vbHRpcCAoc2VlIGB3YXRlcmZhbGxTZXJpZXNgKS5cbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIC8vIE9ubHkgdGhlIHR3byB2aXNpYmxlIHN0ZXBzIGJlbG9uZyBpbiB0aGUgbGVnZW5kLlxuICAgICAgbGVnZW5kOiB7IC4uLmxlZ2VuZCwgZGF0YTogW1dBVEVSRkFMTF9JTkNSRUFTRV9OQU1FLCBXQVRFUkZBTExfREVDUkVBU0VfTkFNRV0gfSxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgICAgfSxcbiAgICAgIHlBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgICBzZXJpZXM6IHdhdGVyZmFsbFNlcmllcyh2YWx1ZXMpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImhvcml6b250YWxCYXJcIikge1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiYXhpc1wiLCBheGlzUG9pbnRlcjogeyB0eXBlOiBcInNoYWRvd1wiIH0gfSxcbiAgICAgIGxlZ2VuZCxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCB9LFxuICAgICAgeUF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCxcbiAgICAgIH0sXG4gICAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICB0eXBlOiBcImJhclwiLFxuICAgICAgICBkYXRhOiBzLmRhdGEsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwiY29tYm9cIikge1xuICAgIGNvbnN0IHVzZXNSaWdodEF4aXMgPSBwbGFuLnNlcmllcy5zb21lKChzKSA9PiBzLnlBeGlzSW5kZXggPT09IDEpO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiYXhpc1wiIH0sXG4gICAgICBsZWdlbmQsXG4gICAgICBncmlkLFxuICAgICAgeEF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCxcbiAgICAgIH0sXG4gICAgICB5QXhpczogdXNlc1JpZ2h0QXhpc1xuICAgICAgICA/IFtcbiAgICAgICAgICAgIHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICAgICAgICAgIHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHMudHlwZSA/PyBcImJhclwiO1xuICAgICAgICBjb25zdCBzZXJpZXNUeXBlID0gbWFyayA9PT0gXCJhcmVhXCIgPyBcImxpbmVcIiA6IG1hcms7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICAgICAgZGF0YTogcy5kYXRhLFxuICAgICAgICAgIHlBeGlzSW5kZXg6IHMueUF4aXNJbmRleCA/PyAwLFxuICAgICAgICAgIHNtb290aDogc2VyaWVzVHlwZSA9PT0gXCJsaW5lXCIsXG4gICAgICAgICAgLi4uKG1hcmsgPT09IFwiYXJlYVwiID8geyBhcmVhU3R5bGU6IHt9IH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGJhciAvIGxpbmUgLyBhcmVhIHNoYXJlIHRoZSBzYW1lIGF4aXMgbGF5b3V0LlxuICBjb25zdCBpc0FyZWEgPSBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJhcmVhXCI7XG4gIGNvbnN0IHNlcmllc1R5cGUgPSBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJiYXJcIiA/IFwiYmFyXCIgOiBcImxpbmVcIjtcbiAgcmV0dXJuIHRoZW1lZCh7XG4gICAgdGl0bGUsXG4gICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcImF4aXNcIiB9LFxuICAgIGxlZ2VuZCxcbiAgICBncmlkLFxuICAgIHhBeGlzOiB7XG4gICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICBuYW1lOiBwbGFuLnhBeGlzTGFiZWwsXG4gICAgfSxcbiAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgIHNlcmllczogcGxhbi5zZXJpZXMubWFwKChzKSA9PiAoe1xuICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgdHlwZTogc2VyaWVzVHlwZSxcbiAgICAgIGRhdGE6IHMuZGF0YSxcbiAgICAgIHNtb290aDogc2VyaWVzVHlwZSA9PT0gXCJsaW5lXCIsXG4gICAgICAuLi4oaXNBcmVhID8geyBhcmVhU3R5bGU6IHt9IH0gOiB7fSksXG4gICAgfSkpLFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVuZGVyX2RhdGEgdG9vbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBgcmVuZGVyX2RhdGFgIE1hc3RyYSB0b29sIGJvdW5kIHRvIHRoZSBnaXZlbiBwbHVnaW5cbiAqIGNvbmZpZy4gQXV0by13aXJlZCBhcyBhIHN5c3RlbSB0b29sIG9uIGV2ZXJ5IGFnZW50IChzZWVcbiAqIGBhZ2VudHMudHNgKTsgcGVyLWFnZW50IHRvb2xzIGNhbiBzaGFkb3cgaXQgYnkgcmVnaXN0ZXJpbmcgYVxuICogc2FtZS1uYW1lZCBlbnRyeS5cbiAqXG4gKiBUaGluIHdyYXBwZXIgb3ZlciB7QGxpbmsgcHJlcGFyZUNoYXJ0fSBmb3IgY2FsbGVycyB0aGF0IGFscmVhZHlcbiAqIGhhdmUgYSBkYXRhc2V0IGluIGhhbmQuIE1pbnRzIGEgYGNoYXJ0SWRgIHN5bmNocm9ub3VzbHksIGNhY2hlc1xuICogYW4gZW1wdHkgcGxhY2Vob2xkZXIsIGFuZCBraWNrcyBvZmYgdGhlIGNoYXJ0LXBsYW5uZXIgaW4gdGhlXG4gKiBiYWNrZ3JvdW5kLiBSZXR1cm5zIHRoZSBgY2hhcnRJZGAgcGx1cyBpdHMgcmVhZHktdG8tY29weSBgbWFya2VyYDsgdGhlIGhvc3RcbiAqIFVJIHJlc29sdmVzIHRoYXQgbWFya2VyIHRocm91Z2ggdGhlIHBsdWdpbidzIGAvZW1iZWQvY2hhcnQvOmlkYCByb3V0ZS5cbiAqXG4gKiBGb3IgR2VuaWUgc3RhdGVtZW50IHJlc3VsdHMsIHByZWZlciB0aGUgR2VuaWUgYWdlbnQnc1xuICogYHByZXBhcmVfY2hhcnRgIHRvb2wsIHdoaWNoIGFjY2VwdHMgYSBgc3RhdGVtZW50X2lkYCBhbmRcbiAqIHJlc29sdmVzIHRoZSByb3dzIGxhemlseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpIHtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBcInJlbmRlcl9kYXRhXCIsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oW1xuICAgICAgYFxuICAgICAgICBTdWJtaXQgYSB0YWJ1bGFyIGRhdGFzZXQgZm9yIGlubGluZSByZW5kZXJpbmcgYXMgYSBjaGFydCBpblxuICAgICAgICB0aGUgdXNlcidzIHZpZXcuIFBhc3MgYSB0aXRsZSwgdGhlIHJhdyByb3dzIChhcnJheSBvZiBvYmplY3RzXG4gICAgICAgIGtleWVkIGJ5IGNvbHVtbiBuYW1lKSwgYW5kIGFuIG9wdGlvbmFsIG9uZS1saW5lIGRlc2NyaXB0aW9uXG4gICAgICAgIG9mIHRoZSBpbnNpZ2h0IHRvIGhpZ2hsaWdodC4gUmV0dXJucyBcXGBjaGFydElkXFxgIHBsdXMgdGhlXG4gICAgICAgIGNvbXBsZXRlIFxcYG1hcmtlclxcYDsgY29weSB0aGUgcmV0dXJuZWQgbWFya2VyIFZFUkJBVElNIG9udG9cbiAgICAgICAgaXRzIG93biBsaW5lIHdoZXJlIHRoZSBjaGFydCBzaG91bGQgcmVuZGVyLiBOZXZlciBjb25zdHJ1Y3QsXG4gICAgICAgIGFsdGVyLCBvciBpbnZlbnQgYSBjaGFydCBtYXJrZXIgeW91cnNlbGYuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBQbGFjZW1lbnQgY29udHJhY3Q6IGVtYmVkIHRoZSByZXR1cm5lZCBcXGBtYXJrZXJcXGAgb24gaXRzIG93blxuICAgICAgICBsaW5lIChibGFuayBsaW5lcyBhYm92ZSBhbmQgYmVsb3cpIHdoZXJldmVyIHlvdSB3YW50IHRoZSBjaGFydFxuICAgICAgICB0byBhcHBlYXIgaW4geW91ciByZXBseS4gVGhlIGNoYXJ0IHJlc29sdmVzXG4gICAgICAgIGFzeW5jaHJvbm91c2x5IC0gdGhlIHRvb2wgcmV0dXJucyB0aGUgaWQgaW1tZWRpYXRlbHkgYW5kIHRoZVxuICAgICAgICBob3N0IFVJIGZldGNoZXMgdGhlIGNoYXJ0IGZyb20gdGhlIGNhY2hlIG9uY2UgdGhlIHBsYW5uZXJcbiAgICAgICAgbGFuZHMuIFlvdSBjYW4gY2FsbCBcXGByZW5kZXJfZGF0YVxcYCBtdWx0aXBsZSB0aW1lcyBpbiB0aGVcbiAgICAgICAgc2FtZSB0dXJuICh0aGUgdG9vbCBpcyBwYXJhbGxlbC1zYWZlKSBhbmQgaW50ZXJsZWF2ZSB0aGVcbiAgICAgICAgbWFya2VycyB3aXRoIHByb3NlIHNvIGVhY2ggY2hhcnQgc2l0cyBuZXh0IHRvIGl0c1xuICAgICAgICBjb21tZW50YXJ5LlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgVXNlIHdoZW5ldmVyIGEgU1FMIHJvdyBzZXQsIEFQSSByZXNwb25zZSwgb3IgaGFuZC1idWlsdFxuICAgICAgICBkYXRhc2V0IHdvdWxkIGxhbmQgYmV0dGVyIGFzIGEgcGljdHVyZSB0aGFuIGFzIGEgbGlzdCBvclxuICAgICAgICB0YWJsZS4gQ2FwIGlucHV0IGF0IGEgZmV3IGh1bmRyZWQgcm93czsgc2FtcGxlIG9yIGFnZ3JlZ2F0ZVxuICAgICAgICBsYXJnZXIgZGF0YXNldHMgZmlyc3QuXG4gICAgICBgLFxuICAgIF0pLFxuICAgIGlucHV0U2NoZW1hOiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLFxuICAgIG91dHB1dFNjaGVtYTogY2hhcnRUb29sT3V0cHV0U2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCB7IHRpdGxlLCBkZXNjcmlwdGlvbiwgZGF0YSB9ID0gaW5wdXQgYXMgQ2hhcnRQbGFubmVyUmVxdWVzdDtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyB7IHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQgfSB8IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBwcmVwYXJlQ2hhcnQoe1xuICAgICAgICBjb25maWcsXG4gICAgICAgIHVzZXJLZXk6IHJlc29sdmVVc2VyS2V5KGN0eD8ucmVxdWVzdENvbnRleHQpLFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgLi4uKGRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICByZXNvbHZlRGF0YTogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHsgcm93czogZGF0YSB9KSxcbiAgICAgICAgLi4uKGN0eD8ucmVxdWVzdENvbnRleHQgPyB7IHJlcXVlc3RDb250ZXh0OiBjdHgucmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
|
|
1028
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxFQUNILE1BQU0sRUFDTixXQUFXLEdBRVosTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBZ0MsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUxQyw2RUFBNkU7QUFFN0U7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXBDLHNEQUFzRDtBQUN0RCxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztBQUU3QyxtRUFBbUU7QUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUM7QUFFeEMsdURBQXVEO0FBQ3ZELE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRXRDLG9FQUFvRTtBQUNwRSxNQUFN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QUM7WUFDckM7Ozs7Ozs7O09BUUM7WUFDRDs7Ozs7Ozs7OztPQVVDO1lBQ0Q7Ozs7O09BS0M7U0FDRixDQUFDO1FBQ0YsV0FBVyxFQUFFLHlCQUF5QjtRQUN0QyxZQUFZLEVBQUUscUJBQXFCO1FBQ25DLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9CLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQTRCLENBQUM7WUFDbEUsTUFBTSxHQUFHLEdBQUcsTUFBeUQsQ0FBQztZQUN0RSxPQUFPLFlBQVksQ0FBQztnQkFDbEIsTUFBTTtnQkFDTixPQUFPLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUM7Z0JBQzVDLEtBQUs7Z0JBQ0wsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3ZFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGFydCBwbGFubmVyICsgY2hhcnQgY2FjaGUuXG4gKlxuICogU2VsZi1jb250YWluZWQgY2hhcnQgc3Vic3lzdGVtIHdpdGggdHdvIGxheWVyczpcbiAqXG4gKiAgIDEuIElubmVyIHBsYW5uZXIgYWdlbnQgKHByaXZhdGUpLiBQdXJlIGRhdGFzZXQtaW4gL1xuICogICAgICBgRUNoYXJ0c09wdGlvbmAtb3V0IGJyYWluLiBEcml2ZW4gYnkge0BsaW5rIHByZXBhcmVDaGFydH07XG4gKiAgICAgIGNhbGxlcnMgbmV2ZXIgaW5zdGFudGlhdGUgaXQgZGlyZWN0bHkuXG4gKiAgIDIuIHtAbGluayBwcmVwYXJlQ2hhcnR9OiBvcmNoZXN0cmF0aW9uIG9uIHRvcCBvZiB0aGUgcGxhbm5lci5cbiAqICAgICAgTWludHMgYSBgY2hhcnRJZGAsIGNhY2hlcyBhbiBlbXB0eSBgeyBjaGFydElkIH1gIHJlY29yZFxuICogICAgICBzeW5jaHJvbm91c2x5LCB0aGVuIHJlc29sdmVzIHRoZSBkYXRhc2V0IGFuZCBydW5zIHRoZVxuICogICAgICBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGUgdGVybWluYWwgZW50cnkgc2V0dGxlcyB3aXRoXG4gKiAgICAgIGVpdGhlciBgcmVzdWx0YCAoc3VjY2Vzcykgb3IgYGVycm9yYCAoZmFpbHVyZSkuIEJvdGhcbiAqICAgICAgdW5kZWZpbmVkIG1lYW5zIHRoZSBlbnRyeSBpcyBzdGlsbCBwcm9jZXNzaW5nLlxuICpcbiAqIFRoZSBjYWNoZSBzdXJmYWNlICh7QGxpbmsgZmV0Y2hDaGFydH0pIGlzIHRoZSBvbmx5IHN0YXRlIHRoZVxuICogSFRUUCByb3V0ZSBhbmQgdGhlIGNoYXJ0LXByb2R1Y2luZyB0b29scyBzaGFyZS4gYHByZXBhcmVDaGFydGBcbiAqIGlzIGRhdGFzZXQtYWdub3N0aWMgLSBjYWxsZXJzIHN1cHBseSBhIGByZXNvbHZlRGF0YWAgY2FsbGJhY2tcbiAqIHRoYXQgZmV0Y2hlcyB0aGUgcm93cyBob3dldmVyIHRoZXkgbGlrZSAoR2VuaWUgc3RhdGVtZW50LCBpbmxpbmVcbiAqIGRhdGFzZXQsIGN1c3RvbSBBUEkpLiBUaGUgbW9kdWxlIGhhcyBubyBrbm93bGVkZ2Ugb2YgR2VuaWUgb3JcbiAqIHN0YXRlbWVudCBpZHM7IHRob3NlIGNvbmNlcm5zIGxpdmUgaW4gdGhlIHRvb2xzIHRoYXQgd3JhcCBpdC5cbiAqXG4gKiBXaXJlLWZvcm1hdCBzY2hlbWFzIGxpdmUgaW4gYEBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYWAgc29cbiAqIHRoZSBkZW1vIGNsaWVudCBhbmQgYW55IG90aGVyIFVJIGNvbnN1bWVyIHNoYXJlIHRoZSBleGFjdCBzYW1lXG4gKiBzaGFwZSB0aGlzIG1vZHVsZSByZWFkcyBhbmQgd3JpdGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBBcHBLaXRFcnJvciwgQ2FjaGVNYW5hZ2VyLCBFeGVjdXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGFzeW5jVXRpbHMsXG4gIGVycm9yVXRpbHMsXG4gIGhhc2gsXG4gIGpzb24sXG4gIGxvZyxcbiAgb2JqZWN0LFxuICBzdHJpbmdVdGlscyxcbiAgdHlwZSBCcmFuZENvbnRleHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBtYXJrZXJzLCB3aXJlLCB0eXBlIENoYXJ0LCB0eXBlIENoYXJ0UmVzdWx0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgcmVzb2x2ZVVzZXJLZXksIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBidWlsZE1vZGVsIH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9jaGFydFwiKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUVEwgZm9yIGNhY2hlZCBjaGFydCBlbnRyaWVzLiBPbmUgaG91ciBiYWxhbmNlcyBcImxvbmcgZW5vdWdoIGZvclxuICogdGhlIGhvc3QgVUkgdG8gZmV0Y2ggdGhlIGNoYXJ0IHdlbGwgYWZ0ZXIgdGhlIG1vZGVsIGZpbmlzaGVkXG4gKiB0YWxraW5nXCIgYWdhaW5zdCBcInNob3J0IGVub3VnaCB0aGF0IGFiYW5kb25lZCBjaGFydCBpZHMgZG9uJ3RcbiAqIHBpbiBzdG9yYWdlXCIuIE1hdGNoZXMgdGhlIHR5cGljYWwgRGF0YWJyaWNrcyBPQk8gdG9rZW4gbGlmZXRpbWVcbiAqIHNvIGFueSBkYXRhIHJlLXJlc29sdXRpb24gc3RheXMgaW5zaWRlIHRoZSBvcmlnaW5hbCBhdXRoIHdpbmRvdy5cbiAqL1xuY29uc3QgQ0hBUlRfQ0FDSEVfVFRMX1NFQyA9IDYwICogNjA7XG5cbi8qKiBDYWNoZSBuYW1lc3BhY2U7IGtlZXBzIHRoZSBjaGFydCBrZXlzcGFjZSB0aWR5LiAqL1xuY29uc3QgQ0hBUlRfQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6Y2hhcnRcIjtcblxuLyoqIERlZmF1bHQgc2VydmVyLXNpZGUgbG9uZy1wb2xsIGJ1ZGdldCBmb3Ige0BsaW5rIGZldGNoQ2hhcnR9LiAqL1xuY29uc3QgREVGQVVMVF9GRVRDSF9USU1FT1VUX01TID0gNjBfMDAwO1xuXG4vKiogRGVmYXVsdCBpbnRlci1wb2xsIHNsZWVwIGZvciB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5jb25zdCBERUZBVUxUX0ZFVENIX0lOVEVSVkFMX01TID0gMjUwO1xuXG4vKiogU3RhYmxlIHRleHQgc3RvcmVkIG9uIGEgY2hhcnQgZW50cnkgd2hvc2UgcGxhbm5lciBydW4gZmFpbGVkLiAqL1xuY29uc3QgQ0hBUlRfRkFJTEVEX01FU1NBR0UgPSBcIkNoYXJ0IGdlbmVyYXRpb24gZmFpbGVkXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2NoZW1hcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHNlcmllcyBkYXRhIHBvaW50LiBXaWRlIHZhcmlhbnQgc2V0IHNvIHRoZSBwbGFubmVyIGFnZW50IGNhblxuICogZmFpdGhmdWxseSBwYXNzIHRocm91Z2ggd2hhdGV2ZXIgdGhlIFNRTCByb3cgc2V0IGNvbnRhaW5lZFxuICogKG51bWJlcnMsIHN0cmluZ2lmaWVkIG51bWJlcnMsIG51bGxzIGZvciBtaXNzaW5nIG1lYXN1cmVtZW50cyxcbiAqIGBbeCwgeV1gIHR1cGxlcyBmb3Igc2NhdHRlciwgYFt4LCB5LCB2YWx1ZV1gIHRyaXBsZXMgZm9yIGhlYXRtYXAsXG4gKiBge25hbWUsIHZhbHVlfWAgc2xpY2VzIGZvciBwaWUgLyBmdW5uZWwgLyB0cmVlbWFwKSB3aXRob3V0IHRoZVxuICogc3RydWN0dXJlZC1vdXRwdXQgZ3VhcmQgcmVqZWN0aW5nIHRoZSB3aG9sZSBwbGFuLlxuICpcbiAqIFRocmVlIGxheWVycyBvZiB0b2xlcmFuY2U6XG4gKlxuICogICAxLiB7QGxpbmsgei5wcmVwcm9jZXNzfSBub3JtYWxpemVzIHdpcmUgc2hhcGVzIEJFRk9SRSB1bmlvblxuICogICAgICBkaXNwYXRjaDogc3RyaW5naWZpZWQgbnVtYmVycyBwYXJzZSB0byBudW1iZXJzLCBmaW5pdGVcbiAqICAgICAgY2hlY2tzIHJlamVjdCBgTmFOYCAvIGBJbmZpbml0eWAsIDItLzMtZWxlbWVudCBhcnJheXMgY29lcmNlXG4gKiAgICAgIHR1cGxlIGNvbXBvbmVudHMsIGFuZCBge3ZhbHVlfWAgb2JqZWN0cyB3aXRoIG1pc3NpbmcgL1xuICogICAgICBzdHJpbmdpZmllZCBgdmFsdWVgIGdldCBjb2VyY2VkIG9yIHJlamVjdGVkIHVuaWZvcm1seS5cbiAqICAgICAgQW55dGhpbmcgbm90IGhhbmRsZWFibGUgYmVjb21lcyBgbnVsbGAuXG4gKiAgIDIuIFRoZSB1bmlvbiBhY2NlcHRzIGBudWxsYCBhcyBhIGZpcnN0LWNsYXNzIHZhcmlhbnQuIEVjaGFydHNcbiAqICAgICAgcmVuZGVycyBudWxsIGFzIGEgZ2FwIG9uIGJhciAvIGxpbmUgLyBhcmVhICh3aGljaCBpcyB0aGVcbiAqICAgICAgcmlnaHQgdmlzdWFsIHNpZ25hbCBmb3IgXCJtaXNzaW5nIHJlYWRpbmdcIikuIFNjYXR0ZXIsIGhlYXRtYXAsXG4gKiAgICAgIGFuZCBzbGljZSBjaGFydHMgZmlsdGVyIG51bGxzIGluIHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufVxuICogICAgICBiZWNhdXNlIEVjaGFydHMgY3Jhc2hlcyBvbiBudWxsIHR1cGxlcyAvIHNsaWNlcy5cbiAqICAgMy4ge0BsaW5rIHoudW5pb24jY2F0Y2h9IGJhY2tzdG9wcyB0aGUgd2hvbGUgdGhpbmc6IGlmXG4gKiAgICAgIHByZXByb2Nlc3Mgc29tZWhvdyBwcm9kdWNlcyBhIHNoYXBlIHRoYXQgc3RpbGwgZG9lc24ndFxuICogICAgICBtYXRjaCBhbnkgdmFyaWFudCwgdGhlIGJhZCBpdGVtIGJlY29tZXMgYG51bGxgIGluc3RlYWQgb2ZcbiAqICAgICAgdGFraW5nIGRvd24gdGhlIGVudGlyZSBjaGFydCB3aXRoIGFcbiAqICAgICAgYFN0cnVjdHVyZWQgb3V0cHV0IHZhbGlkYXRpb24gZmFpbGVkYCBlcnJvci5cbiAqL1xuY29uc3QgY2hhcnREYXRhUG9pbnRTY2hlbWEgPSB6XG4gIC5wcmVwcm9jZXNzKFxuICAgICh2KSA9PiB7XG4gICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHYpID8gdiA6IG51bGw7XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdC50b051bWJlcih2KSA/PyBudWxsO1xuICAgICAgfVxuICAgICAgLy8gU2NhdHRlciBgW3gsIHldYCBvciBoZWF0bWFwIGBbeEluZGV4LCB5SW5kZXgsIHZhbHVlXWAuIENvZXJjZVxuICAgICAgLy8gc3RyaW5naWZpZWQgY29tcG9uZW50czsgcmVqZWN0IGlmIGFueSBjb21wb25lbnQgaXMgbm9uLWZpbml0ZS5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpICYmICh2Lmxlbmd0aCA9PT0gMiB8fCB2Lmxlbmd0aCA9PT0gMykpIHtcbiAgICAgICAgY29uc3QgbnVtcyA9IHYubWFwKChjKSA9PiBvYmplY3QudG9OdW1iZXIoYykpO1xuICAgICAgICByZXR1cm4gbnVtcy5ldmVyeSgobikgPT4gbiAhPT0gdW5kZWZpbmVkKSA/IG51bXMgOiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgXCJ2YWx1ZVwiIGluIHYpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gdiBhcyB7IG5hbWU/OiB1bmtub3duOyB2YWx1ZTogdW5rbm93biB9O1xuICAgICAgICBjb25zdCB2YWwgPSBvYmplY3QudG9OdW1iZXIob2JqLnZhbHVlKTtcbiAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gQ29lcmNlIG51bWVyaWMgLyBib29sZWFuIC8gbnVsbGlzaCBuYW1lcyB0byBzdHJpbmdzIHNvIGFcbiAgICAgICAgLy8gcGllIHNsaWNlIGtleWVkIG9uIGEgeWVhciAoYDIwMjRgKSBvciBjYXRlZ29yeSBpZCBpc1xuICAgICAgICAvLyBhY2NlcHRlZCB3aXRob3V0IHJvdW5kLXRyaXBwaW5nIHRocm91Z2ggdGhlIGNhdGNoIGFybS5cbiAgICAgICAgY29uc3QgcmF3TmFtZSA9IG9iai5uYW1lO1xuICAgICAgICBjb25zdCBuYW1lID0gdHlwZW9mIHJhd05hbWUgPT09IFwic3RyaW5nXCIgPyByYXdOYW1lIDogcmF3TmFtZSA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhyYXdOYW1lKTtcbiAgICAgICAgcmV0dXJuIHsgbmFtZSwgdmFsdWU6IHZhbCB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICB6LnVuaW9uKFtcbiAgICAgIHoubnVtYmVyKCksXG4gICAgICB6Lm51bGwoKSxcbiAgICAgIC8vIGBbeCwgeV1gIHNjYXR0ZXIgb3IgYFt4LCB5LCB2YWx1ZV1gIGhlYXRtYXAgY2VsbC4gTW9kZWxsZWQgYXMgYVxuICAgICAgLy8gbGVuZ3RoLWNvbnN0cmFpbmVkIGhvbW9nZW5lb3VzIGFycmF5IHJhdGhlciB0aGFuIGB6LnR1cGxlYDpcbiAgICAgIC8vIFpvZCBlbWl0cyBhIHR1cGxlIGFzIEpTT04gU2NoZW1hIDIwMjAtMTIgYHByZWZpeEl0ZW1zYCwgYW5kXG4gICAgICAvLyBEYXRhYnJpY2tzJyBHZW1pbmkgZW5kcG9pbnRzIHJlamVjdCBhIGByZXNwb25zZV9qc29uX3NjaGVtYWBcbiAgICAgIC8vIGNvbnRhaW5pbmcgaXQgKFwibXVzdCBiZSBhIGJvb2xlYW4gb3IgYW4gb2JqZWN0XCIsIHNpbmNlXG4gICAgICAvLyBgaXRlbXNgIGlzIGFic2VudCkuIGBtaW5JdGVtc2AgLyBgbWF4SXRlbXNgICsgYGl0ZW1zYCBpcyB3aGF0XG4gICAgICAvLyBldmVyeSBwcm92aWRlciB1bmRlcnN0YW5kcy5cbiAgICAgIHouYXJyYXkoei5udW1iZXIoKSkubWluKDIpLm1heCgzKSxcbiAgICAgIHoub2JqZWN0KHsgbmFtZTogei5zdHJpbmcoKSwgdmFsdWU6IHoubnVtYmVyKCkgfSksXG4gICAgXSksXG4gIClcbiAgLmNhdGNoKG51bGwpO1xuXG4vKiogUGVyLXNlcmllcyBtYXJrIHR5cGUgdXNlZCBieSBgY29tYm9gIGNoYXJ0cyAoYmFyICsgbGluZSBvdmVybGF5KS4gKi9cbmNvbnN0IHNlcmllc01hcmtUeXBlU2NoZW1hID0gelxuICAudW5pb24oW3oubGl0ZXJhbChcImJhclwiKSwgei5saXRlcmFsKFwibGluZVwiKSwgei5saXRlcmFsKFwiYXJlYVwiKV0pXG4gIC5kZXNjcmliZShcbiAgICBcIk1hcmsgdHlwZSBmb3IgdGhpcyBzZXJpZXMuIFJlcXVpcmVkIGZvciBgY29tYm9gIChtaXggYmFyIGFuZCBsaW5lL2FyZWEpOyB1c2UgbnVsbCBmb3Igb3RoZXIgY2hhcnQgdHlwZXMuXCIsXG4gICk7XG5cbi8qKlxuICogQ29tcGFjdCwgbW9kZWwtZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgYW4gRWNoYXJ0cyBzcGVjLiBUaGVcbiAqIHBsYW5uZXIgYWdlbnQgZW1pdHMgdGhpczsge0BsaW5rIHBsYW5Ub0VjaGFydHNPcHRpb259IGV4cGFuZHMgaXRcbiAqIGludG8gYSByZWFsIGBFQ2hhcnRzT3B0aW9uYCBKU09OLiBUd28gbGF5ZXJzIGJlY2F1c2UgbGV0dGluZyB0aGVcbiAqIG1vZGVsIGZpbGwgaW4gYSBmdWxseS10eXBlZCBgRUNoYXJ0c09wdGlvbmAgaXMgYnJpdHRsZSAoaHVuZHJlZHNcbiAqIG9mIG9wdGlvbmFsIGZpZWxkcywgZGVlcCB1bmlvbnMsIHZlcnNpb24tZGVwZW5kZW50IHNoYXBlcykuIEFcbiAqIHNtYWxsIFwiY2hhcnQgcGxhblwiIHNjaGVtYSBpcyBtdWNoIG1vcmUgcmVsaWFibGUgZm9yIGEgZmFzdCBtb2RlbFxuICogYW5kIGtlZXBzIGFuaW1hdGlvbiAvIHRvb2x0aXAgLyBzdHlsaW5nIGRlZmF1bHRzIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBjaGFydHMuXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFydFBsYW5TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGNoYXJ0VHlwZTogd2lyZS5DaGFydFR5cGVTY2hlbWEsXG4gIHRpdGxlOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm51bGxhYmxlKClcbiAgICAuZGVmYXVsdChudWxsKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBTaG9ydCB0aXRsZSBzaG93biBhYm92ZSB0aGUgY2hhcnQuIFVzZSBudWxsIHRvIGZhbGwgYmFjayB0byB0aGVcbiAgICAgICAgXFxgdGl0bGVcXGAgYXJndW1lbnQgdGhlIGNhbGxlciBwYXNzZWQgaW4uXG4gICAgICBgKSxcbiAgICApLFxuICB4QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm51bGxhYmxlKClcbiAgICAuZGVmYXVsdChudWxsKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBBeGlzIGxhYmVsIGZvciB0aGUgcHJpbWFyeSAodXN1YWxseSBib3R0b20gLyB2YWx1ZSkgYXhpcy5cbiAgICAgICAgVXNlZCBmb3IgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGxcbiAgICAgICAgLyBzY2F0dGVyIC8gaGVhdG1hcDsgdXNlIG51bGwgZm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXAgLyByYWRhci5cbiAgICAgIGApLFxuICAgICksXG4gIHlBeGlzTGFiZWw6IHpcbiAgICAuc3RyaW5nKClcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgZm9yIHRoZSBzZWNvbmRhcnkgKHVzdWFsbHkgbGVmdCkgYXhpcy4gVXNlZCBmb3JcbiAgICAgICAgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGwgL1xuICAgICAgICBzY2F0dGVyIC8gaGVhdG1hcDsgdXNlIG51bGwgZm9yIHBpZSAvIGZ1bm5lbCAvIHRyZWVtYXAgLyByYWRhci5cbiAgICAgIGApLFxuICAgICksXG4gIGNhdGVnb3JpZXM6IHpcbiAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFByaW1hcnkgY2F0ZWdvcnkgbGFiZWxzLiBGb3IgXFxgYmFyXFxgIC8gXFxgaG9yaXpvbnRhbEJhclxcYCAvXG4gICAgICAgIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgIC8gXFxgY29tYm9cXGAgLyBcXGB3YXRlcmZhbGxcXGA6IG9uZSBsYWJlbCBwZXJcbiAgICAgICAgZGF0YSBwb2ludC4gRm9yIFxcYGhlYXRtYXBcXGA6IHgtYXhpcyBjYXRlZ29yaWVzLiBGb3IgXFxgcmFkYXJcXGA6XG4gICAgICAgIGluZGljYXRvciBuYW1lcy4gVXNlIG51bGwgZm9yIFxcYHNjYXR0ZXJcXGAgKFxcYFt4LCB5XVxcYCB0dXBsZXMpIGFuZFxuICAgICAgICBzbGljZSBjaGFydHMgKFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvIFxcYHRyZWVtYXBcXGAsIGVhY2ggc2xpY2VcbiAgICAgICAgY2FycmllcyBpdHMgb3duIFxcYG5hbWVcXGApLlxuICAgICAgYCksXG4gICAgKSxcbiAgeUNhdGVnb3JpZXM6IHpcbiAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAubnVsbGFibGUoKVxuICAgIC5kZWZhdWx0KG51bGwpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFktYXhpcyAocm93KSBsYWJlbHMgZm9yIFxcYGhlYXRtYXBcXGAuIFVzZSBudWxsIHdoZW4gdGhlXG4gICAgICAgIHJvdyBsYWJlbHMgY29tZSBmcm9tIHRoZSBzZXJpZXMgbmFtZXMsIHdoaWNoIGlzIHRoZSBwcmVmZXJyZWRcbiAgICAgICAgd2F5IHRvIGJ1aWxkIGEgaGVhdG1hcC4gVXNlIG51bGwgZm9yIGV2ZXJ5IG90aGVyIGNoYXJ0IHR5cGUuXG4gICAgICBgKSxcbiAgICApLFxuICBzZXJpZXM6IHpcbiAgICAuYXJyYXkoXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIG5hbWU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBMZWdlbmQgbmFtZSBmb3IgdGhpcyBzZXJpZXMuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICAgIHR5cGU6IHNlcmllc01hcmtUeXBlU2NoZW1hLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgICAgICAgeUF4aXNJbmRleDogelxuICAgICAgICAgIC51bmlvbihbei5saXRlcmFsKDApLCB6LmxpdGVyYWwoMSldKVxuICAgICAgICAgIC5udWxsYWJsZSgpXG4gICAgICAgICAgLmRlZmF1bHQobnVsbClcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBcIldoaWNoIHktYXhpcyB0byBiaW5kICgwID0gbGVmdCwgMSA9IHJpZ2h0KS4gVXNlIG9uIGBjb21ib2Agd2hlbiBzZXJpZXMgaGF2ZSBkaWZmZXJlbnQgdW5pdHMgb3Igc2NhbGVzOyB1c2UgbnVsbCBvdGhlcndpc2UuXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgZGF0YTogei5hcnJheShjaGFydERhdGFQb2ludFNjaGVtYSkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBEYXRhIHBvaW50cy4gRm9yIGNhdGVnb3J5IGNoYXJ0cyAoXFxgYmFyXFxgIC8gXFxgaG9yaXpvbnRhbEJhclxcYFxuICAgICAgICAgICAgLyBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCAvIFxcYGNvbWJvXFxgIC8gXFxgd2F0ZXJmYWxsXFxgIC8gXFxgcmFkYXJcXGApLFxuICAgICAgICAgICAgYW4gYXJyYXkgb2YgbnVtYmVycyBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGA7IGZvclxuICAgICAgICAgICAgXFxgd2F0ZXJmYWxsXFxgIHRob3NlIG51bWJlcnMgYXJlIHNpZ25lZCBkZWx0YXMgKG9uZSBzZXJpZXNcbiAgICAgICAgICAgIG9ubHkgLSBuZXZlciBhIGN1bXVsYXRpdmUgYmFzZSBzZXJpZXMpLiBGb3IgXFxgaGVhdG1hcFxcYCxcbiAgICAgICAgICAgIG9uZSBzZXJpZXMgcGVyIG1hdHJpeCByb3csIGhvbGRpbmcgdGhhdCByb3cncyBudW1iZXJzXG4gICAgICAgICAgICBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGAuIEZvciBcXGBzY2F0dGVyXFxgLCBhbiBhcnJheSBvZlxuICAgICAgICAgICAgXFxgW3gsIHldXFxgIG51bWVyaWMgdHVwbGVzLiBGb3IgXFxgcGllXFxgIC8gXFxgZnVubmVsXFxgIC9cbiAgICAgICAgICAgIFxcYHRyZWVtYXBcXGAsIGFuIGFycmF5IG9mIFxcYHtuYW1lLCB2YWx1ZX1cXGAgb2JqZWN0cy5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgIClcbiAgICAuZGVmYXVsdChbXSlcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgT25lIG9yIG1vcmUgc2VyaWVzIHRvIHBsb3QuIFJlcXVpcmVkIGZvciBldmVyeSBjaGFydCB0eXBlXG4gICAgICAgIGV4Y2VwdCBcXGBjdXN0b21cXGAsIHdoaWNoIGNhcnJpZXMgaXRzIHNlcmllcyBpbnNpZGUgXFxgb3B0aW9uXFxgLlxuICAgICAgICBTbGljZSBjaGFydHMgKFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvIFxcYHRyZWVtYXBcXGApIGFuZFxuICAgICAgICBcXGB3YXRlcmZhbGxcXGAgLyBcXGBoZWF0bWFwXFxgIHVzZSBleGFjdGx5IG9uZSBzZXJpZXM7IFxcYGJhclxcYCAvXG4gICAgICAgIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgIC8gXFxgY29tYm9cXGAgLyBcXGByYWRhclxcYCAvIFxcYHNjYXR0ZXJcXGAgY2FuXG4gICAgICAgIGNhcnJ5IG11bHRpcGxlIHNlcmllcy5cbiAgICAgIGApLFxuICAgICksXG4gIG9wdGlvbjogelxuICAgIC5zdHJpbmcoKVxuICAgIC5udWxsYWJsZSgpXG4gICAgLmRlZmF1bHQobnVsbClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgUmVxdWlyZWQgZm9yIFxcYGN1c3RvbVxcYDsgdXNlIG51bGwgZm9yIGV2ZXJ5IG90aGVyIGNoYXJ0IHR5cGUuIEFcbiAgICAgICAgQ09NUExFVEUgRWNoYXJ0cyBvcHRpb24sIGFzIGEgSlNPTiBvYmplY3QgZW5jb2RlZCBpbiBhIHN0cmluZzpcbiAgICAgICAgXFxgc2VyaWVzXFxgIChlYWNoIHdpdGggaXRzIG93biBcXGB0eXBlXFxgIGFuZCB0aGF0IHNlcmllcycgb3duIGRhdGFcbiAgICAgICAgc2hhcGUpIHBsdXMgd2hhdGV2ZXIgZWxzZSB0aGUgY2hhcnQgbmVlZHMgLSBhIGNvb3JkaW5hdGUgc3lzdGVtLFxuICAgICAgICBcXGB2aXN1YWxNYXBcXGAsIGF4ZXMuIFBsYWluIEpTT04gdmFsdWVzIG9ubHksIG5ldmVyIGEgSmF2YVNjcmlwdFxuICAgICAgICBmdW5jdGlvbi4gQSBjZW50ZXJlZCB0aXRsZSBpcyBmaWxsZWQgaW4gd2hlbiB0aGUgb2JqZWN0IG9taXRzXG4gICAgICAgIG9uZS5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxudHlwZSBDaGFydFBsYW4gPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5TY2hlbWE+O1xudHlwZSBDaGFydFBsYW5JbnB1dCA9IHouaW5wdXQ8dHlwZW9mIGNoYXJ0UGxhblNjaGVtYT47XG5cbi8qKlxuICogQ2Fub25pY2FsIHBsYW5uZXIgaW5wdXQgc2hhcGUuIFRvb2xzIHRoYXQgc291cmNlIHJvd3MgZnJvbSBhblxuICogaW5saW5lIGRhdGFzZXQgKGByZW5kZXJfZGF0YWApIHVzZSBpdCBhcyB0aGVpciBgaW5wdXRTY2hlbWFgXG4gKiB2ZXJiYXRpbTsgdG9vbHMgdGhhdCByZXNvbHZlIHJvd3MgZnJvbSBhIHJlbW90ZSAoYHByZXBhcmVfY2hhcnRgXG4gKiBvdmVyIGEgR2VuaWUgc3RhdGVtZW50KSBgb21pdCh7IGRhdGEgfSlgIGFuZCBgZXh0ZW5kYCB3aXRoIHRoZWlyXG4gKiBvd24gaWRlbnRpZmllciBmaWVsZCwgc28gdGhlIGZpZWxkLWxldmVsIGAuZGVzY3JpYmUoKWAgdGV4dFxuICogc3RheXMgYSBzaW5nbGUgc291cmNlIG9mIHRydXRoLiBTZXJ2ZXItb25seSAtIHRoZSBVSSBuZXZlclxuICogc2VlcyBhIHBsYW5uZXIgcmVxdWVzdCwgb25seSB0aGUgcmVzb2x2ZWQge0BsaW5rIENoYXJ0fS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHRpdGxlOiB6LnN0cmluZygpLmRlc2NyaWJlKFxuICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBDb25jaXNlIHRpdGxlIHNob3duIGFib3ZlIHRoZSBjaGFydCAoZS5nLiBcIlRvcCAxMCBTS1VzIGJ5IFJldmVudWVcIikuXG4gICAgICBgKSxcbiAgKSxcbiAgZGVzY3JpcHRpb246IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUtbGluZSBpbnRlbnQgdGhlIGNoYXJ0LXBsYW5uZXIgdXNlcyB3aGVuIHBpY2tpbmcgYSBjaGFydCB0eXBlXG4gICAgICAgIGFuZCBheGlzIGVuY29kaW5ncyAoZS5nLiBcImNvbXBhcmUgcXVhcnRlcmx5IHJldmVudWUgYWNyb3NzXG4gICAgICAgIHJlZ2lvbnNcIiwgXCJoaWdobGlnaHQgdGhlIHN0ZWVwIGRyb3AgYWZ0ZXIgcG9zaXRpb24gNVwiKS4gTm90IHNob3duXG4gICAgICAgIHRvIHRoZSB1c2VyLlxuICAgICAgYCksXG4gICAgKSxcbiAgZGF0YTogelxuICAgIC5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpXG4gICAgLm5vbmVtcHR5KFwiRGF0YSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHJvd1wiKVxuICAgIC5yZWFkb25seSgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFRhYnVsYXIgZGF0YXNldCB0byBjaGFydC4gT25lIG9iamVjdCBwZXIgcm93LCBrZXllZCBieSBjb2x1bW5cbiAgICAgICAgbmFtZS4gVmFsdWVzIG1heSBiZSBzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucywgb3IgbnVsbC4gVGhlXG4gICAgICAgIGNoYXJ0LXBsYW5uZXIgZGVjaWRlcyB3aGljaCBjb2x1bW5zIGFyZSBjYXRlZ29yaWVzIHZzLiBudW1lcmljXG4gICAgICAgIHNlcmllcy4gQ2FwIGF0IGEgZmV3IGh1bmRyZWQgcm93cyBmb3IgbGVnaWJpbGl0eTsgc2FtcGxlIC9cbiAgICAgICAgYWdncmVnYXRlIGxhcmdlciBkYXRhc2V0cyBmaXJzdC5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxuLyoqIFZhbGlkYXRlZCB0aXRsZSwgZGVzY3JpcHRpb24sIGFuZCB0YWJ1bGFyIHJvd3MgcGFzc2VkIHRvIHRoZSBjaGFydC1wbGFubmluZyBtb2RlbC4gKi9cbmV4cG9ydCB0eXBlIENoYXJ0UGxhbm5lclJlcXVlc3QgPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hPjtcblxuLyoqXG4gKiBBZ2VudC1mYWNpbmcgcmVzdWx0IG9mIGVpdGhlciBjaGFydC1wcm9kdWNpbmcgdG9vbC5cbiAqXG4gKiBgbWFya2VyYCBpcyBkZWxpYmVyYXRlbHkgcmVkdW5kYW50IHdpdGggYGNoYXJ0SWRgOiB0aGUgaG9zdCBzdGlsbCBrZXlzIHRoZVxuICogY2FjaGUgYnkgaWQsIHdoaWxlIHRoZSBtb2RlbCBnZXRzIHRoZSBleGFjdCBvcGFxdWUgdG9rZW4gdG8gY29weSBpbnRvIHByb3NlXG4gKiBhbmQgaGFzIG5vIHJlYXNvbiB0byBpbnZlbnQgb3IgcmV0eXBlIGEgVVVJRC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoYXJ0VG9vbE91dHB1dFNjaGVtYSA9IHdpcmUuQ2hhcnRTY2hlbWEucGljayh7IGNoYXJ0SWQ6IHRydWUgfSkuZXh0ZW5kKHtcbiAgbWFya2VyOiB6XG4gICAgLnN0cmluZygpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJFeGFjdCBlbWJlZCBtYXJrZXIuIENvcHkgdGhpcyBjb21wbGV0ZSB2YWx1ZSB2ZXJiYXRpbSBvbnRvIGl0cyBvd24gbGluZTsgbmV2ZXIgY29uc3RydWN0IGEgbWFya2VyIGZyb20gY2hhcnRJZC5cIixcbiAgICApLFxufSk7XG5cbi8qKiBSZXN1bHQgcmV0dXJuZWQgc3luY2hyb25vdXNseSB3aGlsZSBjaGFydCBwbGFubmluZyBjb250aW51ZXMgaW4gdGhlIGJhY2tncm91bmQuICovXG5leHBvcnQgdHlwZSBDaGFydFRvb2xPdXRwdXQgPSB6LmluZmVyPHR5cGVvZiBjaGFydFRvb2xPdXRwdXRTY2hlbWE+O1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGxhbm5lciBpbnN0cnVjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRm9ybWF0IHtAbGluayB3aXJlLkNoYXJ0VHlwZVNjaGVtYX0ncyB2YXJpYW50cyBhcyBhIHNpbmdsZVxuICogaHVtYW4tZnJpZW5kbHkgc3RyaW5nIG9mIGBgIGA8dmFsdWU+YCBmb3IgPGRlc2NyaXB0aW9uPiBgYFxuICogY2xhdXNlcyBqb2luZWQgYnkgc2VtaWNvbG9ucywgZHJhd24gZnJvbSBlYWNoIHZhcmlhbnQncyBvd25cbiAqIGAuZGVzY3JpYmUoKWAgc28gdGhlIHBsYW5uZXIgcHJvbXB0IHN0YXlzIGluIGxvY2stc3RlcCB3aXRoXG4gKiB0aGUgc2NoZW1hIGJ5IGNvbnN0cnVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0Q2hhcnRUeXBlUGlja2VyKCk6IHN0cmluZyB7XG4gIHJldHVybiB3aXJlLkNoYXJ0VHlwZVNjaGVtYS5vcHRpb25zXG4gICAgLm1hcCgob3B0KSA9PiBgXFxgJHtvcHQudmFsdWV9XFxgIGZvciAke29wdC5kZXNjcmlwdGlvbiA/PyBcIlwifWApXG4gICAgLmpvaW4oXCI7IFwiKTtcbn1cblxuLyoqXG4gKiBTeXN0ZW0gcHJvbXB0IGZvciB0aGUgaW5uZXIgY2hhcnQtcGxhbm5pbmcgYWdlbnQuIFR1bmVkIGZvciBhXG4gKiBmYXN0LXRpZXIgbW9kZWwgKEhhaWt1LCBHUFQtNS1taW5pLCBHZW1pbmkgRmxhc2ggTGl0ZSkuXG4gKi9cbmNvbnN0IENIQVJUX1BMQU5ORVJfSU5TVFJVQ1RJT05TID0gc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gIFlvdSBkZXNpZ24gQXBhY2hlIEVjaGFydHMgdmlzdWFsaXphdGlvbnMuIFRoZSB1c2VyIGdpdmVzIHlvdSBhXG4gIHRhYnVsYXIgZGF0YXNldCAocm93cyBvZiBvYmplY3RzKSBwbHVzIGEgdGl0bGUgYW5kIGFuIG9wdGlvbmFsXG4gIGRlc2NyaXB0aW9uIG9mIHRoZSBpbnRlbnQuIFlvdSBwcm9kdWNlIGEgc21hbGwgY2hhcnQgcGxhbiAoY2hhcnRcbiAgdHlwZSwgYXhpcyBsYWJlbHMsIGNhdGVnb3JpZXMsIHNlcmllcykgdGhhdCBiZXN0IGNvbnZleXMgdGhlIGRhdGEuXG5cbiAgRGVjaXNpb24gZ3VpZGUuIFBpY2sgdGhlIGNoYXJ0IHR5cGUgd2hvc2UgZGF0YSBzaGFwZSBtYXRjaGVzIHRoZVxuICBkYXRhc2V0IGFuZCB0aGUgdXNlcidzIGludGVudDogJHtmb3JtYXRDaGFydFR5cGVQaWNrZXIoKX0uXG5cbiAgV2hlbiBpbiBkb3VidCBiZXR3ZWVuIGJhciBhbmQgbGluZSwgcHJlZmVyIGJhciBmb3IgdW5vcmRlcmVkXG4gIGNhdGVnb3JpZXMgYW5kIGxpbmUgZm9yIG9yZGVyZWQgb25lcyAoZGF0ZXMsIHRpbWUgYnVja2V0cywgcmFua3MpLlxuICBQcmVmZXIgXFxgaG9yaXpvbnRhbEJhclxcYCB3aGVuIGNhdGVnb3J5IGxhYmVscyBhcmUgbG9uZy4gUHJlZmVyXG4gIFxcYGNvbWJvXFxgIHdoZW4gb25lIG1lYXN1cmUgaXMgYSBjb3VudC92b2x1bWUgYW5kIGFub3RoZXIgaXMgYVxuICByYXRlL3RyZW5kLiBQcmVmZXIgXFxgd2F0ZXJmYWxsXFxgIGZvciBicmlkZ2VzIG9mIHNpZ25lZCBkZWx0YXMuXG4gIFByZWZlciBcXGBzY2F0dGVyXFxgIHdoZW4gY29ycmVsYXRpbmcgdHdvIG51bWVyaWMgZmllbGRzIChub1xuICBjYXRlZ29yeSBheGlzKS4gUHJlZmVyIFxcYGhlYXRtYXBcXGAgZm9yIGEgY2F0ZWdvcnkgeCBjYXRlZ29yeVxuICBtYXRyaXguIFByZWZlciBcXGByYWRhclxcYCBmb3Igc2NvcmluZyB0aGUgc2FtZSBlbnRpdGllcyBhY3Jvc3MgYVxuICBmaXhlZCBzZXQgb2YgZGltZW5zaW9ucy4gTmV2ZXIgcGljayBwaWUgZm9yIG1vcmUgdGhhbiA3IHNsaWNlc1xuICAodXNlIFxcYHRyZWVtYXBcXGAgaW5zdGVhZCkuIFByZWZlciBcXGBmdW5uZWxcXGAgZm9yIG9yZGVyZWQgY29udmVyc2lvblxuICBzdGFnZXMuXG5cbiAgRm9yIGJhciAvIGhvcml6b250YWxCYXIgLyBsaW5lIC8gYXJlYSAvIGNvbWJvIC8gd2F0ZXJmYWxsOiBwaWNrIG9uZVxuICBjb2x1bW4gYXMgdGhlIGNhdGVnb3J5IGF4aXMgKHVzdWFsbHkgdGhlIG9ubHkgc3RyaW5nLXZhbHVlZCBjb2x1bW4pXG4gIGFuZCBvbmUgb3IgbW9yZSBudW1lcmljIGNvbHVtbnMgYXMgc2VyaWVzLiBTb3J0IGNhdGVnb3JpZXMgYnkgdGhlXG4gIHByaW1hcnkgc2VyaWVzIHZhbHVlIGRlc2NlbmRpbmcgdW5sZXNzIHRoZSBkYXRhIGlzIG5hdHVyYWxseSBvcmRlcmVkXG4gIChkYXRlcywgcmFua3MsIGZ1bm5lbCBzdGFnZXMsIHdhdGVyZmFsbCBzdGVwcykuIEZvciBcXGBjb21ib1xcYCwgc2V0XG4gIGVhY2ggc2VyaWVzJyBcXGB0eXBlXFxgIHRvIFxcYGJhclxcYCwgXFxgbGluZVxcYCwgb3IgXFxgYXJlYVxcYCwgYW5kIHVzZVxuICBcXGB5QXhpc0luZGV4OiAxXFxgIHdoZW4gYSBzZXJpZXMgbmVlZHMgYSBzZWNvbmQgc2NhbGUuXG5cbiAgRm9yIHdhdGVyZmFsbCwgZW1pdCBleGFjdGx5IE9ORSBzZXJpZXMgaG9sZGluZyB0aGUgc2lnbmVkIHN0ZXAgdmFsdWVzXG4gIChkZWx0YXMpLCBvbmUgcGVyIGNhdGVnb3J5LCBpbiBvcmRlciAtIHBvc2l0aXZlIGZvciBhIHJpc2UsIG5lZ2F0aXZlXG4gIGZvciBhIGRyb3AuIERvIE5PVCBhZGQgYSBjdW11bGF0aXZlIC8gcnVubmluZy10b3RhbCAvIGJhc2Ugc2VyaWVzIGFuZFxuICBkbyBOT1QgY29udmVydCB0aGUgZGVsdGFzIGludG8gcnVubmluZyB0b3RhbHMgeW91cnNlbGY7IHRoZSBydW5uaW5nXG4gIHRvdGFsIGlzIGNvbXB1dGVkIGZvciB5b3UsIGFuZCBhIGhhbmQtYnVpbHQgYmFzZSBzZXJpZXMgcmVuZGVycyBhcyBhXG4gIHBsYWluIGJhciBjaGFydCBpbnN0ZWFkIG9mIGEgYnJpZGdlLlxuXG4gIEZvciBwaWUgLyBmdW5uZWwgLyB0cmVlbWFwOiBwaWNrIHRoZSBjYXRlZ29yeSBjb2x1bW4gZm9yIHNsaWNlIG5hbWVzXG4gIGFuZCBvbmUgbnVtZXJpYyBjb2x1bW4gZm9yIHNsaWNlIHZhbHVlcy4gRW1pdCBhIHNpbmdsZSBzZXJpZXMgb2ZcbiAgXFxge25hbWUsIHZhbHVlfVxcYCBvYmplY3RzLlxuXG4gIEZvciBzY2F0dGVyOiBwaWNrIHR3byBudW1lcmljIGNvbHVtbnMgYW5kIGVtaXQgXFxgW3gsIHldXFxgIHR1cGxlcyBpblxuICBvbmUgb3IgbW9yZSBzZXJpZXMgKG9uZSBzZXJpZXMgcGVyIGdyb3VwIGlmIGEgZ3JvdXBpbmcgY29sdW1uIGV4aXN0cykuXG5cbiAgRm9yIGhlYXRtYXA6IHBpY2sgdHdvIGNhdGVnb3J5IGNvbHVtbnMgYW5kIG9uZSBudW1lcmljIG1lYXN1cmUuIFB1dFxuICB0aGUgeC1heGlzIGNhdGVnb3JpZXMgaW4gXFxgY2F0ZWdvcmllc1xcYCwgdGhlbiBlbWl0IE9ORSBTRVJJRVMgUEVSIFJPV1xuICBvZiB0aGUgbWF0cml4IC0gdGhlIHNlcmllcyBcXGBuYW1lXFxgIGlzIHRoZSByb3cgbGFiZWwgYW5kIFxcYGRhdGFcXGAgaXNcbiAgdGhlIHJvdydzIG51bWJlcnMsIG9uZSBwZXIgZW50cnkgaW4gXFxgY2F0ZWdvcmllc1xcYCwgaW4gdGhlIHNhbWUgb3JkZXIuXG4gIERvIG5vdCBjb21wdXRlIGNlbGwgaW5kaWNlcy5cblxuICBGb3IgcmFkYXI6IFxcYGNhdGVnb3JpZXNcXGAgYXJlIHRoZSBpbmRpY2F0b3IgbmFtZXM7IGVhY2ggc2VyaWVzIGlzIGFuXG4gIGFycmF5IG9mIG51bWJlcnMgKG9uZSB2YWx1ZSBwZXIgaW5kaWNhdG9yKS5cblxuICBGb3IgYW55dGhpbmcgdGhlIHR5cGVzIGFib3ZlIGNhbm5vdCBleHByZXNzIC0gYSBzYW5rZXksIGJveHBsb3QsXG4gIGNhbmRsZXN0aWNrLCBzdW5idXJzdCwgZ2F1Z2UsIG5ldHdvcmsgZ3JhcGgsIGNhbGVuZGFyLCBwYXJhbGxlbC1cbiAgY29vcmRpbmF0ZXMgcGxvdCwgb3IgYW55IG90aGVyIEVjaGFydHMgc2VyaWVzIC0gdXNlIFxcYGN1c3RvbVxcYCBhbmRcbiAgaGFuZC13cml0ZSB0aGUgd2hvbGUgRWNoYXJ0cyBvcHRpb24gaW50byBcXGBvcHRpb25cXGAgYXMgYSBKU09OIHN0cmluZy5cbiAgSW5jbHVkZSBldmVyeSBwYXJ0IHRoYXQgY2hhcnQgbmVlZHM6IHRoZSBzZXJpZXMgd2l0aCB0aGVpciBvd25cbiAgXFxgdHlwZVxcYCBhbmQgZGF0YSBzaGFwZSwgcGx1cyBhbnkgY29vcmRpbmF0ZSBzeXN0ZW0sIFxcYHZpc3VhbE1hcFxcYCxcbiAgb3IgYXhlcy4gTGVhdmUgXFxgc2VyaWVzXFxgLCBcXGBjYXRlZ29yaWVzXFxgLCBhbmQgdGhlIGF4aXMgbGFiZWxzIG91dDtcbiAgdGhleSBhcmUgaWdub3JlZCBmb3IgXFxgY3VzdG9tXFxgLiBQcmVmZXIgYSBsaXN0ZWQgdHlwZSB3aGVuZXZlciBvbmVcbiAgZ2VudWluZWx5IGZpdHMgLSBcXGBjdXN0b21cXGAgZ2l2ZXMgdXAgdGhlIHNoYXJlZCB0b29sdGlwLCBsZWdlbmQsIGFuZFxuICBncmlkIGRlZmF1bHRzLCBzbyBpdCBpcyB0aGUgYW5zd2VyIGZvciBhbiB1bnN1cHBvcnRlZCBjaGFydCBzaGFwZSxcbiAgbm90IGEgd2F5IHRvIHJlc3R5bGUgYSBzdXBwb3J0ZWQgb25lLlxuXG4gIEtlZXAgc2VyaWVzIG5hbWVzIGh1bWFuLXJlYWRhYmxlICh1c2UgdGhlIGNvbHVtbiBuYW1lOyB0aXRsZSBjYXNlIGl0XG4gIGxpZ2h0bHkgaWYgbmVlZGVkKS4gS2VlcCB0aXRsZXMgY29uY2lzZTsgZG8gbm90IHJlcGVhdCB0aGUgdXNlcidzXG4gIHRpdGxlIGluIHhBeGlzTGFiZWwgLyB5QXhpc0xhYmVsLlxuYCk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBsYW5uZXIgYWdlbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBPbmUgcGxhbm5lciBgQWdlbnRgIHBlciBwbHVnaW4gY29uZmlnLiBDYWNoZWQgb24gY29uZmlnIG9iamVjdFxuICogaWRlbnRpdHkgc28gY2FsbGVycyBjYW4gYHByZXBhcmVDaGFydCh7IGNvbmZpZywgLi4uIH0pYCBmcm9tIGFcbiAqIGhvdCBwYXRoIHdpdGhvdXQgcGF5aW5nIHRoZSBBZ2VudC1jb25zdHJ1Y3RvciBjb3N0IGV2ZXJ5IGNhbGwuXG4gKiBgV2Vha01hcGAgbGV0cyByZXRpcmVkIGNvbmZpZ3MgKGUuZy4gdGVzdCByZWNvbmZpZ3VyYXRpb25zKVxuICogcmVsZWFzZSB0aGVpciBhZ2VudCB3aXRob3V0IG1hbnVhbCBldmljdGlvbi5cbiAqL1xuY29uc3QgcGxhbm5lckFnZW50cyA9IG5ldyBXZWFrTWFwPE1hc3RyYVBsdWdpbkNvbmZpZywgQWdlbnQ+KCk7XG5cbmZ1bmN0aW9uIGdldFBsYW5uZXJBZ2VudChjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IEFnZW50IHtcbiAgbGV0IGFnZW50ID0gcGxhbm5lckFnZW50cy5nZXQoY29uZmlnKTtcbiAgaWYgKCFhZ2VudCkge1xuICAgIGFnZW50ID0gbmV3IEFnZW50KHtcbiAgICAgIGlkOiBcImNoYXJ0X3BsYW5uZXJcIixcbiAgICAgIG5hbWU6IFwiQ2hhcnQgUGxhbm5lclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUGlja3MgY2hhcnQgdHlwZSBhbmQgYXhpcyBlbmNvZGluZ3MgZm9yIGEgZGF0YXNldC5cIixcbiAgICAgIGluc3RydWN0aW9uczogQ0hBUlRfUExBTk5FUl9JTlNUUlVDVElPTlMsXG4gICAgICBtb2RlbDogKHsgcmVxdWVzdENvbnRleHQgfSkgPT5cbiAgICAgICAgYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsQ2xhc3M6IG1vZGVsLk1vZGVsQ2xhc3MuQ2hhdEZhc3QgfSksXG4gICAgfSk7XG4gICAgcGxhbm5lckFnZW50cy5zZXQoY29uZmlnLCBhZ2VudCk7XG4gIH1cbiAgcmV0dXJuIGFnZW50O1xufVxuXG4vKipcbiAqIFJ1biB0aGUgcGxhbm5lciBhZ2FpbnN0IGByZXF1ZXN0YCBhbmQgcmV0dXJuIHRoZSByZXNvbHZlZFxuICogRWNoYXJ0cyBzcGVjLiBUaHJvd3Mgb24gcGxhbm5lciBmYWlsdXJlIC0ge0BsaW5rIHByZXBhcmVDaGFydH1cbiAqIGNhdGNoZXMgYW5kIHN0YXNoZXMgdGhlIGVycm9yIGluIHRoZSBjYWNoZSBlbnRyeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQ2hhcnRQbGFubmVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdDogQ2hhcnRQbGFubmVyUmVxdWVzdCxcbiAgb3B0aW9uczogeyByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0OyBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsIH0gPSB7fSxcbik6IFByb21pc2U8Q2hhcnRSZXN1bHQ+IHtcbiAgY29uc3QgeyB0aXRsZSwgZGVzY3JpcHRpb24sIGRhdGEgfSA9IHJlcXVlc3Q7XG4gIGNvbnN0IHsgcmVxdWVzdENvbnRleHQsIGFib3J0U2lnbmFsIH0gPSBvcHRpb25zO1xuICBjb25zdCBwcm9tcHQgPSBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKHtcbiAgICBUaXRsZTogdGl0bGUsXG4gICAgLi4uKGRlc2NyaXB0aW9uID8geyBEZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICBcIkRhdGFzZXQgKEpTT04sIG9uZSByb3cgcGVyIG9iamVjdClcIjogSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMiksXG4gIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRQbGFubmVyQWdlbnQoY29uZmlnKS5nZW5lcmF0ZShwcm9tcHQsIHtcbiAgICBzdHJ1Y3R1cmVkT3V0cHV0OiB7IHNjaGVtYTogY2hhcnRQbGFuU2NoZW1hIH0sXG4gICAgLi4uKHJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgIC4uLihhYm9ydFNpZ25hbCA/IHsgYWJvcnRTaWduYWwgfSA6IHt9KSxcbiAgfSk7XG4gIGNvbnN0IHBsYW4gPSBjaGFydFBsYW5TY2hlbWEucGFyc2UocmVzdWx0Lm9iamVjdCk7XG4gIGNvbnN0IG9wdGlvbiA9IHBsYW5Ub0VjaGFydHNPcHRpb24ocGxhbiwgdGl0bGUsIGNvbmZpZy5icmFuZCk7XG4gIHJldHVybiB7IGNoYXJ0VHlwZTogcGxhbi5jaGFydFR5cGUsIG9wdGlvbiB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2FjaGUgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIGNhY2hlIGtleSBmb3IgYSBgY2hhcnRJZGAgb3duZWQgYnkgYHVzZXJLZXlgLlxuICpcbiAqIFRoZSBpZGVudGl0eSBpcyBwYXJ0IG9mIHRoZSBrZXksIG5vdCBhIGZpbHRlciBhcHBsaWVkIGFmdGVyIHRoZSByZWFkLCBzbyBhXG4gKiBjaGFydCBpZCBndWVzc2VkIG9yIGNvcGllZCBmcm9tIGFub3RoZXIgdXNlcidzIHRyYW5zY3JpcHQgcmVzb2x2ZXMgdG8gYVxuICogZGlmZmVyZW50IGtleSBhbmQgc2ltcGx5IG1pc3Nlcy4gVGhhdCBtaXNzIGlzIHdoYXQgdGhlIEhUVFAgcm91dGUgdHVybnMgaW50b1xuICogYSA0MDQsIHdoaWNoIGlzIGFsc28gdGhlIGFuc3dlciB0aGF0IGxlYWtzIHRoZSBsZWFzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hhcnRDYWNoZUtleShjaGFydElkOiBzdHJpbmcsIHVzZXJLZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiAoYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkpLmdlbmVyYXRlS2V5KFtDSEFSVF9DQUNIRV9OQU1FU1BBQ0UsIGNoYXJ0SWRdLCB1c2VyS2V5KTtcbn1cblxuLyoqXG4gKiBQZXJzaXN0IGEge0BsaW5rIENoYXJ0fSBlbnRyeSB1bmRlciBpdHMgYGNoYXJ0SWRgLCBvd25lZCBieSBgdXNlcktleWAuXG4gKiBSZWZyZXNoZXMgdGhlIFRUTCBvbiBldmVyeSB3cml0ZS4gQ2FjaGUtbGF5ZXIgZmFpbHVyZXMgYXJlIGxvZ2dlZCBhbmRcbiAqIHN3YWxsb3dlZCBzbyBiYWNrZ3JvdW5kIHJ1bm5lcnMgbmV2ZXIgdGhyb3cgaW50byB0aGVcbiAqIHVuaGFuZGxlZC1yZWplY3Rpb24gc3RyZWFtLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNoYXJ0KGVudHJ5OiBDaGFydCwgdXNlcktleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2hhcnRDYWNoZUtleShlbnRyeS5jaGFydElkLCB1c2VyS2V5KTtcbiAgICBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuc2V0KGtleSwgZW50cnksIHtcbiAgICAgIHR0bDogQ0hBUlRfQ0FDSEVfVFRMX1NFQyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJ3cml0ZS1lcnJvclwiLCB7XG4gICAgICBjaGFydElkOiBlbnRyeS5jaGFydElkLFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTG9vayB1cCBhIGNoYXJ0IGB1c2VyS2V5YCBvd25zLiBSZXR1cm5zIGB1bmRlZmluZWRgIG9uIG1pc3MsIG9uXG4gKiBleHBpcnksIHdoZW4gYW5vdGhlciBpZGVudGl0eSBvd25zIHRoZSBpZCwgb3Igd2hlbiB0aGUgY2FjaGUgbGF5ZXIgaXNcbiAqIHVuaGVhbHRoeSAtIG5ldmVyIHRocm93cy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZENoYXJ0KGNoYXJ0SWQ6IHN0cmluZywgdXNlcktleTogc3RyaW5nKTogUHJvbWlzZTxDaGFydCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNoYXJ0Q2FjaGVLZXkoY2hhcnRJZCwgdXNlcktleSk7XG4gICAgY29uc3QgdiA9IGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5nZXQ8Q2hhcnQ+KGtleSk7XG4gICAgcmV0dXJuIHYgPz8gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcInJlYWQtZXJyb3JcIiwge1xuICAgICAgY2hhcnRJZCxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcmVwYXJlQ2hhcnQgb3JjaGVzdHJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogSW5wdXRzIHRvIHtAbGluayBwcmVwYXJlQ2hhcnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlQ2hhcnRPcHRpb25zIHtcbiAgLyoqIFBsdWdpbiBjb25maWc7IHJlc29sdmVzIHRoZSBwbGFubmVyIGFnZW50J3MgbW9kZWwuICovXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xuICAvKipcbiAgICogSWRlbnRpdHkgdGhhdCBvd25zIHRoZSBtaW50ZWQgY2hhcnQuIE9ubHkgYSB7QGxpbmsgZmV0Y2hDaGFydH0gY2FsbFxuICAgKiBjYXJyeWluZyB0aGUgc2FtZSBrZXkgcmVzb2x2ZXMgaXQuIFVzZSB7QGxpbmsgcmVzb2x2ZVVzZXJLZXl9LlxuICAgKi9cbiAgdXNlcktleTogc3RyaW5nO1xuICAvKiogRGlzcGxheSB0aXRsZSBmb3J3YXJkZWQgdG8gdGhlIHBsYW5uZXIgYWdlbnQuICovXG4gIHRpdGxlPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaW50ZW50IGhpbnQgZm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50LiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSByb3dzIHRvIGNoYXJ0LiBDYWxsZWQgb25jZSwgaW4gdGhlIGJhY2tncm91bmQuXG4gICAqIEFueSB0aHJvd24gZXJyb3IgbGFuZHMgaW4gdGhlIGNhY2hlIGFzIHRoZSBlbnRyeSdzIGBlcnJvcmBcbiAgICogZmllbGQgKG5ldmVyIHByb3BhZ2F0ZWQgdG8gdGhlIGNhbGxlciBvZiB7QGxpbmsgcHJlcGFyZUNoYXJ0fSkuXG4gICAqIEFuIGVtcHR5IGByb3dzYCBhcnJheSBpcyByZWplY3RlZCBhcyBgXCJkYXRhc2V0IGhhcyBubyByb3dzO1xuICAgKiBub3RoaW5nIHRvIGNoYXJ0XCJgLlxuICAgKi9cbiAgcmVzb2x2ZURhdGE6IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTx7IHJvd3M6IFJlYWRvbmx5QXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IH0+O1xuICAvKipcbiAgICogUGVyLXJlcXVlc3QgYFJlcXVlc3RDb250ZXh0YC4gRm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50IHNvXG4gICAqIHVzZXItc2NvcGVkIG1vZGVsIHJlc29sdXRpb24gKE9CTykgc3RheXMgaW4gZWZmZWN0LlxuICAgKi9cbiAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbiAgLyoqXG4gICAqIENvb3BlcmF0aXZlIGNhbmNlbGxhdGlvbi4gRm9yd2FyZGVkIHRvIGByZXNvbHZlRGF0YWAgYW5kIHRoZVxuICAgKiBwbGFubmVyIGFnZW50LiBOb3RlOiB0aGUgY2hhcnQgdGFzayBjb250aW51ZXMgcnVubmluZyBpbiB0aGVcbiAgICogYmFja2dyb3VuZCBhZnRlciB0aGUgcGFyZW50IHJlcXVlc3QgZW5kcywgc28gZXh0ZXJuYWwgYWJvcnRcbiAgICogc2lnbmFscyBhcmUgYmVzdC1lZmZvcnQ7IHR5cGljYWwgdXNlIGlzIHRvIGxlYXZlIHRoaXMgdW5zZXRcbiAgICogYW5kIGxldCB0aGUgMWggVFRMIGNhcCBzdGFsZSBlbnRyaWVzLlxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogTWludCBhIGBjaGFydElkYCwgY2FjaGUgYW4gZW1wdHkgYHsgY2hhcnRJZCB9YCBwbGFjZWhvbGRlclxuICogc3luY2hyb25vdXNseSwgYW5kIGtpY2sgb2ZmIGEgYmFja2dyb3VuZCB0YXNrIHRoYXQgcmVzb2x2ZXMgdGhlXG4gKiBkYXRhc2V0IGFuZCBydW5zIHRoZSBwbGFubmVyLiBSZXR1cm5zIHRoZSBgY2hhcnRJZGAgb25jZSB0aGVcbiAqIHBsYWNlaG9sZGVyIGxhbmRzIHNvIHRoZSBmaXJzdCB7QGxpbmsgZmV0Y2hDaGFydH0gY2FsbCBhbHdheXNcbiAqIHNlZXMgYW4gZW50cnkgKG5vIHNwdXJpb3VzIDQwNCByYWNlKS5cbiAqXG4gKiBUaGUgYmFja2dyb3VuZCB0YXNrIHN3YWxsb3dzIGl0cyBvd24gZmFpbHVyZXMgYW5kIHdyaXRlcyB0aGVtXG4gKiBhcyBgZXJyb3JgIGVudHJpZXMsIHNvIGNhbGxlcnMgbmV2ZXIgc2VlIGEgcmVqZWN0ZWQgcHJvbWlzZS5cbiAqIENhY2hlIHN0YXRlIG1hY2hpbmU6XG4gKlxuICogICAtIGp1c3QgYWZ0ZXIgdGhpcyBjYWxsIHJldHVybnM6IGB7IGNoYXJ0SWQgfWAgKHByb2Nlc3NpbmcpXG4gKiAgIC0gb24gcGxhbm5lciBzdWNjZXNzOiAgICAgICAgICAgYHsgY2hhcnRJZCwgcmVzdWx0IH1gXG4gKiAgIC0gb24gZGF0YSAvIHBsYW5uZXIgZmFpbHVyZTogICAgYHsgY2hhcnRJZCwgZXJyb3IgfWBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVDaGFydChvcHRzOiBQcmVwYXJlQ2hhcnRPcHRpb25zKTogUHJvbWlzZTxDaGFydFRvb2xPdXRwdXQ+IHtcbiAgY29uc3QgY2hhcnRJZCA9IGhhc2guaWQoKTtcbiAgYXdhaXQgd3JpdGVDaGFydCh7IGNoYXJ0SWQgfSwgb3B0cy51c2VyS2V5KTtcbiAgbG9nZ2VyLmRlYnVnKFwicXVldWVkXCIsIHsgY2hhcnRJZCB9KTtcbiAgLy8gRmlyZS1hbmQtZm9yZ2V0LiBGYWlsdXJlcyBsYW5kIGluIHRoZSBjYWNoZSBhcyBgZXJyb3JgIGVudHJpZXM7XG4gIC8vIG5ldmVyIGVzY2FwZSBpbnRvIGFuIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gIHZvaWQgcnVuUHJlcGFyZUNoYXJ0KGNoYXJ0SWQsIG9wdHMpO1xuICByZXR1cm4geyBjaGFydElkLCBtYXJrZXI6IG1hcmtlcnMuZm9ybWF0TWFya2VyKFwiY2hhcnRcIiwgY2hhcnRJZCkgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJlcGFyZUNoYXJ0KGNoYXJ0SWQ6IHN0cmluZywgb3B0czogUHJlcGFyZUNoYXJ0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBvcHRzLnJlc29sdmVEYXRhKG9wdHMuc2lnbmFsKTtcbiAgICBpZiAoZGF0YS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwiRGF0YXNldCBoYXMgbm8gcm93czsgbm90aGluZyB0byBjaGFydFwiKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuQ2hhcnRQbGFubmVyKFxuICAgICAgb3B0cy5jb25maWcsXG4gICAgICB7XG4gICAgICAgIHRpdGxlOiBvcHRzLnRpdGxlID8/IFwiQ2hhcnRcIixcbiAgICAgICAgLi4uKG9wdHMuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIGRhdGE6IGRhdGEucm93cyBhcyBDaGFydFBsYW5uZXJSZXF1ZXN0W1wiZGF0YVwiXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLihvcHRzLnJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dDogb3B0cy5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy5zaWduYWwgPyB7IGFib3J0U2lnbmFsOiBvcHRzLnNpZ25hbCB9IDoge30pLFxuICAgICAgfSxcbiAgICApO1xuICAgIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkLCByZXN1bHQgfSwgb3B0cy51c2VyS2V5KTtcbiAgICBsb2dnZXIuaW5mbyhcImRvbmVcIiwge1xuICAgICAgY2hhcnRJZCxcbiAgICAgIGNoYXJ0VHlwZTogcmVzdWx0LmNoYXJ0VHlwZSxcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJlcnJvclwiLCB7IGNoYXJ0SWQsIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSB9KTtcbiAgICAvLyBUaGUgZW50cnkncyBgZXJyb3JgIGlzIHJlbmRlcmVkIGluIHRoZSBjaGF0LCBzbyBvbmx5IGFuIEFwcEtpdEVycm9yJ3NcbiAgICAvLyBvd24gbWVzc2FnZSB0cmF2ZWxzOyBhbnl0aGluZyBlbHNlIGNvdWxkIGNhcnJ5IHVwc3RyZWFtIHByb3ZpZGVyIGRldGFpbC5cbiAgICBjb25zdCBlcnJUZXh0ID0gZXJyIGluc3RhbmNlb2YgQXBwS2l0RXJyb3IgPyBlcnIubWVzc2FnZSA6IENIQVJUX0ZBSUxFRF9NRVNTQUdFO1xuICAgIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkLCBlcnJvcjogZXJyVGV4dCB9LCBvcHRzLnVzZXJLZXkpO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbG9uZy1wb2xsIGZldGNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIElucHV0cyB0byB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoQ2hhcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkZW50aXR5IHRoZSBjaGFydCBtdXN0IGJlbG9uZyB0by4gQSBjaGFydCBtaW50ZWQgdW5kZXIgYSBkaWZmZXJlbnQga2V5XG4gICAqIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gdW5rbm93biBpZC4gVXNlIHtAbGluayByZXNvbHZlVXNlcktleX0uXG4gICAqL1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBwb2xsaW5nIGJ1ZGdldCBpbiBtcy4gV2hlbiB0aGUgZW50cnkgc3RheXMgaW5cbiAgICogdGhlIHByb2Nlc3Npbmcgc3RhdGUgcGFzdCB0aGlzIHdpbmRvdywgdGhlIGhlbHBlciByZXR1cm5zIHRoZVxuICAgKiBsYXN0IHNlZW4gdmFsdWUgKHN0aWxsIHByb2Nlc3NpbmcpIHNvIHRoZSBjbGllbnQgY2FuIHJlLXBvbGwuXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0ZFVENIX1RJTUVPVVRfTVN9ICg2MHMpLlxuICAgKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogUG9sbCBpbnRlcnZhbCBpbiBtcy4gRGVmYXVsdHMgdG9cbiAgICoge0BsaW5rIERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVN9ICgyNTBtcykuXG4gICAqL1xuICBpbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uIGhhbmRsZSAoZS5nLiByZXF1ZXN0IGByZXEuc2lnbmFsYCkuICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIExvbmctcG9sbCB0aGUgY2hhcnQgY2FjaGUgdW50aWwgdGhlIGVudHJ5IHNldHRsZXMgKGByZXN1bHRgIG9yXG4gKiBgZXJyb3JgIHNldCksIHRoZSBlbnRyeSBpcyBtaXNzaW5nLCBvciB0aGUgc2VydmVyLXNpZGUgdGltZW91dFxuICogZWxhcHNlcy5cbiAqXG4gKiBSZXR1cm5zOlxuICogICAtIHRoZSByZXNvbHZlZCB7QGxpbmsgQ2hhcnR9IHdoZW4gaXQgc2V0dGxlZCwgZXJyb3JlZCwgb3JcbiAqICAgICBzdGF5ZWQgaW4gcHJvY2Vzc2luZyBwYXN0IGB0aW1lb3V0TXNgIChzbyB0aGUgY2xpZW50IGNhblxuICogICAgIHJlLXBvbGwpO1xuICogICAtIGB1bmRlZmluZWRgIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3NpbmcsIGV4cGlyZWQsIG9yIG93bmVkIGJ5XG4gKiAgICAgYW5vdGhlciBpZGVudGl0eSAodGhlIGNvbnN1bWVyIHNob3VsZCB0cmVhdCBhcyA0MDQpLlxuICpcbiAqIGBzaWduYWxgIGxldHMgdGhlIGNhbGxlciBjYW5jZWwgYWhlYWQgb2YgdGltZW91dCAoZS5nLiB0aGUgSFRUUFxuICogcmVxdWVzdCBjbG9zZWQpLiBDYW5jZWxsYXRpb24gcHJvcGFnYXRlcyB0byB0aGUgaW50ZXItcG9sbCBzbGVlcFxuICogc28gdGhlIGhlbHBlciByZXR1cm5zIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDaGFydChcbiAgY2hhcnRJZDogc3RyaW5nLFxuICBvcHRpb25zOiBGZXRjaENoYXJ0T3B0aW9ucyxcbik6IFByb21pc2U8Q2hhcnQgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucy50aW1lb3V0TXMgPz8gREVGQVVMVF9GRVRDSF9USU1FT1VUX01TO1xuICBjb25zdCBpbnRlcnZhbE1zID0gb3B0aW9ucy5pbnRlcnZhbE1zID8/IERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNcztcblxuICBsZXQgbGFzdDogQ2hhcnQgfCB1bmRlZmluZWQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgb3B0aW9ucy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgbGFzdCA9IGF3YWl0IHJlYWRDaGFydChjaGFydElkLCBvcHRpb25zLnVzZXJLZXkpO1xuICAgIGlmICghbGFzdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAobGFzdC5yZXN1bHQgIT09IHVuZGVmaW5lZCB8fCBsYXN0LmVycm9yICE9PSB1bmRlZmluZWQpIHJldHVybiBsYXN0O1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IGRlYWRsaW5lIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAocmVtYWluaW5nIDw9IDApIHJldHVybiBsYXN0O1xuICAgIGF3YWl0IGFzeW5jVXRpbHMuc2xlZXAoTWF0aC5taW4oaW50ZXJ2YWxNcywgcmVtYWluaW5nKSwgb3B0aW9ucy5zaWduYWwpO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVjaGFydHMgdGhlbWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUaGUgc2xpY2Ugb2YgYW4gRWNoYXJ0cyBvcHRpb24gdGhhdCBjYXJyaWVzIGJyYW5kIGlkZW50aXR5OiB0aGUgc2VyaWVzXG4gKiBjb2xvciBjeWNsZSBhbmQgdGhlIGJhc2UgZm9udCBzdGFjay4gRGVyaXZlZCBmcm9tIGEge0BsaW5rIEJyYW5kQ29udGV4dH1cbiAqIGJ5IHtAbGluayBicmFuZENoYXJ0VGhlbWV9IGFuZCBtZXJnZWQgaW50byBldmVyeSBzcGVjIGJ5XG4gKiB7QGxpbmsgcGxhblRvRWNoYXJ0c09wdGlvbn0uXG4gKlxuICogRGVsaWJlcmF0ZWx5IGNhcnJpZXMgbm8gdGV4dCBDT0xPUi4gQSBzcGVjIGlzIHBsYW5uZWQgaGVyZSwgb24gdGhlXG4gKiBzZXJ2ZXIsIGFuZCByZWFkIGxhdGVyIGluIGEgYnJvd3NlciB3aG9zZSBsaWdodC9kYXJrIHRoZW1lIHRoaXMgY29kZVxuICogY2Fubm90IGtub3c7IGJha2luZyBpbiB0aGUgYnJhbmQncyBzaW5nbGUgKGxpZ2h0KSBmb3JlZ3JvdW5kIHByb2R1Y2VkXG4gKiBuZWFyLWJsYWNrIGxhYmVscyB0aGF0IGRpc2FwcGVhcmVkIGFnYWluc3QgYSBkYXJrIGNoYXQgc3VyZmFjZS4gVGhlXG4gKiByZW5kZXJlciByZXNvbHZlcyBjaHJvbWUgY29sb3JzIGZyb20gQXBwS2l0J3MgbGl2ZSBDU1MgdG9rZW5zIGluc3RlYWRcbiAqIChgQGRieC10b29scy91aS1tYXN0cmFgJ3MgYGNoYXJ0LXRoZW1lYCArIGBub3JtYWxpemVDaGFydE9wdGlvbmApLFxuICogbGVhdmluZyB0aGlzIHRoZW1lIHRoZSBwYXJ0cyB0aGF0IHJlYWQgdGhlIHNhbWUgaW4gZWl0aGVyIG1vZGUuXG4gKi9cbmludGVyZmFjZSBDaGFydFRoZW1lIHtcbiAgY29sb3I6IHN0cmluZ1tdO1xuICB0ZXh0U3R5bGU6IHsgZm9udEZhbWlseTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQXBwS2l0J3MgY2F0ZWdvcmljYWwgY2hhcnQgcGFsZXR0ZSAoYC0tY2hhcnQtY2F0LTFgIC4uIGAtLWNoYXJ0LWNhdC04YCBmcm9tXG4gKiBgQGRhdGFicmlja3MvYXBwa2l0LXVpYCksIGFzIGhleC4gU2VydmVyLXJlbmRlcmVkIGNoYXJ0IHNwZWNzIGNhbm5vdCByZWFkIHRoZVxuICogYnJvd3NlcidzIENTUyBjdXN0b20gcHJvcGVydGllcywgc28gdGhlIHZhbHVlcyBhcmUgbWlycm9yZWQgaGVyZSB0byBrZWVwIGFcbiAqIGdlbmVyYXRlZCBjaGFydCB2aXN1YWxseSBjb25zaXN0ZW50IHdpdGggdGhlIEFwcEtpdC1zdHlsZWQgVUkgYXJvdW5kIGl0LlxuICogS2VlcCBpbiBzeW5jIHdpdGggQXBwS2l0J3Mgc3R5bGVzaGVldCBpZiBpdCBjaGFuZ2VzLlxuICovXG5jb25zdCBBUFBLSVRfQ0hBUlRfUEFMRVRURSA9IFtcbiAgXCIjMjQ2M0VCXCIsIC8vIGJsdWVcbiAgXCIjMkVCODhBXCIsIC8vIHRlYWxcbiAgXCIjQUI0N0JEXCIsIC8vIHB1cnBsZVxuICBcIiNGNjlFMjNcIiwgLy8gYW1iZXJcbiAgXCIjREQyQzREXCIsIC8vIHJvc2VcbiAgXCIjMUJBM0JCXCIsIC8vIGN5YW5cbiAgXCIjOUI2MUQxXCIsIC8vIGxhdmVuZGVyXG4gIFwiIzM0QjI2MlwiLCAvLyBlbWVyYWxkXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIEV4cGFuZCB0d28gYnJhbmQgaGV4IGNvbG9ycyBpbnRvIGEgbGVnaWJsZSBjYXRlZ29yaWNhbCBjeWNsZS4gRWNoYXJ0c1xuICogcmVwZWF0cyB0aGUgYGNvbG9yYCBhcnJheSBhY3Jvc3Mgc2VyaWVzIC8gY2F0ZWdvcmllcywgc28gYSBnb29kIGRlZmF1bHRcbiAqIG5lZWRzIHNldmVyYWwgZGlzdGluY3QgaHVlcywgbm90IHR3by4gV2Ugc2VlZCB3aXRoIHRoZSBicmFuZCBwcmltYXJ5IGFuZFxuICogYWNjZW50ICh0aGUgaWRlbnRpdHkgY29sb3JzKSBhbmQgZm9sbG93IHdpdGggQXBwS2l0J3Mgb3duIGNhdGVnb3JpY2FsIGNoYXJ0XG4gKiBwYWxldHRlLCBzbyBtdWx0aS1zZXJpZXMgLyBtYW55LXNsaWNlIGNoYXJ0cyBzdGF5IHJlYWRhYmxlIGFuZCBtYXRjaCB0aGVcbiAqIHN1cnJvdW5kaW5nIEFwcEtpdCBVSSB3aGlsZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBtYXJrcyBsYW5kIG9uLWJyYW5kLlxuICovXG5mdW5jdGlvbiBicmFuZENvbG9yQ3ljbGUocHJpbWFyeTogc3RyaW5nLCBhY2NlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc3ByZWFkID0gQVBQS0lUX0NIQVJUX1BBTEVUVEU7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcmV0dXJuIFtwcmltYXJ5LCBhY2NlbnQsIC4uLnNwcmVhZF0uZmlsdGVyKChjKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYy50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQoa2V5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGVyaXZlIGFuIEVjaGFydHMge0BsaW5rIENoYXJ0VGhlbWV9IGZyb20gYSBicmFuZCBjb250ZXh0OiB0aGUgcHJpbWFyeSArXG4gKiBhY2NlbnQgY29sb3JzIHNlZWQgdGhlIHNlcmllcyBjeWNsZSBhbmQgdGhlIHNhbnMgc3RhY2sgYmVjb21lcyB0aGUgYmFzZVxuICogZm9udC4gVGV4dCBjb2xvcnMgYXJlIHRoZSByZW5kZXJlcidzIGpvYiAtIHNlZSB7QGxpbmsgQ2hhcnRUaGVtZX0uXG4gKi9cbmZ1bmN0aW9uIGJyYW5kQ2hhcnRUaGVtZShicmFuZDogQnJhbmRDb250ZXh0KTogQ2hhcnRUaGVtZSB7XG4gIHJldHVybiB7XG4gICAgY29sb3I6IGJyYW5kQ29sb3JDeWNsZShicmFuZC5jb2xvcnMucHJpbWFyeSwgYnJhbmQuY29sb3JzLmFjY2VudCksXG4gICAgdGV4dFN0eWxlOiB7IGZvbnRGYW1pbHk6IGJyYW5kLnR5cG9ncmFwaHkuc2FucyB9LFxuICB9O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlY2hhcnRzIGV4cGFuc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG50eXBlIE5hbWVkU2xpY2UgPSB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IG51bWJlciB9O1xudHlwZSBTY2F0dGVyUG9pbnQgPSBbbnVtYmVyLCBudW1iZXJdO1xudHlwZSBIZWF0bWFwQ2VsbCA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuLyoqIEtlZXAgb25seSBge25hbWUsIHZhbHVlfWAgc2xpY2VzOyBkcm9wIG51bGxzIC8gYmFyZSBudW1iZXJzIC8gdHVwbGVzLiAqL1xuZnVuY3Rpb24gbmFtZWRTbGljZXMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogTmFtZWRTbGljZVtdIHtcbiAgcmV0dXJuIGRhdGEuZmlsdGVyKFxuICAgIChkKTogZCBpcyBOYW1lZFNsaWNlID0+IGQgIT09IG51bGwgJiYgdHlwZW9mIGQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZCksXG4gICk7XG59XG5cbi8qKiBLZWVwIG9ubHkgZmluaXRlIG51bWJlcnMgKGNhdGVnb3J5IC8gcmFkYXIgLyB3YXRlcmZhbGwgc2VyaWVzKS4gKi9cbmZ1bmN0aW9uIG51bWVyaWNQb2ludHMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogbnVtYmVyW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoKGQpOiBkIGlzIG51bWJlciA9PiB0eXBlb2YgZCA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUoZCkpO1xufVxuXG4vKiogS2VlcCBvbmx5IGBbeCwgeV1gIHNjYXR0ZXIgdHVwbGVzLiAqL1xuZnVuY3Rpb24gc2NhdHRlclBvaW50cyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBTY2F0dGVyUG9pbnRbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcihcbiAgICAoZCk6IGQgaXMgU2NhdHRlclBvaW50ID0+IEFycmF5LmlzQXJyYXkoZCkgJiYgZC5sZW5ndGggPT09IDIsXG4gICkgYXMgU2NhdHRlclBvaW50W107XG59XG5cbi8qKiBLZWVwIG9ubHkgYFt4SW5kZXgsIHlJbmRleCwgdmFsdWVdYCBoZWF0bWFwIGNlbGxzLiAqL1xuZnVuY3Rpb24gaGVhdG1hcENlbGxzKGRhdGE6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdW1wiZGF0YVwiXSk6IEhlYXRtYXBDZWxsW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoKGQpOiBkIGlzIEhlYXRtYXBDZWxsID0+IEFycmF5LmlzQXJyYXkoZCkgJiYgZC5sZW5ndGggPT09IDMpIGFzIEhlYXRtYXBDZWxsW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGhlYXRtYXAncyBjZWxscyBhbmQgcm93IGxhYmVscyBmcm9tIGVpdGhlciBzaGFwZSB0aGVcbiAqIHBsYW5uZXIgbWF5IHByb2R1Y2UuXG4gKlxuICogVGhlIGRvY3VtZW50ZWQgc2hhcGUgaXMgT05FIHNlcmllcyBvZiBgW3hJbmRleCwgeUluZGV4LCB2YWx1ZV1gXG4gKiB0cmlwbGVzLCBidXQgaW5kZXggYXJpdGhtZXRpYyBpcyBleGFjdGx5IHRoZSBraW5kIG9mIGJvb2trZWVwaW5nIGFcbiAqIGZhc3QgbW9kZWwgZ2V0cyB3cm9uZywgYW5kIHRoZSBmYWlsdXJlIGlzIHNpbGVudCAoZXZlcnkgY2VsbCBpc1xuICogZHJvcHBlZCBhbmQgdGhlIGdyaWQgcmVuZGVycyBlbXB0eSkuIFNvIHRoZSByb3ctcGVyLXNlcmllcyBzaGFwZSBpdFxuICogYWxyZWFkeSBwcm9kdWNlcyByZWxpYWJseSBmb3IgYmFyIGNoYXJ0cyAtIG9uZSBzZXJpZXMgcGVyIG1hdHJpeFxuICogcm93LCBudW1iZXJzIGFsaWduZWQgdG8gYGNhdGVnb3JpZXNgIC0gaXMgYWNjZXB0ZWQgdG9vIGFuZCB0dXJuZWRcbiAqIGludG8gdHJpcGxlcyBoZXJlLlxuICpcbiAqIFJvdyBvcmRlciByZWFkcyB0b3AtdG8tYm90dG9tOiBFY2hhcnRzJyBjYXRlZ29yeSB5LWF4aXMgY291bnRzIGluZGV4XG4gKiAwIGZyb20gdGhlIEJPVFRPTSwgc28gYSByb3ctZGVyaXZlZCBtYXRyaXggcmV2ZXJzZXMgYm90aCB0aGUgYXhpc1xuICogbGFiZWxzIGFuZCB0aGUgcm93IGluZGljZXMsIHB1dHRpbmcgdGhlIGZpcnN0IHNlcmllcyBhdCB0aGUgdG9wIHRoZVxuICogd2F5IHRoZSBtb2RlbCBsaXN0ZWQgaXQuXG4gKi9cbmZ1bmN0aW9uIGhlYXRtYXBNYXRyaXgocGxhbjogQ2hhcnRQbGFuKTogeyBjZWxsczogSGVhdG1hcENlbGxbXTsgeUNhdGVnb3JpZXM6IHN0cmluZ1tdIH0ge1xuICBjb25zdCB0cmlwbGVzID0gaGVhdG1hcENlbGxzKHBsYW4uc2VyaWVzWzBdPy5kYXRhID8/IFtdKTtcbiAgaWYgKHRyaXBsZXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7IGNlbGxzOiB0cmlwbGVzLCB5Q2F0ZWdvcmllczogcGxhbi55Q2F0ZWdvcmllcyA/PyBbXSB9O1xuICB9XG4gIGNvbnN0IHJvd3MgPSBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7IG5hbWU6IHMubmFtZSwgdmFsdWVzOiBudW1lcmljUG9pbnRzKHMuZGF0YSkgfSkpO1xuICBjb25zdCBsYWJlbHMgPSBwbGFuLnlDYXRlZ29yaWVzID8/IHJvd3MubWFwKChyKSA9PiByLm5hbWUpO1xuICBjb25zdCBsYXN0Um93ID0gcm93cy5sZW5ndGggLSAxO1xuICByZXR1cm4ge1xuICAgIGNlbGxzOiByb3dzLmZsYXRNYXAoKHJvdywgcm93SW5kZXgpID0+XG4gICAgICByb3cudmFsdWVzLm1hcCgodmFsdWUsIGNvbHVtbkluZGV4KTogSGVhdG1hcENlbGwgPT4gW2NvbHVtbkluZGV4LCBsYXN0Um93IC0gcm93SW5kZXgsIHZhbHVlXSksXG4gICAgKSxcbiAgICB5Q2F0ZWdvcmllczogWy4uLmxhYmVsc10ucmV2ZXJzZSgpLFxuICB9O1xufVxuXG4vKiogU2VxdWVudGlhbCBsaWdodC10by1icmFuZCByYW1wIGZvciBoZWF0bWFwIGludGVuc2l0eS4gKi9cbmNvbnN0IEhFQVRNQVBfUkFNUCA9IFtcIiNFQUYxRkVcIiwgXCIjOUNCREY3XCIsIFwiIzRDODZFRVwiLCBcIiMyNDYzRUJcIiwgXCIjMTQzODdGXCJdO1xuXG4vKiogQWJvdmUgdGhpcyBtYW55IGNlbGxzLCBwcmludGVkIHZhbHVlcyBvdmVybGFwIGFuZCBhcmUgc3VwcHJlc3NlZC4gKi9cbmNvbnN0IEhFQVRNQVBfTEFCRUxfTUFYX0NFTExTID0gNjA7XG5cbi8qKiBSaXNpbmcgc3RlcCBmaWxsIChlbWVyYWxkKSBhbmQgZmFsbGluZyBzdGVwIGZpbGwgKHJvc2UpLiAqL1xuY29uc3QgV0FURVJGQUxMX0lOQ1JFQVNFX0NPTE9SID0gXCIjMkVCODhBXCI7XG5jb25zdCBXQVRFUkZBTExfREVDUkVBU0VfQ09MT1IgPSBcIiNERDJDNERcIjtcblxuLyoqIFNlcmllcyBuYW1lcyB0aGUgd2F0ZXJmYWxsIGV4cGFuc2lvbiBlbWl0cy4gKi9cbmNvbnN0IFdBVEVSRkFMTF9IRUxQRVJfTkFNRSA9IFwiUnVubmluZyB0b3RhbFwiO1xuY29uc3QgV0FURVJGQUxMX0lOQ1JFQVNFX05BTUUgPSBcIkluY3JlYXNlXCI7XG5jb25zdCBXQVRFUkZBTExfREVDUkVBU0VfTkFNRSA9IFwiRGVjcmVhc2VcIjtcblxuLyoqXG4gKiBBIG1vZGVsIGFza2VkIGZvciBhIGJyaWRnZSBvZnRlbiBidWlsZHMgdGhlIHJ1bm5pbmcgdG90YWwgaXRzZWxmIGFuZFxuICogaGFuZHMgYmFjayBhIGN1bXVsYXRpdmUtYmFzZSBzZXJpZXMgYWxvbmdzaWRlIHRoZSBkZWx0YXMgLSB3aGljaFxuICogcmVuZGVycyBhcyB0d28gcGxhaW4gYmFyIHNlcmllcywgbm90IGEgd2F0ZXJmYWxsICh0aGUgYmFzZSBiYXJzIGFyZVxuICogdGhlIHRhbGwgb25lcykuIFRoZSBiYXNlIGlzIHJlY29nbml6YWJsZSBieSBuYW1lLCBzbyBpdCBpcyBkcm9wcGVkXG4gKiBoZXJlIGFuZCB0aGUgcnVubmluZyB0b3RhbCByZWNvbXB1dGVkIGZyb20gdGhlIGRlbHRhcy5cbiAqL1xuY29uc3QgV0FURVJGQUxMX0JBU0VfTkFNRSA9IC9cXGIoYmFzZXxjdW11bGF0aXZlfHJ1bm5pbmd8aGVscGVyfHRvdGFsfHN0YXJ0KGluZyk/KVxcYi9pO1xuXG4vKipcbiAqIFBpY2sgdGhlIHNpZ25lZC1kZWx0YSBzZXJpZXMgb3V0IG9mIGEgd2F0ZXJmYWxsIHBsYW4sIGlnbm9yaW5nIGFueVxuICogY3VtdWxhdGl2ZS1iYXNlIHNlcmllcyB0aGUgcGxhbm5lciBidWlsdCBieSBoYW5kXG4gKiAoe0BsaW5rIFdBVEVSRkFMTF9CQVNFX05BTUV9KS4gRmFsbHMgYmFjayB0byB0aGUgZmlyc3Qgc2VyaWVzIHdoZW5cbiAqIGV2ZXJ5IG5hbWUgbG9va3MgbGlrZSBhIGJhc2UsIHNpbmNlIGRyb3BwaW5nIHRoZW0gYWxsIHdvdWxkIGxlYXZlXG4gKiBub3RoaW5nIHRvIHBsb3QuXG4gKi9cbmZ1bmN0aW9uIHdhdGVyZmFsbERlbHRhU2VyaWVzKFxuICBzZXJpZXM6IENoYXJ0UGxhbltcInNlcmllc1wiXSxcbik6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNlcmllcy5maW5kKChzKSA9PiAhV0FURVJGQUxMX0JBU0VfTkFNRS50ZXN0KHMubmFtZSkpID8/IHNlcmllc1swXTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgc3RhY2tlZCB0cmFuc3BhcmVudC1iYXNlICsgaW5jcmVhc2UgKyBkZWNyZWFzZSBzZXJpZXMgdGhhdFxuICogRWNoYXJ0cyB1c2VzIGZvciBhIHdhdGVyZmFsbCAoaXQgaGFzIG5vIG5hdGl2ZSB3YXRlcmZhbGwgdHlwZSkuXG4gKiBWYWx1ZXMgYXJlIHNpZ25lZCBkZWx0YXM7IHRoZSB0cmFuc3BhcmVudCBoZWxwZXIgY2FycmllcyB0aGUgcnVubmluZ1xuICogdG90YWwgc28gZWFjaCB2aXNpYmxlIGJhciBzdGFydHMgd2hlcmUgdGhlIHByZXZpb3VzIG9uZSBlbmRlZC5cbiAqXG4gKiBUaGUgaGVscGVyIGlzIGBzaWxlbnRgLCBzbyB3aXRoIGFuIGl0ZW0tdHJpZ2dlcmVkIHRvb2x0aXAgaXQgaXNcbiAqIGludmlzaWJsZSB0byBib3RoIHRoZSBleWUgYW5kIHRoZSBwb2ludGVyIC0gdGhlIGFsdGVybmF0aXZlLCBhbiBheGlzXG4gKiB0b29sdGlwIHRoYXQgaGlkZXMgdGhlIGhlbHBlciByb3csIG5lZWRzIGEgZnVuY3Rpb24gZm9ybWF0dGVyLCBhbmRcbiAqIHRoaXMgc3BlYyBoYXMgdG8gc3Vydml2ZSBKU09OIHNlcmlhbGl6YXRpb24gdG8gdGhlIGJyb3dzZXIuXG4gKi9cbmZ1bmN0aW9uIHdhdGVyZmFsbFNlcmllcyh2YWx1ZXM6IG51bWJlcltdKTogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgaGVscGVyczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgaW5jcmVhc2VzOiBBcnJheTxudW1iZXIgfCBcIi1cIj4gPSBbXTtcbiAgY29uc3QgZGVjcmVhc2VzOiBBcnJheTxudW1iZXIgfCBcIi1cIj4gPSBbXTtcbiAgbGV0IGN1bXVsYXRpdmUgPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZSA+PSAwKSB7XG4gICAgICBoZWxwZXJzLnB1c2goY3VtdWxhdGl2ZSk7XG4gICAgICBpbmNyZWFzZXMucHVzaCh2YWx1ZSk7XG4gICAgICBkZWNyZWFzZXMucHVzaChcIi1cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlbHBlcnMucHVzaChjdW11bGF0aXZlICsgdmFsdWUpO1xuICAgICAgaW5jcmVhc2VzLnB1c2goXCItXCIpO1xuICAgICAgZGVjcmVhc2VzLnB1c2goLXZhbHVlKTtcbiAgICB9XG4gICAgY3VtdWxhdGl2ZSArPSB2YWx1ZTtcbiAgfVxuICBjb25zdCB0cmFuc3BhcmVudCA9IHsgYm9yZGVyQ29sb3I6IFwidHJhbnNwYXJlbnRcIiwgY29sb3I6IFwidHJhbnNwYXJlbnRcIiB9O1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9IRUxQRVJfTkFNRSxcbiAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICBzdGFjazogXCJ0b3RhbFwiLFxuICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgaXRlbVN0eWxlOiB0cmFuc3BhcmVudCxcbiAgICAgIGVtcGhhc2lzOiB7IGl0ZW1TdHlsZTogdHJhbnNwYXJlbnQgfSxcbiAgICAgIGRhdGE6IGhlbHBlcnMsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBXQVRFUkZBTExfSU5DUkVBU0VfTkFNRSxcbiAgICAgIHR5cGU6IFwiYmFyXCIsXG4gICAgICBzdGFjazogXCJ0b3RhbFwiLFxuICAgICAgaXRlbVN0eWxlOiB7IGNvbG9yOiBXQVRFUkZBTExfSU5DUkVBU0VfQ09MT1IgfSxcbiAgICAgIGRhdGE6IGluY3JlYXNlcyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9ERUNSRUFTRV9OQU1FLFxuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIHN0YWNrOiBcInRvdGFsXCIsXG4gICAgICBpdGVtU3R5bGU6IHsgY29sb3I6IFdBVEVSRkFMTF9ERUNSRUFTRV9DT0xPUiB9LFxuICAgICAgZGF0YTogZGVjcmVhc2VzLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICogRXhwYW5kIGEge0BsaW5rIENoYXJ0UGxhbn0gaW50byBhIGZ1bGwgRWNoYXJ0cyBgRUNoYXJ0c09wdGlvbmBcbiAqIEpTT04uIENlbnRyYWxpemVkIGhlcmUgc28gdGhlIHBsYW5uZXIgYWdlbnQgb25seSBmaWxscyBpbiB0aGVcbiAqIGNvbXBhY3QgcGxhbiBzaGFwZTsgdG9vbHRpcCAvIGFuaW1hdGlvbiAvIGNvbG9yIC8gZ3JpZCBkZWZhdWx0c1xuICogc3RheSBjb25zaXN0ZW50IGFjcm9zcyBjaGFydHMgYW5kIGFyZSBlYXN5IHRvIHR1bmUgd2l0aG91dFxuICogcmV0cmFpbmluZyBtb2RlbCBiZWhhdmlvdXIuXG4gKlxuICogV2hlbiBgYnJhbmRgIGlzIHNldCwgdGhlIHJlc29sdmVkIHNwZWMgaXMgdGhlbWVkIHdpdGggdGhlIGJyYW5kJ3Mgc2VyaWVzXG4gKiBjb2xvciBjeWNsZSBhbmQgYmFzZSB0ZXh0IHN0eWxlIChzZWUge0BsaW5rIGJyYW5kQ2hhcnRUaGVtZX0pOyBvdGhlcndpc2VcbiAqIEVjaGFydHMnIGRlZmF1bHRzIGFwcGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGxhblRvRWNoYXJ0c09wdGlvbihcbiAgaW5wdXQ6IENoYXJ0UGxhbklucHV0LFxuICBmYWxsYmFja1RpdGxlOiBzdHJpbmcsXG4gIGJyYW5kPzogQnJhbmRDb250ZXh0LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBwbGFuID0gY2hhcnRQbGFuU2NoZW1hLnBhcnNlKGlucHV0KTtcbiAgY29uc3QgYmFzZVRpdGxlID0gcGxhbi50aXRsZSA/PyBmYWxsYmFja1RpdGxlO1xuICBjb25zdCBncmlkID0geyBsZWZ0OiA0OCwgcmlnaHQ6IDI0LCB0b3A6IDU2LCBib3R0b206IDQ4LCBjb250YWluTGFiZWw6IHRydWUgfTtcbiAgY29uc3QgdGhlbWUgPSBicmFuZCA/IGJyYW5kQ2hhcnRUaGVtZShicmFuZCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRoZW1lZCA9IChvcHRpb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgICB0aGVtZSA/IHsgLi4udGhlbWUsIC4uLm9wdGlvbiB9IDogb3B0aW9uO1xuICBjb25zdCB0aXRsZSA9IHsgdGV4dDogYmFzZVRpdGxlLCBsZWZ0OiBcImNlbnRlclwiIH07XG4gIGNvbnN0IGxlZ2VuZCA9IHsgYm90dG9tOiAwIH07XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgLy8gVGhlIG9wdGlvbiBhcnJpdmVzIGFzIGEgSlNPTiBTVFJJTkcsIG5vdCBhIG5lc3RlZCBvYmplY3Q6IHRoaXMgcGxhbiBpc1xuICAgIC8vIHRoZSBwbGFubmVyJ3MgcHJvdmlkZXItZW5mb3JjZWQgc3RydWN0dXJlZCBvdXRwdXQsIGFuZCBhIGZyZWUtZm9ybVxuICAgIC8vIG9iamVjdCBiZWNvbWVzIGFuIHVuY29uc3RyYWluZWQgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCBzY2hlbWEgdGhhdFxuICAgIC8vIHN0cmljdCBPcGVuQUkgYW5kIEdlbWluaSBlbmRwb2ludHMgcmVqZWN0IC0gd2hpY2ggd291bGQgYnJlYWsgRVZFUllcbiAgICAvLyBjaGFydCwgbm90IGp1c3QgdGhpcyBvbmUgKHNhbWUgY2xhc3Mgb2YgaGF6YXJkIGFzIHRoZSBgcHJlZml4SXRlbXNgXG4gICAgLy8gbm90ZSBvbiBgY2hhcnREYXRhUG9pbnRTY2hlbWFgKS4gQSBtYWxmb3JtZWQgc3RyaW5nIGNvc3RzIG9uZSBjaGFydC5cbiAgICAvLyBOb3RoaW5nIGhlcmUgaXMgZXZhbCdkOyBhIHN0cmluZy12YWx1ZWQgRWNoYXJ0cyBmb3JtYXR0ZXIgaXMgYVxuICAgIC8vIHRlbXBsYXRlLCBub3QgY29kZS5cbiAgICBjb25zdCBvcHRpb24gPSBqc29uLnBhcnNlUmVjb3JkKHBsYW4ub3B0aW9uKTtcbiAgICBpZiAoIW9wdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGFydFR5cGUgXCJjdXN0b21cIiBuZWVkcyBhbiBgb3B0aW9uYCBob2xkaW5nIGEgSlNPTiBvYmplY3QnKTtcbiAgICB9XG4gICAgLy8gVGl0bGUgaXMgdGhlIG9uZSBkZWZhdWx0IHdvcnRoIGZpbGxpbmc6IGV2ZXJ5IG90aGVyIGJyYW5jaCBndWFyYW50ZWVzXG4gICAgLy8gb25lIGFuZCB0aGUgcmVuZGVyZXIgcmVzZXJ2ZXMgZ3JpZCBzcGFjZSBmb3IgaXQuIEEgdGl0bGUgdGhlIG1vZGVsIHNldFxuICAgIC8vIHdpbnMsIGFzIGRvZXMgZXZlcnkgb3RoZXIgZmllbGQgaXQgZGVjbGFyZWQuXG4gICAgcmV0dXJuIHRoZW1lZCh7IHRpdGxlLCAuLi5vcHRpb24gfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwicGllXCIgfHwgcGxhbi5jaGFydFR5cGUgPT09IFwiZnVubmVsXCIgfHwgcGxhbi5jaGFydFR5cGUgPT09IFwidHJlZW1hcFwiKSB7XG4gICAgY29uc3Qgc2xpY2VzID0gbmFtZWRTbGljZXMocGxhbi5zZXJpZXNbMF0/LmRhdGEgPz8gW10pO1xuICAgIGNvbnN0IHNlcmllc1R5cGUgPSBwbGFuLmNoYXJ0VHlwZTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kOiBzZXJpZXNUeXBlID09PSBcInRyZWVtYXBcIiA/IHVuZGVmaW5lZCA6IGxlZ2VuZCxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcGxhbi5zZXJpZXNbMF0/Lm5hbWUgPz8gYmFzZVRpdGxlLFxuICAgICAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICAgICAgLi4uKHNlcmllc1R5cGUgPT09IFwicGllXCIgPyB7IHJhZGl1czogW1wiMzUlXCIsIFwiNjUlXCJdIH0gOiB7fSksXG4gICAgICAgICAgLi4uKHNlcmllc1R5cGUgPT09IFwiZnVubmVsXCIgPyB7IHNvcnQ6IFwiZGVzY2VuZGluZ1wiIH0gOiB7fSksXG4gICAgICAgICAgZGF0YTogc2xpY2VzLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJzY2F0dGVyXCIpIHtcbiAgICAvLyBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCBzY2F0dGVyIHBvaW50cyAtIGtlZXAgb25seSB2YWxpZFxuICAgIC8vIGBbeCwgeV1gIHR1cGxlcy4gQmFyZSBudW1iZXJzIC8gb2JqZWN0cyAvIG51bGxzIGZyb20gYVxuICAgIC8vIG1pc21hdGNoZWQgcGxhbiBnZXQgZHJvcHBlZCBzaWxlbnRseS5cbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kLFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi54QXhpc0xhYmVsIH0sXG4gICAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgdHlwZTogXCJzY2F0dGVyXCIsXG4gICAgICAgIGRhdGE6IHNjYXR0ZXJQb2ludHMocy5kYXRhKSxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJoZWF0bWFwXCIpIHtcbiAgICBjb25zdCB7IGNlbGxzLCB5Q2F0ZWdvcmllcyB9ID0gaGVhdG1hcE1hdHJpeChwbGFuKTtcbiAgICBjb25zdCB2YWx1ZXMgPSBjZWxscy5tYXAoKGMpID0+IGNbMl0pO1xuICAgIGNvbnN0IG1pbiA9IHZhbHVlcy5sZW5ndGggPiAwID8gTWF0aC5taW4oLi4udmFsdWVzKSA6IDA7XG4gICAgY29uc3QgbWF4ID0gdmFsdWVzLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi52YWx1ZXMpIDogMTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyBwb3NpdGlvbjogXCJ0b3BcIiB9LFxuICAgICAgLy8gVGhlIHZpc3VhbE1hcCByYW1wIHNpdHMgYmVsb3cgdGhlIHBsb3QsIHNvIHRoZSBncmlkIGdpdmVzIHVwXG4gICAgICAvLyBtb3JlIGJvdHRvbSByb29tIHRoYW4gYW4gYXhpcy1vbmx5IGNoYXJ0IG5lZWRzLlxuICAgICAgZ3JpZDogeyAuLi5ncmlkLCBib3R0b206IDcyIH0sXG4gICAgICB4QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgICAgICBzcGxpdEFyZWE6IHsgc2hvdzogdHJ1ZSB9LFxuICAgICAgfSxcbiAgICAgIHlBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogeUNhdGVnb3JpZXMsXG4gICAgICAgIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCxcbiAgICAgICAgc3BsaXRBcmVhOiB7IHNob3c6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgICB2aXN1YWxNYXA6IHtcbiAgICAgICAgLy8gRWNoYXJ0cyBoaWRlcyBldmVyeSBjZWxsIHdoZW4gbWluID09PSBtYXggKGEgdW5pZm9ybSBtYXRyaXgpLFxuICAgICAgICAvLyBzbyBhIGRlZ2VuZXJhdGUgcmFuZ2UgaXMgd2lkZW5lZCBieSBvbmUuXG4gICAgICAgIG1pbixcbiAgICAgICAgbWF4OiBtYXggPiBtaW4gPyBtYXggOiBtaW4gKyAxLFxuICAgICAgICBjYWxjdWxhYmxlOiB0cnVlLFxuICAgICAgICBvcmllbnQ6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICBsZWZ0OiBcImNlbnRlclwiLFxuICAgICAgICBib3R0b206IDgsXG4gICAgICAgIGluUmFuZ2U6IHsgY29sb3I6IEhFQVRNQVBfUkFNUCB9LFxuICAgICAgfSxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcGxhbi5zZXJpZXNbMF0/Lm5hbWUgPz8gYmFzZVRpdGxlLFxuICAgICAgICAgIHR5cGU6IFwiaGVhdG1hcFwiLFxuICAgICAgICAgIGRhdGE6IGNlbGxzLFxuICAgICAgICAgIC8vIFByaW50ZWQgY2VsbCB2YWx1ZXMgYXJlIHVucmVhZGFibGUgb25jZSB0aGUgZ3JpZCBpcyBkZW5zZS5cbiAgICAgICAgICBsYWJlbDogeyBzaG93OiBjZWxscy5sZW5ndGggPD0gSEVBVE1BUF9MQUJFTF9NQVhfQ0VMTFMgfSxcbiAgICAgICAgICBlbXBoYXNpczogeyBpdGVtU3R5bGU6IHsgc2hhZG93Qmx1cjogMTAsIHNoYWRvd0NvbG9yOiBcInJnYmEoMCwgMCwgMCwgMC4zKVwiIH0gfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwicmFkYXJcIikge1xuICAgIGNvbnN0IGluZGljYXRvcnMgPSAocGxhbi5jYXRlZ29yaWVzID8/IFtdKS5tYXAoKG5hbWUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwZWFrID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIC4uLnBsYW4uc2VyaWVzLm1hcCgocykgPT4ge1xuICAgICAgICAgIGNvbnN0IG51bXMgPSBudW1lcmljUG9pbnRzKHMuZGF0YSk7XG4gICAgICAgICAgcmV0dXJuIG51bXNbaW5kZXhdID8/IDA7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IG5hbWUsIG1heDogcGVhayA+IDAgPyBwZWFrIDogMSB9O1xuICAgIH0pO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiaXRlbVwiIH0sXG4gICAgICBsZWdlbmQsXG4gICAgICByYWRhcjogeyBpbmRpY2F0b3I6IGluZGljYXRvcnMgfSxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJyYWRhclwiLFxuICAgICAgICAgIGRhdGE6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBudW1lcmljUG9pbnRzKHMuZGF0YSksXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJ3YXRlcmZhbGxcIikge1xuICAgIGNvbnN0IHZhbHVlcyA9IG51bWVyaWNQb2ludHMod2F0ZXJmYWxsRGVsdGFTZXJpZXMocGxhbi5zZXJpZXMpPy5kYXRhID8/IFtdKTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgLy8gSXRlbS10cmlnZ2VyZWQgc28gdGhlIHRyYW5zcGFyZW50IGBzaWxlbnRgIG9mZnNldCBiYXJzIG5ldmVyXG4gICAgICAvLyBzdXJmYWNlIGluIGEgdG9vbHRpcCAoc2VlIGB3YXRlcmZhbGxTZXJpZXNgKS5cbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIC8vIE9ubHkgdGhlIHR3byB2aXNpYmxlIHN0ZXBzIGJlbG9uZyBpbiB0aGUgbGVnZW5kLlxuICAgICAgbGVnZW5kOiB7IC4uLmxlZ2VuZCwgZGF0YTogW1dBVEVSRkFMTF9JTkNSRUFTRV9OQU1FLCBXQVRFUkZBTExfREVDUkVBU0VfTkFNRV0gfSxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHBsYW4uY2F0ZWdvcmllcyA/PyBbXSxcbiAgICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgICAgfSxcbiAgICAgIHlBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgICBzZXJpZXM6IHdhdGVyZmFsbFNlcmllcyh2YWx1ZXMpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImhvcml6b250YWxCYXJcIikge1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiYXhpc1wiLCBheGlzUG9pbnRlcjogeyB0eXBlOiBcInNoYWRvd1wiIH0gfSxcbiAgICAgIGxlZ2VuZCxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCB9LFxuICAgICAgeUF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCxcbiAgICAgIH0sXG4gICAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICB0eXBlOiBcImJhclwiLFxuICAgICAgICBkYXRhOiBzLmRhdGEsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwiY29tYm9cIikge1xuICAgIGNvbnN0IHVzZXNSaWdodEF4aXMgPSBwbGFuLnNlcmllcy5zb21lKChzKSA9PiBzLnlBeGlzSW5kZXggPT09IDEpO1xuICAgIHJldHVybiB0aGVtZWQoe1xuICAgICAgdGl0bGUsXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiYXhpc1wiIH0sXG4gICAgICBsZWdlbmQsXG4gICAgICBncmlkLFxuICAgICAgeEF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCxcbiAgICAgIH0sXG4gICAgICB5QXhpczogdXNlc1JpZ2h0QXhpc1xuICAgICAgICA/IFtcbiAgICAgICAgICAgIHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICAgICAgICAgIHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHMudHlwZSA/PyBcImJhclwiO1xuICAgICAgICBjb25zdCBzZXJpZXNUeXBlID0gbWFyayA9PT0gXCJhcmVhXCIgPyBcImxpbmVcIiA6IG1hcms7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICAgICAgZGF0YTogcy5kYXRhLFxuICAgICAgICAgIHlBeGlzSW5kZXg6IHMueUF4aXNJbmRleCA/PyAwLFxuICAgICAgICAgIHNtb290aDogc2VyaWVzVHlwZSA9PT0gXCJsaW5lXCIsXG4gICAgICAgICAgLi4uKG1hcmsgPT09IFwiYXJlYVwiID8geyBhcmVhU3R5bGU6IHt9IH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGJhciAvIGxpbmUgLyBhcmVhIHNoYXJlIHRoZSBzYW1lIGF4aXMgbGF5b3V0LlxuICBjb25zdCBpc0FyZWEgPSBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJhcmVhXCI7XG4gIGNvbnN0IHNlcmllc1R5cGUgPSBwbGFuLmNoYXJ0VHlwZSA9PT0gXCJiYXJcIiA/IFwiYmFyXCIgOiBcImxpbmVcIjtcbiAgcmV0dXJuIHRoZW1lZCh7XG4gICAgdGl0bGUsXG4gICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcImF4aXNcIiB9LFxuICAgIGxlZ2VuZCxcbiAgICBncmlkLFxuICAgIHhBeGlzOiB7XG4gICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICBuYW1lOiBwbGFuLnhBeGlzTGFiZWwsXG4gICAgfSxcbiAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgIHNlcmllczogcGxhbi5zZXJpZXMubWFwKChzKSA9PiAoe1xuICAgICAgbmFtZTogcy5uYW1lLFxuICAgICAgdHlwZTogc2VyaWVzVHlwZSxcbiAgICAgIGRhdGE6IHMuZGF0YSxcbiAgICAgIHNtb290aDogc2VyaWVzVHlwZSA9PT0gXCJsaW5lXCIsXG4gICAgICAuLi4oaXNBcmVhID8geyBhcmVhU3R5bGU6IHt9IH0gOiB7fSksXG4gICAgfSkpLFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVuZGVyX2RhdGEgdG9vbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBgcmVuZGVyX2RhdGFgIE1hc3RyYSB0b29sIGJvdW5kIHRvIHRoZSBnaXZlbiBwbHVnaW5cbiAqIGNvbmZpZy4gQXV0by13aXJlZCBhcyBhIHN5c3RlbSB0b29sIG9uIGV2ZXJ5IGFnZW50IChzZWVcbiAqIGBhZ2VudHMudHNgKTsgcGVyLWFnZW50IHRvb2xzIGNhbiBzaGFkb3cgaXQgYnkgcmVnaXN0ZXJpbmcgYVxuICogc2FtZS1uYW1lZCBlbnRyeS5cbiAqXG4gKiBUaGluIHdyYXBwZXIgb3ZlciB7QGxpbmsgcHJlcGFyZUNoYXJ0fSBmb3IgY2FsbGVycyB0aGF0IGFscmVhZHlcbiAqIGhhdmUgYSBkYXRhc2V0IGluIGhhbmQuIE1pbnRzIGEgYGNoYXJ0SWRgIHN5bmNocm9ub3VzbHksIGNhY2hlc1xuICogYW4gZW1wdHkgcGxhY2Vob2xkZXIsIGFuZCBraWNrcyBvZmYgdGhlIGNoYXJ0LXBsYW5uZXIgaW4gdGhlXG4gKiBiYWNrZ3JvdW5kLiBSZXR1cm5zIHRoZSBgY2hhcnRJZGAgcGx1cyBpdHMgcmVhZHktdG8tY29weSBgbWFya2VyYDsgdGhlIGhvc3RcbiAqIFVJIHJlc29sdmVzIHRoYXQgbWFya2VyIHRocm91Z2ggdGhlIHBsdWdpbidzIGAvZW1iZWQvY2hhcnQvOmlkYCByb3V0ZS5cbiAqXG4gKiBGb3IgR2VuaWUgc3RhdGVtZW50IHJlc3VsdHMsIHByZWZlciB0aGUgR2VuaWUgYWdlbnQnc1xuICogYHByZXBhcmVfY2hhcnRgIHRvb2wsIHdoaWNoIGFjY2VwdHMgYSBgc3RhdGVtZW50X2lkYCBhbmRcbiAqIHJlc29sdmVzIHRoZSByb3dzIGxhemlseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpIHtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBcInJlbmRlcl9kYXRhXCIsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oW1xuICAgICAgYFxuICAgICAgICBTdWJtaXQgYSB0YWJ1bGFyIGRhdGFzZXQgZm9yIGlubGluZSByZW5kZXJpbmcgYXMgYSBjaGFydCBpblxuICAgICAgICB0aGUgdXNlcidzIHZpZXcuIFBhc3MgYSB0aXRsZSwgdGhlIHJhdyByb3dzIChhcnJheSBvZiBvYmplY3RzXG4gICAgICAgIGtleWVkIGJ5IGNvbHVtbiBuYW1lKSwgYW5kIGFuIG9wdGlvbmFsIG9uZS1saW5lIGRlc2NyaXB0aW9uXG4gICAgICAgIG9mIHRoZSBpbnNpZ2h0IHRvIGhpZ2hsaWdodC4gUmV0dXJucyBcXGBjaGFydElkXFxgIHBsdXMgdGhlXG4gICAgICAgIGNvbXBsZXRlIFxcYG1hcmtlclxcYDsgY29weSB0aGUgcmV0dXJuZWQgbWFya2VyIFZFUkJBVElNIG9udG9cbiAgICAgICAgaXRzIG93biBsaW5lIHdoZXJlIHRoZSBjaGFydCBzaG91bGQgcmVuZGVyLiBOZXZlciBjb25zdHJ1Y3QsXG4gICAgICAgIGFsdGVyLCBvciBpbnZlbnQgYSBjaGFydCBtYXJrZXIgeW91cnNlbGYuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBQbGFjZW1lbnQgY29udHJhY3Q6IGVtYmVkIHRoZSByZXR1cm5lZCBcXGBtYXJrZXJcXGAgb24gaXRzIG93blxuICAgICAgICBsaW5lIChibGFuayBsaW5lcyBhYm92ZSBhbmQgYmVsb3cpIHdoZXJldmVyIHlvdSB3YW50IHRoZSBjaGFydFxuICAgICAgICB0byBhcHBlYXIgaW4geW91ciByZXBseS4gVGhlIGNoYXJ0IHJlc29sdmVzXG4gICAgICAgIGFzeW5jaHJvbm91c2x5IC0gdGhlIHRvb2wgcmV0dXJucyB0aGUgaWQgaW1tZWRpYXRlbHkgYW5kIHRoZVxuICAgICAgICBob3N0IFVJIGZldGNoZXMgdGhlIGNoYXJ0IGZyb20gdGhlIGNhY2hlIG9uY2UgdGhlIHBsYW5uZXJcbiAgICAgICAgbGFuZHMuIFlvdSBjYW4gY2FsbCBcXGByZW5kZXJfZGF0YVxcYCBtdWx0aXBsZSB0aW1lcyBpbiB0aGVcbiAgICAgICAgc2FtZSB0dXJuICh0aGUgdG9vbCBpcyBwYXJhbGxlbC1zYWZlKSBhbmQgaW50ZXJsZWF2ZSB0aGVcbiAgICAgICAgbWFya2VycyB3aXRoIHByb3NlIHNvIGVhY2ggY2hhcnQgc2l0cyBuZXh0IHRvIGl0c1xuICAgICAgICBjb21tZW50YXJ5LlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgVXNlIHdoZW5ldmVyIGEgU1FMIHJvdyBzZXQsIEFQSSByZXNwb25zZSwgb3IgaGFuZC1idWlsdFxuICAgICAgICBkYXRhc2V0IHdvdWxkIGxhbmQgYmV0dGVyIGFzIGEgcGljdHVyZSB0aGFuIGFzIGEgbGlzdCBvclxuICAgICAgICB0YWJsZS4gQ2FwIGlucHV0IGF0IGEgZmV3IGh1bmRyZWQgcm93czsgc2FtcGxlIG9yIGFnZ3JlZ2F0ZVxuICAgICAgICBsYXJnZXIgZGF0YXNldHMgZmlyc3QuXG4gICAgICBgLFxuICAgIF0pLFxuICAgIGlucHV0U2NoZW1hOiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLFxuICAgIG91dHB1dFNjaGVtYTogY2hhcnRUb29sT3V0cHV0U2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCB7IHRpdGxlLCBkZXNjcmlwdGlvbiwgZGF0YSB9ID0gaW5wdXQgYXMgQ2hhcnRQbGFubmVyUmVxdWVzdDtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyB7IHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQgfSB8IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBwcmVwYXJlQ2hhcnQoe1xuICAgICAgICBjb25maWcsXG4gICAgICAgIHVzZXJLZXk6IHJlc29sdmVVc2VyS2V5KGN0eD8ucmVxdWVzdENvbnRleHQpLFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgLi4uKGRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICByZXNvbHZlRGF0YTogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHsgcm93czogZGF0YSB9KSxcbiAgICAgICAgLi4uKGN0eD8ucmVxdWVzdENvbnRleHQgPyB7IHJlcXVlc3RDb250ZXh0OiBjdHgucmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
|
package/lib/src/chat.js
CHANGED
|
@@ -116,10 +116,10 @@ export function agentChatRoutes() {
|
|
|
116
116
|
function serializeChatStreamError(error) {
|
|
117
117
|
if (isStaleMastraResumeError(error)) {
|
|
118
118
|
logger.warn("ignored stale mastra resume", {
|
|
119
|
-
error: errorUtils.
|
|
119
|
+
error: errorUtils.toError(error),
|
|
120
120
|
});
|
|
121
121
|
return STALE_MASTRA_RESUME_STREAM_TEXT;
|
|
122
122
|
}
|
|
123
123
|
return errorUtils.errorMessage(error);
|
|
124
124
|
}
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLCtCQUErQixHQUNoQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRXpDLGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBYyxFQUFFLE1BQW1CO0lBQ2xFLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNwRCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxlQUFlO0lBQzdCLE1BQU0sUUFBUSxHQUFHLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQWtDLENBQUM7SUFDaEYsTUFBTSxPQUFPLEdBQ1gsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksWUFBWSxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksU0FBK0MsQ0FBQztJQUNuSCxNQUFNLFNBQVMs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bnRlbnQiOlsiLyoqXG4gKiBPZmZpY2lhbCBNYXN0cmEgQUkgU0RLIGNoYXQgcm91dGVzIGZvciBicm93c2VyLWNvbXBhdGlibGUgVUkgc3RyZWFtcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHJvdXRlcyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7XG4gIGlzU3RhbGVNYXN0cmFSZXN1bWVFcnJvcixcbiAgU1RBTEVfTUFTVFJBX1JFU1VNRV9TVFJFQU1fVEVYVCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYS9yZXN1bWVcIjtcbmltcG9ydCB7IGhhbmRsZUNoYXRTdHJlYW0sIHRvQUlTZGtTdHJlYW0gfSBmcm9tIFwiQG1hc3RyYS9haS1zZGtcIjtcbmltcG9ydCB7IGlzRXZlbnRlZEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudC9kdXJhYmxlXCI7XG5pbXBvcnQgeyByZWdpc3RlckFwaVJvdXRlIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9zZXJ2ZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVVJTWVzc2FnZVN0cmVhbVJlc3BvbnNlIH0gZnJvbSBcImFpXCI7XG5cbmltcG9ydCB7IHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGUgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9jaGF0XCIpO1xuXG4vKiogQ2xpZW50IHJlcXVlc3QgY2FuY2VsbGF0aW9uIGlzIGRldGFjaGVkIG9ubHkgZm9yIGV2ZW50ZWQgYmFja2dyb3VuZCBhZ2VudHMuICovXG5leHBvcnQgZnVuY3Rpb24gYWdlbnRBYm9ydFNpZ25hbChhZ2VudDogdW5rbm93biwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGlzRXZlbnRlZEFnZW50KGFnZW50KSA/IHVuZGVmaW5lZCA6IHNpZ25hbDtcbn1cblxuLyoqIFJlZ2lzdGVyIGRldGFjaGVkIGNoYXQsIGR1cmFibGUgb2JzZXJ2YXRpb24sIGFuZCBleHBsaWNpdCBhYm9ydCByb3V0ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gYWdlbnRDaGF0Um91dGVzKCkge1xuICBjb25zdCBjaGF0UGF0aCA9IGAke3JvdXRlcy5NQVNUUkFfUk9VVEVTLmNoYXR9LzphZ2VudElkYCBhcyBgJHtzdHJpbmd9OmFnZW50SWRgO1xuICBjb25zdCBydW5QYXRoID1cbiAgICBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5jaGF0fS86YWdlbnRJZCR7cm91dGVzLk1BU1RSQV9ST1VURVMucnVuc30vOnJ1bklkYCBhcyBgJHtzdHJpbmd9OmFnZW50SWQke3N0cmluZ306cnVuSWRgO1xuICBjb25zdCBhYm9ydFBhdGggPVxuICAgIGAke3J1blBhdGh9JHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5hYm9ydH1gIGFzIGAke3N0cmluZ306YWdlbnRJZCR7c3RyaW5nfTpydW5JZCR7c3RyaW5nfWA7XG4gIHJldHVybiBbXG4gICAgcmVnaXN0ZXJBcGlSb3V0ZShjaGF0UGF0aCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGNvbnRleHQucmVxLmpzb24oKTtcbiAgICAgICAgY29uc3QgbWFzdHJhID0gY29udGV4dC5nZXQoXCJtYXN0cmFcIik7XG4gICAgICAgIGNvbnN0IGFnZW50SWQgPSBjb250ZXh0LnJlcS5wYXJhbShcImFnZW50SWRcIik7XG4gICAgICAgIGlmICghYWdlbnRJZCkgdGhyb3cgbmV3IEVycm9yKFwiQWdlbnQgSUQgaXMgcmVxdWlyZWRcIik7XG4gICAgICAgIGNvbnN0IG1pZGRsZXdhcmVSZXF1ZXN0Q29udGV4dCA9IGNvbnRleHQuZ2V0KFwicmVxdWVzdENvbnRleHRcIik7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gbWlkZGxld2FyZVJlcXVlc3RDb250ZXh0IHx8IHBhcmFtcy5yZXF1ZXN0Q29udGV4dDtcbiAgICAgICAgaWYgKG1pZGRsZXdhcmVSZXF1ZXN0Q29udGV4dCAmJiBwYXJhbXMucmVxdWVzdENvbnRleHQpIHtcbiAgICAgICAgICBtYXN0cmFcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgPy53YXJuKCdNdWx0aXBsZSBcInJlcXVlc3RDb250ZXh0XCIgc291cmNlcyBwcm92aWRlZC4gVXNpbmcgbWlkZGxld2FyZSBjb250ZXh0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcnNpb25JZCA9IGNvbnRleHQucmVxLnF1ZXJ5KFwidmVyc2lvbklkXCIpO1xuICAgICAgICBjb25zdCByYXdTdGF0dXMgPSBjb250ZXh0LnJlcS5xdWVyeShcInN0YXR1c1wiKTtcbiAgICAgICAgaWYgKHZlcnNpb25JZCAmJiByYXdTdGF0dXMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IHBhcmFtZXRlcnMgXCJ2ZXJzaW9uSWRcIiBhbmQgXCJzdGF0dXNcIiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhd1N0YXR1cyAmJiByYXdTdGF0dXMgIT09IFwiZHJhZnRcIiAmJiByYXdTdGF0dXMgIT09IFwicHVibGlzaGVkXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IHBhcmFtZXRlciBcInN0YXR1c1wiIG11c3QgYmUgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSByYXdTdGF0dXMgYXMgXCJkcmFmdFwiIHwgXCJwdWJsaXNoZWRcIiB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYWJvcnRTaWduYWwgPSBhZ2VudEFib3J0U2lnbmFsKG1hc3RyYS5nZXRBZ2VudEJ5SWQoYWdlbnRJZCksIGNvbnRleHQucmVxLnJhdy5zaWduYWwpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBoYW5kbGVDaGF0U3RyZWFtKHtcbiAgICAgICAgICBtYXN0cmEsXG4gICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAuLi4odmVyc2lvbklkXG4gICAgICAgICAgICA/IHsgYWdlbnRWZXJzaW9uOiB7IHZlcnNpb25JZCB9IH1cbiAgICAgICAgICAgIDogc3RhdHVzXG4gICAgICAgICAgICAgID8geyBhZ2VudFZlcnNpb246IHsgc3RhdHVzIH0gfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICBwYXJhbXM6IHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICAgICAgICAgIC4uLihhYm9ydFNpZ25hbCA/IHsgYWJvcnRTaWduYWwgfSA6IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgICApLFxuICAgICAgICAgIHZlcnNpb246IFwidjdcIixcbiAgICAgICAgICBzZW5kUmVhc29uaW5nOiB0cnVlLFxuICAgICAgICAgIHNlbmRTb3VyY2VzOiB0cnVlLFxuICAgICAgICAgIG9uRXJyb3I6IHNlcmlhbGl6ZUNoYXRTdHJlYW1FcnJvcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVVSU1lc3NhZ2VTdHJlYW1SZXNwb25zZSh7IHN0cmVhbSB9KTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgcmVnaXN0ZXJBcGlSb3V0ZShydW5QYXRoLCB7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBtYXN0cmEgPSBjb250ZXh0LmdldChcIm1hc3RyYVwiKTtcbiAgICAgICAgY29uc3QgYWdlbnRJZCA9IGNvbnRleHQucmVxLnBhcmFtKFwiYWdlbnRJZFwiKTtcbiAgICAgICAgY29uc3QgcnVuSWQgPSBjb250ZXh0LnJlcS5wYXJhbShcInJ1bklkXCIpO1xuICAgICAgICBpZiAoIWFnZW50SWQgfHwgIXJ1bklkKSB0aHJvdyBuZXcgRXJyb3IoXCJBZ2VudCBJRCBhbmQgcnVuIElEIGFyZSByZXF1aXJlZFwiKTtcbiAgICAgICAgY29uc3QgYWdlbnQgPSBtYXN0cmEuZ2V0QWdlbnRCeUlkKGFnZW50SWQpO1xuICAgICAgICBpZiAoIWlzRXZlbnRlZEFnZW50KGFnZW50KSkge1xuICAgICAgICAgIHJldHVybiBSZXNwb25zZS5qc29uKFxuICAgICAgICAgICAgeyBlcnJvcjogYEFnZW50ICR7YWdlbnRJZH0gZG9lcyBub3Qgc3VwcG9ydCBiYWNrZ3JvdW5kIHR1cm5zYCB9LFxuICAgICAgICAgICAgeyBzdGF0dXM6IDQwOSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JzZXJ2ZWQgPSBhd2FpdCBhZ2VudC5vYnNlcnZlKHJ1bklkKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdG9BSVNka1N0cmVhbShvYnNlcnZlZC5vdXRwdXQsIHtcbiAgICAgICAgICBmcm9tOiBcImFnZW50XCIsXG4gICAgICAgICAgdmVyc2lvbjogXCJ2N1wiLFxuICAgICAgICAgIHNlbmRSZWFzb25pbmc6IHRydWUsXG4gICAgICAgICAgc2VuZFNvdXJjZXM6IHRydWUsXG4gICAgICAgICAgb25FcnJvcjogc2VyaWFsaXplQ2hhdFN0cmVhbUVycm9yLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVVJTWVzc2FnZVN0cmVhbVJlc3BvbnNlKHsgc3RyZWFtIH0pO1xuICAgICAgfSxcbiAgICB9KSxcbiAgICByZWdpc3RlckFwaVJvdXRlKGFib3J0UGF0aCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IG1hc3RyYSA9IGNvbnRleHQuZ2V0KFwibWFzdHJhXCIpO1xuICAgICAgICBjb25zdCBhZ2VudElkID0gY29udGV4dC5yZXEucGFyYW0oXCJhZ2VudElkXCIpO1xuICAgICAgICBjb25zdCBydW5JZCA9IGNvbnRleHQucmVxLnBhcmFtKFwicnVuSWRcIik7XG4gICAgICAgIGlmICghYWdlbnRJZCB8fCAhcnVuSWQpIHRocm93IG5ldyBFcnJvcihcIkFnZW50IElEIGFuZCBydW4gSUQgYXJlIHJlcXVpcmVkXCIpO1xuICAgICAgICBjb25zdCBhZ2VudCA9IG1hc3RyYS5nZXRBZ2VudEJ5SWQoYWdlbnRJZCk7XG4gICAgICAgIGlmICghaXNFdmVudGVkQWdlbnQoYWdlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgICAgICAgICB7IGVycm9yOiBgQWdlbnQgJHthZ2VudElkfSBkb2VzIG5vdCBzdXBwb3J0IGJhY2tncm91bmQgdHVybnNgIH0sXG4gICAgICAgICAgICB7IHN0YXR1czogNDA5IH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVzcG9uc2UuanNvbih7IGFib3J0ZWQ6IGFnZW50LmFib3J0UnVuU3RyZWFtKHJ1bklkKSB9KTtcbiAgICAgIH0sXG4gICAgfSksXG4gIF07XG59XG5cbi8qKlxuICogS2VlcCBhIGxhdGUgb3IgZHVwbGljYXRlIHJlc3VtZSBmcm9tIGZhaWxpbmcgdGhlIFVJIHN0cmVhbS4gTWFzdHJhJ3NcbiAqIHJlc3VtZSBwYXRoIGNhbiBzdXJmYWNlIGEgd29ya2Zsb3cgZXJyb3IgYWZ0ZXIgYW5vdGhlciBjbGllbnQgYWxyZWFkeVxuICogcmVzb2x2ZWQgdGhlIHNhbWUgYXBwcm92YWwuXG4gKi9cbmZ1bmN0aW9uIHNlcmlhbGl6ZUNoYXRTdHJlYW1FcnJvcihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChpc1N0YWxlTWFzdHJhUmVzdW1lRXJyb3IoZXJyb3IpKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJpZ25vcmVkIHN0YWxlIG1hc3RyYSByZXN1bWVcIiwge1xuICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICB9KTtcbiAgICByZXR1cm4gU1RBTEVfTUFTVFJBX1JFU1VNRV9TVFJFQU1fVEVYVDtcbiAgfVxuICByZXR1cm4gZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyb3IpO1xufVxuIl19
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLCtCQUErQixHQUNoQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRXpDLGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBYyxFQUFFLE1BQW1CO0lBQ2xFLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNwRCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxlQUFlO0lBQzdCLE1BQU0sUUFBUSxHQUFHLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQWtDLENBQUM7SUFDaEYsTUFBTSxPQUFPLEdBQ1gsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksWUFBWSxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksU0FBK0MsQ0FBQztJQUNuSCxNQUFNLFNBQVMsR0FDYixHQUFHLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBaUQsQ0FBQztJQUMzRixPQUFPO1FBQ0wsZ0JBQWdCLENBQUMsUUFBUSxFQUFFO1lBQ3pCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN4QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLE9BQU87b0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNLHdCQUF3QixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQztnQkFDekUsSUFBSSx3QkFBd0IsSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3RELE1BQU07eUJBQ0gsU0FBUyxFQUFFO3dCQUNaLEVBQUUsSUFBSSxDQUFDLHVFQUF1RSxDQUFDLENBQUM7Z0JBQ3BGLENBQUM7Z0JBQ0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2pELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLFNBQVMsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO2dCQUN0RixDQUFDO2dCQUNELElBQUksU0FBUyxJQUFJLFNBQVMsS0FBSyxPQUFPLElBQUksU0FBUyxLQUFLLFdBQVcsRUFBRSxDQUFDO29CQUNwRSxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7Z0JBQzdFLENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsU0FBOEMsQ0FBQztnQkFDOUQsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDM0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQztvQkFDcEMsTUFBTTtvQkFDTixPQUFPO29CQUNQLEdBQUcsQ0FBQyxTQUFTO3dCQUNYLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFO3dCQUNqQyxDQUFDLENBQUMsTUFBTTs0QkFDTixDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRTs0QkFDOUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDVCxNQUFNLEVBQUUsc0JBQXNCLENBQzVCO3dCQUNFLEdBQUcsTUFBTTt3QkFDVCxjQUFjO3dCQUNkLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztxQkFDeEMsRUFDRCxjQUFjLENBQ2Y7b0JBQ0QsT0FBTyxFQUFFLElBQUk7b0JBQ2IsYUFBYSxFQUFFLElBQUk7b0JBQ25CLFdBQVcsRUFBRSxJQUFJO29CQUNqQixPQUFPLEVBQUUsd0JBQXdCO2lCQUNsQyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyw2QkFBNkIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDbkQsQ0FBQztTQUNGLENBQUM7UUFDRixnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7WUFDeEIsTUFBTSxFQUFFLEtBQUs7WUFDYixPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUN6QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0MsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLO29CQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztnQkFDNUUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMzQixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQ2xCLEVBQUUsS0FBSyxFQUFFLFNBQVMsT0FBTyxvQ0FBb0MsRUFBRSxFQUMvRCxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FDaEIsQ0FBQztnQkFDSixDQUFDO2dCQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7b0JBQzVDLElBQUksRUFBRSxPQUFPO29CQUNiLE9BQU8sRUFBRSxJQUFJO29CQUNiLGFBQWEsRUFBRSxJQUFJO29CQUNuQixXQUFXLEVBQUUsSUFBSTtvQkFDakIsT0FBTyxFQUFFLHdCQUF3QjtpQkFDbEMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sNkJBQTZCLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELENBQUM7U0FDRixDQUFDO1FBQ0YsZ0JBQWdCLENBQUMsU0FBUyxFQUFFO1lBQzFCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDekIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDckMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzdDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSztvQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Z0JBQzVFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDM0IsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUNsQixFQUFFLEtBQUssRUFBRSxTQUFTLE9BQU8sb0NBQW9DLEVBQUUsRUFDL0QsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQ2hCLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakUsQ0FBQztTQUNGLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHdCQUF3QixDQUFDLEtBQWM7SUFDOUMsSUFBSSx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUU7WUFDekMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ2pDLENBQUMsQ0FBQztRQUNILE9BQU8sK0JBQStCLENBQUM7SUFDekMsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPZmZpY2lhbCBNYXN0cmEgQUkgU0RLIGNoYXQgcm91dGVzIGZvciBicm93c2VyLWNvbXBhdGlibGUgVUkgc3RyZWFtcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHJvdXRlcyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7XG4gIGlzU3RhbGVNYXN0cmFSZXN1bWVFcnJvcixcbiAgU1RBTEVfTUFTVFJBX1JFU1VNRV9TVFJFQU1fVEVYVCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYS9yZXN1bWVcIjtcbmltcG9ydCB7IGhhbmRsZUNoYXRTdHJlYW0sIHRvQUlTZGtTdHJlYW0gfSBmcm9tIFwiQG1hc3RyYS9haS1zZGtcIjtcbmltcG9ydCB7IGlzRXZlbnRlZEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudC9kdXJhYmxlXCI7XG5pbXBvcnQgeyByZWdpc3RlckFwaVJvdXRlIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9zZXJ2ZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVVJTWVzc2FnZVN0cmVhbVJlc3BvbnNlIH0gZnJvbSBcImFpXCI7XG5cbmltcG9ydCB7IHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGUgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9jaGF0XCIpO1xuXG4vKiogQ2xpZW50IHJlcXVlc3QgY2FuY2VsbGF0aW9uIGlzIGRldGFjaGVkIG9ubHkgZm9yIGV2ZW50ZWQgYmFja2dyb3VuZCBhZ2VudHMuICovXG5leHBvcnQgZnVuY3Rpb24gYWdlbnRBYm9ydFNpZ25hbChhZ2VudDogdW5rbm93biwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGlzRXZlbnRlZEFnZW50KGFnZW50KSA/IHVuZGVmaW5lZCA6IHNpZ25hbDtcbn1cblxuLyoqIFJlZ2lzdGVyIGRldGFjaGVkIGNoYXQsIGR1cmFibGUgb2JzZXJ2YXRpb24sIGFuZCBleHBsaWNpdCBhYm9ydCByb3V0ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gYWdlbnRDaGF0Um91dGVzKCkge1xuICBjb25zdCBjaGF0UGF0aCA9IGAke3JvdXRlcy5NQVNUUkFfUk9VVEVTLmNoYXR9LzphZ2VudElkYCBhcyBgJHtzdHJpbmd9OmFnZW50SWRgO1xuICBjb25zdCBydW5QYXRoID1cbiAgICBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5jaGF0fS86YWdlbnRJZCR7cm91dGVzLk1BU1RSQV9ST1VURVMucnVuc30vOnJ1bklkYCBhcyBgJHtzdHJpbmd9OmFnZW50SWQke3N0cmluZ306cnVuSWRgO1xuICBjb25zdCBhYm9ydFBhdGggPVxuICAgIGAke3J1blBhdGh9JHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5hYm9ydH1gIGFzIGAke3N0cmluZ306YWdlbnRJZCR7c3RyaW5nfTpydW5JZCR7c3RyaW5nfWA7XG4gIHJldHVybiBbXG4gICAgcmVnaXN0ZXJBcGlSb3V0ZShjaGF0UGF0aCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGNvbnRleHQucmVxLmpzb24oKTtcbiAgICAgICAgY29uc3QgbWFzdHJhID0gY29udGV4dC5nZXQoXCJtYXN0cmFcIik7XG4gICAgICAgIGNvbnN0IGFnZW50SWQgPSBjb250ZXh0LnJlcS5wYXJhbShcImFnZW50SWRcIik7XG4gICAgICAgIGlmICghYWdlbnRJZCkgdGhyb3cgbmV3IEVycm9yKFwiQWdlbnQgSUQgaXMgcmVxdWlyZWRcIik7XG4gICAgICAgIGNvbnN0IG1pZGRsZXdhcmVSZXF1ZXN0Q29udGV4dCA9IGNvbnRleHQuZ2V0KFwicmVxdWVzdENvbnRleHRcIik7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gbWlkZGxld2FyZVJlcXVlc3RDb250ZXh0IHx8IHBhcmFtcy5yZXF1ZXN0Q29udGV4dDtcbiAgICAgICAgaWYgKG1pZGRsZXdhcmVSZXF1ZXN0Q29udGV4dCAmJiBwYXJhbXMucmVxdWVzdENvbnRleHQpIHtcbiAgICAgICAgICBtYXN0cmFcbiAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgPy53YXJuKCdNdWx0aXBsZSBcInJlcXVlc3RDb250ZXh0XCIgc291cmNlcyBwcm92aWRlZC4gVXNpbmcgbWlkZGxld2FyZSBjb250ZXh0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcnNpb25JZCA9IGNvbnRleHQucmVxLnF1ZXJ5KFwidmVyc2lvbklkXCIpO1xuICAgICAgICBjb25zdCByYXdTdGF0dXMgPSBjb250ZXh0LnJlcS5xdWVyeShcInN0YXR1c1wiKTtcbiAgICAgICAgaWYgKHZlcnNpb25JZCAmJiByYXdTdGF0dXMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IHBhcmFtZXRlcnMgXCJ2ZXJzaW9uSWRcIiBhbmQgXCJzdGF0dXNcIiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhd1N0YXR1cyAmJiByYXdTdGF0dXMgIT09IFwiZHJhZnRcIiAmJiByYXdTdGF0dXMgIT09IFwicHVibGlzaGVkXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IHBhcmFtZXRlciBcInN0YXR1c1wiIG11c3QgYmUgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSByYXdTdGF0dXMgYXMgXCJkcmFmdFwiIHwgXCJwdWJsaXNoZWRcIiB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYWJvcnRTaWduYWwgPSBhZ2VudEFib3J0U2lnbmFsKG1hc3RyYS5nZXRBZ2VudEJ5SWQoYWdlbnRJZCksIGNvbnRleHQucmVxLnJhdy5zaWduYWwpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBoYW5kbGVDaGF0U3RyZWFtKHtcbiAgICAgICAgICBtYXN0cmEsXG4gICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAuLi4odmVyc2lvbklkXG4gICAgICAgICAgICA/IHsgYWdlbnRWZXJzaW9uOiB7IHZlcnNpb25JZCB9IH1cbiAgICAgICAgICAgIDogc3RhdHVzXG4gICAgICAgICAgICAgID8geyBhZ2VudFZlcnNpb246IHsgc3RhdHVzIH0gfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICBwYXJhbXM6IHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQsXG4gICAgICAgICAgICAgIC4uLihhYm9ydFNpZ25hbCA/IHsgYWJvcnRTaWduYWwgfSA6IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgICApLFxuICAgICAgICAgIHZlcnNpb246IFwidjdcIixcbiAgICAgICAgICBzZW5kUmVhc29uaW5nOiB0cnVlLFxuICAgICAgICAgIHNlbmRTb3VyY2VzOiB0cnVlLFxuICAgICAgICAgIG9uRXJyb3I6IHNlcmlhbGl6ZUNoYXRTdHJlYW1FcnJvcixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVVSU1lc3NhZ2VTdHJlYW1SZXNwb25zZSh7IHN0cmVhbSB9KTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgcmVnaXN0ZXJBcGlSb3V0ZShydW5QYXRoLCB7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBtYXN0cmEgPSBjb250ZXh0LmdldChcIm1hc3RyYVwiKTtcbiAgICAgICAgY29uc3QgYWdlbnRJZCA9IGNvbnRleHQucmVxLnBhcmFtKFwiYWdlbnRJZFwiKTtcbiAgICAgICAgY29uc3QgcnVuSWQgPSBjb250ZXh0LnJlcS5wYXJhbShcInJ1bklkXCIpO1xuICAgICAgICBpZiAoIWFnZW50SWQgfHwgIXJ1bklkKSB0aHJvdyBuZXcgRXJyb3IoXCJBZ2VudCBJRCBhbmQgcnVuIElEIGFyZSByZXF1aXJlZFwiKTtcbiAgICAgICAgY29uc3QgYWdlbnQgPSBtYXN0cmEuZ2V0QWdlbnRCeUlkKGFnZW50SWQpO1xuICAgICAgICBpZiAoIWlzRXZlbnRlZEFnZW50KGFnZW50KSkge1xuICAgICAgICAgIHJldHVybiBSZXNwb25zZS5qc29uKFxuICAgICAgICAgICAgeyBlcnJvcjogYEFnZW50ICR7YWdlbnRJZH0gZG9lcyBub3Qgc3VwcG9ydCBiYWNrZ3JvdW5kIHR1cm5zYCB9LFxuICAgICAgICAgICAgeyBzdGF0dXM6IDQwOSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JzZXJ2ZWQgPSBhd2FpdCBhZ2VudC5vYnNlcnZlKHJ1bklkKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdG9BSVNka1N0cmVhbShvYnNlcnZlZC5vdXRwdXQsIHtcbiAgICAgICAgICBmcm9tOiBcImFnZW50XCIsXG4gICAgICAgICAgdmVyc2lvbjogXCJ2N1wiLFxuICAgICAgICAgIHNlbmRSZWFzb25pbmc6IHRydWUsXG4gICAgICAgICAgc2VuZFNvdXJjZXM6IHRydWUsXG4gICAgICAgICAgb25FcnJvcjogc2VyaWFsaXplQ2hhdFN0cmVhbUVycm9yLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVVJTWVzc2FnZVN0cmVhbVJlc3BvbnNlKHsgc3RyZWFtIH0pO1xuICAgICAgfSxcbiAgICB9KSxcbiAgICByZWdpc3RlckFwaVJvdXRlKGFib3J0UGF0aCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IG1hc3RyYSA9IGNvbnRleHQuZ2V0KFwibWFzdHJhXCIpO1xuICAgICAgICBjb25zdCBhZ2VudElkID0gY29udGV4dC5yZXEucGFyYW0oXCJhZ2VudElkXCIpO1xuICAgICAgICBjb25zdCBydW5JZCA9IGNvbnRleHQucmVxLnBhcmFtKFwicnVuSWRcIik7XG4gICAgICAgIGlmICghYWdlbnRJZCB8fCAhcnVuSWQpIHRocm93IG5ldyBFcnJvcihcIkFnZW50IElEIGFuZCBydW4gSUQgYXJlIHJlcXVpcmVkXCIpO1xuICAgICAgICBjb25zdCBhZ2VudCA9IG1hc3RyYS5nZXRBZ2VudEJ5SWQoYWdlbnRJZCk7XG4gICAgICAgIGlmICghaXNFdmVudGVkQWdlbnQoYWdlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgICAgICAgICB7IGVycm9yOiBgQWdlbnQgJHthZ2VudElkfSBkb2VzIG5vdCBzdXBwb3J0IGJhY2tncm91bmQgdHVybnNgIH0sXG4gICAgICAgICAgICB7IHN0YXR1czogNDA5IH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVzcG9uc2UuanNvbih7IGFib3J0ZWQ6IGFnZW50LmFib3J0UnVuU3RyZWFtKHJ1bklkKSB9KTtcbiAgICAgIH0sXG4gICAgfSksXG4gIF07XG59XG5cbi8qKlxuICogS2VlcCBhIGxhdGUgb3IgZHVwbGljYXRlIHJlc3VtZSBmcm9tIGZhaWxpbmcgdGhlIFVJIHN0cmVhbS4gTWFzdHJhJ3NcbiAqIHJlc3VtZSBwYXRoIGNhbiBzdXJmYWNlIGEgd29ya2Zsb3cgZXJyb3IgYWZ0ZXIgYW5vdGhlciBjbGllbnQgYWxyZWFkeVxuICogcmVzb2x2ZWQgdGhlIHNhbWUgYXBwcm92YWwuXG4gKi9cbmZ1bmN0aW9uIHNlcmlhbGl6ZUNoYXRTdHJlYW1FcnJvcihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChpc1N0YWxlTWFzdHJhUmVzdW1lRXJyb3IoZXJyb3IpKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJpZ25vcmVkIHN0YWxlIG1hc3RyYSByZXN1bWVcIiwge1xuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvciksXG4gICAgfSk7XG4gICAgcmV0dXJuIFNUQUxFX01BU1RSQV9SRVNVTUVfU1RSRUFNX1RFWFQ7XG4gIH1cbiAgcmV0dXJuIGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycm9yKTtcbn1cbiJdfQ==
|