@wdio/browserstack-service 9.30.2 → 9.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/accessibility-handler.d.ts +11 -0
- package/build/cleanup.js +8 -5
- package/build/cli/modules/accessibilityModule.d.ts +3 -0
- package/build/cli/modules/customTagsModule.d.ts +16 -0
- package/build/cli/modules/testHubModule.d.ts +25 -1
- package/build/customTags.d.ts +14 -0
- package/build/index.js +257 -25
- package/build/insights-handler.d.ts +1 -0
- package/build/types.d.ts +11 -0
- package/build/util.d.ts +21 -2
- package/package.json +1 -1
package/build/cleanup.js
CHANGED
|
@@ -70,7 +70,7 @@ import logger from "@wdio/logger";
|
|
|
70
70
|
// package.json
|
|
71
71
|
var package_default = {
|
|
72
72
|
name: "@wdio/browserstack-service",
|
|
73
|
-
version: "9.
|
|
73
|
+
version: "9.32.0",
|
|
74
74
|
description: "WebdriverIO service for better Browserstack integration",
|
|
75
75
|
author: "BrowserStack <support@browserstack.com>",
|
|
76
76
|
homepage: "https://github.com/browserstack/wdio-browserstack-service",
|
|
@@ -2912,9 +2912,12 @@ var formatString = (template, ...values) => {
|
|
|
2912
2912
|
return value !== null && value !== void 0 ? value : "";
|
|
2913
2913
|
});
|
|
2914
2914
|
};
|
|
2915
|
-
var _getParamsForAppAccessibility = (commandName, testName) => {
|
|
2915
|
+
var _getParamsForAppAccessibility = (commandName, testName, hookRunUuid) => {
|
|
2916
2916
|
return {
|
|
2917
2917
|
"thTestRunUuid": process.env.TEST_ANALYTICS_ID,
|
|
2918
|
+
// Present only when the scan fires inside a hook (dropped by JSON.stringify when undefined,
|
|
2919
|
+
// so in-test scans are unchanged). SeleniumHub appAllyHandler relays this as `hook_run_uuid`.
|
|
2920
|
+
"thHookRunUuid": hookRunUuid || void 0,
|
|
2918
2921
|
"thBuildUuid": process.env.BROWSERSTACK_TESTHUB_UUID,
|
|
2919
2922
|
"thJwtToken": process.env.BROWSERSTACK_TESTHUB_JWT,
|
|
2920
2923
|
"authHeader": process.env.BSTACK_A11Y_JWT,
|
|
@@ -2923,14 +2926,14 @@ var _getParamsForAppAccessibility = (commandName, testName) => {
|
|
|
2923
2926
|
"testName": testName
|
|
2924
2927
|
};
|
|
2925
2928
|
};
|
|
2926
|
-
var performA11yScan = async (isAppAutomate, browser, isBrowserStackSession, isAccessibility, commandName, testName) => {
|
|
2929
|
+
var performA11yScan = async (isAppAutomate, browser, isBrowserStackSession, isAccessibility, commandName, testName, hookRunUuid) => {
|
|
2927
2930
|
if (!isAccessibilityAutomationSession(isAccessibility)) {
|
|
2928
2931
|
BStackLogger.warn("Not an Accessibility Automation session, cannot perform Accessibility scan.");
|
|
2929
2932
|
return;
|
|
2930
2933
|
}
|
|
2931
2934
|
try {
|
|
2932
2935
|
if (isAppAccessibilityAutomationSession(isAccessibility, isAppAutomate)) {
|
|
2933
|
-
const results = await browser.execute(formatString(accessibility_scripts_default.performScan, JSON.stringify(_getParamsForAppAccessibility(commandName, testName))), {});
|
|
2936
|
+
const results = await browser.execute(formatString(accessibility_scripts_default.performScan, JSON.stringify(_getParamsForAppAccessibility(commandName, testName, hookRunUuid))), {});
|
|
2934
2937
|
BStackLogger.debug(util3.format(results));
|
|
2935
2938
|
return results;
|
|
2936
2939
|
}
|
|
@@ -3933,4 +3936,4 @@ void BStackCleanup.startCleanup();
|
|
|
3933
3936
|
export {
|
|
3934
3937
|
BStackCleanup as default
|
|
3935
3938
|
};
|
|
3936
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWwudHMiLCAiLi4vc3JjL2xvZ1BhdGNoZXIudHMiLCAiLi4vc3JjL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIudHMiLCAiLi4vc3JjL2JzdGFja0xvZ2dlci50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2FwaVV0aWxzLnRzIiwgIi4uL3NyYy9jbGkvY2xpVXRpbHMudHMiLCAiLi4vc3JjL2ZldGNoV3JhcHBlci50cyIsICIuLi9zcmMvaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2NsaUxvZ2dlci50cyIsICIuLi9zcmMvY2xpL2ZyYW1ld29ya3MvY29uc3RhbnRzL3Rlc3RGcmFtZXdvcmtDb25zdGFudHMudHMiLCAiLi4vc3JjL3Rlc3RIdWIvdXRpbHMudHMiLCAiLi4vc3JjL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLnRzIiwgIi4uL3NyYy9jcmFzaC1yZXBvcnRlci50cyIsICIuLi9zcmMvdGVzdE9wcy9mZWF0dXJlU3RhdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvZmVhdHVyZVVzYWdlLnRzIiwgIi4uL3NyYy90ZXN0T3BzL3Rlc3RPcHNDb25maWcudHMiLCAiLi4vc3JjL3Rlc3RPcHMvdXNhZ2VTdGF0cy50cyIsICIuLi9zcmMvc2NyaXB0cy9hY2Nlc3NpYmlsaXR5LXNjcmlwdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvb3BlblJ1bnNKb3VybmFsLnRzIiwgIi4uL3NyYy9jbGVhbnVwLnRzIiwgIi4uL3NyYy9pbnN0cnVtZW50YXRpb24vZnVubmVsSW5zdHJ1bWVudGF0aW9uLnRzIiwgIi4uL3NyYy9kYXRhLXN0b3JlLnRzIl0sCiAgInNvdXJjZVJvb3QiOiAiL2hvbWUvcnVubmVyL3dvcmsvd2Rpby1icm93c2Vyc3RhY2stc2VydmljZS93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlL3BhY2thZ2VzL2Jyb3dzZXJzdGFjay1zZXJ2aWNlIiwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGhvc3RuYW1lLCBwbGF0Zm9ybSwgdHlwZSwgdmVyc2lvbiwgYXJjaCwgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCB6bGliIGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB7IGZvcm1hdCwgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHV0aWwgZnJvbSAnbm9kZTp1dGlsJ1xuXG5pbXBvcnQgdHlwZSB7IENhcGFiaWxpdGllcywgRnJhbWV3b3JrcywgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBCZWZvcmVDb21tYW5kQXJncywgQWZ0ZXJDb21tYW5kQXJncyB9IGZyb20gJ0B3ZGlvL3JlcG9ydGVyJ1xuXG5pbXBvcnQgdHlwZSB7IEdpdFJlcG9JbmZvIH0gZnJvbSAnZ2l0LXJlcG8taW5mbydcbmltcG9ydCBnaXRSZXBvSW5mbyBmcm9tICdnaXQtcmVwby1pbmZvJ1xuaW1wb3J0IGdpdGNvbmZpZyBmcm9tICdnaXRjb25maWdsb2NhbCdcbmltcG9ydCB0eXBlIHsgQ29sb3JOYW1lIH0gZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBwZXJmb3JtYW5jZSB9IGZyb20gJ25vZGU6cGVyZl9ob29rcydcbmltcG9ydCBsb2dQYXRjaGVyIGZyb20gJy4vbG9nUGF0Y2hlci5qcydcbmltcG9ydCBQZXJmb3JtYW5jZVRlc3RlciBmcm9tICcuL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgKiBhcyBQRVJGT1JNQU5DRV9TREtfRVZFTlRTIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IGxvZ0J1aWxkRXJyb3IsIGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eSwgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5LCBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5pbXBvcnQgeyBPcmNoZXN0cmF0aW9uVXRpbHMgfSBmcm9tICcuL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLmpzJ1xuaW1wb3J0IHR5cGUgeyBFcnJvcnMgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSB7IFVzZXJDb25maWcsIFVwbG9hZFR5cGUsIEJyb3dzZXJzdGFja0NvbmZpZywgQnJvd3NlcnN0YWNrT3B0aW9ucywgTGF1bmNoUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHR5cGUgeyBJVGVzdENhc2VIb29rUGFyYW1ldGVyIH0gZnJvbSAnLi9jdWN1bWJlci10eXBlcy5qcydcbmltcG9ydCB7XG4gICAgQlJPV1NFUl9ERVNDUklQVElPTixcbiAgICBVUExPQURfTE9HU19FTkRQT0lOVCxcbiAgICBjb25zb2xlSG9sZGVyLFxuICAgIFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsXG4gICAgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0xUUyxcbiAgICBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQsXG4gICAgVEVTVE9QU19TQ1JFRU5TSE9UX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELFxuICAgIFBFUkZfTUVBU1VSRU1FTlRfRU5WLFxuICAgIFJFUlVOX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVF9QTEFOX0lELFxuICAgIE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVMsXG4gICAgR0lUX01FVEFfREFUQV9UUlVOQ0FURUQsXG4gICAgQVBQX0FMTFlfSVNTVUVTX1NVTU1BUllfRU5EUE9JTlQsXG4gICAgQVBQX0FMTFlfSVNTVUVTX0VORFBPSU5ULFxuICAgIENMSV9ERUJVR19MT0dTX0ZJTEUsXG4gICAgV0RJT19OQU1JTkdfUFJFRklYXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IENyYXNoUmVwb3J0ZXIgZnJvbSAnLi9jcmFzaC1yZXBvcnRlci5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IFVzYWdlU3RhdHMgZnJvbSAnLi90ZXN0T3BzL3VzYWdlU3RhdHMuanMnXG5pbXBvcnQgVGVzdE9wc0NvbmZpZyBmcm9tICcuL3Rlc3RPcHMvdGVzdE9wc0NvbmZpZy5qcydcbmltcG9ydCB0eXBlIHsgU3RhcnRCaW5TZXNzaW9uUmVzcG9uc2UgfSBmcm9tICcuL2dycGMvaW5kZXguanMnXG5pbXBvcnQgQVBJVXRpbHMgZnJvbSAnLi9jbGkvYXBpVXRpbHMuanMnXG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd0YXInXG5cbmltcG9ydCBBY2Nlc3NpYmlsaXR5U2NyaXB0cyBmcm9tICcuL3NjcmlwdHMvYWNjZXNzaWJpbGl0eS1zY3JpcHRzLmpzJ1xuXG5pbXBvcnQgeyBfZmV0Y2ggYXMgZmV0Y2ggfSBmcm9tICcuL2ZldGNoV3JhcHBlci5qcydcblxuY29uc3QgcEdpdGNvbmZpZyA9IHByb21pc2lmeShnaXRjb25maWcpXG5cbmV4cG9ydCB0eXBlIEdpdE1ldGFEYXRhID0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzaGE6IHN0cmluZztcbiAgICBzaG9ydF9zaGE6IHN0cmluZztcbiAgICBicmFuY2g6IHN0cmluZztcbiAgICB0YWc6IHN0cmluZyB8IG51bGw7XG4gICAgY29tbWl0dGVyOiBzdHJpbmc7XG4gICAgY29tbWl0dGVyX2RhdGU6IHN0cmluZztcbiAgICBhdXRob3I6IHN0cmluZztcbiAgICBhdXRob3JfZGF0ZTogc3RyaW5nO1xuICAgIGNvbW1pdF9tZXNzYWdlOiBzdHJpbmc7XG4gICAgcm9vdDogc3RyaW5nO1xuICAgIGNvbW1vbl9naXRfZGlyOiBzdHJpbmc7XG4gICAgd29ya3RyZWVfZ2l0X2Rpcjogc3RyaW5nO1xuICAgIGxhc3RfdGFnOiBzdHJpbmcgfCBudWxsO1xuICAgIGNvbW1pdHNfc2luY2VfbGFzdF90YWc6IG51bWJlcjtcbiAgICByZW1vdGVzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdXJsOiBzdHJpbmcgfT47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1JFUVVFU1RfQ09ORklHID0ge1xuICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgJ1gtQlNUQUNLLU9CUyc6ICd0cnVlJ1xuICAgIH0sXG59XG5cbmV4cG9ydCBjb25zdCBDT0xPUlM6IFJlY29yZDxzdHJpbmcsIENvbG9yTmFtZT4gPSB7XG4gICAgZXJyb3I6ICdyZWQnLFxuICAgIHdhcm46ICd5ZWxsb3cnLFxuICAgIGluZm86ICdjeWFuQnJpZ2h0JyxcbiAgICBkZWJ1ZzogJ2dyZWVuJyxcbiAgICB0cmFjZTogJ2N5YW4nLFxuICAgIHByb2dyZXNzOiAnbWFnZW50YSdcbn1cblxuLyoqXG4gKiBnZXQgYnJvd3NlciBkZXNjcmlwdGlvbiBmb3IgQnJvd3NlcnN0YWNrIHNlcnZpY2VcbiAqIEBwYXJhbSBjYXAgYnJvd3NlciBjYXBhYmxpdGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJvd3NlckRlc2NyaXB0aW9uKGNhcDogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKSB7XG4gICAgY2FwID0gY2FwIHx8IHt9XG4gICAgaWYgKGNhcFsnYnN0YWNrOm9wdGlvbnMnXSkge1xuICAgICAgICBjYXAgPSB7IC4uLmNhcCwgLi4uY2FwWydic3RhY2s6b3B0aW9ucyddIH0gYXMgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlc2Uga2V5cyBkZXNjcmliZSB0aGUgYnJvd3NlciB0aGUgdGVzdCB3YXMgcnVuIG9uXG4gICAgICovXG4gICAgcmV0dXJuIEJST1dTRVJfREVTQ1JJUFRJT05cbiAgICAgICAgLm1hcCgoaykgPT4gKGNhcClbayBhcyBrZXlvZiB0eXBlb2YgY2FwXSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuam9pbignICcpXG59XG5cbi8qKlxuICogZ2V0IGNvcnJlY3QgYnJvd3NlciBjYXBhYmlsaXRpZXMgb2JqZWN0IGluIGJvdGggbXVsdGlyZW1vdGUgYW5kIG5vcm1hbCBzZXR1cHNcbiAqIEBwYXJhbSBicm93c2VyIGJyb3dzZXIgb2JqZWN0XG4gKiBAcGFyYW0gY2FwcyBicm93c2VyIGNhcGJpbGl0aWVzIG9iamVjdC4gSW4gY2FzZSBvZiBtdWx0aXJlbW90ZSwgdGhlIG9iamVjdCBpdHNlbGYgc2hvdWxkIGhhdmUgYSBwcm9wZXJ0eSBuYW1lZCAnY2FwYWJpbGl0aWVzJ1xuICogQHBhcmFtIGJyb3dzZXJOYW1lIGJyb3dzZXIgbmFtZSBpbiBjYXNlIG9mIG11bHRpcmVtb3RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyQ2FwYWJpbGl0aWVzKGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIgfCBXZWJkcml2ZXJJTy5NdWx0aVJlbW90ZUJyb3dzZXIsIGNhcHM/OiBDYXBhYmlsaXRpZXMuUmVzb2x2ZWRUZXN0cnVubmVyQ2FwYWJpbGl0aWVzLCBicm93c2VyTmFtZT86IHN0cmluZykge1xuICAgIGlmICghYnJvd3Nlci5pc011bHRpcmVtb3RlKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmJyb3dzZXIuY2FwYWJpbGl0aWVzLCAuLi5jYXBzIH0gYXMgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXG4gICAgfVxuXG4gICAgY29uc3QgbXVsdGlDYXBzID0gY2FwcyBhcyBDYXBhYmlsaXRpZXMuUmVxdWVzdGVkTXVsdGlyZW1vdGVDYXBhYmlsaXRpZXNcbiAgICBjb25zdCBnbG9iYWxDYXAgPSBicm93c2VyTmFtZSAmJiBicm93c2VyLmdldEluc3RhbmNlKGJyb3dzZXJOYW1lKSA/IGJyb3dzZXIuZ2V0SW5zdGFuY2UoYnJvd3Nlck5hbWUpLmNhcGFiaWxpdGllcyA6IHt9XG4gICAgY29uc3QgY2FwID0gYnJvd3Nlck5hbWUgJiYgbXVsdGlDYXBzW2Jyb3dzZXJOYW1lXSA/IG11bHRpQ2Fwc1ticm93c2VyTmFtZV0uY2FwYWJpbGl0aWVzIDoge31cbiAgICByZXR1cm4geyAuLi5nbG9iYWxDYXAsIC4uLmNhcCB9IGFzIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc1xufVxuXG4vKipcbiAqIGNoZWNrIGZvciBicm93c2Vyc3RhY2sgVzNDIGNhcGFiaWxpdGllcy4gRG9lcyBub3Qgc3VwcG9ydCBsZWdhY3kgY2FwYWJpbGl0aWVzXG4gKiBAcGFyYW0gY2FwIGJyb3dzZXIgY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jyb3dzZXJzdGFja0NhcGFiaWxpdHkoY2FwPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICAgIGNhcCAmJlxuICAgICAgICAgICAgY2FwWydic3RhY2s6b3B0aW9ucyddICYmXG4gICAgICAgICAgICAvLyByZXR1cm4gZmFsc2UgaWYgdGhlIG9ubHkgY2FwIGluIGJzdGFjazpvcHRpb25zIGlzIHdkaW9TZXJ2aWNlLFxuICAgICAgICAgICAgLy8gYXMgdGhhdCBpcyBhZGRlZCBieSB0aGUgc2VydmljZSBhbmQgbm90IHByZXNlbnQgaW4gdXNlciBwYXNzZWQgY2Fwc1xuICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjYXBbJ2JzdGFjazpvcHRpb25zJ10pLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIGNhcFsnYnN0YWNrOm9wdGlvbnMnXS53ZGlvU2VydmljZVxuICAgICAgICAgICAgKVxuICAgIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudFN1aXRlTmFtZShmdWxsVGl0bGU6IHN0cmluZywgdGVzdFN1aXRlVGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZnVsbFRpdGxlV29yZHMgPSBmdWxsVGl0bGUuc3BsaXQoJyAnKVxuICAgIGNvbnN0IHRlc3RTdWl0ZVRpdGxlV29yZHMgPSB0ZXN0U3VpdGVUaXRsZS5zcGxpdCgnICcpXG4gICAgY29uc3Qgc2hvcnRlc3RMZW5ndGggPSBNYXRoLm1pbihmdWxsVGl0bGVXb3Jkcy5sZW5ndGgsIHRlc3RTdWl0ZVRpdGxlV29yZHMubGVuZ3RoKVxuICAgIGxldCBjID0gMFxuICAgIGxldCBwYXJlbnRTdWl0ZU5hbWUgPSAnJ1xuICAgIHdoaWxlIChjIDwgc2hvcnRlc3RMZW5ndGggJiYgZnVsbFRpdGxlV29yZHNbY10gPT09IHRlc3RTdWl0ZVRpdGxlV29yZHNbY10pIHtcbiAgICAgICAgcGFyZW50U3VpdGVOYW1lICs9IGZ1bGxUaXRsZVdvcmRzW2MrK10gKyAnICdcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudFN1aXRlTmFtZS50cmltKClcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Vycm9yKGVycm9yOiBFcnJvciwgZm46IEZ1bmN0aW9uLCBhcmdzOiB1bmtub3duW10pIHtcbiAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIGluIGV4ZWN1dGluZyAke2ZuLm5hbWV9IHdpdGggYXJncyAke2FyZ3N9OiAke2Vycm9yfWApXG4gICAgbGV0IGFyZ3NTdHJpbmc6IHN0cmluZ1xuICAgIHRyeSB7XG4gICAgICAgIGFyZ3NTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShhcmdzKVxuICAgIH0gY2F0Y2gge1xuICAgICAgICBhcmdzU3RyaW5nID0gdXRpbC5pbnNwZWN0KGFyZ3MsIHsgZGVwdGg6IDIgfSlcbiAgICB9XG4gICAgQ3Jhc2hSZXBvcnRlci51cGxvYWRDcmFzaFJlcG9ydChgRXJyb3IgaW4gZXhlY3V0aW5nICR7Zm4ubmFtZX0gd2l0aCBhcmdzICR7YXJnc1N0cmluZ30gOiAke2Vycm9yfWAsIGVycm9yICYmIGVycm9yLnN0YWNrIHx8ICd1bmtub3duIGVycm9yJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG8xMXlFcnJvckhhbmRsZXIoZm46IEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBmdW5jdGlvblRvSGFuZGxlID0gZm5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uVG9IYW5kbGUgPSBwZXJmb3JtYW5jZS50aW1lcmlmeShmdW5jdGlvblRvSGFuZGxlIGFzIGFueSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZ1bmN0aW9uVG9IYW5kbGUoLi4uYXJncylcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jYXRjaChlcnJvciA9PiBwcm9jZXNzRXJyb3IoZXJyb3IsIGZuLCBhcmdzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHByb2Nlc3NFcnJvcihlcnJvciBhcyBFcnJvciwgZm4sIGFyZ3MpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckhhbmRsZXIoZm46IEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uVG9IYW5kbGUgPSBmblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZnVuY3Rpb25Ub0hhbmRsZSguLi5hcmdzKVxuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhdGNoKGVycm9yID0+IEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgaW4gZXhlY3V0aW5nICR7Zm4ubmFtZX0gd2l0aCBhcmdzICR7YXJnc306ICR7ZXJyb3J9YCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIGluIGV4ZWN1dGluZyAke2ZuLm5hbWV9IHdpdGggYXJncyAke2FyZ3N9OiAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBub2RlUmVxdWVzdChyZXF1ZXN0VHlwZTogc3RyaW5nLCBhcGlFbmRwb2ludDogc3RyaW5nLCBvcHRpb25zOiBSZXF1ZXN0SW5pdCwgYXBpVXJsOiBzdHJpbmcsIHRpbWVvdXQ6IG51bWJlciA9IDEyMDAwMCkge1xuICAgIHRyeSB7XG5cbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dClcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vJHthcGlFbmRwb2ludH1gLCB7XG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3RUeXBlLFxuICAgICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBDbGVhciB0aGUgdGltZW91dCBhcyB0aGUgcmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIGluIGZpcmluZyByZXF1ZXN0ICR7YXBpVXJsfS8ke2FwaUVuZHBvaW50fTogJHtmb3JtYXQoZXJyb3IpfWApXG4gICAgICAgIGNvbnN0IGlzTG9nVXBsb2FkID0gYXBpRW5kcG9pbnQgPT09IFVQTE9BRF9MT0dTX0VORFBPSU5UXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5yZXNwb25zZSkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlSnNvbiA9IGVycm9yLnJlc3BvbnNlLmJvZHkgPyBKU09OLnBhcnNlKGVycm9yLnJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKSkgOiBudWxsXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2VKc29uID8gZXJyb3JNZXNzYWdlSnNvbi5tZXNzYWdlIDogbnVsbFxuICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgJHtlcnJvck1lc3NhZ2V9IC0gJHtlcnJvci5zdGFja31gXG4gICAgICAgICAgICAgICAgaWYgKGlzTG9nVXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhtZXNzYWdlKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihtZXNzYWdlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzTG9nVXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzTG9nVXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBGYWlsZWQgdG8gZmlyZSBhcGkgcmVxdWVzdCBkdWUgdG8gJHtlcnJvcn0gLSAke2Vycm9yLnN0YWNrfWApXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZhaWxlZCB0byBmaXJlIGFwaSByZXF1ZXN0IGR1ZSB0byAke2Vycm9yfSAtICR7ZXJyb3Iuc3RhY2t9YClcbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIGh0dHBzOi8vdHVnYXlpbGlrLm1lZGl1bS5jb20vZXJyb3ItaGFuZGxpbmctdmlhLXRyeS1jYXRjaC1wcm94eS1pbi1qYXZhc2NyaXB0LTU0MTE2ZGJmNzgzZlxuLypcbiAgICBBIGNsYXNzIHdyYXBwZXIgZm9yIGVycm9yIGhhbmRsaW5nLiBUaGUgd3JhcHBlciB3cmFwcyBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIGNsYXNzIHdpdGggYSBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLlxuICAgIElmIGFueSBleGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhc3MgbWV0aG9kLCB0aGF0IHdpbGwgZ2V0IGNhdWdodCBpbiB0aGUgd3JhcHBlciB3aGljaCBsb2dzIGFuZCByZXBvcnRzIHRoZSBlcnJvci5cbiAqL1xudHlwZSBDbGFzc1R5cGUgPSB7IG5ldyguLi5hcmdzOiB1bmtub3duW10pOiB1bmtub3duOyB9IC8vIEEgZ2VuZXJpYyB0eXBlIGZvciBhIGNsYXNzXG5leHBvcnQgZnVuY3Rpb24gbzExeUNsYXNzRXJyb3JIYW5kbGVyPFQgZXh0ZW5kcyBDbGFzc1R5cGU+KGVycm9yQ2xhc3M6IFQpOiBUIHtcbiAgICBjb25zdCBwcm90b3R5cGUgPSBlcnJvckNsYXNzLnByb3RvdHlwZVxuXG4gICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvdHlwZSkubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gZXJyb3JDbGFzc1xuICAgIH1cblxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvdHlwZSkuZm9yRWFjaCgobWV0aG9kTmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBtZXRob2QgPSBwcm90b3R5cGVbbWV0aG9kTmFtZV1cbiAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdmdW5jdGlvbicgJiYgbWV0aG9kTmFtZSAhPT0gJ2NvbnN0cnVjdG9yJyAmJiBtZXRob2ROYW1lICE9PSAnY29tbWFuZFdyYXBwZXInKSB7XG4gICAgICAgICAgICAvLyBJbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGlzIGNvbnRleHQsIG5lZWQgdG8gZGVmaW5lIGxpa2UgdGhpc1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0gPyBwZXJmb3JtYW5jZS50aW1lcmlmeShtZXRob2QpIDogbWV0aG9kKS5jYWxsKHRoaXMsIC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2F0Y2goZXJyb3IgPT4gcHJvY2Vzc0Vycm9yKGVycm9yLCBtZXRob2QsIGFyZ3MpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGVyciBhcyBFcnJvciwgbWV0aG9kLCBhcmdzKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gZXJyb3JDbGFzc1xufVxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc1Rlc3RPYnNlcnZhYmlsaXR5UmVzcG9uc2UgPSAocmVzcG9uc2U6IExhdW5jaFJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKCFyZXNwb25zZS5vYnNlcnZhYmlsaXR5KSB7XG4gICAgICAgIGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eShudWxsKVxuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5vYnNlcnZhYmlsaXR5LnN1Y2Nlc3MpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGb3JPYnNlcnZhYmlsaXR5KHJlc3BvbnNlLm9ic2VydmFiaWxpdHkgYXMgRXJyb3JzKVxuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFldID0gJ3RydWUnXG4gICAgaWYgKHJlc3BvbnNlLm9ic2VydmFiaWxpdHkub3B0aW9ucy5hbGxvd19zY3JlZW5zaG90cykge1xuICAgICAgICBwcm9jZXNzLmVudltURVNUT1BTX1NDUkVFTlNIT1RfRU5WXSA9IHJlc3BvbnNlLm9ic2VydmFiaWxpdHkub3B0aW9ucy5hbGxvd19zY3JlZW5zaG90cy50b1N0cmluZygpXG4gICAgfVxufVxuXG5pbnRlcmZhY2UgRGF0YUVsZW1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuZXhwb3J0IGNvbnN0IGpzb25pZnlBY2Nlc3NpYmlsaXR5QXJyYXkgPSAoXG4gICAgZGF0YUFycmF5OiBEYXRhRWxlbWVudFtdLFxuICAgIGtleU5hbWU6IGtleW9mIERhdGFFbGVtZW50LFxuICAgIHZhbHVlTmFtZToga2V5b2YgRGF0YUVsZW1lbnRcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICBkYXRhQXJyYXkuZm9yRWFjaCgoZWxlbWVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgcmVzdWx0W2VsZW1lbnRba2V5TmFtZV0gYXMgc3RyaW5nXSA9IGVsZW1lbnRbdmFsdWVOYW1lXVxuICAgIH0pXG4gICAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc0FjY2Vzc2liaWxpdHlSZXNwb25zZSA9IChyZXNwb25zZTogTGF1bmNoUmVzcG9uc2UgfCBTdGFydEJpblNlc3Npb25SZXNwb25zZSwgb3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyKSA9PiB7XG4gICAgaWYgKCFyZXNwb25zZS5hY2Nlc3NpYmlsaXR5KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmFjY2Vzc2liaWxpdHkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGhhbmRsZUVycm9yRm9yQWNjZXNzaWJpbGl0eShudWxsKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLmFjY2Vzc2liaWxpdHkuc3VjY2Vzcykge1xuICAgICAgICBoYW5kbGVFcnJvckZvckFjY2Vzc2liaWxpdHkocmVzcG9uc2UuYWNjZXNzaWJpbGl0eSBhcyBFcnJvcnMpXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5hY2Nlc3NpYmlsaXR5Lm9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBhY2Nlc3NpYmlsaXR5VG9rZW4sIHBvbGxpbmdUaW1lb3V0LCBzY2FubmVyVmVyc2lvbiB9ID0ganNvbmlmeUFjY2Vzc2liaWxpdHlBcnJheShyZXNwb25zZS5hY2Nlc3NpYmlsaXR5Lm9wdGlvbnMuY2FwYWJpbGl0aWVzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiwgJ25hbWUnLCAndmFsdWUnKVxuICAgICAgICBjb25zdCByZXN1bHQgPSBqc29uaWZ5QWNjZXNzaWJpbGl0eUFycmF5KHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucy5jYXBhYmlsaXRpZXMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCAnbmFtZScsICd2YWx1ZScpXG4gICAgICAgIGNvbnN0IHNjcmlwdHNKc29uID0ge1xuICAgICAgICAgICAgJ3NjcmlwdHMnOiBqc29uaWZ5QWNjZXNzaWJpbGl0eUFycmF5KHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucy5zY3JpcHRzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiwgJ25hbWUnLCAnY29tbWFuZCcpLFxuICAgICAgICAgICAgJ2NvbW1hbmRzJzogcmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zLmNvbW1hbmRzVG9XcmFwPy5jb21tYW5kcyA/PyBbXSxcbiAgICAgICAgICAgICdub25CU3RhY2tJbmZyYUExMXlDaHJvbWVPcHRpb25zJzogcmVzdWx0Wydnb29nOmNocm9tZU9wdGlvbnMnXVxuICAgICAgICB9XG4gICAgICAgIGlmIChzY2FubmVyVmVyc2lvbikge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfU0NBTk5FUl9WRVJTSU9OID0gc2Nhbm5lclZlcnNpb24gYXMgc3RyaW5nXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEFjY2Vzc2liaWxpdHkgc2Nhbm5lclZlcnNpb24gJHtzY2FubmVyVmVyc2lvbn1gKVxuICAgICAgICB9XG4gICAgICAgIGlmIChhY2Nlc3NpYmlsaXR5VG9rZW4pIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCA9IGFjY2Vzc2liaWxpdHlUb2tlbiBhcyBzdHJpbmdcbiAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZXSA9ICd0cnVlJ1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb2xsaW5nVGltZW91dCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUID0gcG9sbGluZ1RpbWVvdXQgYXMgc3RyaW5nXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjcmlwdHNKc29uKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGZpeCB0eXBlXG4gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2NyaXB0cy51cGRhdGUoc2NyaXB0c0pzb24pXG4gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5zdG9yZSgpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzTGF1bmNoQnVpbGRSZXNwb25zZSA9IChyZXNwb25zZTogTGF1bmNoUmVzcG9uc2UsIG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lcikgPT4ge1xuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5KSB7XG4gICAgICAgIHByb2Nlc3NUZXN0T2JzZXJ2YWJpbGl0eVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgIH1cbiAgICBwcm9jZXNzQWNjZXNzaWJpbGl0eVJlc3BvbnNlKHJlc3BvbnNlLCBvcHRpb25zKVxufVxuXG5leHBvcnQgY29uc3QgbGF1bmNoVGVzdFNlc3Npb24gPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLlRFU1RIVUJfRVZFTlRTLlNUQVJULCBvMTF5RXJyb3JIYW5kbGVyKGFzeW5jIGZ1bmN0aW9uIGxhdW5jaFRlc3RTZXNzaW9uKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsIGJzQ29uZmlnOiBVc2VyQ29uZmlnLCBiU3RhY2tDb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24/OiBib29sZWFuKSB7XG4gICAgY29uc3QgbGF1bmNoQnVpbGRVc2FnZSA9IFVzYWdlU3RhdHMuZ2V0SW5zdGFuY2UoKS5sYXVuY2hCdWlsZFVzYWdlXG4gICAgbGF1bmNoQnVpbGRVc2FnZS50cmlnZ2VyZWQoKVxuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgZm9ybWF0OiAnanNvbicsXG4gICAgICAgIHByb2plY3RfbmFtZTogZ2V0T2JzZXJ2YWJpbGl0eVByb2plY3Qob3B0aW9ucywgYnNDb25maWcucHJvamVjdE5hbWUpLFxuICAgICAgICBuYW1lOiBnZXRPYnNlcnZhYmlsaXR5QnVpbGQob3B0aW9ucywgYnNDb25maWcuYnVpbGROYW1lKSxcbiAgICAgICAgYnVpbGRfaWRlbnRpZmllcjogYnNDb25maWcuYnVpbGRJZGVudGlmaWVyLFxuICAgICAgICBzdGFydGVkX2F0OiAobmV3IERhdGUoKSkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgdGFnczogZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhvcHRpb25zLCBic0NvbmZpZy5idWlsZFRhZyksXG4gICAgICAgIGhvc3RfaW5mbzoge1xuICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3RuYW1lKCksXG4gICAgICAgICAgICBwbGF0Zm9ybTogcGxhdGZvcm0oKSxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUoKSxcbiAgICAgICAgICAgIHZlcnNpb246IHZlcnNpb24oKSxcbiAgICAgICAgICAgIGFyY2g6IGFyY2goKVxuICAgICAgICB9LFxuICAgICAgICBjaV9pbmZvOiBnZXRDaUluZm8oKSxcbiAgICAgICAgYnVpbGRfcnVuX2lkZW50aWZpZXI6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19CVUlMRF9SVU5fSURFTlRJRklFUixcbiAgICAgICAgZmFpbGVkX3Rlc3RzX3JlcnVuOiBwcm9jZXNzLmVudltSRVJVTl9FTlZdIHx8IGZhbHNlLFxuICAgICAgICB2ZXJzaW9uX2NvbnRyb2w6IGF3YWl0IGdldEdpdE1ldGFEYXRhKCksXG4gICAgICAgIGFjY2Vzc2liaWxpdHk6IHtcbiAgICAgICAgICAgIHNldHRpbmdzOiBvcHRpb25zLmFjY2Vzc2liaWxpdHlPcHRpb25zXG4gICAgICAgIH0sXG4gICAgICAgIGJyb3dzZXJzdGFja0F1dG9tYXRpb246IHNob3VsZEFkZFNlcnZpY2VWZXJzaW9uKGNvbmZpZywgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eSksXG4gICAgICAgIGZyYW1ld29ya19kZXRhaWxzOiB7XG4gICAgICAgICAgICBmcmFtZXdvcmtOYW1lOiBXRElPX05BTUlOR19QUkVGSVggKyBjb25maWcuZnJhbWV3b3JrLFxuICAgICAgICAgICAgZnJhbWV3b3JrVmVyc2lvbjogYnNDb25maWcuYnN0YWNrU2VydmljZVZlcnNpb24sXG4gICAgICAgICAgICBzZGtWZXJzaW9uOiBic0NvbmZpZy5ic3RhY2tTZXJ2aWNlVmVyc2lvbixcbiAgICAgICAgICAgIGxhbmd1YWdlOiAnRUNNQVNjcmlwdCcsXG4gICAgICAgICAgICB0ZXN0RnJhbWV3b3JrOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1dlYmRyaXZlcklPJyxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBic0NvbmZpZy5ic3RhY2tTZXJ2aWNlVmVyc2lvblxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwcm9kdWN0X21hcDogZ2V0UHJvZHVjdE1hcEZvckJ1aWxkU3RhcnRDYWxsKGJTdGFja0NvbmZpZywgYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24pLFxuICAgICAgICBjb25maWc6IHt9LFxuICAgICAgICB0ZXN0X29yY2hlc3RyYXRpb246IE9yY2hlc3RyYXRpb25VdGlscy5nZXRJbnN0YW5jZShjb25maWcpPy5nZXRCdWlsZFN0YXJ0RGF0YSgpIHx8IHt9LFxuICAgICAgICB0ZXN0X21hbmFnZW1lbnQ6IHtcbiAgICAgICAgICAgIHRlc3RfcGxhbl9pZDogZ2V0VGVzdFBsYW5JZChvcHRpb25zKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uICYmIChpc1R1cmJvU2NhbGUob3B0aW9ucykgfHwgZGF0YS5icm93c2Vyc3RhY2tBdXRvbWF0aW9uID09PSBmYWxzZSkpe1xuICAgICAgICBkYXRhLmFjY2Vzc2liaWxpdHkuc2V0dGluZ3MgPz89IHt9XG4gICAgICAgIGRhdGEuYWNjZXNzaWJpbGl0eS5zZXR0aW5ncy5pbmNsdWRlRW5jb2RlZEV4dGVuc2lvbiA9IHRydWVcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoQ3Jhc2hSZXBvcnRlci51c2VyQ29uZmlnRm9yUmVwb3J0aW5nKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIENyYXNoUmVwb3J0ZXIudXNlckNvbmZpZ0ZvclJlcG9ydGluZyA9IHByb2Nlc3MuZW52LlVTRVJfQ09ORklHX0ZPUl9SRVBPUlRJTkcgIT09IHVuZGVmaW5lZCA/IEpTT04ucGFyc2UocHJvY2Vzcy5lbnYuVVNFUl9DT05GSUdfRk9SX1JFUE9SVElORykgOiB7fVxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIEJTdGFja0xvZ2dlci5lcnJvcihgW0NyYXNoX1JlcG9ydF9VcGxvYWRdIEZhaWxlZCB0byBwYXJzZSB1c2VyIGNvbmZpZyB3aGlsZSBzZW5kaW5nIGJ1aWxkIHN0YXJ0IGV2ZW50IGR1ZSB0byAke2Vycm9yfWApXG4gICAgfVxuICAgIGRhdGEuY29uZmlnID0gQ3Jhc2hSZXBvcnRlci51c2VyQ29uZmlnRm9yUmVwb3J0aW5nXG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElVdGlscy5EQVRBX0VORFBPSU5UfS9hcGkvdjIvYnVpbGRzYFxuICAgICAgICBjb25zdCBlbmNvZGVkQXV0aCA9IEJ1ZmZlci5mcm9tKGAke2dldE9ic2VydmFiaWxpdHlVc2VyKG9wdGlvbnMsIGNvbmZpZyl9OiR7Z2V0T2JzZXJ2YWJpbGl0eUtleShvcHRpb25zLCBjb25maWcpfWAsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICAuLi5ERUZBVUxUX1JFUVVFU1RfQ09ORklHLmhlYWRlcnMsXG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gLFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKVxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBqc29uUmVzcG9uc2U6IExhdW5jaFJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIGRlbGV0ZSBkYXRhPy5hY2Nlc3NpYmlsaXR5Py5zZXR0aW5ncz8uaW5jbHVkZUVuY29kZWRFeHRlbnNpb25cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbU3RhcnRfQnVpbGRdIFN1Y2Nlc3MgcmVzcG9uc2U6ICR7SlNPTi5zdHJpbmdpZnkoanNvblJlc3BvbnNlKX1gKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFRlc3QgUGxhbiBJZCBzZW50IGluIHJlcXVlc3Q6ICR7Z2V0VGVzdFBsYW5JZChvcHRpb25zKX1gKVxuICAgICAgICBwcm9jZXNzLmVudltURVNUT1BTX0JVSUxEX0NPTVBMRVRFRF9FTlZdID0gJ3RydWUnXG4gICAgICAgIGlmIChqc29uUmVzcG9uc2Uuand0KSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1RdID0ganNvblJlc3BvbnNlLmp3dFxuICAgICAgICB9XG4gICAgICAgIGlmIChqc29uUmVzcG9uc2UuYnVpbGRfaGFzaGVkX2lkKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXSA9IGpzb25SZXNwb25zZS5idWlsZF9oYXNoZWRfaWRcbiAgICAgICAgICAgIFRlc3RPcHNDb25maWcuZ2V0SW5zdGFuY2UoKS5idWlsZEhhc2hlZElkID0ganNvblJlc3BvbnNlLmJ1aWxkX2hhc2hlZF9pZFxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oYFRlc3RodWIgc3RhcnRlZCB3aXRoIGlkOiAke1Rlc3RPcHNDb25maWcuZ2V0SW5zdGFuY2UoKT8uYnVpbGRIYXNoZWRJZH1gKVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NMYXVuY2hCdWlsZFJlc3BvbnNlKGpzb25SZXNwb25zZSwgb3B0aW9ucylcbiAgICAgICAgbGF1bmNoQnVpbGRVc2FnZS5zdWNjZXNzKClcbiAgICAgICAgcmV0dXJuIGpzb25SZXNwb25zZVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgVGVzdEh1YiBidWlsZCBzdGFydCBmYWlsZWQ6ICR7Zm9ybWF0KGVycm9yKX1gKVxuICAgICAgICBpZiAoIShlcnJvciBhcyBFcnJvciAmIHsgc3VjY2VzczogYm9vbGVhbiB9KS5zdWNjZXNzKSB7XG4gICAgICAgICAgICBsYXVuY2hCdWlsZFVzYWdlLmZhaWxlZChlcnJvcilcbiAgICAgICAgICAgIGxvZ0J1aWxkRXJyb3IoZXJyb3IgYXMgRXJyb3JzKVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgIH1cbn0pKVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQ2Fwc1dpdGhBcHBBMTF5ID0gKHBsYXRmb3JtTWV0YT86IHsgW2tleTogc3RyaW5nXTogYW55OyB9KSA9PiB7XG4gICAgLyogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZHJpdmVyIHBsYXRmb3JtIGlzIGVsaWdpYmxlIGZvciBBcHBBY2Nlc3NpYmlsaXR5IHNjYW4gKi9cbiAgICBpZiAoXG4gICAgICAgIChwbGF0Zm9ybU1ldGE/LnBsYXRmb3JtX25hbWUgJiYgU3RyaW5nKHBsYXRmb3JtTWV0YT8ucGxhdGZvcm1fbmFtZSkudG9Mb3dlckNhc2UoKSA9PT0gJ2FuZHJvaWQnKSAmJlxuICAgICAgICAocGxhdGZvcm1NZXRhPy5wbGF0Zm9ybV92ZXJzaW9uICYmIHBhcnNlSW50KHBsYXRmb3JtTWV0YT8ucGxhdGZvcm1fdmVyc2lvbj8udG9TdHJpbmcoKSkgPCAxMSlcbiAgICApIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FwcCBBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gdGVzdHMgYXJlIHN1cHBvcnRlZCBvbiBPUyB2ZXJzaW9uIDExIGFuZCBhYm92ZSBmb3IgQW5kcm9pZCBkZXZpY2VzLicpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQ2Fwc1dpdGhBMTF5ID0gKGRldmljZU5hbWU/OiBhbnksIHBsYXRmb3JtTWV0YT86IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCBjaHJvbWVPcHRpb25zPzogYW55KSA9PiB7XG4gICAgLyogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZHJpdmVyIHBsYXRmb3JtIGlzIGVsaWdpYmxlIGZvciBBY2Nlc3NpYmlsaXR5IHNjYW4gKi9cbiAgICB0cnkge1xuICAgICAgICBpZiAoZGV2aWNlTmFtZSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB3aWxsIHJ1biBvbmx5IG9uIERlc2t0b3AgYnJvd3NlcnMuJylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsYXRmb3JtTWV0YT8uYnJvd3Nlcl9uYW1lPy50b0xvd2VyQ2FzZSgpICE9PSAnY2hyb21lJykge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB3aWxsIHJ1biBvbmx5IG9uIENocm9tZSBicm93c2Vycy4nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnJvd3NlclZlcnNpb24gPSBwbGF0Zm9ybU1ldGE/LmJyb3dzZXJfdmVyc2lvblxuICAgICAgICBpZiAoICFpc1VuZGVmaW5lZChicm93c2VyVmVyc2lvbikgJiYgIShicm93c2VyVmVyc2lvbiA9PT0gJ2xhdGVzdCcgfHwgcGFyc2VGbG9hdChicm93c2VyVmVyc2lvbiArICcnKSA+IDk0KSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB3aWxsIHJ1biBvbmx5IG9uIENocm9tZSBicm93c2VyIHZlcnNpb24gZ3JlYXRlciB0aGFuIDk0LicpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaHJvbWVPcHRpb25zPy5hcmdzPy5pbmNsdWRlcygnLS1oZWFkbGVzcycpKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgbm90IHJ1biBvbiBsZWdhY3kgaGVhZGxlc3MgbW9kZS4gU3dpdGNoIHRvIG5ldyBoZWFkbGVzcyBtb2RlIG9yIGF2b2lkIHVzaW5nIGhlYWRsZXNzIG1vZGUuJylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFeGNlcHRpb24gaW4gY2hlY2tpbmcgY2FwYWJpbGl0aWVzIGNvbXBhdGliaWxpdHkgd2l0aCBBY2Nlc3NpYmlsaXR5LiBFcnJvcjogJHtlcnJvcn1gKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQ2Fwc1dpdGhOb25Cc3RhY2tBMTF5ID0gKGJyb3dzZXJOYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBicm93c2VyVmVyc2lvbj86c3RyaW5nIHwgdW5kZWZpbmVkICkgID0+IHtcblxuICAgIGlmIChicm93c2VyTmFtZT8udG9Mb3dlckNhc2UoKSAhPT0gJ2Nocm9tZScpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB3aWxsIHJ1biBvbmx5IG9uIENocm9tZSBicm93c2Vycy4nKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKCFpc1VuZGVmaW5lZChicm93c2VyVmVyc2lvbikgJiYgIShicm93c2VyVmVyc2lvbiA9PT0gJ2xhdGVzdCcgfHwgcGFyc2VGbG9hdChicm93c2VyVmVyc2lvbiArICcnKSA+IDEwMCkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB3aWxsIHJ1biBvbmx5IG9uIENocm9tZSBicm93c2VyIHZlcnNpb24gZ3JlYXRlciB0aGFuIDEwMC4nKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcblxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkU2NhblRlc3RGb3JBY2Nlc3NpYmlsaXR5ID0gKHN1aXRlVGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVzdFRpdGxlOiBzdHJpbmcsIGFjY2Vzc2liaWxpdHlPcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0sIHdvcmxkPzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duOyB9LCBpc0N1Y3VtYmVyPzogYm9vbGVhbiApID0+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBpbmNsdWRlVGFncyA9IEFycmF5LmlzQXJyYXkoYWNjZXNzaWJpbGl0eU9wdGlvbnM/LmluY2x1ZGVUYWdzSW5UZXN0aW5nU2NvcGUpID8gYWNjZXNzaWJpbGl0eU9wdGlvbnM/LmluY2x1ZGVUYWdzSW5UZXN0aW5nU2NvcGUgOiBbXVxuICAgICAgICBjb25zdCBleGNsdWRlVGFncyA9IEFycmF5LmlzQXJyYXkoYWNjZXNzaWJpbGl0eU9wdGlvbnM/LmV4Y2x1ZGVUYWdzSW5UZXN0aW5nU2NvcGUpID8gYWNjZXNzaWJpbGl0eU9wdGlvbnM/LmV4Y2x1ZGVUYWdzSW5UZXN0aW5nU2NvcGUgOiBbXVxuXG4gICAgICAgIGlmIChpc0N1Y3VtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdzTGlzdDogc3RyaW5nW10gPSBbXVxuICAgICAgICAgICAgOyh3b3JsZD8ucGlja2xlIGFzIHsgdGFnczogeyBuYW1lOiBzdHJpbmcgfVtdIH0pPy50YWdzLm1hcCgodGFnOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSkgPT4gdGFnc0xpc3QucHVzaCh0YWcubmFtZSkpXG4gICAgICAgICAgICBjb25zdCBleGNsdWRlZCA9IGV4Y2x1ZGVUYWdzPy5zb21lKChleGNsdWRlKSA9PiB0YWdzTGlzdC5pbmNsdWRlcyhleGNsdWRlKSlcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVkID0gaW5jbHVkZVRhZ3M/Lmxlbmd0aCA9PT0gMCB8fCBpbmNsdWRlVGFncz8uc29tZSgoaW5jbHVkZSkgPT4gdGFnc0xpc3QuaW5jbHVkZXMoaW5jbHVkZSkpXG5cbiAgICAgICAgICAgIHJldHVybiAhZXhjbHVkZWQgJiYgaW5jbHVkZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZ1bGxUZXN0TmFtZSA9IHN1aXRlVGl0bGUgKyAnICcgKyB0ZXN0VGl0bGVcbiAgICAgICAgY29uc3QgZXhjbHVkZWQgPSBleGNsdWRlVGFncz8uc29tZSgoZXhjbHVkZSkgPT4gZnVsbFRlc3ROYW1lLmluY2x1ZGVzKGV4Y2x1ZGUpKVxuICAgICAgICBjb25zdCBpbmNsdWRlZCA9IGluY2x1ZGVUYWdzPy5sZW5ndGggPT09IDAgfHwgaW5jbHVkZVRhZ3M/LnNvbWUoKGluY2x1ZGUpID0+IGZ1bGxUZXN0TmFtZS5pbmNsdWRlcyhpbmNsdWRlKSlcblxuICAgICAgICByZXR1cm4gIWV4Y2x1ZGVkICYmIGluY2x1ZGVkXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciB3aGlsZSB2YWxpZGF0aW5nIHRlc3QgY2FzZSBmb3IgYWNjZXNzaWJpbGl0eSBiZWZvcmUgc2Nhbm5pbmcuIEVycm9yIDogJHtlcnJvcn1gKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IGlzQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uID0gKGFjY2Vzc2liaWxpdHlGbGFnPzogYm9vbGVhbiB8IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBoYXNBMTF5Snd0VG9rZW4gPSB0eXBlb2YgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldUID09PSAnc3RyaW5nJyAmJiBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1QubGVuZ3RoID4gMCAmJiBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1QgIT09ICdudWxsJyAmJiBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1QgIT09ICd1bmRlZmluZWQnXG4gICAgICAgIHJldHVybiBhY2Nlc3NpYmlsaXR5RmxhZyAmJiBoYXNBMTF5Snd0VG9rZW5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEV4Y2VwdGlvbiBpbiB2ZXJpZnlpbmcgdGhlIEFjY2Vzc2liaWxpdHkgc2Vzc2lvbiB3aXRoIGVycm9yIDogJHtlcnJvcn1gKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IGlzQXBwQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uID0gKGFjY2Vzc2liaWxpdHlGbGFnPzogYm9vbGVhbiB8IHN0cmluZywgaXNBcHBBdXRvbWF0ZT86IGJvb2xlYW4pID0+IHtcbiAgICBjb25zdCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbiA9IGlzQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGFjY2Vzc2liaWxpdHlGbGFnKVxuICAgIHJldHVybiBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbiAmJiBpc0FwcEF1dG9tYXRlXG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRTdHJpbmcgPSAodGVtcGxhdGU6IChzdHJpbmcgfCBudWxsKSwgLi4udmFsdWVzOiAoc3RyaW5nIHwgbnVsbClbXSk6IHN0cmluZyA9PiB7XG4gICAgbGV0IGkgPSAwXG4gICAgaWYgKHRlbXBsYXRlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvJXMvZywgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tpKytdXG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiAnJ1xuICAgIH0pXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgX2dldFBhcmFtc0ZvckFwcEFjY2Vzc2liaWxpdHkgPSAoIGNvbW1hbmROYW1lPzogc3RyaW5nLCB0ZXN0TmFtZT86IHN0cmluZyApOiB7IHRoVGVzdFJ1blV1aWQ6IGFueSwgdGhCdWlsZFV1aWQ6IGFueSwgdGhKd3RUb2tlbjogYW55LCBhdXRoSGVhZGVyOiBhbnksIHNjYW5UaW1lc3RhbXA6IG51bWJlciwgbWV0aG9kOiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlc3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgIH0gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgICd0aFRlc3RSdW5VdWlkJzogcHJvY2Vzcy5lbnYuVEVTVF9BTkFMWVRJQ1NfSUQsXG4gICAgICAgICd0aEJ1aWxkVXVpZCc6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUSFVCX1VVSUQsXG4gICAgICAgICd0aEp3dFRva2VuJzogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldULFxuICAgICAgICAnYXV0aEhlYWRlcic6IHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCxcbiAgICAgICAgJ3NjYW5UaW1lc3RhbXAnOiBEYXRlLm5vdygpLFxuICAgICAgICAnbWV0aG9kJzogY29tbWFuZE5hbWUsXG4gICAgICAgICd0ZXN0TmFtZSc6IHRlc3ROYW1lXG4gICAgfVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSAgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGNvbnN0IHBlcmZvcm1BMTF5U2NhbiA9IGFzeW5jIChpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyIHwgV2ViZHJpdmVySU8uTXVsdGlSZW1vdGVCcm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nLCAgY29tbWFuZE5hbWU/OiBzdHJpbmcsIHRlc3ROYW1lPzogc3RyaW5nLCkgOiBQcm9taXNlPHsgW2tleTogc3RyaW5nXTogYW55OyB9IHwgdW5kZWZpbmVkPiA9PiB7XG5cbiAgICBpZiAoIWlzQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGlzQWNjZXNzaWJpbGl0eSkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ05vdCBhbiBBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gc2Vzc2lvbiwgY2Fubm90IHBlcmZvcm0gQWNjZXNzaWJpbGl0eSBzY2FuLicpXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGlmIChpc0FwcEFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHksIGlzQXBwQXV0b21hdGUpKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzOiB1bmtub3duID0gYXdhaXQgKGJyb3dzZXIgYXMgV2ViZHJpdmVySU8uQnJvd3NlcikuZXhlY3V0ZShmb3JtYXRTdHJpbmcoQWNjZXNzaWJpbGl0eVNjcmlwdHMucGVyZm9ybVNjYW4sIEpTT04uc3RyaW5naWZ5KF9nZXRQYXJhbXNGb3JBcHBBY2Nlc3NpYmlsaXR5KGNvbW1hbmROYW1lLCB0ZXN0TmFtZSkpKSBhcyBzdHJpbmcsIHt9KVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKHV0aWwuZm9ybWF0KHJlc3VsdHMgYXMgc3RyaW5nKSlcbiAgICAgICAgICAgIHJldHVybiAoIHJlc3VsdHMgYXMgeyBba2V5OiBzdHJpbmddOiBhbnk7IH0gfCB1bmRlZmluZWQgKVxuICAgICAgICB9XG4gICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5U2NyaXB0cy5wZXJmb3JtU2Nhbikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGV4ZWN1dGVBY2Nlc3NpYmlsaXR5U2NyaXB0KGJyb3dzZXIsIEFjY2Vzc2liaWxpdHlTY3JpcHRzLnBlcmZvcm1TY2FuLCB7IG1ldGhvZDogY29tbWFuZE5hbWUgfHwgJycgfSlcbiAgICAgICAgICAgIHJldHVybiAoIHJlc3VsdHMgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duOyB9IHwgdW5kZWZpbmVkIClcbiAgICAgICAgfVxuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0FjY2Vzc2liaWxpdHlTY3JpcHRzLnBlcmZvcm1TY2FuIGlzIG51bGwnKVxuICAgICAgICByZXR1cm5cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdBY2Nlc3NpYmlsaXR5IFNjYW4gY291bGQgbm90IGJlIHBlcmZvcm1lZCA6ICcgKyBlcnIpXG4gICAgICAgIHJldHVyblxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEExMXlSZXN1bHRzID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5BMTFZX0VWRU5UUy5HRVRfUkVTVUxUUywgYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcpIDogUHJvbWlzZTxBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4+ID0+IHtcblxuICAgIGlmICghaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5KSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcmV0cmlldmUgQWNjZXNzaWJpbGl0eSByZXN1bHRzLicpXG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnUGVyZm9ybWluZyBzY2FuIGJlZm9yZSBnZXR0aW5nIHJlc3VsdHMnKVxuICAgICAgICBhd2FpdCBwZXJmb3JtQTExeVNjYW4oaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHkpXG4gICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHVua25vd24gfT4gPSBhd2FpdCBleGVjdXRlQWNjZXNzaWJpbGl0eVNjcmlwdChicm93c2VyLCBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgfVxuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0FjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHMgaXMgbnVsbCcpXG4gICAgICAgIHJldHVybiBbXVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdObyBhY2Nlc3NpYmlsaXR5IHJlc3VsdHMgd2VyZSBmb3VuZC4nKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYGdldEExMXlSZXN1bHRzIEZhaWxlZC4gRXJyb3I6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxufSlcblxuZXhwb3J0IGNvbnN0IGdldEFwcEExMXlSZXN1bHRzID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5BMTFZX0VWRU5UUy5HRVRfUkVTVUxUUywgYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsICB0ZXN0TmFtZTogc3RyaW5nLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nLCBzZXNzaW9uSWQ/OiBzdHJpbmcgfCBudWxsKSA6IFByb21pc2U8QXJyYXk8eyBba2V5OiBzdHJpbmddOiBhbnk7IH0+PiA9PiB7XG4gICAgaWYgKCFpc0Jyb3dzZXJTdGFja1Nlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIFtdIC8vIHNpbmNlIHdlIGFyZSBydW5uaW5nIG9ubHkgb24gQXV0b21hdGUgYXMgb2Ygbm93XG4gICAgfVxuXG4gICAgaWYgKCFpc0FwcEFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHksIGlzQXBwQXV0b21hdGUpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMgc3VtbWFyeS4nKVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHtBUElVdGlscy5BUFBfQUxMWV9FTkRQT0lOVH0vJHtBUFBfQUxMWV9JU1NVRVNfRU5EUE9JTlR9YFxuICAgICAgICBjb25zdCBhcGlSZXNwb25lID0gYXdhaXQgZ2V0QXBwQTExeVJlc3VsdFJlc3BvbnNlKGFwaVVybCwgaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgdGVzdE5hbWUsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5LCBzZXNzaW9uSWQpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFwaVJlc3BvbmU/LmRhdGE/LmRhdGE/Lmlzc3Vlc1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFBvbGxpbmcgUmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpICB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignTm8gYWNjZXNzaWJpbGl0eSBzdW1tYXJ5IHdhcyBmb3VuZC4nKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYGdldEFwcEExMXlSZXN1bHRzIEZhaWxlZC4gRXJyb3I6ICR7ZXJyb3J9YClcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxufSlcblxuZXhwb3J0IGNvbnN0IGdldEFwcEExMXlSZXN1bHRzU3VtbWFyeSA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuQTExWV9FVkVOVFMuR0VUX1JFU1VMVFNfU1VNTUFSWSwgYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsIHRlc3ROYW1lOiBzdHJpbmcsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcsIHNlc3Npb25JZD86IHN0cmluZyB8IG51bGwpIDogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4gPT4ge1xuICAgIGlmICghaXNCcm93c2VyU3RhY2tTZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB7fSAvLyBzaW5jZSB3ZSBhcmUgcnVubmluZyBvbmx5IG9uIEF1dG9tYXRlIGFzIG9mIG5vd1xuICAgIH1cblxuICAgIGlmICghaXNBcHBBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5LCBpc0FwcEF1dG9tYXRlKSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcmV0cmlldmUgQWNjZXNzaWJpbGl0eSByZXN1bHRzIHN1bW1hcnkuJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7QVBJVXRpbHMuQVBQX0FMTFlfRU5EUE9JTlR9LyR7QVBQX0FMTFlfSVNTVUVTX1NVTU1BUllfRU5EUE9JTlR9YFxuICAgICAgICBjb25zdCBhcGlSZXNwb25lID0gYXdhaXQgZ2V0QXBwQTExeVJlc3VsdFJlc3BvbnNlKGFwaVVybCwgaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgdGVzdE5hbWUsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5LCBzZXNzaW9uSWQpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFwaVJlc3BvbmU/LmRhdGE/LmRhdGE/LnN1bW1hcnlcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBQb2xsaW5nIFJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdObyBhY2Nlc3NpYmlsaXR5IHN1bW1hcnkgd2FzIGZvdW5kLicpXG4gICAgICAgIHJldHVybiB7fVxuICAgIH1cbn0pXG5cbmNvbnN0IGdldEFwcEExMXlSZXN1bHRSZXNwb25zZSA9IGFzeW5jIChhcGlVcmw6IHN0cmluZywgaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgdGVzdE5hbWU6IHN0cmluZywgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZywgc2Vzc2lvbklkPzogc3RyaW5nIHwgbnVsbCkgOiBQcm9taXNlPFBvbGxpbmdSZXN1bHQ+ID0+IHtcbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1BlcmZvcm1pbmcgc2NhbiBiZWZvcmUgZ2V0dGluZyByZXN1bHRzIHN1bW1hcnknKVxuICAgIGF3YWl0IHBlcmZvcm1BMTF5U2Nhbihpc0FwcEF1dG9tYXRlLCBicm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24sIGlzQWNjZXNzaWJpbGl0eSwgdW5kZWZpbmVkLCB0ZXN0TmFtZSlcbiAgICBjb25zdCB1cHBlclRpbWVMaW1pdCA9IHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCA/IERhdGUubm93KCkgKyBwYXJzZUludChwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9QT0xMSU5HX1RJTUVPVVQpICogMTAwMCA6IERhdGUubm93KCkgKyAzMDAwMFxuICAgIGNvbnN0IHBhcmFtcyA9IHsgdGVzdF9ydW5fdXVpZDogcHJvY2Vzcy5lbnYuVEVTVF9BTkFMWVRJQ1NfSUQsIHNlc3Npb25faWQ6IHNlc3Npb25JZCwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0gLy8gUXVlcnkgcGFyYW1zIHRvIHBhc3NcbiAgICBjb25zdCBoZWFkZXIgPSB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1R9YCB9XG4gICAgY29uc3QgYXBpUmVzcG9uZSA9IGF3YWl0IHBvbGxBcGkoYXBpVXJsLCBwYXJhbXMsIGhlYWRlciwgdXBwZXJUaW1lTGltaXQpXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBQb2xsaW5nIFJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShhcGlSZXNwb25lKX1gKVxuICAgIHJldHVybiBhcGlSZXNwb25lXG59XG5cbmV4cG9ydCBjb25zdCBnZXRBMTF5UmVzdWx0c1N1bW1hcnkgPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLkExMVlfRVZFTlRTLkdFVF9SRVNVTFRTX1NVTU1BUlksIGFzeW5jIChpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nKSA6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBhbnk7IH0+ID0+IHtcblxuICAgIGlmICghaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5KSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcmV0cmlldmUgQWNjZXNzaWJpbGl0eSByZXN1bHRzIHN1bW1hcnkuJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdQZXJmb3JtaW5nIHNjYW4gYmVmb3JlIGdldHRpbmcgcmVzdWx0cyBzdW1tYXJ5JylcbiAgICAgICAgYXdhaXQgcGVyZm9ybUExMXlTY2FuKGlzQXBwQXV0b21hdGUsIGJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5KVxuICAgICAgICBpZiAoQWNjZXNzaWJpbGl0eVNjcmlwdHMuZ2V0UmVzdWx0c1N1bW1hcnkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlSZXN1bHRzOiB7IFtrZXk6IHN0cmluZ106IHVua25vd247IH0gPSBhd2FpdCBleGVjdXRlQWNjZXNzaWJpbGl0eVNjcmlwdChicm93c2VyLCBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzU3VtbWFyeSlcbiAgICAgICAgICAgIHJldHVybiBzdW1tYXJ5UmVzdWx0c1xuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignQWNjZXNzaWJpbGl0eVNjcmlwdHMuZ2V0UmVzdWx0c1N1bW1hcnkgaXMgbnVsbCcpXG4gICAgICAgIHJldHVybiB7fVxuICAgIH0gY2F0Y2gge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ05vIGFjY2Vzc2liaWxpdHkgc3VtbWFyeSB3YXMgZm91bmQuJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxufSlcblxuZXhwb3J0IGNvbnN0IHN0b3BCdWlsZFVwc3RyZWFtID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5URVNUSFVCX0VWRU5UUy5TVE9QLCBvMTF5RXJyb3JIYW5kbGVyKGFzeW5jIGZ1bmN0aW9uIHN0b3BCdWlsZFVwc3RyZWFtKCkge1xuICAgIGNvbnN0IHN0b3BCdWlsZFVzYWdlID0gVXNhZ2VTdGF0cy5nZXRJbnN0YW5jZSgpLnN0b3BCdWlsZFVzYWdlXG4gICAgc3RvcEJ1aWxkVXNhZ2UudHJpZ2dlcmVkKClcbiAgICBpZiAoIXByb2Nlc3MuZW52W1RFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVl0pIHtcbiAgICAgICAgc3RvcEJ1aWxkVXNhZ2UuZmFpbGVkKCdCdWlsZCBpcyBub3QgY29tcGxldGVkIHlldCcpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiAnQnVpbGQgaXMgbm90IGNvbXBsZXRlZCB5ZXQnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF0pIHtcbiAgICAgICAgc3RvcEJ1aWxkVXNhZ2UuZmFpbGVkKCdUb2tlbi9idWlsZElEIGlzIHVuZGVmaW5lZCwgYnVpbGQgY3JlYXRpb24gbWlnaHQgaGF2ZSBmYWlsZWQnKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1tTVE9QX0JVSUxEXSBNaXNzaW5nIEF1dGhlbnRpY2F0aW9uIFRva2VuLyBCdWlsZCBJRCcpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiAnVG9rZW4vYnVpbGRJRCBpcyB1bmRlZmluZWQsIGJ1aWxkIGNyZWF0aW9uIG1pZ2h0IGhhdmUgZmFpbGVkJ1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICdzdG9wX3RpbWUnOiAobmV3IERhdGUoKSkudG9JU09TdHJpbmcoKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSVV0aWxzLkRBVEFfRU5EUE9JTlR9L2FwaS92MS9idWlsZHMvJHtwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXX0vc3RvcGBcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgLi4uREVGQVVMVF9SRVFVRVNUX0NPTkZJRy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Byb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF19YFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gICAgICAgIH0pXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1NUT1BfQlVJTERdIFN1Y2Nlc3MgcmVzcG9uc2U6ICR7YXdhaXQgcmVzcG9uc2UudGV4dCgpfWApXG4gICAgICAgIHN0b3BCdWlsZFVzYWdlLnN1Y2Nlc3MoKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXG4gICAgICAgICAgICBtZXNzYWdlOiAnJ1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgc3RvcEJ1aWxkVXNhZ2UuZmFpbGVkKGVycm9yKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtTVE9QX0JVSUxEXSBGYWlsZWQuIEVycm9yOiAke2Vycm9yfWApXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2VcbiAgICAgICAgfVxuICAgIH1cbn0pKVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2lJbmZvICgpIHtcbiAgICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudlxuICAgIC8vIEplbmtpbnNcbiAgICBpZiAoKHR5cGVvZiBlbnYuSkVOS0lOU19VUkwgPT09ICdzdHJpbmcnICYmIGVudi5KRU5LSU5TX1VSTC5sZW5ndGggPiAwKSB8fCAodHlwZW9mIGVudi5KRU5LSU5TX0hPTUUgPT09ICdzdHJpbmcnICYmIGVudi5KRU5LSU5TX0hPTUUubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdKZW5raW5zJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkJVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDaXJjbGVDSVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LkNJUkNMRUNJKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0NpcmNsZUNJJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkNJUkNMRV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkNJUkNMRV9KT0IsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5DSVJDTEVfQlVJTERfTlVNXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVHJhdmlzIENJXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuVFJBVklTKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1RyYXZpcyBDSScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5UUkFWSVNfQlVJTERfV0VCX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuVFJBVklTX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuVFJBVklTX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvZGVzaGlwXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQ29kZXNoaXAnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBudWxsLFxuICAgICAgICAgICAgam9iX25hbWU6IG51bGwsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IG51bGxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCaXRidWNrZXRcbiAgICBpZiAoZW52LkJJVEJVQ0tFVF9CUkFOQ0ggJiYgZW52LkJJVEJVQ0tFVF9DT01NSVQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdCaXRidWNrZXQnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQklUQlVDS0VUX0dJVF9IVFRQX09SSUdJTixcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQklUQlVDS0VUX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIERyb25lXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuRFJPTkUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnRHJvbmUnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuRFJPTkVfQlVJTERfTElOSyxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuRFJPTkVfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2VtYXBob3JlXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuU0VNQVBIT1JFKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1NlbWFwaG9yZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5TRU1BUEhPUkVfT1JHQU5JWkFUSU9OX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU0VNQVBIT1JFX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuU0VNQVBIT1JFX0pPQl9JRFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdpdExhYlxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LkdJVExBQl9DSSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdHaXRMYWInLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQ0lfSk9CX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQ0lfSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5DSV9KT0JfSURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCdWlsZGtpdGVcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgaXNUcnVlKGVudi5CVUlMREtJVEUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQnVpbGRraXRlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkJVSUxES0lURV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkJVSUxES0lURV9MQUJFTCB8fCBlbnYuQlVJTERLSVRFX1BJUEVMSU5FX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMREtJVEVfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVmlzdWFsIFN0dWRpbyBUZWFtIFNlcnZpY2VzXG4gICAgaWYgKGlzVHJ1ZShlbnYuVEZfQlVJTEQpICYmIGVudi5URl9CVUlMRF9CVUlMRE5VTUJFUikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1Zpc3VhbCBTdHVkaW8gVGVhbSBTZXJ2aWNlcycsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5TWVNURU1fVEVBTUZPVU5EQVRJT05TRVJWRVJVUkl9JHtlbnYuU1lTVEVNX1RFQU1QUk9KRUNUSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU1lTVEVNX0RFRklOSVRJT05JRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0JVSUxESURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBcHB2ZXlvclxuICAgIGlmIChpc1RydWUoZW52LkFQUFZFWU9SKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0FwcHZleW9yJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYCR7ZW52LkFQUFZFWU9SX1VSTH0vcHJvamVjdC8ke2Vudi5BUFBWRVlPUl9BQ0NPVU5UX05BTUV9LyR7ZW52LkFQUFZFWU9SX1BST0pFQ1RfU0xVR30vYnVpbGRzLyR7ZW52LkFQUFZFWU9SX0JVSUxEX0lEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkFQUFZFWU9SX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQVBQVkVZT1JfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXp1cmUgQ0lcbiAgICBpZiAoZW52LkFaVVJFX0hUVFBfVVNFUl9BR0VOVCAmJiBlbnYuVEZfQlVJTEQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdBenVyZSBDSScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5TWVNURU1fVEVBTUZPVU5EQVRJT05TRVJWRVJVUkl9JHtlbnYuU1lTVEVNX1RFQU1QUk9KRUNUSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQlVJTERfQlVJTERJRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0JVSUxESURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBV1MgQ29kZUJ1aWxkXG4gICAgaWYgKGVudi5DT0RFQlVJTERfQlVJTERfSUQgfHwgZW52LkNPREVCVUlMRF9SRVNPTFZFRF9TT1VSQ0VfVkVSU0lPTiB8fCBlbnYuQ09ERUJVSUxEX1NPVVJDRV9WRVJTSU9OKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQVdTIENvZGVCdWlsZCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5DT0RFQlVJTERfUFVCTElDX0JVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQ09ERUJVSUxEX0JVSUxEX0lELFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ09ERUJVSUxEX0JVSUxEX0lEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQmFtYm9vXG4gICAgaWYgKGVudi5iYW1ib29fYnVpbGROdW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdCYW1ib28nLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuYmFtYm9vX2J1aWxkUmVzdWx0c1VybCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuYmFtYm9vX3Nob3J0Sm9iTmFtZSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LmJhbWJvb19idWlsZE51bWJlclxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFdlcmNrZXJcbiAgICBpZiAoZW52LldFUkNLRVIgfHwgZW52LldFUkNLRVJfTUFJTl9QSVBFTElORV9TVEFSVEVEKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnV2VyY2tlcicsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5XRVJDS0VSX0JVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuV0VSQ0tFUl9NQUlOX1BJUEVMSU5FX1NUQVJURUQgPyAnTWFpbiBQaXBlbGluZScgOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuV0VSQ0tFUl9HSVRfQ09NTUlUXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR29vZ2xlIENsb3VkXG4gICAgaWYgKGVudi5HQ1BfUFJPSkVDVCB8fCBlbnYuR0NMT1VEX1BST0pFQ1QgfHwgZW52LkdPT0dMRV9DTE9VRF9QUk9KRUNUKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnR29vZ2xlIENsb3VkJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuUFJPSkVDVF9JRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0lELFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNoaXBwYWJsZVxuICAgIGlmIChlbnYuU0hJUFBBQkxFKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnU2hpcHBhYmxlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LlNISVBQQUJMRV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNISVBQQUJMRV9KT0JfSUQgPyBgSm9iICMke2Vudi5TSElQUEFCTEVfSk9CX0lEfWAgOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuU0hJUFBBQkxFX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE5ldGxpZnlcbiAgICBpZiAoaXNUcnVlKGVudi5ORVRMSUZZKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ05ldGxpZnknLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuREVQTE9ZX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU0lURV9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERfSURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBHaXRodWIgQWN0aW9uc1xuICAgIGlmIChpc1RydWUoZW52LkdJVEhVQl9BQ1RJT05TKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0dpdEh1YiBBY3Rpb25zJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYCR7ZW52LkdJVEhVQl9TRVJWRVJfVVJMfS8ke2Vudi5HSVRIVUJfUkVQT1NJVE9SWX0vYWN0aW9ucy9ydW5zLyR7ZW52LkdJVEhVQl9SVU5fSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuR0lUSFVCX1dPUktGTE9XLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuR0lUSFVCX1JVTl9JRCxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBWZXJjZWxcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgZW52LlZFUkNFTCA9PT0gJzEnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnVmVyY2VsJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYGh0dHA6Ly8ke2Vudi5WRVJDRUxfVVJMfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogbnVsbCxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUZWFtY2l0eVxuICAgIGlmIChlbnYuVEVBTUNJVFlfVkVSU0lPTikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1RlYW1jaXR5JyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERfTlVNQkVSLFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvbmNvdXJzZVxuICAgIGlmIChlbnYuQ09OQ09VUlNFIHx8IGVudi5DT05DT1VSU0VfVVJMIHx8IGVudi5DT05DT1VSU0VfVVNFUk5BTUUgfHwgZW52LkNPTkNPVVJTRV9URUFNKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQ29uY291cnNlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQlVJTERfSk9CX05BTUUgfHwgbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0lEIHx8IG51bGwsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR29DRFxuICAgIGlmIChlbnYuR09fSk9CX05BTUUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdHb0NEJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuR09fSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5HT19QSVBFTElORV9DT1VOVEVSLFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvZGVGcmVzaFxuICAgIGlmIChlbnYuQ0ZfQlVJTERfSUQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdDb2RlRnJlc2gnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQ0ZfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5DRl9QSVBFTElORV9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ0ZfQlVJTERfSUQsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgbm8gbWF0Y2hlcywgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0R2l0TWV0YURhdGEgKCkge1xuICAgIGNvbnN0IGluZm86IEdpdFJlcG9JbmZvID0gZ2l0UmVwb0luZm8oKVxuICAgIGlmICghaW5mby5jb21tb25HaXREaXIpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHsgcmVtb3RlIH0gPSBhd2FpdCBwR2l0Y29uZmlnKGluZm8uY29tbW9uR2l0RGlyKVxuICAgIGNvbnN0IHJlbW90ZXMgPSByZW1vdGUgPyBPYmplY3Qua2V5cyhyZW1vdGUpLm1hcChyZW1vdGVOYW1lID0+ICAoeyBuYW1lOiByZW1vdGVOYW1lLCB1cmw6IHJlbW90ZVtyZW1vdGVOYW1lXS51cmwgfSkpIDogW11cblxuICAgIGxldCBnaXRNZXRhRGF0YSA6IEdpdE1ldGFEYXRhID0ge1xuICAgICAgICBuYW1lOiAnZ2l0JyxcbiAgICAgICAgc2hhOiBpbmZvLnNoYSxcbiAgICAgICAgc2hvcnRfc2hhOiBpbmZvLmFiYnJldmlhdGVkU2hhLFxuICAgICAgICBicmFuY2g6IGluZm8uYnJhbmNoLFxuICAgICAgICB0YWc6IGluZm8udGFnLFxuICAgICAgICBjb21taXR0ZXI6IGluZm8uY29tbWl0dGVyLFxuICAgICAgICBjb21taXR0ZXJfZGF0ZTogaW5mby5jb21taXR0ZXJEYXRlLFxuICAgICAgICBhdXRob3I6IGluZm8uYXV0aG9yLFxuICAgICAgICBhdXRob3JfZGF0ZTogaW5mby5hdXRob3JEYXRlLFxuICAgICAgICBjb21taXRfbWVzc2FnZTogaW5mby5jb21taXRNZXNzYWdlLFxuICAgICAgICByb290OiBpbmZvLnJvb3QsXG4gICAgICAgIGNvbW1vbl9naXRfZGlyOiBpbmZvLmNvbW1vbkdpdERpcixcbiAgICAgICAgd29ya3RyZWVfZ2l0X2RpcjogaW5mby53b3JrdHJlZUdpdERpcixcbiAgICAgICAgbGFzdF90YWc6IGluZm8ubGFzdFRhZyxcbiAgICAgICAgY29tbWl0c19zaW5jZV9sYXN0X3RhZzogaW5mby5jb21taXRzU2luY2VMYXN0VGFnLFxuICAgICAgICByZW1vdGVzOiByZW1vdGVzXG4gICAgfVxuXG4gICAgZ2l0TWV0YURhdGEgPSBjaGVja0FuZFRydW5jYXRlVkNTSW5mbyhnaXRNZXRhRGF0YSlcblxuICAgIHJldHVybiBnaXRNZXRhRGF0YVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcXVlSWRlbnRpZmllcih0ZXN0OiBGcmFtZXdvcmtzLlRlc3QsIGZyYW1ld29yaz86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZyYW1ld29yayA9PT0gJ2phc21pbmUnKSB7XG4gICAgICAgIHJldHVybiB0ZXN0LmZ1bGxOYW1lXG4gICAgfVxuXG4gICAgbGV0IHBhcmVudFRpdGxlID0gdGVzdC5wYXJlbnRcbiAgICAvLyBTb21ldGltZXMgcGFyZW50IHdpbGwgYmUgYW4gb2JqZWN0IGluc3RlYWQgb2YgYSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIHBhcmVudFRpdGxlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBwYXJlbnRUaXRsZSA9IChwYXJlbnRUaXRsZSBhcyB7IHRpdGxlOiBzdHJpbmcgfSkudGl0bGVcbiAgICB9XG4gICAgcmV0dXJuIGAke3BhcmVudFRpdGxlfSAtICR7dGVzdC50aXRsZX1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmlxdWVJZGVudGlmaWVyRm9yQ3VjdW1iZXIod29ybGQ6IElUZXN0Q2FzZUhvb2tQYXJhbWV0ZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB3b3JsZC5waWNrbGUudXJpICsgJ18nICsgd29ybGQucGlja2xlLmFzdE5vZGVJZHMuam9pbignLCcpXG59XG5cbi8vIExvYWQgVGVzdGluZyBTZXJ2aWNlIChMVFMpIGdhdGluZyBoZWxwZXJzIFx1MjAxNCBtaXJyb3Igb2YgYnN0YWNrX3V0aWxzL2hlbHBlci5weVxuLy8gaXNfbG9hZF90ZXN0aW5nX3Nlc3Npb24oKSAvIGdldF9sdHNfc2Vzc2lvbl9pZCgpIGluIGJyb3dzZXJzdGFjay1weXRob24tc2RrXG4vLyAoYnJhbmNoIExUUy10cmEtcHl0aG9uLXN1cHBvcnQpLiBMVFMgcG9kLWl0ZXJhdGlvbnMgZXhwb3J0XG4vLyBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQgYmVmb3JlIGludm9raW5nIHRoZSB0ZXN0IHJ1bm5lcjsgcHJlc2VuY2Ugb2Zcbi8vIHRoYXQgZW52IHZhciBpcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgXCJ0aGlzIHJ1biBpcyBhbiBMVFMgcG9kXG4vLyBpdGVyYXRpb25cIi4gT3B0aW9uYWwgQlJPV1NFUlNUQUNLX0xUUz10cnVlfDEgbGV0cyB0aGUgcnVubmVyIG9wdC1pbiB3aXRob3V0XG4vLyBzdXBwbHlpbmcgYSBzZXNzaW9uIGlkICh1c2VmdWwgZm9yIGxvY2FsIHJlcHJvKS5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpOiBib29sZWFuIHtcbiAgICBpZiAocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCBmbGFnID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0xUU11cbiAgICByZXR1cm4gZmxhZyA9PT0gJ3RydWUnIHx8IGZsYWcgPT09ICcxJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0THRzU2Vzc2lvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRF0gfHwgJydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsb3VkUHJvdmlkZXIoYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciB8IFdlYmRyaXZlcklPLk11bHRpUmVtb3RlQnJvd3Nlcik6IHN0cmluZyB7XG4gICAgLy8gTk9URTogZG8gTk9UIGJyYW5jaCBvbiBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpIGhlcmUuIGdldENsb3VkUHJvdmlkZXIgaXNcbiAgICAvLyBzaGFyZWQgd2l0aCBBdXRvbWF0ZS1zaWRlIGd1YXJkcyAoYXV0b21hdGVNb2R1bGUgb25CZWZvcmUvb25BZnRlclRlc3QsXG4gICAgLy8gd2ViZHJpdmVySU9Nb2R1bGUgS0VZX0lTX0JST1dTRVJTVEFDS19IVUIsIGFjY2Vzc2liaWxpdHktaGFuZGxlcixcbiAgICAvLyBzZXJ2aWNlLnRzKSBcdTIwMTQgZmxpcHBpbmcgaXQgdG8gJ2Jyb3dzZXJzdGFjaycgdW5kZXIgTFRTIHdvdWxkIG1ha2VcbiAgICAvLyBpc0Jyb3dzZXJzdGFja1Nlc3Npb24oKSByZXR1cm4gdHJ1ZSBmb3IgbG9jYWwtU2VsZW5pdW0gcG9kIHNlc3Npb25zLFxuICAgIC8vIGNhdXNpbmcgbWFya1Nlc3Npb25OYW1lIC8gbWFya1Nlc3Npb25TdGF0dXMgdG8gUFVUIGFnYWluc3QgQXV0b21hdGVcbiAgICAvLyBSRVNUIEFQSXMgd2l0aCBzZXNzaW9uIGlkcyB0aGF0IGRvbid0IGV4aXN0IHRoZXJlLiBUZXN0SHViLXJlcG9ydGluZ1xuICAgIC8vIGNhbGxlcnMgdGhhdCBuZWVkICdicm93c2Vyc3RhY2snIHVuZGVyIExUUyBkZXJpdmUgaXQgbG9jYWxseSB3aXRoXG4gICAgLy8gYGlzTG9hZFRlc3RpbmdTZXNzaW9uKCkgPyAnYnJvd3NlcnN0YWNrJyA6IGdldENsb3VkUHJvdmlkZXIoYnJvd3NlcilgXG4gICAgLy8gKHNlZSByZXBvcnRlci50cywgaW5zaWdodHMtaGFuZGxlci50cykuXG4gICAgaWYgKGJyb3dzZXIgJiYgJ2luc3RhbmNlcycgaW4gYnJvd3Nlcikge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGluc3RhbmNlc1xuICAgICAgICBmb3IgKGNvbnN0IGluc3RhbmNlTmFtZSBvZiBicm93c2VyLmluc3RhbmNlcykge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSAoYnJvd3NlciBhcyBhbnkpW2luc3RhbmNlTmFtZV0gYXMgV2ViZHJpdmVySU8uQnJvd3NlclxuICAgICAgICAgICAgaWYgKGluc3RhbmNlLm9wdGlvbnMgJiYgaW5zdGFuY2Uub3B0aW9ucy5ob3N0bmFtZSAmJiBpbnN0YW5jZS5vcHRpb25zLmhvc3RuYW1lLmluY2x1ZGVzKCdicm93c2Vyc3RhY2snKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnYnJvd3NlcnN0YWNrJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChicm93c2VyLm9wdGlvbnMgJiYgYnJvd3Nlci5vcHRpb25zLmhvc3RuYW1lICYmIGJyb3dzZXIub3B0aW9ucy5ob3N0bmFtZS5pbmNsdWRlcygnYnJvd3NlcnN0YWNrJykpIHsgLy8gU2luZ2xlIGJyb3dzZXIgaW5zdGFuY2VcbiAgICAgICAgcmV0dXJuICdicm93c2Vyc3RhY2snXG4gICAgfVxuICAgIHJldHVybiAndW5rbm93bl9ncmlkJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2Vyc3RhY2tTZXNzaW9uKGJyb3dzZXI/OiBXZWJkcml2ZXJJTy5Ccm93c2VyIHwgV2ViZHJpdmVySU8uTXVsdGlSZW1vdGVCcm93c2VyKSB7XG4gICAgcmV0dXJuIGJyb3dzZXIgJiYgZ2V0Q2xvdWRQcm92aWRlcihicm93c2VyKS50b0xvd2VyQ2FzZSgpID09PSAnYnJvd3NlcnN0YWNrJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NlbmFyaW9FeGFtcGxlcyh3b3JsZDogSVRlc3RDYXNlSG9va1BhcmFtZXRlcikge1xuICAgIGNvbnN0IHNjZW5hcmlvID0gd29ybGQucGlja2xlXG5cbiAgICAvLyBubyBleGFtcGxlcyBwcmVzZW50XG4gICAgaWYgKChzY2VuYXJpby5hc3ROb2RlSWRzICYmIHNjZW5hcmlvLmFzdE5vZGVJZHMubGVuZ3RoIDw9IDEpIHx8IHNjZW5hcmlvLmFzdE5vZGVJZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwaWNrbGVJZDogc3RyaW5nID0gc2NlbmFyaW8uYXN0Tm9kZUlkc1swXVxuICAgIGNvbnN0IGV4YW1wbGVzSWQ6IHN0cmluZyA9IHNjZW5hcmlvLmFzdE5vZGVJZHNbMV1cbiAgICBjb25zdCBnaGVya2luRG9jdW1lbnRDaGlsZHJlbiA9IHdvcmxkLmdoZXJraW5Eb2N1bWVudC5mZWF0dXJlPy5jaGlsZHJlblxuXG4gICAgbGV0IGV4YW1wbGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBnaGVya2luRG9jdW1lbnRDaGlsZHJlbj8uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5ydWxlKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgaWYgcnVsZSBpcyBwcmVzZW50XG4gICAgICAgICAgICBjaGlsZC5ydWxlLmNoaWxkcmVuLmZvckVhY2goY2hpbGRMZXZlbDIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZExldmVsMi5zY2VuYXJpbyAmJiBjaGlsZExldmVsMi5zY2VuYXJpby5pZCA9PT0gcGlja2xlSWQgJiYgY2hpbGRMZXZlbDIuc2NlbmFyaW8uZXhhbXBsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzc2VkRXhhbXBsZXMgPSBjaGlsZExldmVsMi5zY2VuYXJpby5leGFtcGxlcy5mbGF0TWFwKCh2YWwpID0+ICh2YWwudGFibGVCb2R5KSkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZXhhbXBsZXNJZCk/LmNlbGxzLm1hcCgodmFsKSA9PiAodmFsLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZEV4YW1wbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlcyA9IHBhc3NlZEV4YW1wbGVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLnNjZW5hcmlvICYmIGNoaWxkLnNjZW5hcmlvLmlkID09PSBwaWNrbGVJZCAmJiBjaGlsZC5zY2VuYXJpby5leGFtcGxlcykge1xuICAgICAgICAgICAgLy8gaGFuZGxlIGlmIHNjZW5hcmlvIG91dHNpZGUgcnVsZVxuICAgICAgICAgICAgY29uc3QgcGFzc2VkRXhhbXBsZXMgPSBjaGlsZC5zY2VuYXJpby5leGFtcGxlcy5mbGF0TWFwKCh2YWwpID0+ICh2YWwudGFibGVCb2R5KSkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZXhhbXBsZXNJZCk/LmNlbGxzLm1hcCgodmFsKSA9PiAodmFsLnZhbHVlKSlcbiAgICAgICAgICAgIGlmIChwYXNzZWRFeGFtcGxlcykge1xuICAgICAgICAgICAgICAgIGV4YW1wbGVzID0gcGFzc2VkRXhhbXBsZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAoZXhhbXBsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBleGFtcGxlc1xuICAgIH1cbiAgICByZXR1cm5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFuc2lDb2xvcnMobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yOTQ5NzY4MFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvW1xcdTAwMWJcXHUwMDliXVtbKCkjOz9dKig/OlswLTldezEsNH0oPzo7WzAtOV17MCw0fSkqKT9bMC05QS1PUlpjZi1ucXJ5PT48XS9nLCAnJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ1RhZyhldmVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gJ1Rlc3RSdW5TdGFydGVkJyB8fCBldmVudFR5cGUgPT09ICdUZXN0UnVuRmluaXNoZWQnKSB7XG4gICAgICAgIHJldHVybiAnVGVzdF9VcGxvYWQnXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdIb29rUnVuU3RhcnRlZCcgfHwgZXZlbnRUeXBlID09PSAnSG9va1J1bkZpbmlzaGVkJykge1xuICAgICAgICByZXR1cm4gJ0hvb2tfVXBsb2FkJ1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnU2NyZWVuc2hvdENyZWF0ZWQnKSB7XG4gICAgICAgIHJldHVybiAnU2NyZWVuc2hvdF9VcGxvYWQnXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdMb2dDcmVhdGVkJykge1xuICAgICAgICByZXR1cm4gJ0xvZ19VcGxvYWQnXG4gICAgfVxuICAgIHJldHVybiAndW5kZWZpbmVkJ1xufVxuXG4vLyBnZXQgaGllcmFyY2h5IGZvciBhIHBhcnRpY3VsYXIgdGVzdCAoY2FsbGVkIGJ5IHJlcG9ydGVyIGZvciBza2lwcGVkIHRlc3RzKVxuZXhwb3J0IGZ1bmN0aW9uIGdldEhpZXJhcmNoeShmdWxsVGl0bGU/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWZ1bGxUaXRsZSkge1xuICAgICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgcmV0dXJuIGZ1bGxUaXRsZS5zcGxpdCgnLicpLnNsaWNlKDAsIC0xKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SG9va1R5cGUgKGhvb2tOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChob29rTmFtZS5zdGFydHNXaXRoKCdcImJlZm9yZSBlYWNoXCInKSkge1xuICAgICAgICByZXR1cm4gJ0JFRk9SRV9FQUNIJ1xuICAgIH0gZWxzZSBpZiAoaG9va05hbWUuc3RhcnRzV2l0aCgnXCJiZWZvcmUgYWxsXCInKSkge1xuICAgICAgICByZXR1cm4gJ0JFRk9SRV9BTEwnXG4gICAgfSBlbHNlIGlmIChob29rTmFtZS5zdGFydHNXaXRoKCdcImFmdGVyIGVhY2hcIicpKSB7XG4gICAgICAgIHJldHVybiAnQUZURVJfRUFDSCdcbiAgICB9IGVsc2UgaWYgKGhvb2tOYW1lLnN0YXJ0c1dpdGgoJ1wiYWZ0ZXIgYWxsXCInKSkge1xuICAgICAgICByZXR1cm4gJ0FGVEVSX0FMTCdcbiAgICB9XG4gICAgcmV0dXJuICd1bmtub3duJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY3JlZW5zaG90Q29tbWFuZCAoYXJnczogQmVmb3JlQ29tbWFuZEFyZ3MgfCBBZnRlckNvbW1hbmRBcmdzKSB7XG4gICAgcmV0dXJuIGFyZ3MuZW5kcG9pbnQgJiYgYXJncy5lbmRwb2ludC5pbmNsdWRlcygnL3NjcmVlbnNob3QnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCU3RhY2tTZXNzaW9uKGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcudXNlciA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGNvbmZpZy5rZXkgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5rZXkubGVuZ3RoID09PSAyMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcnN0YWNrSW5mcmEoY29uZmlnOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNhcHM/OiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzKTogYm9vbGVhbiB7XG4gICAgLy8gdGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGJhc2ljIHNlc3Npb24gb3IgbXVsdGkgcmVtb3RlIHNlc3Npb24gaXMgcnVubmluZyBvbiBCcm93c2Vyc3RhY2ssIG1haW5seSBieSBjaGVja2luZyB0aGUgaG9zdG5hbWUgcGFyYW1ldGVyIGluIHRoZSBnaXZlbiBjb25maWdcbiAgICAvLyBJbiBjYXNlIGhvc3RuYW1lIGlzIG5vdCBwcmVzZW50IGFueXdoZXJlIGluIHRoZSBjb25maWcsIGl0IHJldHVybnMgdHJ1ZSBieSBkZWZhdWx0IGFzIGhvc3RuYW1lIGlzIG5vdCBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgaW4gdGhlIGNvbmZpZ1xuXG4gICAgY29uc3QgaXNCcm93c2Vyc3RhY2sgPSAoc3RyOiBzdHJpbmcgKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHJldHVybiBzdHIgPT09ICdicm93c2Vyc3RhY2suY29tJyB8fCBzdHIuZW5kc1dpdGgoJy5icm93c2Vyc3RhY2suY29tJylcbiAgICB9XG5cbiAgICBpZiAoKGNvbmZpZy5ob3N0bmFtZSkgJiYgIWlzQnJvd3NlcnN0YWNrKGNvbmZpZy5ob3N0bmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGNhcHMgJiYgdHlwZW9mIGNhcHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNhcHMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgY2Fwcykge1xuICAgICAgICAgICAgICAgIGlmICgoKGNhcGFiaWxpdHkgYXMgT3B0aW9ucy5UZXN0cnVubmVyKS5ob3N0bmFtZSkgJiYgIWlzQnJvd3NlcnN0YWNrKChjYXBhYmlsaXR5IGFzIE9wdGlvbnMuVGVzdHJ1bm5lcikuaG9zdG5hbWUgYXMgc3RyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjYXBzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IGNhcHNba2V5IGFzIGtleW9mIENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXNdXG4gICAgICAgICAgICAgICAgaWYgKCgoY2FwYWJpbGl0eSBhcyBPcHRpb25zLlRlc3RydW5uZXIpLmhvc3RuYW1lKSAmJiAhaXNCcm93c2Vyc3RhY2soKGNhcGFiaWxpdHkgYXMgT3B0aW9ucy5UZXN0cnVubmVyKS5ob3N0bmFtZSBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNCU3RhY2tTZXNzaW9uKGNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja1VzZXJBbmRLZXkoY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsIG9wdGlvbnM6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuXG4gICAgLy8gRmFsbGJhY2sgMTogRW52IHZhcmlhYmxlc1xuICAgIC8vIEZhbGxiYWNrIDI6IFNlcnZpY2UgdmFyaWFibGVzIGluIHdkaW8uY29uZi5qcyAodGhhdCBhcmUgcmVjZWl2ZWQgaW5zaWRlIG9wdGlvbnMgb2JqZWN0KVxuICAgIGNvbnN0IGVudk9yU2VydmljZVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdXNlcjogZ2V0QnJvd3NlclN0YWNrVXNlcihvcHRpb25zKSxcbiAgICAgICAga2V5OiBnZXRCcm93c2VyU3RhY2tLZXkob3B0aW9ucylcbiAgICB9XG4gICAgaWYgKGVudk9yU2VydmljZVZhcmlhYmxlcy51c2VyICYmIGVudk9yU2VydmljZVZhcmlhYmxlcy5rZXkpIHtcbiAgICAgICAgcmV0dXJuIGVudk9yU2VydmljZVZhcmlhYmxlc1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIDM6IFNlcnZpY2UgdmFyaWFibGVzIGluIHRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyBvYmplY3RcbiAgICAvLyBGYWxsYmFjayA0OiBTZXJ2aWNlIHZhcmlhYmxlcyBpbiB0aGUgdG9wIGxldmVsIGNvbmZpZyBvYmplY3RcbiAgICBjb25zdCBvMTF5VmFyaWFibGVzID0ge1xuICAgICAgICB1c2VyOiBnZXRPYnNlcnZhYmlsaXR5VXNlcihvcHRpb25zLCBjb25maWcpLFxuICAgICAgICBrZXk6IGdldE9ic2VydmFiaWxpdHlLZXkob3B0aW9ucywgY29uZmlnKVxuICAgIH1cbiAgICByZXR1cm4gbzExeVZhcmlhYmxlc1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRBZGRTZXJ2aWNlVmVyc2lvbihjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lciwgdGVzdE9ic2VydmFiaWxpdHk/OiBib29sZWFuLCBjYXBzPzogQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIGlmICgoY29uZmlnLnNlcnZpY2VzICYmIGNvbmZpZy5zZXJ2aWNlcy50b1N0cmluZygpLmluY2x1ZGVzKCdjaHJvbWVkcml2ZXInKSAmJiB0ZXN0T2JzZXJ2YWJpbGl0eSAhPT0gZmFsc2UpIHx8ICFpc0Jyb3dzZXJzdGFja0luZnJhKGNvbmZpZywgY2FwcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYXRjaEFuZFBvc3RFdmVudHMgKGV2ZW50VXJsOiBzdHJpbmcsIGtpbmQ6IHN0cmluZywgZGF0YTogVXBsb2FkVHlwZVtdKSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudltURVNUT1BTX0JVSUxEX0NPTVBMRVRFRF9FTlZdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQnVpbGQgbm90IGNvbXBsZXRlZCB5ZXQnKVxuICAgIH1cblxuICAgIGNvbnN0IGp3dFRva2VuID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXVxuICAgIGlmICghand0VG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGF1dGhlbnRpY2F0aW9uIFRva2VuJylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElVdGlscy5EQVRBX0VORFBPSU5UfS8ke2V2ZW50VXJsfWBcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtqd3RUb2tlbn1gXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgfSlcbiAgICAgICAgLy8gcmVhZCBhcyB0ZXh0IGZpcnN0OiBlcnJvciByZXNwb25zZXMgKDQwMS81eHgpIGFuZCBlbXB0eSBib2RpZXMgYXJlIG5vdCBKU09OLCBhbmQgYSBibGluZFxuICAgICAgICAvLyByZXNwb25zZS5qc29uKCkgc3VyZmFjZWQgdGhlbSBhcyBhIG1pc2xlYWRpbmcgXCJVbmV4cGVjdGVkIGVuZCBvZiBKU09OIGlucHV0XCJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fSR7cmVzcG9uc2VCb2R5ID8gYCBcdTIwMTQgJHtyZXNwb25zZUJvZHkuc2xpY2UoMCwgMzAwKX1gIDogJyAoZW1wdHkgYm9keSknfWApXG4gICAgICAgIH1cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbJHtraW5kfV0gU3VjY2VzcyByZXNwb25zZTogJHtyZXNwb25zZUJvZHl9YClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFske2tpbmR9XSBFWENFUFRJT04gSU4gJHtraW5kfSBSRVFVRVNUIFRPIFRFU1QgUkVQT1JUSU5HIEFORCBBTkFMWVRJQ1MgOiAke2Vycm9yfWApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhjZXB0aW9uIGluIHJlcXVlc3QgJyArIGVycm9yKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2VydmFiaWxpdHlVc2VyKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUVcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zICYmIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXJcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy51c2VyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FDQ0VTU19LRVkpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BQ0NFU1NfS0VZXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5rZXkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmtleVxuICAgIH1cbiAgICByZXR1cm4gY29uZmlnLmtleVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eVByb2plY3Qob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBic3RhY2tQcm9qZWN0TmFtZT86IHN0cmluZykge1xuICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfUFJPSkVDVF9OQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfUFJPSkVDVF9OQU1FXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5wcm9qZWN0TmFtZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMucHJvamVjdE5hbWVcbiAgICB9XG4gICAgcmV0dXJuIGJzdGFja1Byb2plY3ROYW1lXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5QnVpbGQob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBic3RhY2tCdWlsZE5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX05BTUUpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LlRFU1RfT0JTRVJWQUJJTElUWV9CVUlMRF9OQU1FXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkTmFtZVxuICAgIH1cbiAgICByZXR1cm4gYnN0YWNrQnVpbGROYW1lIHx8IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGJzdGFja0J1aWxkVGFnPzogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHLnNwbGl0KCcsJylcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zICYmIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkVGFnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZFRhZ1xuICAgIH1cbiAgICBpZiAoYnN0YWNrQnVpbGRUYWcpIHtcbiAgICAgICAgcmV0dXJuIFtic3RhY2tCdWlsZFRhZ11cbiAgICB9XG4gICAgcmV0dXJuIFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXN0UGxhbklkKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUX1BMQU5fSURdKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVF9QTEFOX0lEXVxuICAgIH1cbiAgICBjb25zdCBDTElfQVJHID0gJy0tYnJvd3NlcnN0YWNrLnRlc3RNYW5hZ2VtZW50T3B0aW9ucy50ZXN0UGxhbklkJ1xuICAgIGNvbnN0IGFyZ0luZGV4ID0gcHJvY2Vzcy5hcmd2LmluZGV4T2YoQ0xJX0FSRylcbiAgICBpZiAoYXJnSW5kZXggIT09IC0xICYmIHByb2Nlc3MuYXJndlthcmdJbmRleCArIDFdKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmFyZ3ZbYXJnSW5kZXggKyAxXVxuICAgIH1cbiAgICBjb25zdCBhcmdXaXRoRXF1YWxzID0gcHJvY2Vzcy5hcmd2LmZpbmQoKGFyZykgPT4gYXJnLnN0YXJ0c1dpdGgoYCR7Q0xJX0FSR309YCkpXG4gICAgaWYgKGFyZ1dpdGhFcXVhbHMpIHtcbiAgICAgICAgcmV0dXJuIGFyZ1dpdGhFcXVhbHMuc3BsaXQoJz0nKVsxXVxuICAgIH1cbiAgICBjb25zdCB0ZXN0UGxhbklkID0gb3B0aW9ucy50ZXN0TWFuYWdlbWVudE9wdGlvbnM/LnRlc3RQbGFuSWRcbiAgICBpZiAodHlwZW9mIHRlc3RQbGFuSWQgPT09ICdzdHJpbmcnICYmIHRlc3RQbGFuSWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRlc3RQbGFuSWQudHJpbSgpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja1VzZXIoY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUUgYXMgc3RyaW5nXG4gICAgfVxuICAgIHJldHVybiBjb25maWcudXNlciBhcyBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja0tleShjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgIGlmIChwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQUNDRVNTX0tFWSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FDQ0VTU19LRVlcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy5rZXlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlOiB1bmtub3duKSB7XG4gICAgbGV0IHJlcyA9ICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlcyA9IHJlcyB8fCB2YWx1ZSA9PT0gJydcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUcnVlKHZhbHVlPzogdW5rbm93bikge1xuICAgIHJldHVybiAodmFsdWUgKyAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZhbHNlKHZhbHVlPzogdW5rbm93bikge1xuICAgIHJldHVybiAodmFsdWUgKyAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJhbWV3b3JrU3VwcG9ydHNIb29rKGhvb2s6IHN0cmluZywgZnJhbWV3b3JrPzogc3RyaW5nKSB7XG4gICAgaWYgKGZyYW1ld29yayA9PT0gJ21vY2hhJyAmJiAoaG9vayA9PT0gJ2JlZm9yZScgfHwgaG9vayA9PT0gJ2FmdGVyJyB8fCBob29rID09PSAnYmVmb3JlRWFjaCcgfHwgaG9vayA9PT0gJ2FmdGVyRWFjaCcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKGZyYW1ld29yayA9PT0gJ2N1Y3VtYmVyJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgcGF0Y2hDb25zb2xlTG9ncyA9IG8xMXlFcnJvckhhbmRsZXIoKCkgPT4ge1xuICAgIGNvbnN0IEJTVGVzdE9wc1BhdGNoZXIgPSBuZXcgbG9nUGF0Y2hlcih7fSlcblxuICAgIE9iamVjdC5rZXlzKGNvbnNvbGVIb2xkZXIpLmZvckVhY2goKG1ldGhvZDoga2V5b2YgdHlwZW9mIGNvbnNvbGUpID0+IHtcbiAgICAgICAgaWYgKCEobWV0aG9kIGluIGNvbnNvbGUpIHx8IG1ldGhvZCA9PT0gJ0NvbnNvbGUnIHx8IHR5cGVvZiBjb25zb2xlW21ldGhvZF0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgU2tpcHBpbmcgbWV0aG9kOiAke21ldGhvZH0sIGV4aXN0czogJHttZXRob2QgaW4gY29uc29sZX0sIHR5cGU6ICR7dHlwZW9mIGNvbnNvbGVbbWV0aG9kXX1gKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JpZ01ldGhvZDogRnVuY3Rpb24gPSBjb25zb2xlW21ldGhvZF0uYmluZChjb25zb2xlKVxuXG4gICAgICAgIGNvbnNvbGVbbWV0aG9kXSA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhCU1Rlc3RPcHNQYXRjaGVyKS5pbmNsdWRlcyhtZXRob2QpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdNZXRob2QoLi4uYXJncylcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcmlnTWV0aG9kKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAoQlNUZXN0T3BzUGF0Y2hlciBhcyBhbnkpW21ldGhvZF0oLi4uYXJncylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3Igd2hpbGUgcGF0Y2hpbmcgY29uc29sZSBsb2dzIDogJHtlcnJvcn1gKVxuICAgICAgICAgICAgICAgIG9yaWdNZXRob2QoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG59KVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmFpbHVyZU9iamVjdChlcnJvcjogc3RyaW5nfEVycm9yKSB7XG4gICAgY29uc3Qgc3RhY2sgPSAoZXJyb3IgYXMgRXJyb3IpLnN0YWNrXG4gICAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycgPyBlcnJvciA6IGVycm9yLm1lc3NhZ2VcbiAgICBjb25zdCBiYWNrdHJhY2UgPSBzdGFjayA/IHJlbW92ZUFuc2lDb2xvcnMoc3RhY2sudG9TdHJpbmcoKSkgOiAnJ1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmFpbHVyZTogW3sgYmFja3RyYWNlOiBbYmFja3RyYWNlXSB9XSxcbiAgICAgICAgZmFpbHVyZV9yZWFzb246IHJlbW92ZUFuc2lDb2xvcnMobWVzc2FnZS50b1N0cmluZygpKSxcbiAgICAgICAgZmFpbHVyZV90eXBlOiBtZXNzYWdlID8gKG1lc3NhZ2UudG9TdHJpbmcoKS5tYXRjaCgvQXNzZXJ0aW9uRXJyb3IvKSA/ICdBc3NlcnRpb25FcnJvcicgOiAnVW5oYW5kbGVkRXJyb3InKSA6IG51bGxcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBzbGVlcCA9IChtcyA9IDEwMCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBsb2FkTG9ncyh1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQsIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjbGllbnRCdWlsZFV1aWQ6IHN0cmluZykge1xuICAgIC8vIE1hbnVhbCBpbnN0cnVtZW50YXRpb246IHRhZyBldmVyeSByZXR1cm4gcGF0aCBvbiB0aGUgU0RLX1VQTE9BRF9MT0dTIGV2ZW50IHNvXG4gICAgLy8gdGhlIG1ldHJpYyBpZGVudGlmaWVzIHRoZSBzcGVjaWZpYyByZWFzb24gbG9ncyB3ZXJlIG5vdCB1cGxvYWRlZCAobm8gY3JlZHMsXG4gICAgLy8gcGVyLWZpbGUgY29weSBmYWlsdXJlLCB1cGxvYWQgbm8tcmVzcG9uc2UsIGV4Y2VwdGlvbikuIG1lYXN1cmVXcmFwcGVyIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIG1hcmsgYWxsIG5vbi10aHJvd2luZyBwYXRocyBhcyBzdWNjZXNzLlxuICAgIGNvbnN0IGV2ZW50TmFtZSA9IFBFUkZPUk1BTkNFX1NES19FVkVOVFMuRVZFTlRTLlNES19VUExPQURfTE9HU1xuICAgIGxldCBzdWNjZXNzID0gdHJ1ZVxuICAgIGxldCBmYWlsdXJlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChldmVudE5hbWUpXG5cbiAgICB0cnkge1xuICAgICAgICBpZiAoIXVzZXIgfHwgIWtleSkge1xuICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICAgICAgICBmYWlsdXJlID0gJ3NraXBwZWQ6IG1pc3NpbmdfY3JlZGVudGlhbHMnXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1VwbG9hZGluZyBsb2dzIGZhaWxlZCBkdWUgdG8gbm8gY3JlZGVudGlhbHMnKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0bXBEaXIgPSB0bXBkaXIoKVxuICAgICAgICBjb25zdCB0YXJQYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ2xvZ3MudGFyJylcbiAgICAgICAgY29uc3QgdGFyR3pQYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ2xvZ3MudGFyLmd6JylcblxuICAgICAgICBjb25zdCBmaWxlc1RvQXJjaGl2ZSA9IFtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5sb2dGaWxlUGF0aCxcbiAgICAgICAgICAgIENMSV9ERUJVR19MT0dTX0ZJTEUsXG4gICAgICAgIF0uZmlsdGVyKGYgPT4gZnMuZXhpc3RzU3luYyhmKSlcblxuICAgICAgICBjb25zdCBjb3BpZWRGaWxlTmFtZXM6IHN0cmluZ1tdID0gW11cbiAgICAgICAgY29uc3QgYXJjaGl2ZUFkZEZhaWx1cmVzOiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWxlc1RvQXJjaGl2ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXN0ID0gcGF0aC5qb2luKHRtcERpciwgcGF0aC5iYXNlbmFtZShmKSlcbiAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoZiwgZGVzdClcbiAgICAgICAgICAgICAgICBjb3BpZWRGaWxlTmFtZXMucHVzaChwYXRoLmJhc2VuYW1lKGYpKVxuICAgICAgICAgICAgfSBjYXRjaCAoY29weUVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IChjb3B5RXJyIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBTdHJpbmcoY29weUVycilcbiAgICAgICAgICAgICAgICBhcmNoaXZlQWRkRmFpbHVyZXMucHVzaChgJHtwYXRoLmJhc2VuYW1lKGYpfTogJHttc2d9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmNoaXZlQWRkRmFpbHVyZXMubGVuZ3RoID4gMCAmJiBmYWlsdXJlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9IGBhcmNoaXZlX2FkZF9mYWlsZWQgWyR7YXJjaGl2ZUFkZEZhaWx1cmVzLmxlbmd0aH1dOiAke2FyY2hpdmVBZGRGYWlsdXJlcy5qb2luKCc7ICcpfWAuc3Vic3RyaW5nKDAsIDMwMClcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGNyZWF0ZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmaWxlOiB0YXJQYXRoLFxuICAgICAgICAgICAgICAgIGN3ZDogdG1wRGlyLFxuICAgICAgICAgICAgICAgIHBvcnRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIG5vRGlyUmVjdXJzZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcGllZEZpbGVOYW1lc1xuICAgICAgICApXG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0YXJQYXRoKVxuICAgICAgICAgICAgY29uc3QgZGVzdCA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRhckd6UGF0aClcbiAgICAgICAgICAgIGNvbnN0IGd6aXAgPSB6bGliLmNyZWF0ZUd6aXAoeyBsZXZlbDogMSB9KVxuXG4gICAgICAgICAgICBzb3VyY2UucGlwZShnemlwKS5waXBlKGRlc3QpXG4gICAgICAgICAgICBkZXN0Lm9uKCdmaW5pc2gnLCByZXNvbHZlKVxuICAgICAgICAgICAgZGVzdC5vbignZXJyb3InLCByZWplY3QpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICAvLyBvcGVuQXNCbG9iIChOb2RlID49MjApIHJldHVybnMgYSBCbG9iIGJhY2tlZCBieSBhIGZpbGUgZGVzY3JpcHRvciBcdTIwMTQgdW5kaWNpXG4gICAgICAgIC8vIHN0cmVhbXMgZnJvbSBkaXNrIGR1cmluZyB0aGUgdXBsb2FkIGluc3RlYWQgb2YgbWF0ZXJpYWxpc2luZyB0aGUgZnVsbCBhcmNoaXZlXG4gICAgICAgIC8vIGluIFY4IGhlYXAgKHdoaWNoIHJlYWRGaWxlU3luYyArIG5ldyBCbG9iKFtCdWZmZXJdKSB3b3VsZCBkbyB0d2ljZSkuXG4gICAgICAgIC8vIE5vZGUgMTguMjAgKHN0aWxsIHN1cHBvcnRlZCBwZXIgYGVuZ2luZXNgKSBsYWNrcyBmcy5vcGVuQXNCbG9iLCBzbyBmYWxsIGJhY2tcbiAgICAgICAgLy8gdG8gcmVhZGluZyB0aGUgKHNtYWxsKSBsb2cgYXJjaGl2ZSBpbnRvIGEgQmxvYiB0aGVyZS5cbiAgICAgICAgY29uc3QgZmlsZSA9IHR5cGVvZiBmcy5vcGVuQXNCbG9iID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGF3YWl0IGZzLm9wZW5Bc0Jsb2IodGFyR3pQYXRoLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi94LWd6aXAnIH0pXG4gICAgICAgICAgICA6IG5ldyBCbG9iKFtmcy5yZWFkRmlsZVN5bmModGFyR3pQYXRoKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3gtZ3ppcCcgfSlcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdkYXRhJywgZmlsZSwgJ2xvZ3MudGFyLmd6JylcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdjbGllbnRCdWlsZFV1aWQnLCBjbGllbnRCdWlsZFV1aWQpXG5cbiAgICAgICAgY29uc3QgYXV0aCA9IEJ1ZmZlci5mcm9tKGAke3VzZXJ9OiR7a2V5fWApLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgICAgICBib2R5OiBmb3JtRGF0YSBhcyBCb2R5SW5pdCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCYXNpYyAke2F1dGh9YFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBub2RlUmVxdWVzdChcbiAgICAgICAgICAgICdQT1NUJywgVVBMT0FEX0xPR1NfRU5EUE9JTlQsIHJlcXVlc3RPcHRpb25zLCBBUElVdGlscy5VUExPQURfTE9HU19BRERSRVNTXG4gICAgICAgIClcblxuICAgICAgICBmcy51bmxpbmtTeW5jKHRhclBhdGgpXG4gICAgICAgIGZzLnVubGlua1N5bmModGFyR3pQYXRoKVxuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgY29waWVkRmlsZU5hbWVzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0bXBEaXIsIGYpXG4gICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKGZpbGVQYXRoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVsZXRlIHRoZSBTREsgQ0xJIGxvZyBmaWxlIGFmdGVyIHVwbG9hZFxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhDTElfREVCVUdfTE9HU19GSUxFKSkge1xuICAgICAgICAgICAgZnMudW5saW5rU3luYyhDTElfREVCVUdfTE9HU19GSUxFKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gbm9kZVJlcXVlc3Qgc3dhbGxvd3MgZXJyb3JzIGZvciB0aGUgbG9nLXVwbG9hZCBwYXRoIGFuZCByZXR1cm5zIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vIHJlY29yZCB0aGUgc2lsZW50IHVwbG9hZCBmYWlsdXJlIG9uIHRoZSBtZXRyaWMuXG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgICAgIGZhaWx1cmUgPSAndXBsb2FkX25vX3Jlc3BvbnNlJ1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyAmJiByZXNwb25zZS5zdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgLy8gU2VydmVyLXNpZGUgcmVqZWN0aW9uIChlLmcuIFwiRmlsZSBub3QgYXR0YWNoZWRcIikgXHUyMDE0IHJlc3BvbnNlIGlzIHRydXRoeVxuICAgICAgICAgICAgLy8gYnV0IHRoZSB1cGxvYWQgZGlkbid0IGFjdHVhbGx5IGxhbmQuXG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgICAgIGZhaWx1cmUgPSBgdXBsb2FkX3N0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9JHtyZXNwb25zZS5tZXNzYWdlID8gJyAtICcgKyBTdHJpbmcocmVzcG9uc2UubWVzc2FnZSkuc2xpY2UoMCwgMjAwKSA6ICcnfWBcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICBmYWlsdXJlID0gYHVwbG9hZExvZ3MgZXhjZXB0aW9uOiAke2dldEVycm9yU3RyaW5nKGVycm9yKX1gXG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3Igd2hpbGUgdXBsb2FkaW5nIGxvZ3M6ICR7Z2V0RXJyb3JTdHJpbmcoZXJyb3IpfWApXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKGV2ZW50TmFtZSwgc3VjY2VzcywgZmFpbHVyZSlcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBpc09iamVjdCA9IChvYmplY3Q6IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gb2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9iamVjdClcbn1cblxuZXhwb3J0IGNvbnN0IE9iamVjdHNBcmVFcXVhbCA9IChvYmplY3QxOiBvYmplY3QsIG9iamVjdDI6IG9iamVjdCkgPT4ge1xuICAgIGNvbnN0IG9iamVjdEtleXMxID0gT2JqZWN0LmtleXMob2JqZWN0MSlcbiAgICBjb25zdCBvYmplY3RLZXlzMiA9IE9iamVjdC5rZXlzKG9iamVjdDIpXG4gICAgaWYgKG9iamVjdEtleXMxLmxlbmd0aCAhPT0gb2JqZWN0S2V5czIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBvYmplY3RLZXlzMSkge1xuICAgICAgICBjb25zdCB2YWx1ZTEgPSBvYmplY3QxW2tleSBhcyBrZXlvZiB0eXBlb2Ygb2JqZWN0MV1cbiAgICAgICAgY29uc3QgdmFsdWUyID0gb2JqZWN0MltrZXkgYXMga2V5b2YgdHlwZW9mIG9iamVjdDFdXG4gICAgICAgIGNvbnN0IGlzQm90aEFyZU9iamVjdHMgPSBpc09iamVjdCh2YWx1ZTEpICYmIGlzT2JqZWN0KHZhbHVlMilcbiAgICAgICAgaWYgKChpc0JvdGhBcmVPYmplY3RzICYmICFPYmplY3RzQXJlRXF1YWwodmFsdWUxLCB2YWx1ZTIpKSB8fCAoIWlzQm90aEFyZU9iamVjdHMgJiYgdmFsdWUxICE9PSB2YWx1ZTIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1WZXJzaW9uID0gbzExeUVycm9ySGFuZGxlcihmdW5jdGlvbiBnZXRQbGF0Zm9ybVZlcnNpb24oY2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzLCB1c2VyQ2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKSB7XG4gICAgaWYgKCFjYXBzICYmICF1c2VyQ2Fwcykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgYnN0YWNrT3B0aW9ucyA9ICh1c2VyQ2Fwcyk/LlsnYnN0YWNrOm9wdGlvbnMnXVxuICAgIGNvbnN0IGtleXMgPSBbJ3BsYXRmb3JtVmVyc2lvbicsICdwbGF0Zm9ybV92ZXJzaW9uJywgJ29zVmVyc2lvbicsICdvc192ZXJzaW9uJ11cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKGNhcHM/LltrZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBHb3QgJHtrZXl9IGZyb20gZHJpdmVyIGNhcHNgKVxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhjYXBzPy5ba2V5IGFzIGtleW9mIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc10pXG4gICAgICAgIH0gZWxzZSBpZiAoYnN0YWNrT3B0aW9ucyAmJiBic3RhY2tPcHRpb25zPy5ba2V5IGFzIGtleW9mIENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXNdKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEdvdCAke2tleX0gZnJvbSB1c2VyIGJzdGFjayBvcHRpb25zYClcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoYnN0YWNrT3B0aW9ucz8uW2tleSBhcyBrZXlvZiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzXSlcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyQ2Fwc1trZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBHb3QgJHtrZXl9IGZyb20gdXNlciBjYXBzYClcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodXNlckNhcHNba2V5IGFzIGtleW9mIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc10pXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufSlcblxuLyoqXG4gKiBSZXNvbHZlIGEgc3RhYmxlLCBodW1hbi1yZWFkYWJsZSBkZXZpY2UgaWRlbnRpZmllciBmb3IgdGhlXG4gKiBgZGV2aWNlYCBmaWVsZCBvbiB0ZXN0X3J1biBpbnRlZ3JhdGlvbnMgcGF5bG9hZHMuXG4gKlxuICogVGVzdEh1YiBkZWR1cGVzIHRlc3RfcnVucyBieSBhIGhhc2ggdGhhdCBpbmNsdWRlcyBgZGV2aWNlYC4gRm9yXG4gKiBBcHAtQXV0b21hdGUgZmxvd3MgdGhhdCBwYXNzIGEgcmVnZXggZGV2aWNlIHJlcXVlc3QgKGUuZy4gYC4qUGl4ZWwuKmApXG4gKiBhY3Jvc3MgbXVsdGlwbGUgcGxhdGZvcm1zLCB0aGUgU0RLIHByZXZpb3VzbHkgc2VudCB0aGUgaW5wdXQgcmVnZXhcbiAqIHN0cmluZywgY2F1c2luZyB0d28gcGFyYWxsZWwgc2Vzc2lvbnMgb24gcGh5c2ljYWxseSBkaWZmZXJlbnQgZGV2aWNlc1xuICogdG8gY29sbGlkZSBvbiB0aGUgaGFzaCBhbmQgbWVyZ2UuIFRoaXMgaGVscGVyIHByZWZlcnMgdGhlIEFwcGl1bVxuICogc2VydmVyLXJlc29sdmVkIGZpZWxkcyAoYGRldmljZU1vZGVsYCAvIGBhcHBpdW06ZGV2aWNlTW9kZWxgKSBiZWZvcmVcbiAqIGZhbGxpbmcgYmFjayB0byB0aGUgcmVxdWVzdGVkIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBNdWx0aXJlbW90ZTogYGRyaXZlckNhcHNgIGZvciBhIGBNdWx0aVJlbW90ZUJyb3dzZXJgIGlzIGEgbWFwIG9mXG4gKiBge2luc3RhbmNlTmFtZTogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzLCBcdTIwMjZ9YCByYXRoZXIgdGhhbiBmbGF0IGNhcHM7XG4gKiB0aGUgaGVscGVyIGRldGVjdHMgdGhhdCBzaGFwZSBhbmQgd2Fsa3MgZWFjaCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gZHJpdmVyQ2FwcyAtIGxpdmUgZHJpdmVyIGNhcGFiaWxpdGllcyAoYGJyb3dzZXIuY2FwYWJpbGl0aWVzYClcbiAqICAgICAgICAgICAgICAgICAgICAgd2hlcmUgQXBwaXVtIHNlcnZlci1yZXNvbHZlZCBmaWVsZHMgYXJlIHBvcHVsYXRlZFxuICogQHBhcmFtIHJlcXVlc3RlZENhcHMgLSB1c2VyLXJlcXVlc3RlZCBjYXBhYmlsaXRpZXMgKHJ1bm5lciBjYXBzIC8geW1sKVxuICogICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGFzIGEgZmFsbGJhY2tcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJlc29sdmVkRGV2aWNlTmFtZSA9IG8xMXlFcnJvckhhbmRsZXIoZnVuY3Rpb24gZ2V0UmVzb2x2ZWREZXZpY2VOYW1lKFxuICAgIGRyaXZlckNhcHM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfCBSZWNvcmQ8c3RyaW5nLCB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9PixcbiAgICByZXF1ZXN0ZWRDYXBzPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIHwgUmVjb3JkPHN0cmluZywgeyBjYXBhYmlsaXRpZXM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfT4sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZsYXR0ZW5NdWx0aXJlbW90ZSA9IChcbiAgICAgICAgY2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIHwgUmVjb3JkPHN0cmluZywgeyBjYXBhYmlsaXRpZXM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfT4gfCB1bmRlZmluZWQsXG4gICAgKTogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzW10gPT4ge1xuICAgICAgICBpZiAoIWNhcHMpIHtyZXR1cm4gW119XG4gICAgICAgIGNvbnN0IG9iaiA9IGNhcHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgaWYgKG9iai5kZXZpY2VNb2RlbCB8fCBvYmpbJ2FwcGl1bTpkZXZpY2VNb2RlbCddIHx8IG9iai5kZXZpY2VOYW1lIHx8IG9ialsnYnN0YWNrOm9wdGlvbnMnXSkge1xuICAgICAgICAgICAgLy8gbG9va3MgbGlrZSBmbGF0IGNhcHNcbiAgICAgICAgICAgIHJldHVybiBbY2FwcyBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNdXG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9va3MgbGlrZSBhIG11bHRpcmVtb3RlIG1hcDoge2luc3RhbmNlTmFtZToge2NhcGFiaWxpdGllczogey4uLn19fVxuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhvYmopXG4gICAgICAgICAgICAuZmlsdGVyKCh2KTogdiBpcyB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9ID0+XG4gICAgICAgICAgICAgICAgdiAhPT0gbnVsbCAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgJ2NhcGFiaWxpdGllcycgaW4gKHYgYXMgb2JqZWN0KSlcbiAgICAgICAgICAgIC5tYXAodiA9PiB2LmNhcGFiaWxpdGllcyBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzW10gPSBbXG4gICAgICAgIC4uLmZsYXR0ZW5NdWx0aXJlbW90ZShkcml2ZXJDYXBzKSxcbiAgICAgICAgLi4uZmxhdHRlbk11bHRpcmVtb3RlKHJlcXVlc3RlZENhcHMpLFxuICAgIF1cbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7cmV0dXJuIHVuZGVmaW5lZH1cblxuICAgIGNvbnN0IHBpY2tTdHJpbmcgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICBjb25zdCB2ID0gb2JqPy5ba2V5XVxuICAgICAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoID4gMCA/IHYgOiB1bmRlZmluZWRcbiAgICB9XG4gICAgLy8gUHJlY2VkZW5jZTogcHJlZmVyIEFwcGl1bSBzZXJ2ZXItcmVzb2x2ZWQgZGV2aWNlTW9kZWw7IGZhbGwgYmFjayB0aHJvdWdoXG4gICAgLy8gcmVxdWVzdGVkIGNhcCB2YXJpYW50cy4gYGJzdGFjazpvcHRpb25zLmRldmljZU5hbWVgIGlzIHRoZSB1c2VyJ3MgcmVnZXhcbiAgICAvLyBmb3IgQXBwLUF1dG9tYXRlIHJ1bnMsIGtlcHQgYXMgYSBmYWxsYmFjayBmb3IgdGhlIG5vbi1yZXNvbHZlZCBjYXNlLlxuICAgIGNvbnN0IHBhdGhzOiBBcnJheTwoYzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHN0cmluZyB8IHVuZGVmaW5lZD4gPSBbXG4gICAgICAgIGMgPT4gcGlja1N0cmluZyhjLCAnZGV2aWNlTW9kZWwnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdhcHBpdW06ZGV2aWNlTW9kZWwnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGNbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsICdkZXZpY2VOYW1lJyksXG4gICAgICAgIGMgPT4gcGlja1N0cmluZyhjLCAnYXBwaXVtOmRldmljZU5hbWUnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdkZXZpY2VOYW1lJyksXG4gICAgXVxuICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgICBmb3IgKGNvbnN0IHNyYyBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gcGF0aChzcmMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICAgIGlmICh2KSB7cmV0dXJuIHZ9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufSlcblxuZXhwb3J0IGNvbnN0IGdldEJhc2ljQXV0aEhlYWRlciA9ICh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZW5jb2RlZEF1dGggPSBCdWZmZXIuZnJvbShgJHt1c2VybmFtZX06JHtwYXNzd29yZH1gLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIHJldHVybiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gXG59XG5cbmV4cG9ydCBjb25zdCBpc09iamVjdEVtcHR5ID0gKG9iamVjdE5hbWU6IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICBvYmplY3ROYW1lICYmXG4gICAgICAgIE9iamVjdC5rZXlzKG9iamVjdE5hbWUpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICBvYmplY3ROYW1lLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICApXG59XG5cbmV4cG9ydCBjb25zdCBnZXRFcnJvclN0cmluZyA9IChlcnI6IHVua25vd24pID0+IHtcbiAgICBpZiAoIWVycikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gIGVyciAvLyB3b3JrcywgYGVgIG5hcnJvd2VkIHRvIHN0cmluZ1xuICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVyci5tZXNzYWdlIC8vIHdvcmtzLCBgZWAgbmFycm93ZWQgdG8gRXJyb3JcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZVN0cmluZyhmaWVsZDogc3RyaW5nLCB0cnVuY2F0ZVNpemVJbkJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlclNpemVJbkJ5dGVzID0gQnVmZmVyLmZyb20oR0lUX01FVEFfREFUQV9UUlVOQ0FURUQpLmxlbmd0aFxuXG4gICAgICAgIGNvbnN0IGZpZWxkQnVmZmVyT2JqID0gQnVmZmVyLmZyb20oZmllbGQpXG4gICAgICAgIGNvbnN0IGxlbk9mRmllbGRCdWZmZXJPYmogPSBmaWVsZEJ1ZmZlck9iai5sZW5ndGhcbiAgICAgICAgY29uc3QgZmluYWxMZW4gPSBNYXRoLmNlaWwobGVuT2ZGaWVsZEJ1ZmZlck9iaiAtIHRydW5jYXRlU2l6ZUluQnl0ZXMgLSBidWZmZXJTaXplSW5CeXRlcylcbiAgICAgICAgaWYgKGZpbmFsTGVuID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkU3RyaW5nID0gZmllbGRCdWZmZXJPYmouc3ViYXJyYXkoMCwgZmluYWxMZW4pLnRvU3RyaW5nKCkgKyBHSVRfTUVUQV9EQVRBX1RSVU5DQVRFRFxuICAgICAgICAgICAgcmV0dXJuIHRydW5jYXRlZFN0cmluZ1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciB3aGlsZSB0cnVuY2F0aW5nIGZpZWxkLCBub3RoaW5nIHdhcyB0cnVuY2F0ZWQgaGVyZTogJHtlcnJvcn1gKVxuICAgIH1cbiAgICByZXR1cm4gZmllbGRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpemVPZkpzb25PYmplY3RJbkJ5dGVzKGpzb25EYXRhOiBHaXRNZXRhRGF0YSk6IG51bWJlciB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoanNvbkRhdGEpKVxuXG4gICAgICAgIHJldHVybiBidWZmZXIubGVuZ3RoXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTb21ldGhpbmcgd2VudCB3cm9uZyB3aGlsZSBjYWxjdWxhdGluZyBzaXplIG9mIEpTT04gb2JqZWN0OiAke2Vycm9yfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIC0xXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0FuZFRydW5jYXRlVkNTSW5mbyhnaXRNZXRhRGF0YTogR2l0TWV0YURhdGEpOiBHaXRNZXRhRGF0YSB7XG4gICAgY29uc3QgZ2l0TWV0YURhdGFTaXplSW5CeXRlcyA9IGdldFNpemVPZkpzb25PYmplY3RJbkJ5dGVzKGdpdE1ldGFEYXRhKVxuXG4gICAgaWYgKGdpdE1ldGFEYXRhU2l6ZUluQnl0ZXMgJiYgZ2l0TWV0YURhdGFTaXplSW5CeXRlcyA+IE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVMpIHtcbiAgICAgICAgY29uc3QgdHJ1bmNhdGVTaXplID0gZ2l0TWV0YURhdGFTaXplSW5CeXRlcyAtIE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVNcbiAgICAgICAgY29uc3QgdHJ1bmNhdGVkQ29tbWl0TWVzc2FnZSA9IHRydW5jYXRlU3RyaW5nKGdpdE1ldGFEYXRhLmNvbW1pdF9tZXNzYWdlLCB0cnVuY2F0ZVNpemUpXG4gICAgICAgIGdpdE1ldGFEYXRhLmNvbW1pdF9tZXNzYWdlID0gdHJ1bmNhdGVkQ29tbWl0TWVzc2FnZVxuICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgVGhlIGNvbW1pdCBoYXMgYmVlbiB0cnVuY2F0ZWQuIFNpemUgb2YgY29tbWl0IGFmdGVyIHRydW5jYXRpb24gaXMgJHsgZ2V0U2l6ZU9mSnNvbk9iamVjdEluQnl0ZXMoZ2l0TWV0YURhdGEpIC8gMTAyNCB9IEtCYClcbiAgICB9XG5cbiAgICByZXR1cm4gZ2l0TWV0YURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0Jyb3dzZXJOYW1lID0gKGNhcDogQ2FwYWJpbGl0aWVzLldlYmRyaXZlcklPQ29uZmlnKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFjYXAgfHwgIWNhcC5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGJyb3dzZXJTdGFja0NhcGFiaWxpdGllcyA9IGNhcC5jYXBhYmlsaXRpZXMgYXMgQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllc1xuICAgIHJldHVybiBicm93c2VyU3RhY2tDYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgIT09IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgaXNWYWxpZENhcHNGb3JIZWFsaW5nID0gKGNhcHM6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyk6IGJvb2xlYW4gPT4ge1xuXG4gICAgLy8gR2V0IGFsbCBjYXBhYmlsaXR5IHZhbHVlc1xuICAgIGNvbnN0IGNhcFZhbHVlcyA9IE9iamVjdC52YWx1ZXMoY2FwcylcblxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgY2FwYWJpbGl0aWVzIGFuZCBpZiBhdCBsZWFzdCBvbmUgaGFzIGEgYnJvd3NlciBuYW1lXG4gICAgcmV0dXJuIGNhcFZhbHVlcy5sZW5ndGggPiAwICYmIGNhcFZhbHVlcy5zb21lKGhhc0Jyb3dzZXJOYW1lKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUdXJib1NjYWxlKG9wdGlvbnM6IChCcm93c2Vyc3RhY2tDb25maWcgJiBCcm93c2Vyc3RhY2tPcHRpb25zKSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKG9wdGlvbnM/LnR1cmJvU2NhbGUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5UHJvZHVjdChvcHRpb25zOiAoQnJvd3NlcnN0YWNrQ29uZmlnICYgQnJvd3NlcnN0YWNrT3B0aW9ucykgfCB1bmRlZmluZWQsIGlzQXBwQXV0b21hdGU6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBpc0FwcEF1dG9tYXRlXG4gICAgICAgID8gJ2FwcC1hdXRvbWF0ZSdcbiAgICAgICAgOiAoaXNUdXJib1NjYWxlKG9wdGlvbnMpID8gJ3R1cmJvc2NhbGUnIDogJ2F1dG9tYXRlJylcbn1cblxudHlwZSBQb2xsaW5nUmVzdWx0ID0ge1xuICAgIGRhdGE6IGFueTtcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7IC8vIE9wdGlvbmFsIG1lc3NhZ2UgZm9yIHRpbWVvdXQgY2FzZXNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBvbGxBcGkoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgdXBwZXJMaW1pdDogbnVtYmVyLFxuICAgIHN0YXJ0VGltZSA9IERhdGUubm93KClcbik6IFByb21pc2U8UG9sbGluZ1Jlc3VsdD4ge1xuICAgIHBhcmFtcy50aW1lc3RhbXAgPSBNYXRoLnJvdW5kKERhdGUubm93KCkgLyAxMDAwKVxuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgY3VycmVudCB0aW1lc3RhbXAgJHtwYXJhbXMudGltZXN0YW1wfWApXG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2VHZXRSZXF1ZXN0KHVybCwgcGFyYW1zLCBoZWFkZXJzKVxuICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICBtZXNzYWdlOiAnUG9sbGluZyBzdWNjZWVkZWQuJyxcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlICYmIGVycm9yLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0UG9sbFRpbWUgPSBwYXJzZUludChlcnJvci5yZXNwb25zZS5oZWFkZXJzLmdldCgnbmV4dF9wb2xsX3RpbWUnKSwgMTApICogMTAwMFxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGB0aW1lSW5NaWxsaXMgJHtuZXh0UG9sbFRpbWV9YClcblxuICAgICAgICAgICAgaWYgKGlzTmFOKG5leHRQb2xsVGltZSkpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignSW52YWxpZCBvciBtaXNzaW5nIGBuZXh0UG9sbFRpbWVgIGhlYWRlci4gU3RvcHBpbmcgcG9sbGluZy4nKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBlcnJvci5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBuZXh0UG9sbFRpbWUgaGVhZGVyIHZhbHVlLiBQb2xsaW5nIHN0b3BwZWQuJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gbmV4dFBvbGxUaW1lIC0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBlbGFwc2VkVGltZSAke2VsYXBzZWRUaW1lfSB0aW1lSW5NaWxsaXMgJHtuZXh0UG9sbFRpbWV9IHVwcGVyTGltaXQgJHt1cHBlckxpbWl0fWBcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKG5leHRQb2xsVGltZSA+IHVwcGVyTGltaXQpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignUG9sbGluZyBzdG9wcGVkIGR1ZSB0byB1cHBlciB0aW1lIGxpbWl0LicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGVycm9yLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQb2xsaW5nIHN0b3BwZWQgZHVlIHRvIHVwcGVyIHRpbWUgbGltaXQuJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgUG9sbGluZyBhZ2FpbiBpbiAke2VsYXBzZWRUaW1lfW1zIHdpdGggcGFyYW1zOmAsIHBhcmFtcylcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGVsYXBzZWRUaW1lKSlcbiAgICAgICAgICAgIHJldHVybiBwb2xsQXBpKHVybCwgcGFyYW1zLCBoZWFkZXJzLCB1cHBlckxpbWl0LCBzdGFydFRpbWUpXG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBlcnJvci5yZXNwb25zZS5zdGF0dXNUZXh0XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEVycm9yID0gSlNPTi5wYXJzZShlcnJvci5yZXNwb25zZS5qc29uKCkpXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gcGFyc2VkRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBwYXJzaW5nIHBvbGxBcGkgcmVxdWVzdCBib2R5ICR7ZXJyb3IucmVzcG9uc2UuYm9keX1gKVxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICdVbmtub3duIGVycm9yJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZDogJHtlcnJvcn1gKVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YToge30sIGhlYWRlcnM6IHt9LCBtZXNzYWdlOiAnVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZC4nIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFrZUdldFJlcXVlc3QodXJsOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiwgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybClcbiAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGtleSkgPT4gdXJsT2JqLnNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBwYXJhbXNba2V5XSkpXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybE9iai50b1N0cmluZygpLCB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgfSlcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgZmFpbGVkJylcbiAgICAgICAgZXJyb3IucmVzcG9uc2UgPSByZXNwb25zZVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjY2Vzc2liaWxpdHlTY3JpcHQ8UmV0dXJuVHlwZT4oXG4gICAgYnJvd3NlcjogYW55LFxuICAgIGZuQm9keTogc3RyaW5nLFxuICAgIGFyZz86IHVua25vd25cbik6IFByb21pc2U8UmV0dXJuVHlwZT4ge1xuICAgIHJldHVybiBicm93c2VyLmV4ZWN1dGUoXG4gICAgICAgIGByZXR1cm4gKGZ1bmN0aW9uICguLi5ic3RhY2tTZGtBcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBic3RhY2tTZGtBcmdzWzBdO1xuICAgICAgICAgICAgICAgIGJzdGFja1Nka0FyZ3MucHVzaChyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICAke2ZuQm9keS5yZXBsYWNlKC9hcmd1bWVudHMvZywgJ2JzdGFja1Nka0FyZ3MnKX1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSgke2FyZyA/IEpTT04uc3RyaW5naWZ5KGFyZykgOiAnJ30pYFxuICAgIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSGFzaENvZGVGcm9tRmllbGRzKGZpZWxkczogQXJyYXk8c3RyaW5nIHwgb2JqZWN0Pikge1xuICAgIGNvbnN0IHNlcmlhbGl6ZSA9ICh2YWx1ZToge30pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBmaWVsZHMubWFwKHNlcmlhbGl6ZSkuam9pbignfCcpXG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoc2VyaWFsaXplZCkuZGlnZXN0KCdoZXgnKVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEJvb2xlYW5WYWx1ZUZyb21TdHJpbmcodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiBbJ3RydWUnXS5pbmNsdWRlcyh2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKSlcbn1cblxuLyoqXG4gKiBTREstMzczNzogQ29lcmNlIHN0cmluZ2lmaWVkIGJvb2xlYW5zICgndHJ1ZScvJ2ZhbHNlJywgYW55IGNhc2UpIGluIGEgZmxhdFxuICogb3B0aW9ucyBvYmplY3QgdG8gcmVhbCBib29sZWFucywgbGVhdmluZyBldmVyeSBvdGhlciB2YWx1ZSB1bnRvdWNoZWQuIEJvb2xlYW4tXG4gKiB0eXBlZCBhY2Nlc3NpYmlsaXR5IG9wdGlvbnMgKGUuZy4gYXV0b1NjYW5uaW5nKSBhcmUgY29tbW9ubHkgc3VwcGxpZWQgYXNcbiAqIHN0cmluZ3MgZnJvbSBKUyBjb25maWcgLyBlbnY7IHdpdGhvdXQgY29lcmNpb24gdGhleSBmYWlsIFczQyBjYXBzIHZhbGlkYXRpb25cbiAqIGFuZCBhcmUgc2lsZW50bHkgZHJvcHBlZC4gT25seSB0aGUgZXhhY3Qgc3RyaW5ncyAndHJ1ZScvJ2ZhbHNlJyBhcmUgY29udmVydGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29lcmNlU3RyaW5nQm9vbGVhbnM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9ialxuICAgIH1cbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpc2VkID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIGlmIChub3JtYWxpc2VkID09PSAndHJ1ZScgfHwgbm9ybWFsaXNlZCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgIG91dFtrZXldID0gbm9ybWFsaXNlZCA9PT0gJ3RydWUnXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXRba2V5XSA9IHZhbHVlXG4gICAgfVxuICAgIHJldHVybiBvdXQgYXMgVFxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGtleSBpcyBzYWZlIHRvIHVzZSBmb3Igb2JqZWN0IHByb3BlcnR5IGFzc2lnbm1lbnQgdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IGlzIHNhZmUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5mdW5jdGlvbiBpc1NhZmVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYW5nZXJvdXNLZXlzID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ11cbiAgICByZXR1cm4gIWRhbmdlcm91c0tleXMuaW5jbHVkZXMoa2V5KVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGJvb2xlYW4gdmFsdWUgZnJvbSBtaXhlZCB0eXBlcyAoYm9vbGVhbiBvciBzdHJpbmcpXG4gKiBPbmx5IGFjY2VwdHMgdHJ1ZSBib29sZWFuIG9yIHN0cmluZyBcInRydWVcIiAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRFbmFibGVkVmFsdWUodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblZhbHVlRnJvbVN0cmluZyh2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXAodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5zb3VyY2VzOiBhbnlbXSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGlmICghc291cmNlcy5sZW5ndGgpIHtyZXR1cm4gdGFyZ2V0fVxuICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKVxuXG4gICAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIFNraXAgZGFuZ2Vyb3VzIGtleXMgdGhhdCBjb3VsZCBsZWFkIHRvIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICAgICAgICAgIGlmICghaXNTYWZlS2V5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHRhcmdldFtrZXldXG5cbiAgICAgICAgICAgIGlmIChpc09iamVjdChzb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFZhbHVlIHx8ICFpc09iamVjdCh0YXJnZXRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVZhbHVlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ2hyb21lT3B0aW9ucyhiYXNlOiBDYXBhYmlsaXRpZXMuQ2hyb21lT3B0aW9ucywgb3ZlcnJpZGU6IFBhcnRpYWw8Q2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnM+KTogQ2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnMge1xuICAgIGNvbnN0IG1lcmdlZDogQ2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnMgPSB7IC4uLmJhc2UgfVxuXG4gICAgaWYgKG92ZXJyaWRlLmFyZ3MpIHtcbiAgICAgICAgbWVyZ2VkLmFyZ3MgPSBbLi4uKGJhc2UuYXJncyB8fCBbXSksIC4uLm92ZXJyaWRlLmFyZ3NdXG4gICAgfVxuXG4gICAgaWYgKG92ZXJyaWRlLmV4dGVuc2lvbnMpIHtcbiAgICAgICAgbWVyZ2VkLmV4dGVuc2lvbnMgPSBbLi4uKGJhc2UuZXh0ZW5zaW9ucyB8fCBbXSksIC4uLm92ZXJyaWRlLmV4dGVuc2lvbnNdXG4gICAgfVxuXG4gICAgaWYgKG92ZXJyaWRlLnByZWZzKSB7XG4gICAgICAgIG1lcmdlZC5wcmVmcyA9IG1lcmdlRGVlcCh7IC4uLihiYXNlLnByZWZzIHx8IHt9KSB9LCBvdmVycmlkZS5wcmVmcylcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsT3JFbXB0eShzdHJpbmc6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhc3RyaW5nIHx8IHN0cmluZy50cmltKCkgPT09ICcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hhc2goZW50aXR5OiBhbnkpIHtcbiAgICByZXR1cm4gQm9vbGVhbihlbnRpdHkgJiYgdHlwZW9mKGVudGl0eSkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGVudGl0eSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXN0ZWRLZXlWYWx1ZShoYXNoOiBhbnksIGtleXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICByZXR1cm4ga2V5cy5yZWR1Y2UoKGhhc2gsIGtleSkgPT4gKGlzSGFzaChoYXNoKSA/IGhhc2hba2V5XSA6IHVuZGVmaW5lZCksIGhhc2gpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBsaXN0ID0gZnMucmVhZGRpclN5bmMoZGlyKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihkaXIsIGxpc3RbaV0pXG4gICAgICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmaWxlbmFtZSlcblxuICAgICAgICBpZiAoZmlsZW5hbWUgPT09ICcuJyB8fCBmaWxlbmFtZSA9PT0gJy4uJykge1xuICAgICAgICAgICAgLy8gcGFzcyB0aGVzZSBmaWxlc1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgLy8gcm1kaXIgcmVjdXJzaXZlbHlcbiAgICAgICAgICAgIHJlbW92ZURpcihmaWxlbmFtZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJtIGZpbGVuYW1lXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKGZpbGVuYW1lKVxuICAgICAgICB9XG4gICAgfVxuICAgIGZzLnJtZGlyU3luYyhkaXIpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXIpKXtcbiAgICAgICAgcmVtb3ZlRGlyKGRpcilcbiAgICB9XG4gICAgZnMubWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV3JpdGFibGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgICAgZnMuYWNjZXNzU3luYyhkaXJQYXRoLCBmcy5jb25zdGFudHMuV19PSylcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVhZFdyaXRlQWNjZXNzKGRpclBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGZzLmNobW9kU3luYyhkaXJQYXRoLCAwbzY2NilcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBEaXJlY3RvcnkgJHtkaXJQYXRofSBpcyBub3cgcmVhZC93cml0ZSBhY2Nlc3NpYmxlLmApXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gc2V0IGRpcmVjdG9yeSBhY2Nlc3M6ICR7ZXJyLnN0YWNrfWApXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9jaGFUZXN0SGllcmFyY2h5KHRlc3Q6IEZyYW1ld29ya3MuVGVzdCkge1xuICAgIGNvbnN0IHZhbHVlOiBzdHJpbmdbXSA9IFtdXG4gICAgaWYgKHRlc3QuY3R4ICYmIHRlc3QuY3R4LnRlc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBwYXJlbnQgb2JqZWN0LCB1dGlsaXplIGl0IGVsc2UgZ2V0IGZyb20gY29udGV4dFxuICAgICAgICBsZXQgcGFyZW50ID0gdHlwZW9mIHRlc3QucGFyZW50ID09PSAnb2JqZWN0JyA/IHRlc3QucGFyZW50IDogdGVzdC5jdHgudGVzdC5wYXJlbnRcbiAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQudGl0bGUgIT09ICcnKSB7XG4gICAgICAgICAgICB2YWx1ZS5wdXNoKHBhcmVudC50aXRsZSlcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGVzdC5kZXNjcmlwdGlvbiAmJiB0ZXN0LmZ1bGxOYW1lKSB7XG4gICAgICAgIC8vIGZvciBKYXNtaW5lXG4gICAgICAgIHZhbHVlLnB1c2godGVzdC5kZXNjcmlwdGlvbilcbiAgICAgICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIFwiIDxkZXNjcmlwdGlvbj5cIiBzdWZmaXggd2l0aG91dCBidWlsZGluZyBhIHJlZ2V4IGZyb21cbiAgICAgICAgLy8gYSB2YXJpYWJsZSAoYXZvaWRzIFJlRG9TIGFuZCByZWdleC1tZXRhY2hhcmFjdGVyIG1pc21hdGNoZXMgaW4gZGVzY3JpcHRpb25zKS5cbiAgICAgICAgY29uc3QgZGVzY1N1ZmZpeCA9IGAgJHt0ZXN0LmRlc2NyaXB0aW9ufWBcbiAgICAgICAgdmFsdWUucHVzaCh0ZXN0LmZ1bGxOYW1lLmVuZHNXaXRoKGRlc2NTdWZmaXgpID8gdGVzdC5mdWxsTmFtZS5zbGljZSgwLCAtZGVzY1N1ZmZpeC5sZW5ndGgpIDogdGVzdC5mdWxsTmFtZSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJldmVyc2UoKVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybU8xMXlTeW5jID0gYXN5bmMgKGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIpID0+IHtcbiAgICBpZiAoaXNCcm93c2Vyc3RhY2tTZXNzaW9uKGJyb3dzZXIpKSB7XG4gICAgICAgIGF3YWl0IGJyb3dzZXIuZXhlY3V0ZShgYnJvd3NlcnN0YWNrX2V4ZWN1dG9yOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2Fubm90YXRlJyxcbiAgICAgICAgICAgIGFyZ3VtZW50czoge1xuICAgICAgICAgICAgICAgIGRhdGE6IGBPYnNlcnZhYmlsaXR5U3luYzoke0RhdGUubm93KCl9YCxcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2RlYnVnJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KX1gKVxuICAgIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGNhcGFiaWxpdGllcyByZXByZXNlbnQgYSBtdWx0aXJlbW90ZSBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gY2FwYWJpbGl0aWVzIC0gVGhlIGNhcGFiaWxpdGllcyB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiBjYXBhYmlsaXRpZXMgcmVwcmVzZW50IGFueSBtdWx0aXJlbW90ZSBjb25maWd1cmF0aW9uIChyZWd1bGFyIG9yIHBhcmFsbGVsKVxuICpcbiAqIEBleGFtcGxlXG4gKiBSZWd1bGFyIG11bHRpcmVtb3RlIChvYmplY3QpOlxuICogeyBicm93c2VyQTogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0sIGJyb3dzZXJCOiB7IGNhcGFiaWxpdGllczogey4uLn0gfSB9XG4gKlxuICogUGFyYWxsZWwgbXVsdGlyZW1vdGUgKGFycmF5IHdpdGggbmVzdGVkIHN0cnVjdHVyZSk6XG4gKiBbeyBicm93c2VyQTogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0sIGJyb3dzZXJCOiB7IGNhcGFiaWxpdGllczogey4uLn0gfSB9XVxuICpcbiAqIFJlZ3VsYXIgY2FwYWJpbGl0aWVzIChhcnJheSk6XG4gKiBbeyBicm93c2VyTmFtZTogJ2Nocm9tZScsIC4uLiB9XVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNdWx0aVJlbW90ZUNhcHMoY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXRpZXMuVGVzdHJ1bm5lckNhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIC8vIFJlZ3VsYXIgbXVsdGlyZW1vdGUgaXMgYW4gb2JqZWN0IChub3QgYXJyYXkpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBFbXB0eSBhcnJheSBpcyBub3QgbXVsdGlyZW1vdGVcbiAgICBpZiAoY2FwYWJpbGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBQYXJhbGxlbCBtdWx0aXJlbW90ZSBpcyBhbiBhcnJheSB3aXRoIG5lc3RlZCBjYXBhYmlsaXRpZXMgc3RydWN0dXJlXG4gICAgcmV0dXJuIGNhcGFiaWxpdGllcy5ldmVyeShjYXAgPT5cbiAgICAgICAgT2JqZWN0LnZhbHVlcyhjYXApLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhjYXApLmV2ZXJ5KGMgPT4gYyAhPT0gbnVsbCAmJiB0eXBlb2YgYyA9PT0gJ29iamVjdCcgJiYgKGMgYXMgeyBjYXBhYmlsaXRpZXM6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9KS5jYXBhYmlsaXRpZXMpXG4gICAgKVxufVxuIiwgImltcG9ydCBUcmFuc3BvcnQgZnJvbSAnd2luc3Rvbi10cmFuc3BvcnQnXG5cbmNvbnN0IExPR19MRVZFTFMgPSB7XG4gICAgSU5GTzogJ0lORk8nLCBFUlJPUjogJ0VSUk9SJywgREVCVUc6ICdERUJVRycsIFRSQUNFOiAnVFJBQ0UnLCBXQVJOOiAnV0FSTicsXG59XG5cbmNsYXNzIGxvZ1BhdGNoZXIgZXh0ZW5kcyBUcmFuc3BvcnQge1xuICAgIGxvZ1RvVGVzdE9wcyA9IChsZXZlbCA9IExPR19MRVZFTFMuSU5GTywgbWVzc2FnZSA9IFsnJ10gYXMgdW5rbm93bltdKSA9PiB7XG4gICAgICAgIChwcm9jZXNzLmVtaXQgYXMgRnVuY3Rpb24pKGBiczphZGRMb2c6JHtwcm9jZXNzLnBpZH1gLCB7XG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbC50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgICAgbWVzc2FnZTogYFwiJHttZXNzYWdlLmpvaW4oJywgJyl9XCJgLFxuICAgICAgICAgICAga2luZDogJ1RFU1RfTE9HJyxcbiAgICAgICAgICAgIGh0dHBfcmVzcG9uc2U6IHt9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyogUGF0Y2hpbmcgdGhpcyB3b3VsZCBzaG93IHVzZXIgYW4gZXh0ZW5kZWQgdHJhY2Ugb24gdGhlaXIgY2xpICovXG4gICAgdHJhY2UgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuVFJBQ0UsIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgZGVidWcgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuREVCVUcsIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgaW5mbyA9ICguLi5tZXNzYWdlOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgdGhpcy5sb2dUb1Rlc3RPcHMoTE9HX0xFVkVMUy5JTkZPLCBtZXNzYWdlKVxuICAgIH1cblxuICAgIHdhcm4gPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuV0FSTiwgbWVzc2FnZSlcbiAgICB9XG5cbiAgICBlcnJvciA9ICguLi5tZXNzYWdlOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgdGhpcy5sb2dUb1Rlc3RPcHMoTE9HX0xFVkVMUy5FUlJPUiwgbWVzc2FnZSlcbiAgICB9XG5cbiAgICBsb2cgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuSU5GTywgbWVzc2FnZSlcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBsb2dQYXRjaGVyXG4iLCAiaW1wb3J0IHsgY3JlYXRlT2JqZWN0Q3N2V3JpdGVyIH0gZnJvbSAnY3N2LXdyaXRlcidcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IGZzUHJvbWlzZSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHR5cGUgeyBFbnRyeVR5cGUgfSBmcm9tICdub2RlOnBlcmZfaG9va3MnXG5pbXBvcnQgeyBwZXJmb3JtYW5jZSwgUGVyZm9ybWFuY2VPYnNlcnZlciB9IGZyb20gJ25vZGU6cGVyZl9ob29rcydcbmltcG9ydCB1dGlsIGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB3b3JrZXIgZnJvbSAnbm9kZTp3b3JrZXJfdGhyZWFkcydcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB7IGFyY2gsIGhvc3RuYW1lLCBwbGF0Zm9ybSwgdHlwZSwgdmVyc2lvbiB9IGZyb20gJ25vZGU6b3MnXG5cbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uLy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7IFBFUkZfTUVBU1VSRU1FTlRfRU5WIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IEFQSVV0aWxzIGZyb20gJy4uLy4uL2NsaS9hcGlVdGlscy5qcydcbmltcG9ydCB7IENMSVV0aWxzIH0gZnJvbSAnLi4vLi4vY2xpL2NsaVV0aWxzLmpzJ1xuaW1wb3J0IHsgRVZFTlRTIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgZmV0Y2hXcmFwIGZyb20gJy4uLy4uL2ZldGNoV3JhcHBlci5qcydcbmltcG9ydCB0eXBlIHsgQ3N2V3JpdGVyIH0gZnJvbSAnY3N2LXdyaXRlci9zcmMvbGliL2Nzdi13cml0ZXIuanMnXG5pbXBvcnQgdHlwZSB7IE9iamVjdE1hcCB9IGZyb20gJ2Nzdi13cml0ZXIvc3JjL2xpYi9sYW5nL29iamVjdC5qcydcbmltcG9ydCB0eXBlIHsgQnJvd3NlciB9IGZyb20gJ3dlYmRyaXZlcmlvJ1xuXG4vLyBUZWxlbWV0cnkgbXVzdCBuZXZlciB0aHJvdyBpbnRvIGJ1c2luZXNzIGxvZ2ljLiBOb2RlIDE4J3MgcGVyZl9ob29rcyByZWplY3RzXG4vLyBuZWdhdGl2ZSB0aW1lc3RhbXBzIChlLmcuIHBlcmZvcm1hbmNlLm5vdygpIHVuZGVyIGZha2VkIHRpbWVycywgb3IgYW55IG90aGVyXG4vLyBlZGdlKSB3aXRoIEVSUl9QRVJGT1JNQU5DRV9JTlZBTElEX1RJTUVTVEFNUDsgTm9kZSAyMCsgdG9sZXJhdGVzIHRoZW0uIFdyYXBwaW5nXG4vLyBtYXJrL21lYXN1cmUga2VlcHMgYW4gaW5zdHJ1bWVudGF0aW9uIGZhaWx1cmUgZnJvbSBicmVha2luZyBhIGNhbGxlcidzIGhvb2tcbi8vIChlLmcuIGEgc2VydmljZSBiZWZvcmUoKSksIGFuZCBpcyBhIG5vLW9wIG9uIHRoZSBoYXBweSBwYXRoLlxuZnVuY3Rpb24gc2FmZU1hcmsobWFya05hbWU6IHN0cmluZykge1xuICAgIHRyeSB7IHBlcmZvcm1hbmNlLm1hcmsobWFya05hbWUpIH0gY2F0Y2ggeyAvKiBpbnN0cnVtZW50YXRpb24gbXVzdCBub3QgdGhyb3cgKi8gfVxufVxuZnVuY3Rpb24gc2FmZU1lYXN1cmUobWVhc3VyZU5hbWU6IHN0cmluZywgc3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcpIHtcbiAgICB0cnkgeyBwZXJmb3JtYW5jZS5tZWFzdXJlKG1lYXN1cmVOYW1lLCBzdGFydCwgZW5kKSB9IGNhdGNoIHsgLyogaW5zdHJ1bWVudGF0aW9uIG11c3Qgbm90IHRocm93ICovIH1cbn1cblxudHlwZSBQZXJmb3JtYW5jZURldGFpbHMgPSB7XG4gICAgc3VjY2Vzcz86IHRydWUsXG4gICAgZmFpbHVyZT86IHN0cmluZyxcbiAgICB0ZXN0TmFtZT86IHN0cmluZyxcbiAgICB3b3JrZXI/OiBzdHJpbmcgfCBudW1iZXIsXG4gICAgY2xpZW50V29ya2VySWQ/OiBzdHJpbmcsXG4gICAgY29tbWFuZD86IHN0cmluZyxcbiAgICBob29rVHlwZT86IHN0cmluZyxcbiAgICBwbGF0Zm9ybT86IHN0cmluZyB8IG51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZXJmb3JtYW5jZVRlc3RlciB7XG4gICAgc3RhdGljIF9vYnNlcnZlcjogUGVyZm9ybWFuY2VPYnNlcnZlclxuICAgIHN0YXRpYyBfY3N2V3JpdGVyOiBDc3ZXcml0ZXI8T2JqZWN0TWFwPHt9Pj5cbiAgICBwcml2YXRlIHN0YXRpYyBfZXZlbnRzOiBQZXJmb3JtYW5jZUVudHJ5W10gPSBbXVxuICAgIHByaXZhdGUgc3RhdGljIF9tZWFzdXJlZEV2ZW50czogQXJyYXk8UGVyZm9ybWFuY2VFbnRyeSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IFtdXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2hhc1N0b3BwZWRHZW5lcmF0aW9uID0gZmFsc2VcbiAgICBwcml2YXRlIHN0YXRpYyBfc3RvcEdlbmVyYXRlQ2FsbENvdW50ID0gMFxuICAgIHN0YXRpYyBzdGFydGVkID0gZmFsc2VcbiAgICBzdGF0aWMgZGV0YWlsczogeyBba2V5OiBzdHJpbmddOiBQZXJmb3JtYW5jZURldGFpbHMgfSA9IHt9XG4gICAgc3RhdGljIGV2ZW50c01hcDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgc3RhdGljIGJyb3dzZXI/OiBCcm93c2VyXG4gICAgc3RhdGljIHNjZW5hcmlvVGhhdFJhbjogc3RyaW5nW11cbiAgICBzdGF0aWMganNvblJlcG9ydERpck5hbWUgPSAncGVyZm9ybWFuY2UtcmVwb3J0J1xuICAgIHN0YXRpYyBqc29uUmVwb3J0RGlyUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycsIHRoaXMuanNvblJlcG9ydERpck5hbWUpXG4gICAgc3RhdGljIGpzb25SZXBvcnRGaWxlTmFtZSA9IGAke3RoaXMuanNvblJlcG9ydERpclBhdGh9L3BlcmZvcm1hbmNlLXJlcG9ydC0ke1BlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpfS5qc29uYFxuXG4gICAgc3RhdGljIHN0YXJ0TW9uaXRvcmluZyhjc3ZOYW1lOiBzdHJpbmcgPSAncGVyZm9ybWFuY2UtcmVwb3J0LmNzdicpIHtcblxuICAgICAgICAvLyBDcmVhdGUgcGVyZm9ybWFuY2UtcmVwb3J0IGRpciBpZiBub3QgZXhpc3RzIGFscmVhZHlcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuanNvblJlcG9ydERpclBhdGgpKSB7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5qc29uUmVwb3J0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBQZXJmb3JtYW5jZU9ic2VydmVyKGxpc3QgPT4ge1xuICAgICAgICAgICAgbGlzdC5nZXRFbnRyaWVzKClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuZW50cnlUeXBlID09PSAnbWVhc3VyZScpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goZW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmluYWxFbnRyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBlbnRyeS50b0pTT04oKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbmFsRW50cnkuc3RhcnRUaW1lID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UudGltZU9yaWdpbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFN0YXJ0VGltZSA9IGZpbmFsRW50cnkuc3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxFbnRyeS5zdGFydFRpbWUgPSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgZmluYWxFbnRyeS5zdGFydFRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFRpbWVzdGFtcCBjb252ZXJzaW9uIGZvciAke2VudHJ5Lm5hbWV9OiAke29yaWdpbmFsU3RhcnRUaW1lfSAtPiAke2ZpbmFsRW50cnkuc3RhcnRUaW1lfSAodGltZU9yaWdpbjogJHtwZXJmb3JtYW5jZS50aW1lT3JpZ2lufSlgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIGNvbnZlcnRpbmcgc3RhcnRUaW1lIHRvIGVwb2NoOiAke3V0aWwuZm9ybWF0KGUpfWApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXRhaWxzW2VudHJ5Lm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbEVudHJ5ID0gT2JqZWN0LmFzc2lnbihmaW5hbEVudHJ5LCB0aGlzLmRldGFpbHNbZW50cnkubmFtZV0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZGV0YWlsc1tlbnRyeS5uYW1lXVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlZEV2ZW50cy5wdXNoKGZpbmFsRW50cnkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgICAgIGxpc3QuZ2V0RW50cmllcygpLmZvckVhY2goKGVudHJ5KSA9PiB0aGlzLl9ldmVudHMucHVzaChlbnRyeSkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGVudHJ5VHlwZXM6IEVudHJ5VHlwZVtdID0gWydtZWFzdXJlJ11cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgZW50cnlUeXBlcy5wdXNoKCdmdW5jdGlvbicpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXIub2JzZXJ2ZSh7IGJ1ZmZlcmVkOiB0cnVlLCBlbnRyeVR5cGVzOiBlbnRyeVR5cGVzIH0pXG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IHRydWVcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgdGhpcy5fY3N2V3JpdGVyID0gY3JlYXRlT2JqZWN0Q3N2V3JpdGVyKHtcbiAgICAgICAgICAgICAgICBwYXRoOiBjc3ZOYW1lLFxuICAgICAgICAgICAgICAgIGhlYWRlcjogW1xuICAgICAgICAgICAgICAgICAgICB7IGlkOiAnbmFtZScsIHRpdGxlOiAnRnVuY3Rpb24gTmFtZScgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBpZDogJ3RpbWUnLCB0aXRsZTogJ0V4ZWN1dGlvbiBUaW1lIChtcyknIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGNhbGN1bGF0ZVRpbWVzKG1ldGhvZHM6IHN0cmluZ1tdKSA6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRpbWVzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge31cbiAgICAgICAgdGhpcy5fZXZlbnRzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGlmICghdGltZXNbZW50cnkubmFtZV0pIHtcbiAgICAgICAgICAgICAgICB0aW1lc1tlbnRyeS5uYW1lXSA9IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRpbWVzW2VudHJ5Lm5hbWVdICs9IGVudHJ5LmR1cmF0aW9uXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHRpbWVUYWtlbiA9IG1ldGhvZHMucmVkdWNlKChhLCBjKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGltZXNbY10gKyAoYSB8fCAwKVxuICAgICAgICB9LCAwKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFRpbWUgZm9yICR7bWV0aG9kc30gaXMgJHt0aW1lVGFrZW59YClcbiAgICAgICAgcmV0dXJuIHRpbWVUYWtlblxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBzdG9wQW5kR2VuZXJhdGUoZmlsZW5hbWU6IHN0cmluZyA9ICdwZXJmb3JtYW5jZS1vd24uaHRtbCcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBldmVudHNKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5fbWVhc3VyZWRFdmVudHMpXG4gICAgICAgICAgICAvLyByZW1vdmUgZW5jbG9zaW5nIGFycmF5IGFuZCBhZGQgYSB0cmFpbGluZyBjb21tYSBzbyB0aGF0IHdlXG4gICAgICAgICAgICAvLyBkb250IG5lZWQgdG8gYm90aCByZWFkIGFuZCB0aGVuIHdyaXRlIHRoZSBmaWxlLCB3ZSBjYW4gdXNlIGFwcGVuZCBpbnN0ZWFkXG4gICAgICAgICAgICBjb25zdCBmaW5hbEpTT05TdHIgPSBldmVudHNKc29uLnNsaWNlKDEsIC0xKSArICcsJ1xuICAgICAgICAgICAgYXdhaXQgZnNQcm9taXNlLmFwcGVuZEZpbGUodGhpcy5qc29uUmVwb3J0RmlsZU5hbWUsIGZpbmFsSlNPTlN0cilcbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIHdyaXRlIGV2ZW50cyBvZiB0aGUgd29ya2VyIHRvICR7dGhpcy5qc29uUmVwb3J0RmlsZU5hbWV9OiAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKVxuXG4gICAgICAgIGlmICghcHJvY2Vzcy5lbnZbUEVSRl9NRUFTVVJFTUVOVF9FTlZdKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlXG5cbiAgICAgICAgLy8gR2VuZXJhdGUgQ1NWIGFuZCBIVE1MIHJlcG9ydHMgdXNpbmcgZGlyZWN0bHkgY29sbGVjdGVkIGV2ZW50c1xuICAgICAgICB0aGlzLmdlbmVyYXRlQ1NWKHRoaXMuX2V2ZW50cylcblxuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZW5lcmF0ZVJlcG9ydCh0aGlzLl9ldmVudHMpXG4gICAgICAgIGNvbnN0IGRpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBmaWxlbmFtZSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzUHJvbWlzZS53cml0ZUZpbGUoZGlyLCBjb250ZW50KVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oYFBlcmZvcm1hbmNlIHJlcG9ydCBpcyBhdCAke3BhdGh9YClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIGluIHdyaXRpbmcgaHRtbCAke3V0aWwuZm9ybWF0KGVycil9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZW5lcmF0ZVJlcG9ydChlbnRyaWVzOiBQZXJmb3JtYW5jZUVudHJ5W10pIHtcbiAgICAgICAgbGV0IGh0bWwgPSAnPCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+PHRpdGxlPlBlcmZvcm1hbmNlIFJlcG9ydDwvdGl0bGU+PC9oZWFkPjxib2R5PidcbiAgICAgICAgaHRtbCArPSAnPGgxPlBlcmZvcm1hbmNlIFJlcG9ydDwvaDE+J1xuICAgICAgICBodG1sICs9ICc8dGFibGU+PHRoZWFkPjx0cj48dGg+RnVuY3Rpb24gTmFtZTwvdGg+PHRoPkR1cmF0aW9uIChtcyk8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+J1xuICAgICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBodG1sICs9IGA8dHI+PHRkPiR7ZW50cnkubmFtZX08L3RkPjx0ZD4ke2VudHJ5LmR1cmF0aW9ufTwvdGQ+PC90cj5gXG4gICAgICAgIH0pXG4gICAgICAgIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT48L2JvZHk+PC9odG1sPidcbiAgICAgICAgcmV0dXJuIGh0bWxcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2VuZXJhdGVDU1YoZW50cmllczogUGVyZm9ybWFuY2VFbnRyeVtdKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge31cbiAgICAgICAgZW50cmllcy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRpbWVzW2VudHJ5Lm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgdGltZXNbZW50cnkubmFtZV0gPSAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lc1tlbnRyeS5uYW1lXSArPSBlbnRyeS5kdXJhdGlvblxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgICAgICAgdGltZTogZW50cnkuZHVyYXRpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZGF0ID0gT2JqZWN0LmVudHJpZXModGltZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICB0aW1lOiB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLl9jc3ZXcml0ZXIud3JpdGVSZWNvcmRzKGRhdClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IEJTdGFja0xvZ2dlci5pbmZvKCdQZXJmb3JtYW5jZSBDU1YgcmVwb3J0IGdlbmVyYXRlZCBzdWNjZXNzZnVsbHknKSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGVycm9yKSlcbiAgICB9XG5cbiAgICBzdGF0aWMgTWVhc3VyZShsYWJlbDogc3RyaW5nLCBkZXRhaWxzOiBQZXJmb3JtYW5jZURldGFpbHMgPSB7fSkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgICAgICAgICBrZXk6IHN0cmluZyB8IHN5bWJvbCxcbiAgICAgICAgICAgIGRlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPEZ1bmN0aW9uPikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2Q6IEZ1bmN0aW9ufHVuZGVmaW5lZCA9IGRlc2NyaXB0b3IudmFsdWVcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uKC4uLmFyZ3M6IG9iamVjdFtdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlLmFwcGx5KHNlbGYsIFtsYWJlbCwgb3JpZ2luYWxNZXRob2QgYXMgRnVuY3Rpb24sIHsgbWV0aG9kTmFtZToga2V5LnRvU3RyaW5nKCksIC4uLmRldGFpbHMgfSwgYXJncywgdGhpc10pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIG1lYXN1cmVXcmFwcGVyKG5hbWU6IHN0cmluZywgZm46IEZ1bmN0aW9uLCBkZXRhaWxzOiBQZXJmb3JtYW5jZURldGFpbHMgPSB7fSkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpc1xuXG4gICAgICAgIGRldGFpbHMud29ya2VyID0gUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKClcbiAgICAgICAgZGV0YWlscy50ZXN0TmFtZSA9IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbiAmJiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW5bUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuLmxlbmd0aCAtIDFdXG4gICAgICAgIGRldGFpbHMucGxhdGZvcm0gPSBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWRcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IChvYmplY3R8Ym9vbGVhbnx1bmRlZmluZWR8bnVsbHxzdHJpbmcpW10pIHtcblxuICAgICAgICAgICAgcmV0dXJuIHNlbGYubWVhc3VyZShuYW1lLCBmbiwgZGV0YWlscywgYXJncylcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgc3RhdGljIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICEocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1NES19JTlNUUlVNRU5UQVRJT04gPT09ICdmYWxzZScpXG4gICAgfVxuXG4gICAgc3RhdGljIG1lYXN1cmUobGFiZWw6IHN0cmluZywgZm46IEZ1bmN0aW9uLCBkZXRhaWxzID0ge30sIGFyZ3M/OiAob2JqZWN0fGJvb2xlYW58dW5kZWZpbmVkfG51bGx8c3RyaW5nKVtdLCB0aGlzQXJnOiBvYmplY3R8bnVsbCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0ZWQgfHwgIXRoaXMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQXJnLCBhcmdzKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgdW5pcXVlIG1hcmsgbmFtZXMgZm9yIHRoaXMgc3BlY2lmaWMgY2FsbCB0byBhdm9pZCB0aW1pbmcgY29uZmxpY3RzXG4gICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gYCR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNyl9YFxuICAgICAgICBjb25zdCBzdGFydE1hcmsgPSBgJHtsYWJlbH0tc3RhcnQtJHt1bmlxdWVJZH1gXG4gICAgICAgIGNvbnN0IGVuZE1hcmsgPSBgJHtsYWJlbH0tZW5kLSR7dW5pcXVlSWR9YFxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgc3RhcnQgbWFyayB3aXRoIHVuaXF1ZSBJRFxuICAgICAgICBzYWZlTWFyayhzdGFydE1hcmspXG5cbiAgICAgICAgLy8gU3RvcmUgZGV0YWlscyB3aXRoIG1lYXN1cmVtZW50IGNvbnRleHRcbiAgICAgICAgY29uc3QgZGV0YWlsc1dpdGhDb250ZXh0ID0ge1xuICAgICAgICAgICAgLi4uZGV0YWlscyxcbiAgICAgICAgICAgIG1lYXN1cmVtZW50SWQ6IHVuaXF1ZUlkXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gZm4uYXBwbHkodGhpc0FyZywgYXJncylcblxuICAgICAgICAgICAgaWYgKHJldHVyblZhbCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHYgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBzcGVjaWZpYyBtYXJrcyBmb3IgdGhpcyBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZU1hcmsoZW5kTWFyaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlTWVhc3VyZShsYWJlbCwgc3RhcnRNYXJrLCBlbmRNYXJrKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXRhaWxzW2xhYmVsXSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRQcm9jZXNzSWQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06IFBlcmZvcm1hbmNlVGVzdGVyLmJyb3dzZXI/LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbj8ucG9wKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkZXRhaWxzV2l0aENvbnRleHQpLCB0aGlzLmRldGFpbHNbbGFiZWxdIHx8IHt9KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVNYXJrKGVuZE1hcmspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tsYWJlbF0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmU6IHV0aWwuZm9ybWF0KGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50V29ya2VySWQ6IFBlcmZvcm1hbmNlVGVzdGVyLmdldENsaWVudFdvcmtlcklkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3ROYW1lOiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4/LnBvcCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3luY2hyb25vdXMgZXhlY3V0aW9uXG4gICAgICAgICAgICBzYWZlTWFyayhlbmRNYXJrKVxuICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgdGhpcy5kZXRhaWxzW2xhYmVsXSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgZmFpbHVyZTogdW5kZWZpbmVkXG4gICAgICAgICAgICB9LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgcGxhdGZvcm06IFBlcmZvcm1hbmNlVGVzdGVyLmJyb3dzZXI/LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuPy5wb3AoKVxuICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWxcbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIHNhZmVNYXJrKGVuZE1hcmspXG4gICAgICAgICAgICBzYWZlTWVhc3VyZShsYWJlbCwgc3RhcnRNYXJrLCBlbmRNYXJrKVxuXG4gICAgICAgICAgICB0aGlzLmRldGFpbHNbbGFiZWxdID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbHVyZTogdXRpbC5mb3JtYXQoZXIpXG4gICAgICAgICAgICB9LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgcGxhdGZvcm06IFBlcmZvcm1hbmNlVGVzdGVyLmJyb3dzZXI/LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuPy5wb3AoKVxuICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgIHRocm93IGVyXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgc3RhcnQoZXZlbnQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBmaW5hbEV2ZW50ID0gZXZlbnQgKyAnLXN0YXJ0J1xuICAgICAgICBpZiAodGhpcy5ldmVudHNNYXBbZmluYWxFdmVudF0pIHtyZXR1cm59XG4gICAgICAgIHNhZmVNYXJrKGZpbmFsRXZlbnQpXG4gICAgICAgIHRoaXMuZXZlbnRzTWFwW2ZpbmFsRXZlbnRdID0gMVxuICAgIH1cblxuICAgIHN0YXRpYyBlbmQoZXZlbnQ6IHN0cmluZywgc3VjY2VzcyA9IHRydWUsIGZhaWx1cmU/OiBzdHJpbmcgfCB1bmtub3duLCBkZXRhaWxzID0ge30pIHtcbiAgICAgICAgc2FmZU1hcmsoZXZlbnQgKyAnLWVuZCcpXG4gICAgICAgIHNhZmVNZWFzdXJlKGV2ZW50LCBldmVudCArICctc3RhcnQnLCBldmVudCArICctZW5kJylcbiAgICAgICAgLy8gQ2xlYXIgdGhlIHN0YXJ0LW1hcmsgZ3VhcmQgc28gYSBzdWJzZXF1ZW50IHN0YXJ0KGV2ZW50KSBmb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gZXZlbnQgYWN0dWFsbHkgbWFya3MgYSBuZXcgc3RhcnQuIFdpdGhvdXQgdGhpcywgc3RhcnQoKSBzaG9ydC1jaXJjdWl0c1xuICAgICAgICAvLyBhbmQgdGhlIG5leHQgZW5kKCkgbWVhc3VyZXMgZnJvbSB0aGUgb3JpZ2luYWwgc3RhcnQgbWFyayBcdTIwMTQgaW5mbGF0ZWRcbiAgICAgICAgLy8gZHVyYXRpb25zIGluIHRlbGVtZXRyeSBvbiBldmVyeSBjYWxsIGFmdGVyIHRoZSBmaXJzdC5cbiAgICAgICAgZGVsZXRlIHRoaXMuZXZlbnRzTWFwW2V2ZW50ICsgJy1zdGFydCddXG4gICAgICAgIHRoaXMuZGV0YWlsc1tldmVudF0gPSBPYmplY3QuYXNzaWduKHsgc3VjY2VzcywgZmFpbHVyZTogdXRpbC5mb3JtYXQoZmFpbHVyZSkgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgd29ya2VyOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRQcm9jZXNzSWQoKSxcbiAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuICYmIFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbltQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4ubGVuZ3RoIC0gMV1cbiAgICAgICAgfSwgZGV0YWlscyksIHRoaXMuZGV0YWlsc1tldmVudF0gfHwge30pKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBjbGllbnQgd29ya2VyIElEIGluIGZvcm1hdCBcInRocmVhZElkLXByb2Nlc3NJZFwiLlxuICAgICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgY29uc2lzdGVudCBpZGVudGlmaWVyIGFjcm9zcyB0aGUgU0RLIGZvciB0cmFja2luZ1xuICAgICAqIHdvcmtlci1zcGVjaWZpYyBldmVudHMgYW5kIHBlcmZvcm1hbmNlIG1ldHJpY3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXb3JrZXIgSUQgc3RyaW5nIGluIGZvcm1hdCBcInRocmVhZElkLXByb2Nlc3NJZFwiXG4gICAgICovXG4gICAgc3RhdGljIGdldENsaWVudFdvcmtlcklkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBDTElVdGlscy5nZXRDbGllbnRXb3JrZXJJZCgpXG4gICAgfVxuXG4gICAgc3RhdGljIGdldFByb2Nlc3NJZCgpIHtcbiAgICAgICAgcmV0dXJuIGAke3Byb2Nlc3MucGlkfS0ke3dvcmtlci50aHJlYWRJZH1gXG4gICAgfVxuXG4gICAgc3RhdGljIHNsZWVwID0gKG1zID0gMTAwKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG5cbiAgICBzdGF0aWMgYXN5bmMgdXBsb2FkRXZlbnRzRGF0YSgpIHtcbiAgICAgICAgLy8gVHJhY2sgb3ZlcmFsbCBrZXkgbWV0cmljcyBvcGVyYXRpb25cbiAgICAgICAgdGhpcy5zdGFydChFVkVOVFMuU0RLX1NFTkRfS0VZX01FVFJJQ1MpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlcklkID0gYCR7cHJvY2Vzcy5waWR9YFxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBTdGFydGluZyB1cGxvYWQgZm9yIHdvcmtlciAke3dvcmtlcklkfWApXG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHByZXBhcmF0aW9uIHBoYXNlIChjb2xsZWN0aW9uIGFuZCBkZWR1cGxpY2F0aW9uKVxuICAgICAgICAgICAgdGhpcy5zdGFydChFVkVOVFMuU0RLX0tFWV9NRVRSSUNTX1BSRVBBUkFUSU9OKVxuXG4gICAgICAgICAgICAvLyBDb2xsZWN0IGFsbCBtZWFzdXJlcyBmcm9tIHBlcmZvcm1hbmNlIHJlcG9ydCBmaWxlcyBhbmQgaW4tbWVtb3J5IGV2ZW50c1xuICAgICAgICAgICAgbGV0IG1lYXN1cmVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW11cbiAgICAgICAgICAgIGlmIChhd2FpdCBmc1Byb21pc2UuYWNjZXNzKHRoaXMuanNvblJlcG9ydERpclBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSkuY2F0Y2goKCkgPT4gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZXMgPSAoYXdhaXQgZnNQcm9taXNlLnJlYWRkaXIodGhpcy5qc29uUmVwb3J0RGlyUGF0aCkpLm1hcChmaWxlID0+IHBhdGgucmVzb2x2ZSh0aGlzLmpzb25SZXBvcnREaXJQYXRoLCBmaWxlKSlcbiAgICAgICAgICAgICAgICBtZWFzdXJlcyA9IChhd2FpdCBQcm9taXNlLmFsbChmaWxlcy5tYXAoKGZpbGUpID0+IGZzUHJvbWlzZS5yZWFkRmlsZShmaWxlLCAndXRmLTgnKSkpKS5tYXAoZWwgPT4gYFske2VsLnNsaWNlKDAsIC0xKX1dYCkubWFwKGVsID0+IEpTT04ucGFyc2UoZWwpKS5mbGF0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gVG90YWwgZXZlbnRzIGZyb20gZmlsZXM6ICR7bWVhc3VyZXMubGVuZ3RofWApXG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9tZWFzdXJlZEV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBBZGRpbmcgJHt0aGlzLl9tZWFzdXJlZEV2ZW50cy5sZW5ndGh9IGluLW1lbW9yeSBldmVudHNgKVxuICAgICAgICAgICAgICAgIG1lYXN1cmVzID0gbWVhc3VyZXMuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlZEV2ZW50cy5tYXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IFBlcmZvcm1hbmNlRW50cnkgdG8gcGxhaW4gb2JqZWN0IGlmIGl0IGhhcyB0b0pTT05cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGUgYXMgUGVyZm9ybWFuY2VFbnRyeSkudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlIGFzIFBlcmZvcm1hbmNlRW50cnkpLnRvSlNPTigpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVuc3VyZUVwb2NoVGltZXMgPSAoYXJyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1dG9mZiA9IDFlMTIgLy8gfnllYXIgMjAwMSwgbXMgZXBvY2hcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lT3JpZ2luID0gKFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwZXJmb3JtYW5jZS50aW1lT3JpZ2luID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgPyBwZXJmb3JtYW5jZS50aW1lT3JpZ2luXG4gICAgICAgICAgICAgICAgICAgIDogKG5vdyAtIHByb2Nlc3MudXB0aW1lKCkgKiAxMDAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBhcnIubWFwKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnRyeS5zdGFydFRpbWUgPT09ICdudW1iZXInICYmIGVudHJ5LnN0YXJ0VGltZSA8IGN1dG9mZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RhcnRUaW1lID0gdGltZU9yaWdpbiArIGVudHJ5LnN0YXJ0VGltZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtZWFzdXJlcyA9IGVuc3VyZUVwb2NoVGltZXMobWVhc3VyZXMpXG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKVxuICAgICAgICAgICAgLy8geXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1NTUyBaXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB0aW1lWm9uZTogJ1VUQycsXG4gICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgaG91cjogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIHNlY29uZDogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIGZyYWN0aW9uYWxTZWNvbmREaWdpdHM6IDMsIC8vIFRvIGluY2x1ZGUgbWljcm9zZWNvbmRzXG4gICAgICAgICAgICAgICAgaG91cjEyOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRm9ybWF0IHRoZSBkYXRlIGFuZCByZXBsYWNlIHRoZSBkZWZhdWx0IHNlcGFyYXRvciBmb3IgdGltZSB6b25lXG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLUdCJywgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAuZm9ybWF0VG9QYXJ0cyhkYXRlKVxuICAgICAgICAgICAgICAgIC5tYXAoKHsgdHlwZSwgdmFsdWUgfSkgPT4gdHlwZSA9PT0gJ3RpbWVab25lTmFtZScgPyAnWicgOiB2YWx1ZSlcbiAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnLCcsICdUJylcblxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19LRVlfTUVUUklDU19QUkVQQVJBVElPTiwgdHJ1ZSlcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ3Nka19ldmVudHMnLFxuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGh1Yl91dWlkOiBwcm9jZXNzLmVudi5QRVJGX1RFU1RIVUJfVVVJRCB8fCBwcm9jZXNzLmVudi5TREtfUlVOX0lELFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkX2RheTogZm9ybWF0dGVkRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRfbmFtZTogJ1NES0ZlYXR1cmVQZXJmb3JtYW5jZScsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YTogcHJvY2Vzcy5lbnYuUEVSRl9VU0VSX05BTUUsXG4gICAgICAgICAgICAgICAgICAgIGhvc3RfaW5mbzogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3RuYW1lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybTogcGxhdGZvcm0oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHZlcnNpb24oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyY2g6IGFyY2goKVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRfanNvbjogeyBtZWFzdXJlczogbWVhc3VyZXMsIHNka1J1bklkOiBwcm9jZXNzLmVudi5TREtfUlVOX0lEIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaFdyYXAoYCR7QVBJVXRpbHMuRURTX1VSTH0vc2VuZF9zZGtfZXZlbnRzYCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gU3VjY2Vzc2Z1bGx5IHVwbG9hZGVkIHRvIEVEUzogJHt1dGlsLmZvcm1hdChhd2FpdCByZXN1bHQudGV4dCgpKX1gKVxuXG4gICAgICAgICAgICB0aGlzLmVuZChFVkVOVFMuU0RLX1NFTkRfS0VZX01FVFJJQ1MsIHRydWUpXG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIEZhaWxlZCB0byB1cGxvYWQgZXZlbnRzOiAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19LRVlfTUVUUklDU19QUkVQQVJBVElPTiwgZmFsc2UsIGVyKVxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19TRU5EX0tFWV9NRVRSSUNTLCBmYWxzZSwgZXIpXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IGZzUHJvbWlzZS5hY2Nlc3ModGhpcy5qc29uUmVwb3J0RGlyUGF0aCkudGhlbigoKSA9PiB0cnVlLCAoKSA9PiBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzUHJvbWlzZS5yZWFkZGlyKHRoaXMuanNvblJlcG9ydERpclBhdGgpXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNQcm9taXNlLnVubGluayhwYXRoLmpvaW4odGhpcy5qc29uUmVwb3J0RGlyUGF0aCwgZmlsZSkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBDbGVhbmVkIHVwICR7ZmlsZXMubGVuZ3RofSB0ZW1wb3JhcnkgcmVwb3J0IGZpbGVzYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gRmFpbGVkIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXM6ICR7dXRpbC5mb3JtYXQoZXIpfWApXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5cbmltcG9ydCBsb2dnZXIgZnJvbSAnQHdkaW8vbG9nZ2VyJ1xuXG5pbXBvcnQgeyBMT0dTX0ZJTEUgfSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IENPTE9SUyB9IGZyb20gJy4vdXRpbC5qcydcblxuY29uc3QgbG9nID0gbG9nZ2VyKCdAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZScpXG5cbmV4cG9ydCBjbGFzcyBCU3RhY2tMb2dnZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgTE9HU19GSUxFKVxuICAgIHB1YmxpYyBzdGF0aWMgbG9nRm9sZGVyUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycpXG4gICAgcHJpdmF0ZSBzdGF0aWMgbG9nRmlsZVN0cmVhbTogZnMuV3JpdGVTdHJlYW0gfCBudWxsXG5cbiAgICBwcml2YXRlIHN0YXRpYyByZWRhY3RDcmVkZW50aWFscyhsb2dNZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbG9nTWVzc2FnZVxuICAgICAgICAgICAgLnJlcGxhY2UoLyhbXCInXT8oPzp1c2VybmFtZXx1c2VyTmFtZXxhY2Nlc3NrZXl8YWNjZXNzS2V5fHVzZXJ8a2V5KVtcIiddP1xccypbOj1dXFxzKltcIiddPykoW15cIidcXHMsfV0rKS9naSwgJyQxJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oWz8mXSg/OnVzZXJuYW1lfHVzZXJOYW1lfGFjY2Vzc19rZXl8YWNjZXNza2V5fGFjY2Vzc0tleXx1c2VyfGtleSk9KShbXiYjXFxzXSspL2dpLCAnJDEnKVxuICAgIH1cblxuICAgIHN0YXRpYyBsb2dUb0ZpbGUobG9nTWVzc2FnZTogc3RyaW5nLCBsb2dMZXZlbDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKGxvZ01lc3NhZ2UpXG4gICAgICAgICAgICBpZiAoIXRoaXMubG9nRmlsZVN0cmVhbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5zdXJlTG9nc0ZvbGRlcigpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odGhpcy5sb2dGaWxlUGF0aCwgeyBmbGFnczogJ2EnIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dGaWxlU3RyZWFtICYmIHRoaXMubG9nRmlsZVN0cmVhbS53cml0YWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbS53cml0ZSh0aGlzLmZvcm1hdExvZyhyZWRhY3RlZE1lc3NhZ2UsIGxvZ0xldmVsKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgRmFpbGVkIHRvIGxvZyB0byBmaWxlLiBFcnJvciAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmb3JtYXRMb2cobG9nTWVzc2FnZTogc3RyaW5nLCBsZXZlbDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgJHtjaGFsay5ncmF5KG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSl9ICR7Y2hhbGtbQ09MT1JTW2xldmVsXV0obGV2ZWwudG9VcHBlckNhc2UoKSl9ICR7Y2hhbGsud2hpdGVCcmlnaHQoJ0B3ZGlvL2Jyb3dzZXJzdGFjay1zZXJ2aWNlJyl9ICR7bG9nTWVzc2FnZX1cXG5gXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ2luZm8nKVxuICAgICAgICBsb2cuaW5mbyhyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICdlcnJvcicpXG4gICAgICAgIGxvZy5lcnJvcihyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIHBhcmFtPzogdW5rbm93bikge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ2RlYnVnJylcbiAgICAgICAgaWYgKHBhcmFtKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcocmVkYWN0ZWRNZXNzYWdlLCBwYXJhbSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhyZWRhY3RlZE1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHdhcm4obWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJlZGFjdGVkTWVzc2FnZSA9IHRoaXMucmVkYWN0Q3JlZGVudGlhbHMobWVzc2FnZSlcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUocmVkYWN0ZWRNZXNzYWdlLCAnd2FybicpXG4gICAgICAgIGxvZy53YXJuKHJlZGFjdGVkTWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRyYWNlKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ3RyYWNlJylcbiAgICAgICAgbG9nLnRyYWNlKHJlZGFjdGVkTWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyTG9nZ2VyKCkge1xuICAgICAgICBpZiAodGhpcy5sb2dGaWxlU3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0uZW5kKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0gPSBudWxsXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckxvZ0ZpbGUoKSB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMubG9nRmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBmcy50cnVuY2F0ZVN5bmModGhpcy5sb2dGaWxlUGF0aClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW5zdXJlTG9nc0ZvbGRlcigpIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMubG9nRm9sZGVyUGF0aCkpe1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMubG9nRm9sZGVyUGF0aClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJ7XG4gIFwibmFtZVwiOiBcIkB3ZGlvL2Jyb3dzZXJzdGFjay1zZXJ2aWNlXCIsXG4gIFwidmVyc2lvblwiOiBcIjkuMzAuMlwiLFxuICBcImRlc2NyaXB0aW9uXCI6IFwiV2ViZHJpdmVySU8gc2VydmljZSBmb3IgYmV0dGVyIEJyb3dzZXJzdGFjayBpbnRlZ3JhdGlvblwiLFxuICBcImF1dGhvclwiOiBcIkJyb3dzZXJTdGFjayA8c3VwcG9ydEBicm93c2Vyc3RhY2suY29tPlwiLFxuICBcImhvbWVwYWdlXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJzdGFjay93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlXCIsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcImVuZ2luZXNcIjoge1xuICAgIFwibm9kZVwiOiBcIj49MTguMjAuMFwiXG4gIH0sXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXQraHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJzdGFjay93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlLmdpdFwiLFxuICAgIFwiZGlyZWN0b3J5XCI6IFwicGFja2FnZXMvYnJvd3NlcnN0YWNrLXNlcnZpY2VcIlxuICB9LFxuICBcImtleXdvcmRzXCI6IFtcbiAgICBcIndlYmRyaXZlcmlvXCIsXG4gICAgXCJ3ZGlvXCIsXG4gICAgXCJicm93c2Vyc3RhY2tcIixcbiAgICBcIndkaW8tc2VydmljZVwiXG4gIF0sXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcnN0YWNrL3dkaW8tYnJvd3NlcnN0YWNrLXNlcnZpY2UvaXNzdWVzXCJcbiAgfSxcbiAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gIFwidHlwZXNcIjogXCIuL2J1aWxkL2luZGV4LmQudHNcIixcbiAgXCJleHBvcnRzXCI6IHtcbiAgICBcIi5cIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vYnVpbGQvaW5kZXguZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2J1aWxkL2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9jbGVhbnVwXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2J1aWxkL2NsZWFudXAuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2J1aWxkL2NsZWFudXAuanNcIixcbiAgICAgIFwic291cmNlXCI6IFwiLi9zcmMvY2xlYW51cC50c1wiXG4gICAgfVxuICB9LFxuICBcInR5cGVTY3JpcHRWZXJzaW9uXCI6IFwiMy44LjNcIixcbiAgXCJmaWxlc1wiOiBbXG4gICAgXCJidWlsZFwiLFxuICAgIFwic3JjL3Byb3RvLyoqLyoucHJvdG9cIixcbiAgICBcImJyb3dzZXJzdGFjay1zZXJ2aWNlLmQudHNcIixcbiAgICBcIlJFQURNRS5tZFwiLFxuICAgIFwiTElDRU5TRVwiXG4gIF0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJjbGVhblwiOiBcInJpbXJhZiAuL2J1aWxkIHNyYy9ncnBjL2dlbmVyYXRlZFwiLFxuICAgIFwiZ2VuZXJhdGVcIjogXCJidWYgZ2VuZXJhdGVcIixcbiAgICBcImJ1aWxkXCI6IFwicmltcmFmIC4vYnVpbGQgc3JjL2dycGMvZ2VuZXJhdGVkICYmIGJ1ZiBnZW5lcmF0ZSAmJiBub2RlIC4vc2NyaXB0cy9idWlsZC5tanMgJiYgdHNjIC1wIHRzY29uZmlnLnByb2QuanNvblwiLFxuICAgIFwiYnVpbGQ6d2F0Y2hcIjogXCJub2RlIC4vc2NyaXB0cy9idWlsZC5tanMgLS13YXRjaFwiLFxuICAgIFwidGVzdFwiOiBcInZpdGVzdCAtLXJ1blwiLFxuICAgIFwidGVzdDp3YXRjaFwiOiBcInZpdGVzdFwiLFxuICAgIFwicHJlcGFja1wiOiBcIm5wbSBydW4gYnVpbGRcIlxuICB9LFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYnJvd3NlcnN0YWNrL2FpLXNkay1ub2RlXCI6IFwiMS41LjE3XCIsXG4gICAgXCJAYnVmYnVpbGQvcHJvdG9idWZcIjogXCJeMi41LjJcIixcbiAgICBcIkBncnBjL2dycGMtanNcIjogXCIxLjEzLjNcIixcbiAgICBcIkBwZXJjeS9hcHBpdW0tYXBwXCI6IFwiXjIuMC45XCIsXG4gICAgXCJAcGVyY3kvc2VsZW5pdW0td2ViZHJpdmVyXCI6IFwiXjIuMi4yXCIsXG4gICAgXCJAdHlwZXMvZ2l0Y29uZmlnbG9jYWxcIjogXCJeMi4wLjFcIixcbiAgICBcImJyb3dzZXJzdGFjay1sb2NhbFwiOiBcIl4xLjUuMVwiLFxuICAgIFwiY2hhbGtcIjogXCJeNS4zLjBcIixcbiAgICBcImNzdi13cml0ZXJcIjogXCJeMS42LjBcIixcbiAgICBcImdpdC1yZXBvLWluZm9cIjogXCJeMi4xLjFcIixcbiAgICBcImdpdGNvbmZpZ2xvY2FsXCI6IFwiXjIuMS4wXCIsXG4gICAgXCJnbG9iXCI6IFwiXjExLjAuMFwiLFxuICAgIFwidGFyXCI6IFwiXjcuNS4xMVwiLFxuICAgIFwidW5kaWNpXCI6IFwiXjYuMjQuMFwiLFxuICAgIFwidXVpZFwiOiBcIl4xMS4xLjBcIixcbiAgICBcIndpbnN0b24tdHJhbnNwb3J0XCI6IFwiXjQuNS4wXCIsXG4gICAgXCJ5YXV6bFwiOiBcIl4zLjQuMFwiLFxuICAgIFwiQHdkaW8vbG9nZ2VyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9yZXBvcnRlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vdHlwZXNcIjogXCJeOS4wLjBcIixcbiAgICBcIndlYmRyaXZlcmlvXCI6IFwiXjkuMC4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkB3ZGlvL2NsaVwiOiBcIl41LjAuMCB8fCBeNi4wLjAgfHwgXjcuMC4wIHx8IF44LjAuMCB8fCBeOS4wLjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYnVmYnVpbGQvYnVmXCI6IFwiXjEuNTUuMVwiLFxuICAgIFwiQGNoYW5nZXNldHMvY2xpXCI6IFwiXjIuMjcuOVwiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMjAuMS4wXCIsXG4gICAgXCJAdHlwZXMvdGFyXCI6IFwiXjcuMC44N1wiLFxuICAgIFwiQHR5cGVzL3lhdXpsXCI6IFwiXjIuMTAuM1wiLFxuICAgIFwiQHdkaW8vZ2xvYmFsc1wiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vbG9nZ2VyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9yZXBvcnRlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vdHlwZXNcIjogXCJeOS4wLjBcIixcbiAgICBcImVzYnVpbGRcIjogXCJeMC4yNy4yXCIsXG4gICAgXCJyaW1yYWZcIjogXCJeNi4wLjFcIixcbiAgICBcInRzLXByb3RvXCI6IFwiXjIuNy41XCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuOC4zXCIsXG4gICAgXCJ2aXRlc3RcIjogXCJeMy4yLjRcIixcbiAgICBcIndlYmRyaXZlcmlvXCI6IFwiXjkuMC4wXCJcbiAgfSxcbiAgXCJwdWJsaXNoQ29uZmlnXCI6IHtcbiAgICBcImFjY2Vzc1wiOiBcInB1YmxpY1wiXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJyb3dzZXJzdGFja0NvbmZpZyB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbicgd2l0aCB7IHR5cGU6ICdqc29uJyB9XG5cbmNvbnN0IGJzdGFja1NlcnZpY2VWZXJzaW9uID0gcGtnLnZlcnNpb25cblxuZXhwb3J0IGNvbnN0IEJST1dTRVJfREVTQ1JJUFRJT04gPSBbXG4gICAgJ2RldmljZScsXG4gICAgJ29zJyxcbiAgICAnb3NWZXJzaW9uJyxcbiAgICAnb3NfdmVyc2lvbicsXG4gICAgJ2Jyb3dzZXJOYW1lJyxcbiAgICAnYnJvd3NlcicsXG4gICAgJ2Jyb3dzZXJWZXJzaW9uJyxcbiAgICAnYnJvd3Nlcl92ZXJzaW9uJ1xuXSBhcyBjb25zdFxuXG5leHBvcnQgY29uc3QgVkFMSURfQVBQX0VYVEVOU0lPTiA9IFtcbiAgICAnLmFwaycsXG4gICAgJy5hYWInLFxuICAgICcuaXBhJ1xuXVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9PUFRJT05TOiBQYXJ0aWFsPEJyb3dzZXJzdGFja0NvbmZpZz4gPSB7XG4gICAgc2V0U2Vzc2lvbk5hbWU6IHRydWUsXG4gICAgc2V0U2Vzc2lvblN0YXR1czogdHJ1ZSxcbiAgICB0ZXN0T2JzZXJ2YWJpbGl0eTogdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgY29uc29sZUhvbGRlcjogdHlwZW9mIGNvbnNvbGUgPSBPYmplY3QuYXNzaWduKHt9LCBjb25zb2xlKVxuXG5leHBvcnQgY29uc3QgREFUQV9FTkRQT0lOVCA9ICdodHRwczovL2NvbGxlY3Rvci1vYnNlcnZhYmlsaXR5LmJyb3dzZXJzdGFjay5jb20nXG5leHBvcnQgY29uc3QgQVBQX0FMTFlfRU5EUE9JTlQgPSAnaHR0cHM6Ly9hcHAtYWNjZXNzaWJpbGl0eS5icm93c2Vyc3RhY2suY29tL2F1dG9tYXRlJ1xuZXhwb3J0IGNvbnN0IEFQUF9BTExZX0lTU1VFU19FTkRQT0lOVCA9ICdhcGkvdjEvaXNzdWVzJ1xuZXhwb3J0IGNvbnN0IEFQUF9BTExZX0lTU1VFU19TVU1NQVJZX0VORFBPSU5UID0gJ2FwaS92MS9pc3N1ZXMtc3VtbWFyeSdcbmV4cG9ydCBjb25zdCBEQVRBX0VWRU5UX0VORFBPSU5UID0gJ2FwaS92MS9ldmVudCdcbmV4cG9ydCBjb25zdCBEQVRBX0JBVENIX0VORFBPSU5UID0gJ2FwaS92MS9iYXRjaCdcbmV4cG9ydCBjb25zdCBEQVRBX1NDUkVFTlNIT1RfRU5EUE9JTlQgPSAnYXBpL3YxL3NjcmVlbnNob3RzJ1xuZXhwb3J0IGNvbnN0IERBVEFfQkFUQ0hfU0laRSA9IDEwMDBcbmV4cG9ydCBjb25zdCBEQVRBX0JBVENIX0lOVEVSVkFMID0gMjAwMFxuZXhwb3J0IGNvbnN0IEJBVENIX0VWRU5UX1RZUEVTID0gWydMb2dDcmVhdGVkJywgJ1Rlc3RSdW5TdGFydGVkJywgJ1Rlc3RSdW5GaW5pc2hlZCcsICdIb29rUnVuRmluaXNoZWQnLCAnSG9va1J1blN0YXJ0ZWQnLCAnU2NyZWVuc2hvdENyZWF0ZWQnXVxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0FJVF9USU1FT1VUX0ZPUl9QRU5ESU5HX1VQTE9BRFMgPSA1MDAwIC8vIDVzXG5leHBvcnQgY29uc3QgREVGQVVMVF9XQUlUX0lOVEVSVkFMX0ZPUl9QRU5ESU5HX1VQTE9BRFMgPSAxMDAgLy8gMTAwbXNcbmV4cG9ydCBjb25zdCBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OID0gYnN0YWNrU2VydmljZVZlcnNpb25cblxuZXhwb3J0IGNvbnN0IE5PVF9BTExPV0VEX0tFWVNfSU5fQ0FQUyA9IFsnaW5jbHVkZVRhZ3NJblRlc3RpbmdTY29wZScsICdleGNsdWRlVGFnc0luVGVzdGluZ1Njb3BlJywgJ3Rlc3RNYW5hZ2VtZW50T3B0aW9ucyddXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRCA9ICdCUk9XU0VSU1RBQ0tfVEVTVF9QTEFOX0lEJ1xuXG5leHBvcnQgY29uc3QgTE9HU19GSUxFID0gJ2xvZ3MvYnN0YWNrLXdkaW8tc2VydmljZS5sb2cnXG5leHBvcnQgY29uc3QgQ0xJX0RFQlVHX0xPR1NfRklMRSA9ICdsb2cvc2RrLWNsaS1kZWJ1Zy5sb2cnXG5leHBvcnQgY29uc3QgVVBMT0FEX0xPR1NfQUREUkVTUyA9ICdodHRwczovL3VwbG9hZC1vYnNlcnZhYmlsaXR5LmJyb3dzZXJzdGFjay5jb20nXG5leHBvcnQgY29uc3QgVVBMT0FEX0xPR1NfRU5EUE9JTlQgPSAnY2xpZW50LWxvZ3MvdXBsb2FkJ1xuXG5leHBvcnQgY29uc3QgUEVSQ1lfTE9HU19GSUxFID0gJ2xvZ3MvcGVyY3kubG9nJ1xuXG5leHBvcnQgY29uc3QgUEVSQ1lfRE9NX0NIQU5HSU5HX0NPTU1BTkRTX0VORFBPSU5UUyA9IFtcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC91cmwnLFxuICAgICcvc2Vzc2lvbi86c2Vzc2lvbklkL2ZvcndhcmQnLFxuICAgICcvc2Vzc2lvbi86c2Vzc2lvbklkL2JhY2snLFxuICAgICcvc2Vzc2lvbi86c2Vzc2lvbklkL3JlZnJlc2gnLFxuICAgICcvc2Vzc2lvbi86c2Vzc2lvbklkL3NjcmVlbnNob3QnLFxuICAgICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FjdGlvbnMnLFxuICAgICcvc2Vzc2lvbi86c2Vzc2lvbklkL2FwcGl1bS9kZXZpY2Uvc2hha2UnXG5dXG5cbmV4cG9ydCBjb25zdCBDQVBUVVJFX01PREVTID0gWydjbGljaycsICdhdXRvJywgJ3NjcmVlbnNob3QnLCAnbWFudWFsJywgJ3Rlc3RjYXNlJ11cbmV4cG9ydCBjb25zdCBMT0dfS0lORF9VU0FHRV9NQVAgPSB7XG4gICAgJ1RFU1RfTE9HJzogJ2xvZycsXG4gICAgJ1RFU1RfU0NSRUVOU0hPVCc6ICdzY3JlZW5zaG90JyxcbiAgICAnVEVTVF9TVEVQJzogJ3N0ZXAnLFxuICAgICdIVFRQJzogJ2h0dHAnXG59XG5cbmV4cG9ydCBjb25zdCBGVU5ORUxfSU5TVFJVTUVOVEFUSU9OX1VSTCA9ICdodHRwczovL2FwaS5icm93c2Vyc3RhY2suY29tL3Nkay92MS9ldmVudCdcblxuZXhwb3J0IGNvbnN0IEVEU19VUkwgPSAnaHR0cHM6Ly9lZHMuYnJvd3NlcnN0YWNrLmNvbSdcblxuZXhwb3J0IGNvbnN0IFNVUFBPUlRFRF9CUk9XU0VSU19GT1JfQUkgPSBbJ2Nocm9tZScsICdtaWNyb3NvZnRlZGdlJywgJ2ZpcmVmb3gnXVxuXG5leHBvcnQgY29uc3QgVENHX1VSTCA9ICdodHRwczovL3RjZy5icm93c2Vyc3RhY2suY29tJ1xuXG5leHBvcnQgY29uc3QgVENHX0lORk8gPSB7XG4gICAgdGNnUmVnaW9uOiAndXNlJyxcbiAgICB0Y2dVcmw6IFRDR19VUkwsXG59XG5cbi8vIFNtYXJ0IFNlbGVjdGlvbiBNb2RlIENvbnN0YW50c1xuZXhwb3J0IGNvbnN0IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNUID0gJ3JlbGV2YW50Rmlyc3QnXG5leHBvcnQgY29uc3QgU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfT05MWSA9ICdyZWxldmFudE9ubHknXG5cbi8vIEVudiB2YXJpYWJsZXMgLSBEZWZpbmUgYWxsIHRoZSBlbnYgdmFyaWFibGUgY29uc3RhbnRzIG92ZXIgaGVyZVxuXG4vLyBUbyBzdG9yZSB0aGUgSldUIHRva2VuIHJldHVybmVkIHRoZSBzZXNzaW9uIGxhdW5jaFxuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUSFVCX0pXVCA9ICdCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QnXG5cbi8vIFRvIHN0b3JlIHRjZyBhdXRoIHJlc3VsdCBmb3Igc2VsZkhlYWxpbmcgZmVhdHVyZTpcbmV4cG9ydCBjb25zdCBCU1RBQ0tfVENHX0FVVEhfUkVTVUxUID0gJ0JTVEFDS19UQ0dfQVVUSF9SRVNVTFQnXG5cbi8vIFRvIHN0b3JlIHRoZSBzZXR0aW5nIG9mIHdoZXRoZXIgdG8gc2VuZCBzY3JlZW5zaG90cyBvciBub3RcbmV4cG9ydCBjb25zdCBURVNUT1BTX1NDUkVFTlNIT1RfRU5WID0gJ0JTX1RFU1RPUFNfQUxMT1dfU0NSRUVOU0hPVFMnXG5cbi8vIFRvIHN0b3JlIGJ1aWxkIGhhc2hlZCBpZFxuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUSFVCX1VVSUQgPSAnQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRCdcblxuLy8gVG8gc3RvcmUgdGVzdCBydW4gdXVpZFxuZXhwb3J0IGNvbnN0IFRFU1RfQU5BTFlUSUNTX0lEID0gJ1RFU1RfQU5BTFlUSUNTX0lEJ1xuXG4vLyBXaGV0aGVyIHRvIGNvbGxlY3QgcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uIG9yIG5vdFxuZXhwb3J0IGNvbnN0IFBFUkZfTUVBU1VSRU1FTlRfRU5WID0gJ0JST1dTRVJTVEFDS19PMTFZX1BFUkZfTUVBU1VSRU1FTlQnXG5cbi8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcnVuIGlzIHJlcnVuIG9yIG5vdFxuZXhwb3J0IGNvbnN0IFJFUlVOX1RFU1RTX0VOViA9ICdCUk9XU0VSU1RBQ0tfUkVSVU5fVEVTVFMnXG5cbi8vIFRoZSB0ZXN0cyB0aGF0IG5lZWRzIHRvIGJlIHJlcnVuXG5leHBvcnQgY29uc3QgUkVSVU5fRU5WID0gJ0JST1dTRVJTVEFDS19SRVJVTidcblxuLy8gVG8gc3RvcmUgd2hldGhlciB0aGUgYnVpbGQgbGF1bmNoIGhhcyBjb21wbGV0ZWQgb3Igbm90XG5leHBvcnQgY29uc3QgVEVTVE9QU19CVUlMRF9DT01QTEVURURfRU5WID0gJ0JTX1RFU1RPUFNfQlVJTERfQ09NUExFVEVEJ1xuXG4vLyBXaGV0aGVyIHBlcmN5IGhhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSBvciBub3RcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfUEVSQ1kgPSAnQlJPV1NFUlNUQUNLX1BFUkNZJ1xuXG4vLyBXaGV0aGVyIHNlc3Npb24gaXMgYSBhY2Nlc3NpYmlsaXR5IHNlc3Npb25cbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWSA9ICdCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWSdcblxuLy8gV2hldGhlciBzZXNzaW9uIGlzIGEgdGVzdCByZXBvcnRpbmcgc2Vzc2lvblxuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZID0gJ0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZJ1xuXG4vLyBMb2FkIFRlc3RpbmcgU2VydmljZSAoTFRTKSBlbnYgdmFyczogdGhlIHBvZC1pdGVyYXRpb24gc2Vzc2lvbiBpZCAoaXRzXG4vLyBwcmVzZW5jZSBpcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgXCJ0aGlzIHJ1biBpcyBhbiBMVFMgcG9kXG4vLyBpdGVyYXRpb25cIikgYW5kIGFuIG9wdGlvbmFsIG9wdC1pbiBmbGFnIGZvciBsb2NhbCByZXBybyAvIENJIHJ1bnMgdGhhdFxuLy8gZG9uJ3QgaGF2ZSBhIHJlYWwgc2Vzc2lvbiBpZC5cbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQgPSAnQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEJ1xuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19MVFMgPSAnQlJPV1NFUlNUQUNLX0xUUydcblxuLy8gTmV3IFRlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MgZW52aXJvbm1lbnQgdmFyaWFibGVzXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1RFU1RfUkVQT1JUSU5HID0gJ0JST1dTRVJTVEFDS19URVNUX1JFUE9SVElORydcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVF9SRVBPUlRJTkdfREVCVUcgPSAnQlJPV1NFUlNUQUNLX1RFU1RfUkVQT1JUSU5HX0RFQlVHJ1xuZXhwb3J0IGNvbnN0IFRFU1RfUkVQT1JUSU5HX0JVSUxEX1RBRyA9ICdURVNUX1JFUE9SVElOR19CVUlMRF9UQUcnXG5leHBvcnQgY29uc3QgVEVTVF9SRVBPUlRJTkdfUFJPSkVDVF9OQU1FID0gJ1RFU1RfUkVQT1JUSU5HX1BST0pFQ1RfTkFNRSdcbmV4cG9ydCBjb25zdCBURVNUX1JFUE9SVElOR19CVUlMRF9OQU1FID0gJ1RFU1RfUkVQT1JUSU5HX0JVSUxEX05BTUUnXG5cbi8vIE1heGltdW0gc2l6ZSBvZiBWQ1MgaW5mbyB3aGljaCBpcyBhbGxvd2VkXG5leHBvcnQgY29uc3QgTUFYX0dJVF9NRVRBX0RBVEFfU0laRV9JTl9CWVRFUyA9IDY0ICogMTAyNFxuXG4vKiBUaGUgdmFsdWUgdG8gYmUgYXBwZW5kZWQgYXQgdGhlIGVuZCBpZiBnaXQgbWV0YWRhdGEgaXMgbGFyZ2VyIHRoYW4gTUFYX0dJVF9NRVRBX0RBVEFfU0laRV9JTl9CWVRFU1xuKi9cbmV4cG9ydCBjb25zdCBHSVRfTUVUQV9EQVRBX1RSVU5DQVRFRCA9ICcuLi5bVFJVTkNBVEVEXSdcblxuLy8gQ0xJIHJlbGF0ZWQgY29uc3RhbnRzXG5leHBvcnQgY29uc3QgQ0xJX1NUT1BfVElNRU9VVCA9IDUwMDAgLy8gNSBzZWNvbmRzXG5leHBvcnQgY29uc3QgQklOQVJZX0JVU1lfRVJST1JfQ09ERVMgPSBbJ0VUWFRCU1knLCAnRUJVU1knXVxuZXhwb3J0IGNvbnN0IE1BWF9TUEFXTl9SRVRSSUVTID0gM1xuZXhwb3J0IGNvbnN0IFNQQVdOX1JFVFJZX0RFTEFZX01TID0gMTAwMFxuZXhwb3J0IGNvbnN0IFdESU9fTkFNSU5HX1BSRUZJWCA9ICdXZWJkcml2ZXJJTy0nXG5leHBvcnQgY29uc3QgUEVSRl9NRVRSSUNTX1dBSVRfVElNRSA9IDIwMDBcblxuLy8gQVBJIEVuZHBvaW50IGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IFVQREFURURfQ0xJX0VORFBPSU5UID0gJ3Nkay92MS91cGRhdGVfY2xpJ1xuXG4vKipcbiAqIE1vZHVsZSBIb29rIEV2ZW50cyAtIFBlcmZvcm1hbmNlIGV2ZW50IG5hbWVzIGZvciBtb2R1bGUgbGlmZWN5Y2xlIHRyYWNraW5nXG4gKiBVc2VkIGJ5IG1vZHVsZS1ob29rLXRyYWNrZXIudHMgdG8gaW5zdHJ1bWVudCBtb2R1bGUgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFudXBcbiAqL1xuZXhwb3J0IGNvbnN0IE1PRFVMRV9IT09LX0VWRU5UUyA9IHtcbiAgICAvLyBJbnN0cnVtZW50YXRpb24gbW9kdWxlXG4gICAgSU5TVFJVTUVOVEFUSU9OX09OX1NUQVJUOiAnTU9EVUxFX0lOU1RSVU1FTlRBVElPTl9PTl9TVEFSVCcsXG4gICAgSU5TVFJVTUVOVEFUSU9OX09OX1NUT1A6ICdNT0RVTEVfSU5TVFJVTUVOVEFUSU9OX09OX1NUT1AnLFxuXG4gICAgLy8gVGVzdEh1YiBtb2R1bGVcbiAgICBURVNUSFVCX09OX1NUQVJUOiAnTU9EVUxFX1RFU1RIVUJfT05fU1RBUlQnLFxuICAgIFRFU1RIVUJfT05fU1RPUDogJ01PRFVMRV9URVNUSFVCX09OX1NUT1AnLFxuXG4gICAgLy8gT2JzZXJ2YWJpbGl0eSBtb2R1bGVcbiAgICBPQlNFUlZBQklMSVRZX09OX1NUQVJUOiAnTU9EVUxFX09CU0VSVkFCSUxJVFlfT05fU1RBUlQnLFxuICAgIE9CU0VSVkFCSUxJVFlfT05fU1RPUDogJ01PRFVMRV9PQlNFUlZBQklMSVRZX09OX1NUT1AnLFxuXG4gICAgLy8gUGVyY3kgbW9kdWxlXG4gICAgUEVSQ1lfT05fU1RBUlQ6ICdNT0RVTEVfUEVSQ1lfT05fU1RBUlQnLFxuICAgIFBFUkNZX09OX1NUT1A6ICdNT0RVTEVfUEVSQ1lfT05fU1RPUCcsXG5cbiAgICAvLyBBY2Nlc3NpYmlsaXR5IG1vZHVsZVxuICAgIEFDQ0VTU0lCSUxJVFlfT05fU1RBUlQ6ICdNT0RVTEVfQUNDRVNTSUJJTElUWV9PTl9TVEFSVCcsXG4gICAgQUNDRVNTSUJJTElUWV9PTl9TVE9QOiAnTU9EVUxFX0FDQ0VTU0lCSUxJVFlfT05fU1RPUCcsXG4gICAgQUNDRVNTSUJJTElUWV9PTl9EUklWRVJfSU5JVDogJ01PRFVMRV9BQ0NFU1NJQklMSVRZX09OX0RSSVZFUl9JTklUJyxcblxuICAgIC8vIEFJIG1vZHVsZVxuICAgIEFJX09OX1NUQVJUOiAnTU9EVUxFX0FJX09OX1NUQVJUJyxcbiAgICBBSV9PTl9TVE9QOiAnTU9EVUxFX0FJX09OX1NUT1AnLFxuICAgIEFJX0JFRk9SRV9TRVNTSU9OOiAnTU9EVUxFX0FJX0JFRk9SRV9TRVNTSU9OJyxcbiAgICBBSV9PTl9EUklWRVJfSU5JVDogJ01PRFVMRV9BSV9PTl9EUklWRVJfSU5JVCcsXG5cbiAgICAvLyBMb2NhbCB0ZXN0aW5nIG1vZHVsZVxuICAgIExPQ0FMX09OX1NUQVJUOiAnTU9EVUxFX0xPQ0FMX09OX1NUQVJUJyxcbiAgICBMT0NBTF9PTl9TVE9QOiAnTU9EVUxFX0xPQ0FMX09OX1NUT1AnLFxuICAgIExPQ0FMX0lOSVRfU0VTU0lPTjogJ01PRFVMRV9MT0NBTF9JTklUX1NFU1NJT04nLFxuICAgIExPQ0FMX09OX0RSSVZFUl9JTklUOiAnTU9EVUxFX0xPQ0FMX09OX0RSSVZFUl9JTklUJyxcblxuICAgIC8vIEFwcCBBdXRvbWF0ZSBtb2R1bGVcbiAgICBBUFBBVVRPTUFURV9PTl9TVEFSVDogJ01PRFVMRV9BUFBBVVRPTUFURV9PTl9TVEFSVCcsXG4gICAgQVBQQVVUT01BVEVfT05fRFJJVkVSX0lOSVQ6ICdNT0RVTEVfQVBQQVVUT01BVEVfT05fRFJJVkVSX0lOSVQnLFxufSBhcyBjb25zdFxuIiwgImV4cG9ydCBkZWZhdWx0IGNsYXNzIEFQSVV0aWxzIHtcbiAgICBzdGF0aWMgRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9zZGsvdjEvZXZlbnQnXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BQV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19QRVJDWV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfQ0xPVURfVVJMID0gJ2h0dHBzOi8vYXBpLWNsb3VkLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BQV9BUElfQ0xPVURfVVJMID0gJ2h0dHBzOi8vYXBpLWNsb3VkLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEFQUF9BTExZX0VORFBPSU5UID0gJ2h0dHBzOi8vYXBwLWFjY2Vzc2liaWxpdHkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZSdcbiAgICBzdGF0aWMgREFUQV9FTkRQT0lOVCA9ICdodHRwczovL2NvbGxlY3Rvci1vYnNlcnZhYmlsaXR5LmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIFVQTE9BRF9MT0dTX0FERFJFU1MgPSAnaHR0cHM6Ly91cGxvYWQtb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBFRFNfVVJMID0gJ2h0dHBzOi8vZWRzLmJyb3dzZXJzdGFjay5jb20nXG5cbiAgICBzdGF0aWMgdXBkYXRlVVJMU0ZvckdSUihhcGlzOiBHUlJVcmxzKSB7XG4gICAgICAgIHRoaXMuRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSBgJHthcGlzLmF1dG9tYXRlLmFwaX0vc2RrL3YxL2V2ZW50YFxuICAgICAgICB0aGlzLkJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfVVJMID0gYXBpcy5hdXRvbWF0ZS5hcGlcbiAgICAgICAgdGhpcy5CUk9XU0VSU1RBQ0tfQUFfQVBJX1VSTCA9IGFwaXMuYXBwQXV0b21hdGUuYXBpXG4gICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX1BFUkNZX0FQSV9VUkwgPSBhcGlzLnBlcmN5LmFwaVxuICAgICAgICB0aGlzLkJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfQ0xPVURfVVJMID0gYXBpcy5hdXRvbWF0ZS51cGxvYWRcbiAgICAgICAgdGhpcy5CUk9XU0VSU1RBQ0tfQUFfQVBJX0NMT1VEX1VSTCA9IGFwaXMuYXBwQXV0b21hdGUudXBsb2FkXG4gICAgICAgIHRoaXMuQVBQX0FMTFlfRU5EUE9JTlQgPSBgJHthcGlzLmFwcEFjY2Vzc2liaWxpdHkuYXBpfS9hdXRvbWF0ZWBcbiAgICAgICAgdGhpcy5EQVRBX0VORFBPSU5UID0gYXBpcy5vYnNlcnZhYmlsaXR5LmFwaVxuICAgICAgICB0aGlzLlVQTE9BRF9MT0dTX0FERFJFU1MgPSBhcGlzLm9ic2VydmFiaWxpdHkudXBsb2FkXG4gICAgICAgIHRoaXMuRURTX1VSTCA9IGFwaXMuZWRzSW5zdHJ1bWVudGF0aW9uLmFwaVxuICAgIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IHBsYXRmb3JtLCBhcmNoLCBob21lZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB1dGlsLCB7IHByb21pc2lmeSB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ25vZGU6c3RyZWFtJ1xuaW1wb3J0IHR5cGUgeyBaaXBGaWxlLCBPcHRpb25zIGFzIHlhdXpsT3B0aW9ucyB9IGZyb20gJ3lhdXpsJ1xuaW1wb3J0IHlhdXpsIGZyb20gJ3lhdXpsJ1xuaW1wb3J0IHsgdGhyZWFkSWQgfSBmcm9tICdub2RlOndvcmtlcl90aHJlYWRzJ1xuXG5pbXBvcnQgeyBfZmV0Y2ggYXMgZmV0Y2ggfSBmcm9tICcuLi9mZXRjaFdyYXBwZXIuanMnXG5cbmltcG9ydCB7XG4gICAgaXNOdWxsT3JFbXB0eSxcbiAgICBuZXN0ZWRLZXlWYWx1ZSxcbiAgICBjcmVhdGVEaXIsXG4gICAgaXNXcml0YWJsZSxcbiAgICBzZXRSZWFkV3JpdGVBY2Nlc3MsXG4gICAgaXNUcnVlLFxuICAgIGdldEJyb3dzZXJTdGFja1VzZXIsXG4gICAgZ2V0QnJvd3NlclN0YWNrS2V5LFxuICAgIGlzRmFsc2UsXG4gICAgaXNUdXJib1NjYWxlLFxuICAgIHNob3VsZEFkZFNlcnZpY2VWZXJzaW9uLFxufSBmcm9tICcuLi91dGlsLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4uL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgeyBFVkVOVFMgYXMgUGVyZm9ybWFuY2VFdmVudHMgfSBmcm9tICcuLi9pbnN0cnVtZW50YXRpb24vcGVyZm9ybWFuY2UvY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIGFzIGxvZ2dlciB9IGZyb20gJy4vY2xpTG9nZ2VyLmpzJ1xuaW1wb3J0IHsgVVBEQVRFRF9DTElfRU5EUE9JTlQsIEJTVEFDS19TRVJWSUNFX1ZFUlNJT04sIEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zLCBDYXBhYmlsaXRpZXMgfSBmcm9tICdAd2Rpby90eXBlcydcbmltcG9ydCB0eXBlIHtcbiAgICBCcm93c2Vyc3RhY2tDb25maWcsXG4gICAgQnJvd3NlcnN0YWNrT3B0aW9ucyxcbiAgICBUZXN0TWFuYWdlbWVudE9wdGlvbnMsXG4gICAgVGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLFxufSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IFRlc3RGcmFtZXdvcmtDb25zdGFudHMgfSBmcm9tICcuL2ZyYW1ld29ya3MvY29uc3RhbnRzL3Rlc3RGcmFtZXdvcmtDb25zdGFudHMuanMnXG5pbXBvcnQgQVBJVXRpbHMgZnJvbSAnLi9hcGlVdGlscy5qcydcblxuY29uc3QgQ0xJX0xPQ0tfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDBcbmNvbnN0IENMSV9MT0NLX1BPTExfTVMgPSAxMDAwXG5jb25zdCBDTElfRE9XTkxPQURfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDBcbmNvbnN0IENMSV9ET1dOTE9BRF9UTVBfUFJFRklYID0gJ2Rvd25sb2FkZWRfZmlsZV8nXG5jb25zdCBDTElfRE9XTkxPQURfVE1QX1NVRkZJWCA9ICcuemlwJ1xuXG5leHBvcnQgY2xhc3MgQ0xJVXRpbHMge1xuICAgIHN0YXRpYyBhdXRvbWF0aW9uRnJhbWV3b3JrRGV0YWlsID0ge31cbiAgICBzdGF0aWMgdGVzdEZyYW1ld29ya0RldGFpbCA9IHt9XG4gICAgc3RhdGljIENMSVN1cHBvcnRlZEZyYW1ld29ya3MgPSBbJ21vY2hhJ11cblxuICAgIHN0YXRpYyBpc0RldmVsb3BtZW50RW52KCkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0NMSV9FTlYgPT09ICdkZXZlbG9wbWVudCdcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0Q0xJUGFyYW1zRm9yRGV2RW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19DTElfRU5WIHx8ICcnLFxuICAgICAgICAgICAgbGlzdGVuOiBgdW5peDovdG1wL3Nkay1wbGF0Zm9ybS0ke3Byb2Nlc3MuZW52LkJST1dTRVJTVEFDS19DTElfRU5WfS5zb2NrYCxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGNvbmZpZyBvYmplY3QgZm9yIGJpbmFyeSBzZXNzaW9uIHJlcXVlc3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRCaW5Db25maWcoXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICAgICBjYXBhYmlsaXRpZXM6XG4gICAgICAgICAgICB8IENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRTdGFuZGFsb25lQ2FwYWJpbGl0aWVzXG4gICAgICAgICAgICB8IENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRTdGFuZGFsb25lQ2FwYWJpbGl0aWVzW10sXG4gICAgICAgIG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIEJyb3dzZXJzdGFja09wdGlvbnMsXG4gICAgICAgIGJ1aWxkVGFnPzogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBjb25zdCBtb2RpZmllZE9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5vcHRpb25zIH1cbiAgICAgICAgaWYgKG1vZGlmaWVkT3B0cy5vcHRzKSB7XG4gICAgICAgICAgICBtb2RpZmllZE9wdHMuYnJvd3NlclN0YWNrTG9jYWxPcHRpb25zID0gbW9kaWZpZWRPcHRzLm9wdHNcbiAgICAgICAgICAgIGRlbGV0ZSBtb2RpZmllZE9wdHMub3B0c1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBtb2RpZmllZE9wdHMudGVzdE1hbmFnZW1lbnRPcHRpb25zXG5cbiAgICAgICAgbW9kaWZpZWRPcHRzLnRlc3RDb250ZXh0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHNraXBTZXNzaW9uTmFtZTogaXNGYWxzZShtb2RpZmllZE9wdHMuc2V0U2Vzc2lvbk5hbWUpLFxuICAgICAgICAgICAgc2tpcFNlc3Npb25TdGF0dXM6IGlzRmFsc2UobW9kaWZpZWRPcHRzLnNldFNlc3Npb25TdGF0dXMpLFxuICAgICAgICAgICAgc2Vzc2lvbk5hbWVPbWl0VGVzdFRpdGxlOiBtb2RpZmllZE9wdHMuc2Vzc2lvbk5hbWVPbWl0VGVzdFRpdGxlIHx8IGZhbHNlLFxuICAgICAgICAgICAgc2Vzc2lvbk5hbWVQcmVwZW5kVG9wTGV2ZWxTdWl0ZVRpdGxlOlxuICAgICAgICAgICAgICAgIG1vZGlmaWVkT3B0cy5zZXNzaW9uTmFtZVByZXBlbmRUb3BMZXZlbFN1aXRlVGl0bGUgfHwgZmFsc2UsXG4gICAgICAgICAgICBzZXNzaW9uTmFtZUZvcm1hdDogbW9kaWZpZWRPcHRzLnNlc3Npb25OYW1lRm9ybWF0IHx8ICcnLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tbW9uQnN0YWNrT3B0aW9ucyA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzICYmXG4gICAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoY2FwYWJpbGl0aWVzKSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBjYXBhYmlsaXRpZXMgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgJ2JzdGFjazpvcHRpb25zJyBpbiAoY2FwYWJpbGl0aWVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FzdCBhZnRlciBndWFyZCB0byBzYXRpc2Z5IFR5cGVTY3JpcHRcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMgYXMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnYnN0YWNrOm9wdGlvbnMnXT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApWydic3RhY2s6b3B0aW9ucyddIHx8IHt9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH0pKClcblxuICAgICAgICBjb25zdCBpc05vbkJzdGFja0ExMXkgPVxuICAgICAgICAgICAgaXNUdXJib1NjYWxlKG9wdGlvbnMpIHx8XG4gICAgICAgICAgICAhc2hvdWxkQWRkU2VydmljZVZlcnNpb24oXG4gICAgICAgICAgICAgICAgY29uZmlnIGFzIE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICAgICAgICAgICAgICBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgICAgKVxuICAgICAgICBjb25zdCBvYnNlcnZhYmlsaXR5T3B0aW9uczogVGVzdE9ic2VydmFiaWxpdHlPcHRpb25zID1cbiAgICAgICAgICAgIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zIHx8IHt9XG4gICAgICAgIGNvbnN0IHRlc3RNYW5hZ2VtZW50T3B0aW9uczogVGVzdE1hbmFnZW1lbnRPcHRpb25zID1cbiAgICAgICAgICAgIG9wdGlvbnMudGVzdE1hbmFnZW1lbnRPcHRpb25zIHx8IHt9XG4gICAgICAgIGNvbnN0IHRlc3RQbGFuSWQgPSB0eXBlb2YgdGVzdE1hbmFnZW1lbnRPcHRpb25zLnRlc3RQbGFuSWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IHRlc3RNYW5hZ2VtZW50T3B0aW9ucy50ZXN0UGxhbklkLnRyaW0oKVxuICAgICAgICAgICAgOiAnJ1xuICAgICAgICBjb25zdCBiaW5jb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICAgICAgdXNlck5hbWU6IG9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXIgfHwgY29uZmlnLnVzZXIsXG4gICAgICAgICAgICBhY2Nlc3NLZXk6IG9ic2VydmFiaWxpdHlPcHRpb25zLmtleSB8fCBjb25maWcua2V5LFxuICAgICAgICAgICAgcGxhdGZvcm1zOiBbXSxcbiAgICAgICAgICAgIGlzTm9uQnN0YWNrQTExeVdESU86IGlzTm9uQnN0YWNrQTExeSxcbiAgICAgICAgICAgIC4uLm1vZGlmaWVkT3B0cyxcbiAgICAgICAgICAgIC4uLmNvbW1vbkJzdGFja09wdGlvbnMsXG4gICAgICAgIH1cblxuICAgICAgICBiaW5jb25maWcuYnVpbGROYW1lID0gb2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGROYW1lIHx8IGJpbmNvbmZpZy5idWlsZE5hbWVcbiAgICAgICAgYmluY29uZmlnLnByb2plY3ROYW1lID0gb2JzZXJ2YWJpbGl0eU9wdGlvbnMucHJvamVjdE5hbWUgfHwgYmluY29uZmlnLnByb2plY3ROYW1lXG4gICAgICAgIGJpbmNvbmZpZy5idWlsZFRhZyA9IHRoaXMuZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhvYnNlcnZhYmlsaXR5T3B0aW9ucywgYnVpbGRUYWcpIHx8IFtdXG4gICAgICAgIGlmICh0ZXN0UGxhbklkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGJpbmNvbmZpZy50ZXN0TWFuYWdlbWVudE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdGVzdFBsYW5JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhcHMgPSBBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykgPyBjYXBhYmlsaXRpZXMgOiBbY2FwYWJpbGl0aWVzXVxuICAgICAgICBmb3IgKGNvbnN0IGNhcCBvZiBjYXBzKSB7XG4gICAgICAgICAgICBjb25zdCBwbGF0Zm9ybTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgICAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IGNhcCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjYXBhYmlsaXR5KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnYnN0YWNrOm9wdGlvbnMnKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1ba2V5XSA9IGNhcGFiaWxpdHlba2V5XVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGlmIChjYXBhYmlsaXR5Wydic3RhY2s6b3B0aW9ucyddKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoXG4gICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1ba2V5XSA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIClba2V5XVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoYmluY29uZmlnLnBsYXRmb3JtcyBhcyBBcnJheTx1bmtub3duPikucHVzaChwbGF0Zm9ybSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYmluY29uZmlnKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRTZGtWZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTlxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRTZGtMYW5ndWFnZSgpIHtcbiAgICAgICAgcmV0dXJuICdFQ01BU2NyaXB0J1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBzZXR1cENsaVBhdGgoXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0NvbmZpZ3VyaW5nIENsaSBwYXRoLicpXG4gICAgICAgIGNvbnN0IGRldmVsb3BtZW50QmluYXJ5UGF0aCA9IHByb2Nlc3MuZW52LlNES19DTElfQklOX1BBVEggfHwgbnVsbFxuICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoZGV2ZWxvcG1lbnRCaW5hcnlQYXRoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBEZXZlbG9wbWVudCBDbGkgUGF0aDogJHtkZXZlbG9wbWVudEJpbmFyeVBhdGh9YClcbiAgICAgICAgICAgIHJldHVybiBkZXZlbG9wbWVudEJpbmFyeVBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjbGlEaXIgPSB0aGlzLmdldENsaURpcigpXG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShjbGlEaXIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB3cml0YWJsZSBkaXJlY3RvcnkgYXZhaWxhYmxlIGZvciB0aGUgQ0xJJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xpUGF0aCA9IHRoaXMuZ2V0RXhpc3RpbmdDbGlQYXRoKGNsaURpcilcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsQmluYXJ5UGF0aCA9IGF3YWl0IHRoaXMuY2hlY2tBbmRVcGRhdGVDbGkoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdDbGlQYXRoLFxuICAgICAgICAgICAgICAgIGNsaURpcixcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFJlc29sdmVkIGJpbmFyeSBwYXRoOiAke2ZpbmFsQmluYXJ5UGF0aH1gKVxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsQmluYXJ5UGF0aFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgRXJyb3IgaW4gc2V0dGluZyB1cCBjbGkgcGF0aCBkaXJlY3RvcnksIEV4Y2VwdGlvbjogJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgY2hlY2tBbmRVcGRhdGVDbGkoXG4gICAgICAgIGV4aXN0aW5nQ2xpUGF0aDogc3RyaW5nLFxuICAgICAgICBjbGlEaXI6IHN0cmluZyxcbiAgICAgICAgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsXG4gICAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIC8vIFNraXAgQ0xJIHVwZGF0ZSBpbiB3b3JrZXIgcHJvY2Vzc2VzIC0gb25seSBsYXVuY2hlciBzaG91bGQgdXBkYXRlXG4gICAgICAgIC8vIFdvcmtlcnMgYXJlIGlkZW50aWZpZWQgYnkgaGF2aW5nIEJST1dTRVJTVEFDS19URVNUSFVCX0pXVCBzZXQgKGJ1aWxkIGFscmVhZHkgc3RhcnRlZClcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUSFVCX0pXVCkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBXb3JrZXIgcHJvY2VzcyBkZXRlY3RlZCwgc2tpcHBpbmcgQ0xJIHVwZGF0ZS4gVXNpbmcgZXhpc3Rpbmc6ICR7ZXhpc3RpbmdDbGlQYXRofWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdDbGlQYXRoICYmIGZzLmV4aXN0c1N5bmMoZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0NsaVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICdXb3JrZXIgcHJvY2VzcyBoYXMgbm8gZXhpc3RpbmcgQ0xJIGJpbmFyeSwgYXR0ZW1wdGluZyBkb3dubG9hZCBhcyBmYWxsYmFjay4nLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuc3RhcnQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgIGxvZ2dlci5pbmZvKGBDdXJyZW50IENMSSBQYXRoIEZvdW5kOiAke2V4aXN0aW5nQ2xpUGF0aH1gKVxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIHNka192ZXJzaW9uOiBDTElVdGlscy5nZXRTZGtWZXJzaW9uKCksXG4gICAgICAgICAgICBvczogcGxhdGZvcm0oKSxcbiAgICAgICAgICAgIG9zX2FyY2g6IGFyY2goKSxcbiAgICAgICAgICAgIGNsaV92ZXJzaW9uOiAnMCcsXG4gICAgICAgICAgICBzZGtfbGFuZ3VhZ2U6IHRoaXMuZ2V0U2RrTGFuZ3VhZ2UoKSxcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgLy8gSWYgYmluYXJ5IGlzIGJ1c3kgKGJlaW5nIGV4ZWN1dGVkIGJ5IGFub3RoZXIgcHJvY2VzcyksIHNraXAgdmVyc2lvbiBjaGVja1xuICAgICAgICAgICAgLy8gYW5kIEFQSSBjYWxsIGVudGlyZWx5IFx1MjAxNCB1c2UgZXhpc3RpbmcgYmluYXJ5IGFzLWlzXG4gICAgICAgICAgICBpZiAodGhpcy5pc0JpbmFyeUJ1c3koZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBFeGlzdGluZyBiaW5hcnkgaXMgY3VycmVudGx5IGluIHVzZSwgc2tpcHBpbmcgdXBkYXRlOiAke2V4aXN0aW5nQ2xpUGF0aH1gKVxuICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChQZXJmb3JtYW5jZUV2ZW50cy5TREtfQ0xJX0NIRUNLX1VQREFURSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdDbGlQYXRoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgdGhpcy5ydW5TaGVsbENvbW1hbmQoXG4gICAgICAgICAgICAgICAgYCR7ZXhpc3RpbmdDbGlQYXRofSB2ZXJzaW9uYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmICh2ZXJzaW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3RleHQgZmlsZSBidXN5JykpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgQmluYXJ5IGJ1c3kgZHVyaW5nIHZlcnNpb24gY2hlY2ssIHNraXBwaW5nIHVwZGF0ZTogJHtleGlzdGluZ0NsaVBhdGh9YClcbiAgICAgICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2xpUGF0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnlQYXJhbXMuY2xpX3ZlcnNpb24gPSB2ZXJzaW9uXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3RUb1VwZGF0ZUNMSShxdWVyeVBhcmFtcywgY29uZmlnKVxuICAgICAgICBpZiAobmVzdGVkS2V5VmFsdWUocmVzcG9uc2UsIFsndXBkYXRlZF9jbGlfdmVyc2lvbiddKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBOZWVkIHRvIHVwZGF0ZSBiaW5hcnksIGN1cnJlbnQgYmluYXJ5IHZlcnNpb246ICR7cXVlcnlQYXJhbXMuY2xpX3ZlcnNpb259YCxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgY29uc3QgYnJvd3NlclN0YWNrQmluYXJ5VXJsID1cbiAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQklOQVJZX1VSTCB8fCBudWxsXG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoYnJvd3NlclN0YWNrQmluYXJ5VXJsKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgYFVzaW5nIEJST1dTRVJTVEFDS19CSU5BUllfVVJMOiAke2Jyb3dzZXJTdGFja0JpbmFyeVVybH1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXNwb25zZS51cmwgPSBicm93c2VyU3RhY2tCaW5hcnlVcmxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmluYWxCaW5hcnlQYXRoID0gYXdhaXQgdGhpcy5kb3dubG9hZExhdGVzdEJpbmFyeShcbiAgICAgICAgICAgICAgICBuZXN0ZWRLZXlWYWx1ZShyZXNwb25zZSwgWyd1cmwnXSksXG4gICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfQ0hFQ0tfVVBEQVRFKVxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsQmluYXJ5UGF0aFxuICAgICAgICB9XG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChQZXJmb3JtYW5jZUV2ZW50cy5TREtfQ0xJX0NIRUNLX1VQREFURSlcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2xpUGF0aFxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRDbGlEaXIoKSB7XG4gICAgICAgIGNvbnN0IHdyaXRhYmxlRGlyID0gdGhpcy5nZXRXcml0YWJsZURpcigpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eSh3cml0YWJsZURpcikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHdyaXRhYmxlIGRpcmVjdG9yeSBhdmFpbGFibGUgZm9yIHRoZSBDTEknKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2xpRGlyUGF0aCA9IHBhdGguam9pbih3cml0YWJsZURpciEsICdjbGknKVxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNsaURpclBhdGgpKSB7XG4gICAgICAgICAgICAgICAgY3JlYXRlRGlyKGNsaURpclBhdGgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xpRGlyUGF0aFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBgRXJyb3IgaW4gZ2V0dGluZyB3cml0YWJsZSBkaXJlY3RvcnksIHdyaXRhYmxlRGlyPSR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0V3JpdGFibGVEaXIoKSB7XG4gICAgICAgIGNvbnN0IHdyaXRhYmxlRGlyT3B0aW9ucyA9IFtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19GSUxFU19ESVIsXG4gICAgICAgICAgICBwYXRoLmpvaW4oaG9tZWRpcigpLCAnLmJyb3dzZXJzdGFjaycpLFxuICAgICAgICAgICAgcGF0aC5qb2luKCd0bXAnLCAnLmJyb3dzZXJzdGFjaycpLFxuICAgICAgICBdXG5cbiAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHdyaXRhYmxlRGlyT3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkocGF0aCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoISkpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBGaWxlICR7cGF0aH0gYWxyZWFkeSBleGlzdGApXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNXcml0YWJsZShwYXRoISkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgR2l2aW5nIHdyaXRlIHBlcm1pc3Npb24gdG8gJHtwYXRofWApXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gc2V0UmVhZFdyaXRlQWNjZXNzKHBhdGghKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RydWUoc3VjY2VzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFVuYWJsZSB0byBwcm92aWRlIHdyaXRlIHBlcm1pc3Npb24gdG8gJHtwYXRofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBGaWxlIGRvZXMgbm90IGV4aXN0OiAke3BhdGh9YClcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGlyKHBhdGghKVxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEdpdmluZyB3cml0ZSBwZXJtaXNzaW9uIHRvICR7cGF0aH1gKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gc2V0UmVhZFdyaXRlQWNjZXNzKHBhdGghKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVHJ1ZShzdWNjZXNzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFVuYWJsZSB0byBwcm92aWRlIHdyaXRlIHBlcm1pc3Npb24gdG8gJHtwYXRofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYFVuYWJsZSB0byBnZXQgd3JpdGFibGUgZGlyZWN0b3J5LCBleGNlcHRpb24gJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgc3RhdGljIGdldEV4aXN0aW5nQ2xpUGF0aChjbGlEaXI6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhdGggZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeVxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNsaURpcikgfHwgIWZzLnN0YXRTeW5jKGNsaURpcikuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBMaXN0IGFsbCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgc3RhcnQgd2l0aCBcImJpbmFyeS1cIlxuICAgICAgICAgICAgY29uc3QgYWxsQmluYXJpZXMgPSBmc1xuICAgICAgICAgICAgICAgIC5yZWFkZGlyU3luYyhjbGlEaXIpXG4gICAgICAgICAgICAgICAgLm1hcCgoZmlsZTogc3RyaW5nKSA9PiBwYXRoLmpvaW4oY2xpRGlyLCBmaWxlKSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAoZmlsZVBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLnN0YXRTeW5jKGZpbGVQYXRoKS5pc0ZpbGUoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkuc3RhcnRzV2l0aCgnYmluYXJ5LScpLFxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKGFsbEJpbmFyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxhdGVzdCBiaW5hcnkgYnkgY29tcGFyaW5nIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWVcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3RCaW5hcnkgPSBhbGxCaW5hcmllc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChmaWxlUGF0aDogc3RyaW5nKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtdGltZTogZnMuc3RhdFN5bmMoZmlsZVBhdGgpLm10aW1lLFxuICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3Q6IHsgZmlsZVBhdGg6IHN0cmluZzsgbXRpbWU6IERhdGUgfSB8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudDogeyBmaWxlUGF0aDogc3RyaW5nOyBtdGltZTogRGF0ZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXRlc3QgfHwgIWxhdGVzdC5tdGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Lm10aW1lID4gbGF0ZXN0Lm10aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhdGVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXR1cm4gbGF0ZXN0QmluYXJ5ID8gbGF0ZXN0QmluYXJ5LmZpbGVQYXRoIDogJydcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICcnIC8vIE5vIGJpbmFyeSBwcmVzZW50XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBFcnJvciB3aGlsZSByZWFkaW5nIENMSSBwYXRoOiAke3V0aWwuZm9ybWF0KGVycil9YClcbiAgICAgICAgICAgIHJldHVybiAnJ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGlzQmluYXJ5QnVzeShiaW5hcnlQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkoYmluYXJ5UGF0aCkpIHtyZXR1cm4gZmFsc2V9XG4gICAgICAgIGlmIChwbGF0Zm9ybSgpID09PSAnZGFyd2luJykge3JldHVybiBmYWxzZX1cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGJpbmFyeVBhdGgpKSB7cmV0dXJuIGZhbHNlfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmZCA9IGZzLm9wZW5TeW5jKGJpbmFyeVBhdGgsICdyKycpXG4gICAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChCSU5BUllfQlVTWV9FUlJPUl9DT0RFUy5pbmNsdWRlcyhlcnIuY29kZSkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEJpbmFyeSBpcyBidXN5OiAke2JpbmFyeVBhdGh9YClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBFcnJvciBjaGVja2luZyBpZiBiaW5hcnkgaXMgYnVzeTogJHtlcnIubWVzc2FnZX1gKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcmVxdWVzdFRvVXBkYXRlQ0xJID0gYXN5bmMgKFxuICAgICAgICBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICAgICAgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsXG4gICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocXVlcnlQYXJhbXMpXG4gICAgICAgIGNvbnN0IHJlcXVlc3RJbml0OiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7Z2V0QnJvd3NlclN0YWNrVXNlcihjb25maWcpfToke2dldEJyb3dzZXJTdGFja0tleShjb25maWcpfWApLnRvU3RyaW5nKCdiYXNlNjQnKX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgYCR7QVBJVXRpbHMuQlJPV1NFUlNUQUNLX0FVVE9NQVRFX0FQSV9VUkx9LyR7VVBEQVRFRF9DTElfRU5EUE9JTlR9PyR7cGFyYW1zLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgICAgIHJlcXVlc3RJbml0LFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGpzb25SZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgICBsb2dnZXIuZGVidWcoYHJlc3BvbnNlICR7SlNPTi5zdHJpbmdpZnkoanNvblJlc3BvbnNlKX1gKVxuICAgICAgICByZXR1cm4ganNvblJlc3BvbnNlXG4gICAgfVxuXG4gICAgc3RhdGljIHJ1blNoZWxsQ29tbWFuZChcbiAgICAgICAgY21kQ29tbWFuZDogc3RyaW5nLFxuICAgICAgICB3b3JraW5nRGlyID0gJycsXG4gICAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzID0gZXhlYyhcbiAgICAgICAgICAgICAgICBjbWRDb21tYW5kLFxuICAgICAgICAgICAgICAgIHsgY3dkOiB3b3JraW5nRGlyLCB0aW1lb3V0OiA1MDAwIH0sXG4gICAgICAgICAgICAgICAgKGVycm9yOiBFcnJvciwgc3Rkb3V0OiBzdHJpbmcsIHN0ZGVycjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzdGRlcnIudHJpbSgpIHx8ICdTSEVMTF9FWEVDVVRFX0VSUk9SJylcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgcHJvY2VzcyBpcyBraWxsZWQgaWYgaXQgZXhjZWVkcyB0aGUgdGltZW91dFxuICAgICAgICAgICAgcHJvY2Vzcy5vbignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgnU0hFTExfRVhFQ1VURV9FUlJPUicpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHN0YXRpYyBkb3dubG9hZExhdGVzdEJpbmFyeSA9IGFzeW5jIChcbiAgICAgICAgYmluRG93bmxvYWRVcmw6IHN0cmluZyxcbiAgICAgICAgY2xpRGlyOiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XG4gICAgICAgIGNvbnN0IGxvY2tQYXRoID0gcGF0aC5qb2luKGNsaURpciwgJ2Rvd25sb2FkLmxvY2snKVxuXG4gICAgICAgIGNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIG1zKSlcblxuICAgICAgICBjb25zdCBwYXJzZUxvY2tGaWxlID0gKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGxvY2tQYXRoLCAndXRmOCcpLnRyaW0oKVxuICAgICAgICAgICAgICAgIGNvbnN0IFtwaWRMaW5lLCB0aW1lc3RhbXBMaW5lXSA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAgICAgY29uc3QgcGlkID0gTnVtYmVyLnBhcnNlSW50KHBpZExpbmUsIDEwKVxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IE51bWJlci5wYXJzZUludCh0aW1lc3RhbXBMaW5lLCAxMClcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShwaWQpIHx8ICFOdW1iZXIuaXNGaW5pdGUodGltZXN0YW1wKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBwaWQsIHRpbWVzdGFtcCB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNQcm9jZXNzUnVubmluZyA9IChwaWQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocGlkLCAwKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjcXVpcmVMb2NrID0gYXN5bmMgKFxuICAgICAgICAgICAgdGltZW91dE1zID0gQ0xJX0xPQ0tfVElNRU9VVF9NUyxcbiAgICAgICAgICAgIHBvbGxNcyA9IENMSV9MT0NLX1BPTExfTVMsXG4gICAgICAgICk6IFByb21pc2U8KCgpID0+IHZvaWQpIHwgeyBhbHJlYWR5RXhpc3RzOiBzdHJpbmcgfT4gPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uIC0tIGludGVudGlvbmFsIHBvbGwgbG9vcDsgZXhpdHMgdmlhIHJldHVybi90aHJvdyBiZWxvd1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmZCA9IGZzLm9wZW5TeW5jKGxvY2tQYXRoLCAnd3gnKVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmZCwgYCR7cHJvY2Vzcy5waWR9XFxuJHtEYXRlLm5vdygpfVxcbmApXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWxseSBpZ25vcmUgd3JpdGUgZXJyb3JzOyB0aGUgb3BlbiBmZCBzdGlsbCBob2xkc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGV4Y2x1c2l2ZSBsb2NrIGFuZCB3aWxsIGJlIGNsb3NlZCBpbiBjbGVhbnVwXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLnVubGlua1N5bmMobG9ja1BhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlIGFzIHsgY29kZT86IHN0cmluZyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5jb2RlID09PSAnRUVYSVNUJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9ja01ldGEgPSBwYXJzZUxvY2tGaWxlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NrTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2tBZ2UgPSBEYXRlLm5vdygpIC0gbG9ja01ldGEudGltZXN0YW1wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVubmluZyA9IGlzUHJvY2Vzc1J1bm5pbmcobG9ja01ldGEucGlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcnVubmluZyB8fCBsb2NrQWdlID4gdGltZW91dE1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFN0YWxlIENMSSBkb3dubG9hZCBsb2NrIGRldGVjdGVkIChwaWQ9JHtsb2NrTWV0YS5waWR9LCBhZ2U9JHtsb2NrQWdlfW1zKS4gUmVtb3ZpbmcgbG9jay5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKGxvY2tQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZXhpc3RpbmcgYmluYXJ5IGFwcGVhcmVkIHdoaWxlIHdhaXRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQmluYXJ5ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTElVdGlscy5nZXRFeGlzdGluZ0NsaVBhdGgoY2xpRGlyKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQmluYXJ5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhleGlzdGluZ0JpbmFyeSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5zdGF0U3luYyhleGlzdGluZ0JpbmFyeSkuc2l6ZSA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEJpbmFyeSBhcHBlYXJlZCB3aGlsZSB3YWl0aW5nIGZvciBsb2NrOiAke2V4aXN0aW5nQmluYXJ5fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGFscmVhZHlFeGlzdHM6IGV4aXN0aW5nQmluYXJ5IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPiB0aW1lb3V0TXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaW1lb3V0IHdhaXRpbmcgZm9yIGxvY2s6ICR7bG9ja1BhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcChwb2xsTXMpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGVhbnVwVGVtcG9yYXJ5RG93bmxvYWRzID0gKG1heEFnZU1zID0gQ0xJX0xPQ0tfVElNRU9VVF9NUykgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICAgICAgLy8gTWF0Y2ggYm90aCBkb3dubG9hZCB6aXBzIChkb3dubG9hZGVkX2ZpbGVfKi56aXApIGFuZCBvcnBoYW4gZXh0cmFjdFxuICAgICAgICAgICAgICAgIC8vIHRlbXAgZmlsZXMgKDxuYW1lPi50bXAuPHBpZD4pIGxlZnQgYnkgY3Jhc2hlZCBwZWVyIHdvcmtlcnMuXG4gICAgICAgICAgICAgICAgY29uc3QgdG1wRXh0cmFjdFJlID0gL1xcLnRtcFxcLlxcZCskL1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZnMucmVhZGRpclN5bmMoY2xpRGlyKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0Rvd25sb2FkWmlwID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0c1dpdGgoQ0xJX0RPV05MT0FEX1RNUF9QUkVGSVgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5lbmRzV2l0aChDTElfRE9XTkxPQURfVE1QX1NVRkZJWClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNFeHRyYWN0VG1wID0gdG1wRXh0cmFjdFJlLnRlc3QoZW50cnkpXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNEb3dubG9hZFppcCAmJiAhaXNFeHRyYWN0VG1wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNsaURpciwgZW50cnkpXG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGF0czogZnMuU3RhdHNcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzID0gZnMuc3RhdFN5bmMoZmlsZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobm93IC0gc3RhdHMubXRpbWVNcyA8IG1heEFnZU1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKGZpbGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRlbGV0ZSB0ZW1wIENMSSBmaWxlICR7ZmlsZVBhdGh9OiAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBzY2FuIHRlbXAgQ0xJIGZpbGVzIGluICR7Y2xpRGlyfTogJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuc3RhcnQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9ET1dOTE9BRClcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBEb3dubG9hZGluZyBTREsgYmluYXJ5IGZyb206ICR7YmluRG93bmxvYWRVcmx9YClcblxuICAgICAgICBsZXQgZG93bmxvYWRFbmRlZCA9IGZhbHNlXG4gICAgICAgIGNvbnN0IGVuZERvd25sb2FkID0gKHN1Y2Nlc3MgPSB0cnVlLCBlcnJNc2c/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChkb3dubG9hZEVuZGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb3dubG9hZEVuZGVkID0gdHJ1ZVxuICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9ET1dOTE9BRClcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChcbiAgICAgICAgICAgICAgICBQZXJmb3JtYW5jZUV2ZW50cy5TREtfQ0xJX0RPV05MT0FELFxuICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIGVyck1zZyxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZWxlYXNlTG9jazogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBsb2NrUmVzdWx0ID0gYXdhaXQgYWNxdWlyZUxvY2soKVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBiaW5hcnkgYWxyZWFkeSBleGlzdHMgKGFub3RoZXIgcHJvY2VzcyBkb3dubG9hZGVkIGl0KVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBsb2NrUmVzdWx0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZW5kRG93bmxvYWQoKVxuICAgICAgICAgICAgICAgIHJldHVybiBsb2NrUmVzdWx0LmFscmVhZHlFeGlzdHNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVsZWFzZUxvY2sgPSBsb2NrUmVzdWx0XG5cbiAgICAgICAgICAgIC8vIFJlLWNoZWNrIGFmdGVyIGFjcXVpcmluZyBsb2NrXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0JpbmFyeSA9IENMSVV0aWxzLmdldEV4aXN0aW5nQ2xpUGF0aChjbGlEaXIpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdCaW5hcnkgJiZcbiAgICAgICAgICAgICAgICBmcy5leGlzdHNTeW5jKGV4aXN0aW5nQmluYXJ5KSAmJlxuICAgICAgICAgICAgICAgIGZzLnN0YXRTeW5jKGV4aXN0aW5nQmluYXJ5KS5zaXplID4gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICBgQmluYXJ5IGFscmVhZHkgZXhpc3RzIGFmdGVyIGFjcXVpcmluZyBsb2NrOiAke2V4aXN0aW5nQmluYXJ5fWAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGVuZERvd25sb2FkKClcbiAgICAgICAgICAgICAgICByZWxlYXNlTG9jaygpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQmluYXJ5XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsZWFudXBUZW1wb3JhcnlEb3dubG9hZHMoKVxuXG4gICAgICAgICAgICBjb25zdCB6aXBGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBjbGlEaXIsXG4gICAgICAgICAgICAgICAgYCR7Q0xJX0RPV05MT0FEX1RNUF9QUkVGSVh9JHtwcm9jZXNzLnBpZH1fJHtEYXRlLm5vdygpfSR7Q0xJX0RPV05MT0FEX1RNUF9TVUZGSVh9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IGRvd25sb2FkZWRGaWxlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0oemlwRmlsZVBhdGgpXG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmcgfCBudWxsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0Rvd25sb2FkID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIENMSV9ET1dOTE9BRF9USU1FT1VUX01TLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZTogUmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYmluRG93bmxvYWRVcmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5ib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlc3BvbnNlIGJvZHkgcmVjZWl2ZWQnKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRlZEZpbGVTdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycjogRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgR290IEVycm9yIHdoaWxlIGRvd25sb2FkaW5nIGNsaSBiaW5hcnkgZmlsZTogJHtlcnJ9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZERvd25sb2FkKGZhbHNlLCB1dGlsLmZvcm1hdChlcnIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVTdHJlYW0gPSBSZWFkYWJsZS5mcm9tKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciksXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlU3RyZWFtLnBpcGUoZG93bmxvYWRlZEZpbGVTdHJlYW0pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgZG93bmxvYWRGaWxlU3RyZWFtIGhhbmRsZXIgYmVmb3JlIHBpcGVsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBDTElVdGlscy5kb3dubG9hZEZpbGVTdHJlYW0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRlZEZpbGVTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnI/OiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEdvdCBFcnJvciBpbiBjbGkgYmluYXJ5IGRvd25sb2FkaW5nIHJlcXVlc3QgJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByb2Nlc3NEb3dubG9hZCgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgZW5kRG93bmxvYWQoZmFsc2UsIHV0aWwuZm9ybWF0KGVycikpXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBkb3dubG9hZCBiaW5hcnksIEV4Y2VwdGlvbjogJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGRvd25sb2FkRmlsZVN0cmVhbShcbiAgICAgICAgZG93bmxvYWRlZEZpbGVTdHJlYW06IGZzLldyaXRlU3RyZWFtLFxuICAgICAgICB6aXBGaWxlUGF0aDogc3RyaW5nLFxuICAgICAgICBjbGlEaXI6IHN0cmluZyxcbiAgICAgICAgcmVzb2x2ZTogKHBhdGg6IHN0cmluZykgPT4gdm9pZCxcbiAgICAgICAgcmVqZWN0OiAocmVhc29uPzogRXJyb3IpID0+IHZvaWQsXG4gICAgKSB7XG4gICAgICAgIGRvd25sb2FkZWRGaWxlU3RyZWFtLm9uKCdjbG9zZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHlhdXpsT3BlblByb21pc2UgPSBwcm9taXNpZnkoeWF1emwub3BlbikgYXMgKFxuICAgICAgICAgICAgICAgIHBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB5YXV6bE9wdGlvbnMsXG4gICAgICAgICAgICApID0+IFByb21pc2U8WmlwRmlsZT5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgemlwZmlsZSA9IGF3YWl0IHlhdXpsT3BlblByb21pc2UoemlwRmlsZVBhdGgsIHtcbiAgICAgICAgICAgICAgICAgICAgbGF6eUVudHJpZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBsZXQgcmVzb2x2ZWRCaW5hcnlQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuXG4gICAgICAgICAgICAgICAgemlwZmlsZS5yZWFkRW50cnkoKVxuICAgICAgICAgICAgICAgIHppcGZpbGUub24oJ2VudHJ5JywgYXN5bmMgKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgvXFwvJC8udGVzdChlbnRyeS5maWxlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUucmVhZEVudHJ5KClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gWmlwLXNsaXAgZ3VhcmQ6IHJlamVjdCBlbnRyaWVzIHdob3NlIHJlc29sdmVkIHBhdGggZXNjYXBlcyBjbGlEaXJcbiAgICAgICAgICAgICAgICAgICAgLy8gKEJST1dTRVJTVEFDS19CSU5BUllfVVJMIGxldHMgdXNlcnMgc3VwcGx5IGFyYml0cmFyeSB6aXBzKS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlUGF0aCA9IHBhdGguam9pbihjbGlEaXIsIGVudHJ5LmZpbGVOYW1lKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENhbmRpZGF0ZSA9IHBhdGgucmVzb2x2ZShjYW5kaWRhdGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZERpciA9IHBhdGgucmVzb2x2ZShjbGlEaXIpICsgcGF0aC5zZXBcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZENhbmRpZGF0ZS5zdGFydHNXaXRoKHJlc29sdmVkRGlyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBaaXAtc2xpcCBkZXRlY3RlZDogZW50cnkgXCIke2VudHJ5LmZpbGVOYW1lfVwiIHJlc29sdmVzIG91dHNpZGUgJHtjbGlEaXJ9YCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQmluYXJ5RW50cnkgPSBwYXRoLmJhc2VuYW1lKGVudHJ5LmZpbGVOYW1lKS5zdGFydHNXaXRoKCdiaW5hcnktJylcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQmluYXJ5RW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdFN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGNhbmRpZGF0ZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RTdHJlYW0ub24oJ2Vycm9yJywgKHdyaXRlRXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHdyaXRlRXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZSA9IHByb21pc2lmeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLm9wZW5SZWFkU3RyZWFtLFxuICAgICAgICAgICAgICAgICAgICAgICAgKS5iaW5kKHppcGZpbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBhd2FpdCBvcGVuUmVhZFN0cmVhbVByb21pc2UoZW50cnkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RTdHJlYW0uZW5kKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0U3RyZWFtLm9uKCdjbG9zZScsICgpID0+IHppcGZpbGUucmVhZEVudHJ5KCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RyZWFtLnBpcGUoZGlyZWN0U3RyZWFtKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoemlwRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHppcEVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQmluYXJ5IGVudHJ5OiBleHRyYWN0IHRvIFBJRC1zY29wZWQgdGVtcCBmaWxlLCBjaG1vZCwgYXRvbWljIHJlbmFtZSBpbmxpbmUuXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnRzIEVUWFRCU1kvRUJVU1k6IHRoZSBmaWxlIGJlaW5nIGV4ZWN1dGVkIGlzIG5ldmVyIHRoZSBmaWxlIGJlaW5nIHdyaXR0ZW4uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsUGF0aCA9IGNhbmRpZGF0ZVBhdGhcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcFBhdGggPSBwYXRoLmpvaW4oY2xpRGlyLCBgJHtlbnRyeS5maWxlTmFtZX0udG1wLiR7cHJvY2Vzcy5waWR9YClcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB3cml0ZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRlbXBQYXRoKVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCB3cml0ZVN0cmVhbUVycm9yZWQgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbS5vbignZXJyb3InLCAod3JpdGVFcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtRXJyb3JlZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzcC51bmxpbmsodGVtcFBhdGgpLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3Qod3JpdGVFcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gJ2Nsb3NlJyBmaXJlcyBhZnRlciB0aGUgZmQgaXMgY2xvc2VkOyBzYWZlIGZvciBmc3AucmVuYW1lIG9uIFdpbmRvd3MgKHdoZXJlICdmaW5pc2gnIG1heSBmaXJlIGJlZm9yZSBmZCByZWxlYXNlKS5cbiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b0Nsb3NlPXRydWUgYWxzbyBtYWtlcyAnY2xvc2UnIGZpcmUgYWZ0ZXIgJ2Vycm9yJyBcdTIwMTQgYmFpbCBvdXQgaWYgdGhlIGVycm9yIHBhdGggYWxyZWFkeSByZWplY3RlZC5cbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW0ub24oJ2Nsb3NlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlU3RyZWFtRXJyb3JlZCkgeyByZXR1cm4gfVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AuY2htb2QodGVtcFBhdGgsICcwNzU1JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AucmVuYW1lKHRlbXBQYXRoLCBmaW5hbFBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyZW5hbWVFcnI6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXJyb3cgZmFsbGJhY2sgdG8gY3Jvc3MtZGV2aWNlIChFWERFVikgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVuYW1lRXJyLmNvZGUgIT09ICdFWERFVicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlbmFtZUVyclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBBdG9taWMgcmVuYW1lIGZhaWxlZCAoY3Jvc3MtZGV2aWNlKSwgZmFsbGluZyBiYWNrIHRvIGNvcHk6ICR7cmVuYW1lRXJyLm1lc3NhZ2V9YClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNwLmNvcHlGaWxlKHRlbXBQYXRoLCBmaW5hbFBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC51bmxpbmsodGVtcFBhdGgpLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkQmluYXJ5UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEJpbmFyeVBhdGggPSBmaW5hbFBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5yZWFkRW50cnkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNwLnVubGluayh0ZW1wUGF0aCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGVuUmVhZFN0cmVhbVByb21pc2UgPSBwcm9taXNpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLm9wZW5SZWFkU3RyZWFtLFxuICAgICAgICAgICAgICAgICAgICApLmJpbmQoemlwZmlsZSlcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBhd2FpdCBvcGVuUmVhZFN0cmVhbVByb21pc2UoZW50cnkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW0uZW5kKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RyZWFtLnBpcGUod3JpdGVTdHJlYW0pXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHppcEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnNwLnVubGluayh0ZW1wUGF0aCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh6aXBFcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgemlwZmlsZS5vbignZXJyb3InLCAoemlwRXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCh6aXBFcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHppcGZpbGUub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmc3AudW5saW5rKHppcEZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIGRlbGV0ZSB6aXAgZmlsZTogJHt6aXBGaWxlUGF0aH1gKVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRCaW5hcnlQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ05vIGJpbmFyeS0qIGVudHJ5IGZvdW5kIGluIHppcDsgY2Fubm90IGNvbXBsZXRlIENMSSBiaW5hcnkgZXh0cmFjdGlvbicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzb2x2ZWRCaW5hcnlQYXRoKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRUZXN0RnJhbWV3b3JrRGV0YWlsKCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RfRlJBTUVXT1JLX0RFVEFJTCkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RfRlJBTUVXT1JLX0RFVEFJTClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50ZXN0RnJhbWV3b3JrRGV0YWlsXG4gICAgfVxuXG4gICAgc3RhdGljIGdldEF1dG9tYXRpb25GcmFtZXdvcmtEZXRhaWwoKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQVVUT01BVElPTl9GUkFNRVdPUktfREVUQUlMKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQVVUT01BVElPTl9GUkFNRVdPUktfREVUQUlMLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmF1dG9tYXRpb25GcmFtZXdvcmtEZXRhaWxcbiAgICB9XG5cbiAgICBzdGF0aWMgc2V0RnJhbWV3b3JrRGV0YWlsKFxuICAgICAgICB0ZXN0RnJhbWV3b3JrOiBzdHJpbmcsXG4gICAgICAgIGF1dG9tYXRpb25GcmFtZXdvcms6IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgaWYgKCF0ZXN0RnJhbWV3b3JrIHx8ICFhdXRvbWF0aW9uRnJhbWV3b3JrKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgYFRlc3Qgb3IgQXV0b21hdGlvbiBmcmFtZXdvcmsgbm90IHByb3ZpZGVkIHRlc3RGcmFtZXdvcms9JHt0ZXN0RnJhbWV3b3JrfSwgYXV0b21hdGlvbkZyYW1ld29yaz0ke2F1dG9tYXRpb25GcmFtZXdvcmt9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGVzdEZyYW1ld29ya0RldGFpbCA9IHtcbiAgICAgICAgICAgIG5hbWU6IHRlc3RGcmFtZXdvcmssXG4gICAgICAgICAgICB2ZXJzaW9uOiB7IFt0ZXN0RnJhbWV3b3JrXTogQ0xJVXRpbHMuZ2V0U2RrVmVyc2lvbigpIH0sXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF1dG9tYXRpb25GcmFtZXdvcmtEZXRhaWwgPSB7XG4gICAgICAgICAgICBuYW1lOiBhdXRvbWF0aW9uRnJhbWV3b3JrLFxuICAgICAgICAgICAgdmVyc2lvbjogeyBbYXV0b21hdGlvbkZyYW1ld29ya106IENMSVV0aWxzLmdldFNka1ZlcnNpb24oKSB9LFxuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FVVE9NQVRJT05fRlJBTUVXT1JLX0RFVEFJTCA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgdGhpcy5hdXRvbWF0aW9uRnJhbWV3b3JrRGV0YWlsLFxuICAgICAgICApXG4gICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUX0ZSQU1FV09SS19ERVRBSUwgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHRoaXMudGVzdEZyYW1ld29ya0RldGFpbCxcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBpbnN0YW5jZSBuYW1lIHVzaW5nIHRocmVhZCBpZCBhbmQgcHJvY2Vzc0lkXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0Q3VycmVudEluc3RhbmNlTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGAke3Byb2Nlc3MucGlkfToke3RocmVhZElkfWBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBjbGllbnQgd29ya2VyIGlkZW50aWZpZXIgY29tYmluaW5nIHRocmVhZCBJRCBhbmQgcHJvY2VzcyBJRC5cbiAgICAgKiBUaGlzIGlkZW50aWZpZXIgaXMgdXNlZCB0byB0cmFjayB3b3JrZXItc3BlY2lmaWMgZXZlbnRzIGFuZCBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAgICogYWNyb3NzIGRpc3RyaWJ1dGVkIHRlc3QgZXhlY3V0aW9uLiBGb3JtYXQgbWF0Y2hlcyB0aGUgUHl0aG9uIFNESyBpbXBsZW1lbnRhdGlvblxuICAgICAqIGZvciBjb25zaXN0ZW5jeSBhY3Jvc3MgU0RLcy5cbiAgICAgKlxuICAgICAqIEZvcm1hdDogXCJ0aHJlYWRJZC1wcm9jZXNzSWRcIlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQgLSBPcHRpb25hbCBleGVjdXRpb24gY29udGV4dCB3aXRoIHRocmVhZElkIGFuZCBwcm9jZXNzSWRcbiAgICAgKiBAcmV0dXJucyBXb3JrZXIgSUQgc3RyaW5nIGluIGZvcm1hdCBcInRocmVhZElkLXByb2Nlc3NJZFwiXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCB3b3JrZXJJZCA9IENMSVV0aWxzLmdldENsaWVudFdvcmtlcklkKCkgLy8gUmV0dXJucyBcIjEtMTIzNDVcIlxuICAgICAqIGNvbnN0IHdvcmtlcklkID0gQ0xJVXRpbHMuZ2V0Q2xpZW50V29ya2VySWQoeyB0aHJlYWRJZDogMTIzLCBwcm9jZXNzSWQ6IDQ1NiB9KSAvLyBSZXR1cm5zIFwiMTIzLTQ1NlwiXG4gICAgICovXG4gICAgc3RhdGljIGdldENsaWVudFdvcmtlcklkKGNvbnRleHQ/OiB7IHRocmVhZElkPzogc3RyaW5nIHwgbnVtYmVyOyBwcm9jZXNzSWQ/OiBzdHJpbmcgfCBudW1iZXIgfSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHdvcmtlclRocmVhZElkID0gY29udGV4dD8udGhyZWFkSWQ/LnRvU3RyaW5nKCkgfHwgdGhyZWFkSWQudG9TdHJpbmcoKVxuICAgICAgICBjb25zdCB3b3JrZXJQcm9jZXNzSWQgPSBjb250ZXh0Py5wcm9jZXNzSWQ/LnRvU3RyaW5nKCkgfHwgcHJvY2Vzcy5waWQudG9TdHJpbmcoKVxuICAgICAgICByZXR1cm4gYCR7d29ya2VyVGhyZWFkSWR9LSR7d29ya2VyUHJvY2Vzc0lkfWBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VGVzdEZyYW1ld29ya1N0YXRlIHwgQXV0b21hdGlvbkZyYW1ld29ya1N0YXRlfSBmcmFtZXdvcmtTdGF0ZVxuICAgICAqIEBwYXJhbSB7SG9va1N0YXRlfSBob29rU3RhdGVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRIb29rUmVnaXN0cnlLZXkoZnJhbWV3b3JrU3RhdGU6IFN0YXRlLCBob29rU3RhdGU6IFN0YXRlKSB7XG4gICAgICAgIHJldHVybiBgJHtmcmFtZXdvcmtTdGF0ZX06JHtob29rU3RhdGV9YFxuICAgIH1cblxuICAgIHN0YXRpYyBtYXRjaEhvb2tSZWdleChob29rU3RhdGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChUZXN0RnJhbWV3b3JrQ29uc3RhbnRzLkhPT0tfUkVHRVgpXG5cbiAgICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdChob29rU3RhdGUpXG4gICAgfVxuXG4gICAgc3RhdGljIGdldE9ic2VydmFiaWxpdHlCdWlsZFRhZ3MoXG4gICAgICAgIG9ic2VydmFiaWxpdHlPcHRpb25zOiBUZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMsXG4gICAgICAgIGJzdGFja0J1aWxkVGFnPzogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX1RBRykge1xuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LlRFU1RfT0JTRVJWQUJJTElUWV9CVUlMRF9UQUcuc3BsaXQoJywnKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZFRhZykge1xuICAgICAgICAgICAgcmV0dXJuIG9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkVGFnXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJzdGFja0J1aWxkVGFnKSB7XG4gICAgICAgICAgICByZXR1cm4gW2JzdGFja0J1aWxkVGFnXVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIHN0YXRpYyBjaGVja0NMSVN1cHBvcnRlZEZyYW1ld29ya3MoZnJhbWV3b3JrOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGZyYW1ld29yayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5DTElTdXBwb3J0ZWRGcmFtZXdvcmtzLmluY2x1ZGVzKGZyYW1ld29yaylcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgZmV0Y2ggYXMgdW5kaWNpRmV0Y2gsIHR5cGUgUmVxdWVzdEluaXQgYXMgVW5kaWNpUmVxdWVzdEluaXQsIFByb3h5QWdlbnQgfSBmcm9tICd1bmRpY2knXG5cbmV4cG9ydCBjbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIHB1YmxpYyByZXNwb25zZTogUmVzcG9uc2VcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHJlczogUmVzcG9uc2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSlcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hXcmFwKGlucHV0OiBSZXF1ZXN0SW5mbyB8IFVSTCwgaW5pdD86IFJlcXVlc3RJbml0KSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgX2ZldGNoKGlucHV0LCBpbml0KVxuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXNwb25zZUVycm9yKGBFcnJvciByZXNwb25zZSBmcm9tIHNlcnZlciAke3Jlcy5zdGF0dXN9OiAgJHthd2FpdCByZXMudGV4dCgpfWAsIHJlcylcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2ZldGNoKGlucHV0OiBSZXF1ZXN0SW5mbyB8IFVSTCwgaW5pdD86IFJlcXVlc3RJbml0KSB7XG4gICAgY29uc3QgcHJveHlVcmwgPSBwcm9jZXNzLmVudi5IVFRQX1BST1hZIHx8IHByb2Nlc3MuZW52LkhUVFBTX1BST1hZXG4gICAgaWYgKHByb3h5VXJsKSB7XG4gICAgICAgIGNvbnN0IG5vUHJveHkgPSBwcm9jZXNzLmVudi5OT19QUk9YWSAmJiBwcm9jZXNzLmVudi5OT19QUk9YWS50cmltKClcbiAgICAgICAgICAgID8gcHJvY2Vzcy5lbnYuTk9fUFJPWFkudHJpbSgpLnNwbGl0KC9bXFxzLDtdKy8pXG4gICAgICAgICAgICA6IFtdXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dClcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybClcbiAgICAgICAgaWYgKCFub1Byb3h5LnNvbWUoKHN0cikgPT4gdXJsLmhvc3RuYW1lLmVuZHNXaXRoKHN0cikpKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kaWNpRmV0Y2goXG4gICAgICAgICAgICAgICAgcmVxdWVzdC51cmwsXG4gICAgICAgICAgICAgICAgeyAuLi4oaW5pdCBhcyBVbmRpY2lSZXF1ZXN0SW5pdCksIGRpc3BhdGNoZXI6IG5ldyBQcm94eUFnZW50KHByb3h5VXJsKSB9LFxuICAgICAgICAgICAgKSBhcyB1bmtub3duIGFzIFByb21pc2U8UmVzcG9uc2U+XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KVxufVxuIiwgImV4cG9ydCBjb25zdCBFVkVOVFMgPSB7XG4gICAgU0RLX1NFVFVQOiAnc2RrOnNldHVwJyxcbiAgICBTREtfQ0xFQU5VUDogJ3NkazpjbGVhbnVwJyxcbiAgICBTREtfUFJFX1RFU1Q6ICdzZGs6cHJlLXRlc3QnLFxuICAgIFNES19URVNUOiAnc2RrOnRlc3QnLFxuICAgIFNES19QT1NUX1RFU1Q6ICdzZGs6cG9zdC10ZXN0JyxcbiAgICBTREtfSE9PSzogJ3Nkazpob29rJyxcbiAgICBTREtfRFJJVkVSOiAnc2RrOmRyaXZlcicsXG4gICAgU0RLX0ExMVk6ICdzZGs6YTExeScsXG4gICAgU0RLX08xMVk6ICdzZGs6bzExeScsXG4gICAgU0RLX0FVVE9fQ0FQVFVSRTogJ3NkazphdXRvLWNhcHR1cmUnLFxuICAgIFNES19QUk9YWV9TRVRVUDogJ3Nkazpwcm94eS1zZXR1cCcsXG4gICAgU0RLX1RFU1RIVUI6ICdzZGs6dGVzdGh1YicsXG4gICAgU0RLX0FVVE9NQVRFOiAnc2RrOmF1dG9tYXRlJyxcbiAgICBTREtfQVBQX0FVVE9NQVRFOiAnc2RrOmFwcC1hdXRvbWF0ZScsXG4gICAgU0RLX1RVUkJPU0NBTEU6ICdzZGs6dHVyYm9zY2FsZScsXG4gICAgU0RLX1BFUkNZOiAnc2RrOnBlcmN5JyxcbiAgICBTREtfUFJFX0lOSVRJQUxJWkU6ICdzZGs6ZHJpdmVyOnByZS1pbml0aWFsaXphdGlvbicsXG4gICAgU0RLX1BPU1RfSU5JVElBTElaRTogJ3Nkazpkcml2ZXI6cG9zdC1pbml0aWFsaXphdGlvbicsXG4gICAgU0RLX0NMSV9DSEVDS19VUERBVEU6ICdzZGs6Y2xpOmNoZWNrLXVwZGF0ZScsXG4gICAgU0RLX0NMSV9ET1dOTE9BRDogJ3NkazpjbGk6ZG93bmxvYWQnLFxuICAgIFNES19DTElfT05fQk9PVFNUUkFQOiAnc2RrOmNsaTpvbi1ib290c3RyYXAnLFxuICAgIFNES19DTElfT05fQ09OTkVDVDogJ3NkazpjbGk6b24tY29ubmVjdCcsXG4gICAgU0RLX0NMSV9TVEFSVDogJ3NkazpjbGk6c3RhcnQnLFxuICAgIFNES19DTElfT05fU1RPUDogJ3NkazpjbGk6b24tc3RvcCcsXG4gICAgU0RLX0NPTk5FQ1RfQklOX1NFU1NJT046ICdzZGs6Y29ubmVjdEJpblNlc3Npb24nLFxuICAgIFNES19TVEFSVF9CSU5fU0VTU0lPTjogJ3NkazpzdGFydEJpblNlc3Npb24nLFxuICAgIC8vIE5ldyBldmVudHMgZnJvbSBQeXRob24gU0RLXG4gICAgU0RLX0RSSVZFUl9JTklUOiAnc2RrOmRyaXZlckluaXQnLFxuICAgIFNES19GSU5EX05FQVJFU1RfSFVCOiAnc2RrOmZpbmROZWFyZXN0SHViJyxcbiAgICBTREtfQVVUT01BVElPTl9GUkFNRVdPUktfSU5JVDogJ3NkazphdXRvbWF0aW9uRnJhbWV3b3JrSW5pdCcsXG4gICAgU0RLX0FVVE9NQVRJT05fRlJBTUVXT1JLX1NUQVJUOiAnc2RrOmF1dG9tYXRpb25GcmFtZXdvcmtTdGFydCcsXG4gICAgU0RLX0FVVE9NQVRJT05fRlJBTUVXT1JLX1NUT1A6ICdzZGs6YXV0b21hdGlvbkZyYW1ld29ya1N0b3AnLFxuICAgIFNES19BQ0NFU1NJQklMSVRZX0NPTkZJRzogJ3NkazphY2Nlc3NpYmlsaXR5Q29uZmlnJyxcbiAgICBTREtfT0JTRVJWQUJJTElUWV9DT05GSUc6ICdzZGs6b2JzZXJ2YWJpbGl0eUNvbmZpZycsXG4gICAgU0RLX0FJX1NFTEZfSEVBTF9TVEVQOiAnc2RrOmFpU2VsZkhlYWxTdGVwJyxcbiAgICBTREtfQUlfU0VMRl9IRUFMX0dFVF9SRVNVTFQ6ICdzZGs6YWlTZWxmSGVhbEdldFJlc3VsdCcsXG4gICAgU0RLX1RFU1RfRlJBTUVXT1JLX0VWRU5UOiAnc2RrOnRlc3RGcmFtZXdvcmtFdmVudCcsXG4gICAgU0RLX1RFU1RfU0VTU0lPTl9FVkVOVDogJ3Nkazp0ZXN0U2Vzc2lvbkV2ZW50JyxcbiAgICBTREtfQ0xJX0xPR19DUkVBVEVEX0VWRU5UOiAnc2RrOmNsaTpsb2dDcmVhdGVkRXZlbnQnLFxuICAgIFNES19DTElfRU5RVUVVRV9URVNUX0VWRU5UOiAnc2RrOmNsaTplbnF1ZXVlVGVzdEV2ZW50JyxcbiAgICBTREtfT05fU1RPUDogJ3NkazpvblN0b3AnLFxuICAgIFNES19TRU5EX0xPR1M6ICdzZGs6c2VuZGxvZ3MnLFxuICAgIC8vIEZ1bm5lbCBFdmVudHNcbiAgICBTREtfRlVOTkVMX1RFU1RfQVRURU1QVEVEOiAnc2RrOmZ1bm5lbDp0ZXN0LWF0dGVtcHRlZCcsXG4gICAgU0RLX0ZVTk5FTF9URVNUX1NVQ0NFU1NGVUw6ICdzZGs6ZnVubmVsOnRlc3Qtc3VjY2Vzc2Z1bCcsXG4gICAgLy8gTG9nIFVwbG9hZCBFdmVudHNcbiAgICBTREtfVVBMT0FEX0xPR1M6ICdzZGs6dXBsb2FkLWxvZ3MnLFxuICAgIC8vIEtleSBNZXRyaWNzIEV2ZW50c1xuICAgIFNES19TRU5EX0tFWV9NRVRSSUNTOiAnc2RrOnNlbmQta2V5LW1ldHJpY3MnLFxuICAgIFNES19LRVlfTUVUUklDU19QUkVQQVJBVElPTjogJ3NkazprZXktbWV0cmljczpwcmVwYXJhdGlvbicsXG4gICAgU0RLX0tFWV9NRVRSSUNTX1VQTE9BRDogJ3NkazprZXktbWV0cmljczp1cGxvYWQnLFxuICAgIC8vIENMSSBCaW5hcnkgRXZlbnRzXG4gICAgU0RLX0NMSV9ET1dOTE9BRF9CSU5BUlk6ICdzZGs6Y2xpOmRvd25sb2FkLWJpbmFyeScsXG4gICAgU0RLX0NMSV9CSU5BUllfVkVSSUZJQ0FUSU9OOiAnc2RrOmNsaTpiaW5hcnktdmVyaWZpY2F0aW9uJyxcbiAgICAvLyBDbGVhbnVwICYgU2h1dGRvd24gRXZlbnRzICh0cmFja2luZyBnYXAgYmV0d2VlbiBkcml2ZXI6cXVpdCBhbmQgZnVubmVsOnRlc3Qtc3VjY2Vzc2Z1bClcbiAgICBTREtfTElTVEVORVJfV09SS0VSX0VORDogJ3NkazpsaXN0ZW5lcjp3b3JrZXItZW5kJyxcbiAgICBTREtfUEVSQ1lfVEVBUkRPV046ICdzZGs6cGVyY3k6dGVhcmRvd24nLFxuICAgIFNES19XT1JLRVJfU0FWRV9EQVRBOiAnc2RrOndvcmtlcjpzYXZlLWRhdGEnLFxuICAgIFNES19QRVJGT1JNQU5DRV9SRVBPUlRfR0VOOiAnc2RrOnBlcmZvcm1hbmNlOnJlcG9ydC1nZW5lcmF0aW9uJyxcbiAgICBTREtfUEVSRk9STUFOQ0VfSlNPTl9XUklURTogJ3NkazpwZXJmb3JtYW5jZTpqc29uLXdyaXRlJyxcbiAgICBTREtfUEVSRk9STUFOQ0VfSFRNTF9HRU46ICdzZGs6cGVyZm9ybWFuY2U6aHRtbC1nZW5lcmF0aW9uJyxcbiAgICAvLyBEZXZpY2UgQWxsb2NhdGlvbiBFdmVudCAodHJhY2tpbmcgZ2FwIGJldHdlZW4gYmVmb3JlU2Vzc2lvbiBhbmQgYmVmb3JlIGhvb2tzKVxuICAgIFNES19ERVZJQ0VfQUxMT0NBVElPTjogJ3NkazpkZXZpY2UtYWxsb2NhdGlvbidcbn1cblxuZXhwb3J0IGNvbnN0IFRFU1RIVUJfRVZFTlRTID0ge1xuICAgIFNUQVJUOiBgJHtFVkVOVFMuU0RLX1RFU1RIVUJ9OnN0YXJ0YCxcbiAgICBTVE9QOiBgJHtFVkVOVFMuU0RLX1RFU1RIVUJ9OnN0b3BgXG59XG5cbmV4cG9ydCBjb25zdCBBVVRPTUFURV9FVkVOVFMgPSB7XG4gICAgS0VFUF9BTElWRTogYCR7RVZFTlRTLlNES19BVVRPTUFURX06a2VlcC1hbGl2ZWAsXG4gICAgSFVCX01BTkFHRU1FTlQ6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9Omh1Yi1tYW5hZ2VtZW50YCxcbiAgICBMT0NBTF9TVEFSVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06bG9jYWwtc3RhcnRgLFxuICAgIExPQ0FMX1NUT1A6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OmxvY2FsLXN0b3BgLFxuICAgIERSSVZFUl9NQU5BR0U6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OmRyaXZlci1tYW5hZ2VgLFxuICAgIFNFU1NJT05fTkFNRTogYCR7RVZFTlRTLlNES19BVVRPTUFURX06c2Vzc2lvbi1uYW1lYCxcbiAgICBTRVNTSU9OX1NUQVRVUzogYCR7RVZFTlRTLlNES19BVVRPTUFURX06c2Vzc2lvbi1zdGF0dXNgLFxuICAgIFNFU1NJT05fQU5OT1RBVElPTjogYCR7RVZFTlRTLlNES19BVVRPTUFURX06c2Vzc2lvbi1hbm5vdGF0aW9uYCxcbiAgICBJRExFX1RJTUVPVVQ6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OmlkbGUtdGltZW91dGAsXG4gICAgR0VORVJBVEVfQ0lfQVJUSUZBQ1Q6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OmNpLWFydGlmYWN0c2AsXG4gICAgUFJJTlRfQlVJTERMSU5LOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpwcmludC1idWlsZGxpbmtgXG59XG5cbmV4cG9ydCBjb25zdCBBMTFZX0VWRU5UUyA9IHtcbiAgICBQRVJGT1JNX1NDQU46IGAke0VWRU5UUy5TREtfQTExWX06ZHJpdmVyLXBlcmZvcm1zY2FuYCxcbiAgICBTQVZFX1JFU1VMVFM6IGAke0VWRU5UUy5TREtfQTExWX06c2F2ZS1yZXN1bHRzYCxcbiAgICBHRVRfUkVTVUxUUzogYCR7RVZFTlRTLlNES19BMTFZfTpnZXQtYWNjZXNzaWJpbGl0eS1yZXN1bHRzYCxcbiAgICBHRVRfUkVTVUxUU19TVU1NQVJZOiBgJHtFVkVOVFMuU0RLX0ExMVl9OmdldC1hY2Nlc3NpYmlsaXR5LXJlc3VsdHMtc3VtbWFyeWBcbn1cblxuZXhwb3J0IGNvbnN0IFBFUkNZX0VWRU5UUyA9IHtcbiAgICBET1dOTE9BRDogYCR7RVZFTlRTLlNES19QRVJDWX06ZG93bmxvYWRgLFxuICAgIFNDUkVFTlNIT1Q6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnNjcmVlbnNob3RgLFxuICAgIFNUQVJUOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpzdGFydGAsXG4gICAgU1RPUDogYCR7RVZFTlRTLlNES19QRVJDWX06c3RvcGAsXG4gICAgQVVUT19DQVBUVVJFOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTphdXRvLWNhcHR1cmVgLFxuICAgIFNOQVBTSE9UOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpzbmFwc2hvdGAsXG4gICAgU0NSRUVOU0hPVF9BUFA6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnNjcmVlbnNob3QtYXBwYFxufVxuXG5leHBvcnQgY29uc3QgTzExWV9FVkVOVFMgPSB7XG4gICAgU1lOQzogYCR7RVZFTlRTLlNES19PMTFZfTpzeW5jYCxcbiAgICBUQUtFX1NDUkVFTlNIT1Q6IGAke0VWRU5UUy5TREtfTzExWX06ZHJpdmVyLXRha2VTY3JlZW5TaG90YCxcbiAgICBQUklOVF9CVUlMRExJTks6IGAke0VWRU5UUy5TREtfTzExWX06cHJpbnQtYnVpbGRsaW5rYFxufVxuXG5leHBvcnQgY29uc3QgSE9PS19FVkVOVFMgPSB7XG4gICAgQkVGT1JFX0VBQ0g6IGAke0VWRU5UUy5TREtfSE9PS306YmVmb3JlLWVhY2hgLFxuICAgIEFGVEVSX0VBQ0g6IGAke0VWRU5UUy5TREtfSE9PS306YWZ0ZXItZWFjaGAsXG4gICAgQUZURVJfQUxMOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmFmdGVyLWFsbGAsXG4gICAgQkVGT1JFX0FMTDogYCR7RVZFTlRTLlNES19IT09LfTpiZWZvcmUtYWxsYCxcbiAgICBCRUZPUkU6IGAke0VWRU5UUy5TREtfSE9PS306YmVmb3JlYCxcbiAgICBBRlRFUjogYCR7RVZFTlRTLlNES19IT09LfTphZnRlcmBcbn1cblxuZXhwb3J0IGNvbnN0IFRVUkJPU0NBTEVfRVZFTlRTID0ge1xuICAgIEhVQl9NQU5BR0VNRU5UOiBgJHtFVkVOVFMuU0RLX1RVUkJPU0NBTEV9Omh1Yi1tYW5hZ2VtZW50YCxcbiAgICBQUklOVF9CVUlMRExJTks6IGAke0VWRU5UUy5TREtfVFVSQk9TQ0FMRX06cHJpbnQtYnVpbGRsaW5rYFxufVxuXG5leHBvcnQgY29uc3QgQVBQX0FVVE9NQVRFX0VWRU5UUyA9IHtcbiAgICBBUFBfVVBMT0FEOiBgJHtFVkVOVFMuU0RLX0FQUF9BVVRPTUFURX06YXBwLXVwbG9hZGBcbn1cblxuZXhwb3J0IGNvbnN0IERSSVZFUl9FVkVOVCA9IHtcbiAgICBRVUlUOiBgJHtFVkVOVFMuU0RLX0RSSVZFUn06cXVpdGAsXG4gICAgR0VUOiBgJHtFVkVOVFMuU0RLX0RSSVZFUn06Z2V0YCxcbiAgICBQUkVfRVhFQ1VURTogYCR7RVZFTlRTLlNES19EUklWRVJ9OnByZS1leGVjdXRlYCxcbiAgICBQT1NUX0VYRUNVVEU6IGAke0VWRU5UUy5TREtfRFJJVkVSfTpwb3N0LWV4ZWN1dGVgLFxuICAgIElOSVQ6IEVWRU5UUy5TREtfRFJJVkVSX0lOSVQsXG4gICAgUFJFX0lOSVRJQUxJWkU6IEVWRU5UUy5TREtfUFJFX0lOSVRJQUxJWkUsXG4gICAgUE9TVF9JTklUSUFMSVpFOiBFVkVOVFMuU0RLX1BPU1RfSU5JVElBTElaRVxufVxuXG4vKipcbiAqIEZyYW1ld29yayBsaWZlY3ljbGUgZXZlbnRzIGZvciBhdXRvbWF0aW9uIGZyYW1ld29yayB0cmFja2luZ1xuICovXG5leHBvcnQgY29uc3QgRlJBTUVXT1JLX0VWRU5UUyA9IHtcbiAgICBJTklUOiBFVkVOVFMuU0RLX0FVVE9NQVRJT05fRlJBTUVXT1JLX0lOSVQsXG4gICAgU1RBUlQ6IEVWRU5UUy5TREtfQVVUT01BVElPTl9GUkFNRVdPUktfU1RBUlQsXG4gICAgU1RPUDogRVZFTlRTLlNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19TVE9QXG59XG5cbi8qKlxuICogTW9kdWxlIGNvbmZpZ3VyYXRpb24gZXZlbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBDT05GSUdfRVZFTlRTID0ge1xuICAgIEFDQ0VTU0lCSUxJVFk6IEVWRU5UUy5TREtfQUNDRVNTSUJJTElUWV9DT05GSUcsXG4gICAgT0JTRVJWQUJJTElUWTogRVZFTlRTLlNES19PQlNFUlZBQklMSVRZX0NPTkZJR1xufVxuXG4vKipcbiAqIEFJIHNlbGYtaGVhbGluZyBldmVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IEFJX0VWRU5UUyA9IHtcbiAgICBTRUxGX0hFQUxfU1RFUDogRVZFTlRTLlNES19BSV9TRUxGX0hFQUxfU1RFUCxcbiAgICBTRUxGX0hFQUxfR0VUX1JFU1VMVDogRVZFTlRTLlNES19BSV9TRUxGX0hFQUxfR0VUX1JFU1VMVFxufVxuXG4vKipcbiAqIEV2ZW50IGRpc3BhdGNoZXIgZXZlbnRzIGZvciB0ZXN0IGZyYW1ld29yayBhbmQgc2Vzc2lvbiB0cmFja2luZ1xuICovXG5leHBvcnQgY29uc3QgRElTUEFUQ0hFUl9FVkVOVFMgPSB7XG4gICAgVEVTVF9GUkFNRVdPUks6IEVWRU5UUy5TREtfVEVTVF9GUkFNRVdPUktfRVZFTlQsXG4gICAgVEVTVF9TRVNTSU9OOiBFVkVOVFMuU0RLX1RFU1RfU0VTU0lPTl9FVkVOVCxcbiAgICBMT0dfQ1JFQVRFRDogRVZFTlRTLlNES19DTElfTE9HX0NSRUFURURfRVZFTlQsXG4gICAgRU5RVUVVRV9URVNUOiBFVkVOVFMuU0RLX0NMSV9FTlFVRVVFX1RFU1RfRVZFTlRcbn1cblxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQgbG9nZ2VyIGZyb20gJ0B3ZGlvL2xvZ2dlcidcblxuaW1wb3J0IHsgTE9HU19GSUxFIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgQ09MT1JTIH0gZnJvbSAnLi4vdXRpbC5qcydcblxuY29uc3QgbG9nID0gbG9nZ2VyKCdAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZS9jbGknKVxuXG5leHBvcnQgY2xhc3MgQlN0YWNrTG9nZ2VyIHtcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIExPR1NfRklMRSlcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZvbGRlclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnKVxuICAgIHByaXZhdGUgc3RhdGljIGxvZ0ZpbGVTdHJlYW06IGZzLldyaXRlU3RyZWFtIHwgbnVsbFxuXG4gICAgc3RhdGljIGxvZ1RvRmlsZShsb2dNZXNzYWdlOiBzdHJpbmcsIGxvZ0xldmVsOiBzdHJpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5sb2dGaWxlU3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbnN1cmVMb2dzRm9sZGVyKClcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbSh0aGlzLmxvZ0ZpbGVQYXRoLCB7IGZsYWdzOiAnYScgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmxvZ0ZpbGVTdHJlYW0gJiYgdGhpcy5sb2dGaWxlU3RyZWFtLndyaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtLndyaXRlKHRoaXMuZm9ybWF0TG9nKGxvZ01lc3NhZ2UsIGxvZ0xldmVsKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgRmFpbGVkIHRvIGxvZyB0byBmaWxlLiBFcnJvciAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmb3JtYXRMb2cobG9nTWVzc2FnZTogc3RyaW5nLCBsZXZlbDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgJHtjaGFsay5ncmF5KG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSl9ICR7Y2hhbGtbQ09MT1JTW2xldmVsXV0obGV2ZWwudG9VcHBlckNhc2UoKSl9ICR7Y2hhbGsud2hpdGVCcmlnaHQoJ0B3ZGlvL2Jyb3dzZXJzdGFjay1zZXJ2aWNlJyl9ICR7bG9nTWVzc2FnZX1cXG5gXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAnaW5mbycpXG4gICAgICAgIGxvZy5pbmZvKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUobWVzc2FnZSwgJ2Vycm9yJylcbiAgICAgICAgbG9nLmVycm9yKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIHBhcmFtPzogdW5rbm93bikge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAnZGVidWcnKVxuICAgICAgICBpZiAocGFyYW0pIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlLCBwYXJhbSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAnd2FybicpXG4gICAgICAgIGxvZy53YXJuKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0cmFjZShtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUobWVzc2FnZSwgJ3RyYWNlJylcbiAgICAgICAgbG9nLnRyYWNlKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckxvZ2dlcigpIHtcbiAgICAgICAgaWYgKHRoaXMubG9nRmlsZVN0cmVhbSkge1xuICAgICAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtLmVuZCgpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtID0gbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJMb2dGaWxlKCkge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLmxvZ0ZpbGVQYXRoKSkge1xuICAgICAgICAgICAgZnMudHJ1bmNhdGVTeW5jKHRoaXMubG9nRmlsZVBhdGgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGVuc3VyZUxvZ3NGb2xkZXIoKSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmxvZ0ZvbGRlclBhdGgpKXtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyh0aGlzLmxvZ0ZvbGRlclBhdGgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IFRlc3RGcmFtZXdvcmtDb25zdGFudHMgPSB7XG4gICAgS0VZX1RFU1RfVVVJRDogJ3Rlc3RfdXVpZCcsXG4gICAgS0VZX1RFU1RfSUQgOiAndGVzdF9pZCcsXG4gICAgS0VZX1RFU1RfTkFNRSA6ICd0ZXN0X25hbWUnLFxuICAgIEtFWV9URVNUX0ZJTEVfUEFUSCA6ICd0ZXN0X2ZpbGVfcGF0aCcsXG4gICAgS0VZX1RFU1RfVEFHUyA6ICd0ZXN0X3RhZ3MnLFxuICAgIEtFWV9URVNUX1JFU1VMVCA6ICd0ZXN0X3Jlc3VsdCcsXG4gICAgS0VZX1RFU1RfUkVTVUxUX0FUIDogJ3Rlc3RfcmVzdWx0X2F0JyxcbiAgICBLRVlfVEVTVF9TVEFSVEVEX0FUIDogJ3Rlc3Rfc3RhcnRlZF9hdCcsXG4gICAgS0VZX1RFU1RfRU5ERURfQVQgOiAndGVzdF9lbmRlZF9hdCcsXG4gICAgS0VZX1RFU1RfTE9DQVRJT04gOiAndGVzdF9sb2NhdGlvbicsXG4gICAgS0VZX1RFU1RfU0NPUEUgOiAndGVzdF9zY29wZScsXG4gICAgS0VZX1RFU1RfU0NPUEVTIDogJ3Rlc3Rfc2NvcGVzJyxcbiAgICBLRVlfVEVTVF9GUkFNRVdPUktfTkFNRSA6ICd0ZXN0X2ZyYW1ld29ya19uYW1lJyxcbiAgICBLRVlfVEVTVF9GUkFNRVdPUktfVkVSU0lPTiA6ICd0ZXN0X2ZyYW1ld29ya192ZXJzaW9uJyxcbiAgICBLRVlfVEVTVF9DT0RFIDogJ3Rlc3RfY29kZScsXG4gICAgS0VZX1RFU1RfUkVSVU5fTkFNRSA6ICd0ZXN0X3JlcnVuX25hbWUnLFxuICAgIEtFWV9QTEFURk9STV9JTkRFWCA6ICdwbGF0Zm9ybV9pbmRleCcsXG4gICAgS0VZX1RFU1RfRkFJTFVSRSA6ICd0ZXN0X2ZhaWx1cmUnLFxuICAgIEtFWV9URVNUX0ZBSUxVUkVfVFlQRSA6ICd0ZXN0X2ZhaWx1cmVfdHlwZScsXG4gICAgS0VZX1RFU1RfRkFJTFVSRV9SRUFTT04gOiAndGVzdF9mYWlsdXJlX3JlYXNvbicsXG4gICAgS0VZX1RFU1RfTE9HUyA6ICd0ZXN0X2xvZ3MnLFxuICAgIEtFWV9URVNUX01FVEEgOiAndGVzdF9tZXRhJyxcbiAgICBLRVlfQ1VTVE9NX1RBR1MgOiAnY3VzdG9tX21ldGFkYXRhJyxcbiAgICBLRVlfVEVTVF9ERUZFUlJFRCA6ICd0ZXN0X2RlZmVycmVkJyxcbiAgICBLRVlfU0VTU0lPTl9OQU1FIDogJ3Rlc3Rfc2Vzc2lvbl9uYW1lJyxcbiAgICBLRVlfQVVUT01BVEVfU0VTU0lPTl9OQU1FIDogJ2F1dG9tYXRlX3Nlc3Npb25fbmFtZScsXG4gICAgS0VZX0FVVE9NQVRFX1NFU1NJT05fU1RBVFVTOiAnYXV0b21hdGVfc2Vzc2lvbl9zdGF0dXMnLFxuICAgIEtFWV9BVVRPTUFURV9TRVNTSU9OX1JFQVNPTjogJ2F1dG9tYXRlX3Nlc3Npb25fcmVhc29uJyxcbiAgICBLRVlfRVZFTlRfU1RBUlRFRF9BVCA6ICdldmVudF9zdGFydGVkX2F0JyxcbiAgICBLRVlfRVZFTlRfRU5ERURfQVQgOiAnZXZlbnRfZW5kZWRfYXQnLFxuICAgIEtFWV9IT09LX0lEIDogJ2hvb2tfaWQnLFxuICAgIEtFWV9IT09LX1JFU1VMVCA6ICdob29rX3Jlc3VsdCcsXG4gICAgS0VZX0hPT0tfTE9HUyA6ICdob29rX2xvZ3MnLFxuICAgIEtFWV9IT09LX05BTUUgOiAnaG9va19uYW1lJyxcbiAgICBLRVlfSE9PS1NfU1RBUlRFRDogJ3Rlc3RfaG9va3Nfc3RhcnRlZCcsXG4gICAgS0VZX0hPT0tTX0ZJTklTSEVEOiAndGVzdF9ob29rc19maW5pc2hlZCcsXG4gICAgREVGQVVMVF9URVNUX1JFU1VMVCA6ICdwZW5kaW5nJyxcbiAgICBERUZBVUxUX0hPT0tfUkVTVUxUIDogJ3BlbmRpbmcnLFxuICAgIEtJTkRfU0NSRUVOU0hPVCA6ICdURVNUX1NDUkVFTlNIT1QnLFxuICAgIEtJTkRfTE9HIDogJ1RFU1RfTE9HJyxcbiAgICBIT09LX1JFR0VYIDogJ14oQkVGT1JFX3xBRlRFUl8pJyxcbn1cbiIsICJcbmltcG9ydCB7IEJST1dTRVJTVEFDS19QRVJDWSwgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksIEJST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHR5cGUgQnJvd3NlclN0YWNrQ29uZmlnIGZyb20gJy4uL2NvbmZpZy5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7IGlzVHJ1ZSwgaXNMb2FkVGVzdGluZ1Nlc3Npb24gfSBmcm9tICcuLi91dGlsLmpzJ1xuXG5pbnRlcmZhY2UgRXJyb3JUeXBlIHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9ycyB7XG4gICAgZXJyb3JzOiBFcnJvclR5cGVbXVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UHJvZHVjdE1hcCA9IChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZyk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0+IHtcbiAgICAvLyBMVFMgZ2F0aW5nOiB1bmRlciBMVFMsIGF1dG9tYXRlIGlzIGZvcmNlZCBmYWxzZSAoTFRTIGJ1aWxkcyByb3V0ZSB0b1xuICAgIC8vIHRoZSBMVFMgaW50ZXJuYWwgaHViOyBrZWVwaW5nIGF1dG9tYXRlPXRydWUgdGFncyBUZXN0SHViIHNvdXJjZSBhc1xuICAgIC8vIFRPLEFVVCxMVFMgaW5zdGVhZCBvZiBUTyxMVFMgXHUyMDE0IHNlZSBweS1zZGsgZWE1M2Q5MTQpLiBUaGUgYGx0c2Aga2V5XG4gICAgLy8gaXRzZWxmIGlzIG9ubHkgZW1pdHRlZCB1bmRlciBMVFMgc28gbm9uLUxUUyBwYXlsb2FkcyBzdGF5IGJ5dGUtXG4gICAgLy8gaWRlbnRpY2FsIHRvIHRoZSBwcmUtTFRTLVBSIHNoYXBlIChhdm9pZHMgc3VycHJpc2luZyBhbnkgYmFja2VuZCB3aXRoXG4gICAgLy8gc3RyaWN0IHVua25vd24ta2V5IHZhbGlkYXRpb24pLlxuICAgIGNvbnN0IGx0cyA9IGlzTG9hZFRlc3RpbmdTZXNzaW9uKClcbiAgICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBib29sZWFuIHwgdW5kZWZpbmVkXVtdID0gW1xuICAgICAgICBbJ29ic2VydmFiaWxpdHknLCBjb25maWcudGVzdE9ic2VydmFiaWxpdHkuZW5hYmxlZF0sXG4gICAgICAgIFsnYWNjZXNzaWJpbGl0eScsICEhY29uZmlnLmFjY2Vzc2liaWxpdHldLFxuICAgICAgICBbJ3BlcmN5JywgY29uZmlnLnBlcmN5XSxcbiAgICAgICAgWydhdXRvbWF0ZScsIGx0cyA/IGZhbHNlIDogY29uZmlnLmF1dG9tYXRlXSxcbiAgICAgICAgWydhcHBfYXV0b21hdGUnLCBjb25maWcuYXBwQXV0b21hdGVdLFxuICAgIF1cbiAgICBpZiAobHRzKSB7XG4gICAgICAgIGVudHJpZXMucHVzaChbJ2x0cycsIHRydWVdKVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMuZmlsdGVyKChbLCB2XSkgPT4gdiAhPT0gbnVsbCkpIGFzIHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRQcm9jZXNzRXZlbnRGb3JUZXN0aHViID0gKGV2ZW50VHlwZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgLy8gTFRTIHNob3J0LWNpcmN1aXQ6IHdoZW4gcnVubmluZyBhcyBhbiBMVFMgbG9hZCB0ZXN0IChCUk9XU0VSU1RBQ0tfTFRTPXRydWVcbiAgICAvLyBmb3IgbG9jYWwgcmVwcm8sIG9yIEJST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRCBzZXQgYnkgdGhlIHBvZCksIFRlc3RIdWJcbiAgICAvLyBldmVudCBlbWlzc2lvbiBtdXN0IGFsd2F5cyBmbG93IHJlZ2FyZGxlc3Mgb2YgdGhlIG9ic2VydmFiaWxpdHkgL1xuICAgIC8vIGFjY2Vzc2liaWxpdHkgLyBwZXJjeSBlbnYgZmxhZ3MuIFBvZCBydW5zIGRvIGV4cG9ydFxuICAgIC8vIEJST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZLCBidXQgdGhlIGxvY2FsLXJlcHJvIGZsYWcgcGF0aCBkb2Vzbid0XG4gICAgLy8gZ3VhcmFudGVlIGl0IFx1MjAxNCB3aXRob3V0IHRoaXMgc2hvcnQtY2lyY3VpdCwgZ2V0UHJvZHVjdE1hcCBjb3JyZWN0bHlcbiAgICAvLyBlbWl0cyBsdHM6IHRydWUgd2hpbGUgZXZlcnkgb25UZXN0U3RhcnQgLyBvblRlc3RFbmQgLyBvbkhvb2tTdGFydFxuICAgIC8vIHNpbGVudGx5IG5vLW9wcy4gTWlycm9yIG9mIHRoZSB1bmNvbmRpdGlvbmFsIExUUyBldmVudCBmbG93IGluIHB5LXNkaydzXG4gICAgLy8gc2hvdWxkX3NlbmRfZXZlbnRfZm9yX3Rlc3RodWIoKSAoUFIgIzk5MykuXG4gICAgaWYgKGlzTG9hZFRlc3RpbmdTZXNzaW9uKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChpc1RydWUocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFldKSkge1xuICAgICAgICByZXR1cm4gIShbJ0hvb2tSdW5TdGFydGVkJywgJ0hvb2tSdW5GaW5pc2hlZCcsICdMb2dDcmVhdGVkJ10uaW5jbHVkZXMoZXZlbnRUeXBlKSlcbiAgICB9XG4gICAgaWYgKGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfUEVSQ1ldKSAmJiBldmVudFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiBCb29sZWFuKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZXSB8fCBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0gfHwgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1BFUkNZXSkhXG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVFcnJvckZvck9ic2VydmFiaWxpdHkgPSAoZXJyb3I6IEVycm9ycyB8IG51bGwpOiB2b2lkID0+IHtcbiAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0gPSAnZmFsc2UnXG4gICAgbG9nQnVpbGRFcnJvcihlcnJvciwgJ1Rlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MnKVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5ID0gKGVycm9yOiBFcnJvcnMgfCBudWxsKTogdm9pZCA9PiB7XG4gICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFldID0gJ2ZhbHNlJ1xuICAgIGxvZ0J1aWxkRXJyb3IoZXJyb3IsICdhY2Nlc3NpYmlsaXR5Jylcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ0J1aWxkRXJyb3IgPSAoZXJyb3I6IEVycm9ycyB8IG51bGwsIHByb2R1Y3Q6IHN0cmluZyA9ICcnKTogdm9pZCA9PiB7XG4gICAgaWYgKCFlcnJvciB8fCAhZXJyb3IuZXJyb3JzKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgJHtwcm9kdWN0LnRvVXBwZXJDYXNlKCl9IEJ1aWxkIGNyZWF0aW9uIGZhaWxlZCAke2Vycm9yIX1gKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVycm9ySnNvbiBvZiBlcnJvci5lcnJvcnMpIHtcbiAgICAgICAgY29uc3QgZXJyb3JUeXBlID0gZXJyb3JKc29uLmtleVxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvckpzb24ubWVzc2FnZVxuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVycm9yVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnRVJST1JfSU5WQUxJRF9DUkVERU5USUFMUyc6XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSAnRVJST1JfQUNDRVNTX0RFTklFRCc6XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlICdFUlJPUl9TREtfREVQUkVDQVRFRCc6XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UHJvZHVjdE1hcEZvckJ1aWxkU3RhcnRDYWxsID0gKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbj86IGJvb2xlYW4gfCBudWxsKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPT4ge1xuICAgIC8vIExUUyBnYXRpbmc6IHVuZGVyIExUUywgYXV0b21hdGUgaXMgZm9yY2VkIGZhbHNlIChMVFMgYnVpbGRzIHJvdXRlIHRvXG4gICAgLy8gdGhlIExUUyBpbnRlcm5hbCBodWI7IGtlZXBpbmcgYXV0b21hdGU9dHJ1ZSB0YWdzIFRlc3RIdWIgc291cmNlIGFzXG4gICAgLy8gVE8sQVVULExUUyBpbnN0ZWFkIG9mIFRPLExUUyBcdTIwMTQgc2VlIHB5LXNkayBlYTUzZDkxNCkuIFRoZSBgbHRzYCBrZXlcbiAgICAvLyBpdHNlbGYgaXMgb25seSBlbWl0dGVkIHVuZGVyIExUUyB0byBrZWVwIG5vbi1MVFMgcGF5bG9hZHMgYnl0ZS1cbiAgICAvLyBpZGVudGljYWwgdG8gdGhlIHByZS1MVFMtUFIgc2hhcGUuXG4gICAgY29uc3QgbHRzID0gaXNMb2FkVGVzdGluZ1Nlc3Npb24oKVxuICAgIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsXVtdID0gW1xuICAgICAgICBbJ29ic2VydmFiaWxpdHknLCBjb25maWcudGVzdE9ic2VydmFiaWxpdHkuZW5hYmxlZF0sXG4gICAgICAgIFsnYWNjZXNzaWJpbGl0eScsIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uXSxcbiAgICAgICAgWydwZXJjeScsIGNvbmZpZy5wZXJjeV0sXG4gICAgICAgIFsnYXV0b21hdGUnLCBsdHMgPyBmYWxzZSA6IGNvbmZpZy5hdXRvbWF0ZV0sXG4gICAgICAgIFsnYXBwX2F1dG9tYXRlJywgY29uZmlnLmFwcEF1dG9tYXRlXSxcbiAgICBdXG4gICAgaWYgKGx0cykge1xuICAgICAgICBlbnRyaWVzLnB1c2goWydsdHMnLCB0cnVlXSlcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzLmZpbHRlcigoWywgdl0pID0+IHYgIT09IG51bGwpKSBhcyB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfVxufVxuIiwgImltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuXG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICdAd2Rpby90eXBlcydcblxuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHsgaXNWYWxpZEVuYWJsZWRWYWx1ZSB9IGZyb20gJy4uL3V0aWwuanMnXG5pbXBvcnQgeyBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCwgU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfT05MWSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcblxuY29uc3QgUlVOX1NNQVJUX1NFTEVDVElPTiA9ICdydW5TbWFydFNlbGVjdGlvbidcblxuY29uc3QgQUxMT1dFRF9PUkNIRVNUUkFUSU9OX0tFWVMgPSBbXG4gICAgUlVOX1NNQVJUX1NFTEVDVElPTlxuXVxuXG50eXBlIFNtYXJ0U2VsZWN0aW9uUmVwb0luZm8gPSB7XG4gICAgdXJsPzogc3RyaW5nXG4gICAgZmVhdHVyZUJyYW5jaD86IHN0cmluZ1xuICAgIGJhc2VCcmFuY2g/OiBzdHJpbmdcbiAgICBuYW1lPzogc3RyaW5nXG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG50eXBlIFNtYXJ0U2VsZWN0aW9uU291cmNlID0gc3RyaW5nW10gfCBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10gfCBudWxsXG5cbnR5cGUgUnVuU21hcnRTZWxlY3Rpb25Db25maWcgPSB7XG4gICAgZW5hYmxlZD86IGJvb2xlYW4gfCBzdHJpbmdcbiAgICBtb2RlPzogc3RyaW5nXG4gICAgc291cmNlPzogc3RyaW5nIHwgc3RyaW5nW10gfCBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10gfCBudWxsXG59XG5cbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbilcblxuY29uc3QgYXNTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQ2xhc3MgdG8gaGFuZGxlIHRlc3Qgb3JkZXJpbmcgZnVuY3Rpb25hbGl0eVxuICovXG5jbGFzcyBUZXN0T3JkZXJpbmcge1xuICAgIHByaXZhdGUgZW5hYmxlZDogYm9vbGVhblxuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nIHwgbnVsbFxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMubmFtZSA9IG51bGxcbiAgICB9XG5cbiAgICBlbmFibGUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIH1cblxuICAgIGRpc2FibGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMubmFtZSA9IG51bGxcbiAgICB9XG5cbiAgICBnZXRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVkXG4gICAgfVxuXG4gICAgZ2V0TmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZVxuICAgIH1cbn1cblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGZvciB0ZXN0IG9yY2hlc3RyYXRpb25cbiAqL1xudHlwZSBPcmNoZXN0cmF0aW9uQ29uZmlnID0gT3B0aW9ucy5UZXN0cnVubmVyIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuZXhwb3J0IGNsYXNzIE9yY2hlc3RyYXRpb25VdGlscyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBPcmNoZXN0cmF0aW9uVXRpbHMgfCBudWxsID0gbnVsbFxuICAgIHByaXZhdGUgcnVuU21hcnRTZWxlY3Rpb246IGJvb2xlYW5cbiAgICBwcml2YXRlIHNtYXJ0U2VsZWN0aW9uTW9kZTogc3RyaW5nXG4gICAgcHJpdmF0ZSB0ZXN0T3JkZXJpbmc6IFRlc3RPcmRlcmluZ1xuICAgIHByaXZhdGUgc21hcnRTZWxlY3Rpb25Tb3VyY2U6IFNtYXJ0U2VsZWN0aW9uU291cmNlXG4gICAgcHJpdmF0ZSBwcm9qZWN0TmFtZT86IHN0cmluZ1xuICAgIHByaXZhdGUgYnVpbGROYW1lPzogc3RyaW5nXG4gICAgcHJpdmF0ZSBidWlsZElkZW50aWZpZXI/OiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IE9yY2hlc3RyYXRpb25Db25maWcpIHtcbiAgICAgICAgdGhpcy5ydW5TbWFydFNlbGVjdGlvbiA9IGZhbHNlXG4gICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlID0gU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1RcbiAgICAgICAgdGhpcy50ZXN0T3JkZXJpbmcgPSBuZXcgVGVzdE9yZGVyaW5nKClcbiAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IG51bGwgLy8gU3RvcmUgc291cmNlIHBhdGhzIGlmIHByb3ZpZGVkXG5cbiAgICAgICAgLy8gQ2hlY2sgYm90aCBwb3NzaWJsZSBjb25maWd1cmF0aW9uIHBhdGhzOiBkaXJlY3Qgb3IgbmVzdGVkIGluIHNlcnZpY2VzXG4gICAgICAgIGNvbnN0IGNvbmZpZ1JlY29yZCA9IGlzUGxhaW5PYmplY3QoY29uZmlnKSA/IGNvbmZpZyA6IHt9XG4gICAgICAgIGxldCB0ZXN0T3JjaE9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gaXNQbGFpbk9iamVjdChjb25maWdSZWNvcmQudGVzdE9yY2hlc3RyYXRpb25PcHRpb25zKVxuICAgICAgICAgICAgPyBjb25maWdSZWNvcmQudGVzdE9yY2hlc3RyYXRpb25PcHRpb25zXG4gICAgICAgICAgICA6IHt9XG5cbiAgICAgICAgLy8gSWYgbm90IGZvdW5kIGF0IHRvcCBsZXZlbCwgY2hlY2sgaWYgaXQncyBpbiB0aGUgYnJvd3NlcnN0YWNrIHNlcnZpY2UgY29uZmlnXG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gQXJyYXkuaXNBcnJheShjb25maWdSZWNvcmQuc2VydmljZXMpID8gY29uZmlnUmVjb3JkLnNlcnZpY2VzIDogdW5kZWZpbmVkXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0ZXN0T3JjaE9wdGlvbnMpLmxlbmd0aCA9PT0gMCAmJiBBcnJheS5pc0FycmF5KHNlcnZpY2VzKSkge1xuICAgICAgICAgICAgLy8gTG9vayBmb3IgYnJvd3NlcnN0YWNrIHNlcnZpY2UgY29uZmlndXJhdGlvblxuICAgICAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHNlcnZpY2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHNlcnZpY2UpICYmXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VbMF0gPT09ICdicm93c2Vyc3RhY2snICYmXG4gICAgICAgICAgICAgICAgICAgIGlzUGxhaW5PYmplY3Qoc2VydmljZVsxXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNQbGFpbk9iamVjdChzZXJ2aWNlWzFdLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9ucylcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdE9yY2hPcHRpb25zID0gc2VydmljZVsxXS50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdbY29uc3RydWN0b3JdIEZvdW5kIHRlc3RPcmNoZXN0cmF0aW9uT3B0aW9ucyBpbiBicm93c2Vyc3RhY2sgc2VydmljZSBjb25maWcnKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyeSB0byBnZXQgcnVuU21hcnRTZWxlY3Rpb24gb3B0aW9uc1xuICAgICAgICBjb25zdCBydW5TbWFydFNlbGVjdGlvbk9wdHM6IFJ1blNtYXJ0U2VsZWN0aW9uQ29uZmlnID0gaXNQbGFpbk9iamVjdCh0ZXN0T3JjaE9wdGlvbnNbUlVOX1NNQVJUX1NFTEVDVElPTl0pXG4gICAgICAgICAgICA/IHRlc3RPcmNoT3B0aW9uc1tSVU5fU01BUlRfU0VMRUNUSU9OXSBhcyBSdW5TbWFydFNlbGVjdGlvbkNvbmZpZ1xuICAgICAgICAgICAgOiB7fVxuXG4gICAgICAgIHRoaXMuX3NldFJ1blNtYXJ0U2VsZWN0aW9uKFxuICAgICAgICAgICAgcnVuU21hcnRTZWxlY3Rpb25PcHRzLmVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICAgICAgICBydW5TbWFydFNlbGVjdGlvbk9wdHMubW9kZSB8fCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCxcbiAgICAgICAgICAgIHJ1blNtYXJ0U2VsZWN0aW9uT3B0cy5zb3VyY2UgPz8gbnVsbFxuICAgICAgICApXG4gICAgICAgIC8vIEV4dHJhY3QgYnVpbGQgZGV0YWlscyBmcm9tIGNhcGFiaWxpdGllc1xuICAgICAgICB0aGlzLl9leHRyYWN0QnVpbGREZXRhaWxzKGNvbmZpZylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IGJ1aWxkIGRldGFpbHMgZnJvbSBjYXBhYmlsaXRpZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIF9leHRyYWN0QnVpbGREZXRhaWxzKGNvbmZpZzogT3JjaGVzdHJhdGlvbkNvbmZpZyk6IHZvaWQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnUmVjb3JkID0gaXNQbGFpbk9iamVjdChjb25maWcpID8gY29uZmlnIDoge31cbiAgICAgICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IChjb25maWdSZWNvcmQgYXMgeyBjYXBhYmlsaXRpZXM/OiB1bmtub3duIH0pLmNhcGFiaWxpdGllc1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmZvckVhY2goY2FwYWJpbGl0eSA9PiB0aGlzLl9wYXJzZUNhcGFiaWxpdHkoY2FwYWJpbGl0eSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoY2FwYWJpbGl0aWVzKSkge1xuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBtdWx0aXJlbW90ZSBjYXBhYmlsaXRpZXNcbiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKGNhcGFiaWxpdGllcykuZm9yRWFjaCgoY2FwcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNQbGFpbk9iamVjdChjYXBzKSAmJiAnY2FwYWJpbGl0aWVzJyBpbiBjYXBzICYmIGlzUGxhaW5PYmplY3QoY2Fwcy5jYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZUNhcGFiaWxpdHkoY2Fwcy5jYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtfZXh0cmFjdEJ1aWxkRGV0YWlsc10gRXh0cmFjdGVkIC0gcHJvamVjdE5hbWU6ICR7dGhpcy5wcm9qZWN0TmFtZX0sIGJ1aWxkTmFtZTogJHt0aGlzLmJ1aWxkTmFtZX0sIGJ1aWxkSWRlbnRpZmllcjogJHt0aGlzLmJ1aWxkSWRlbnRpZmllcn1gKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBbX2V4dHJhY3RCdWlsZERldGFpbHNdICR7ZXJyb3J9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQ2FwYWJpbGl0eShjYXBhYmlsaXR5OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmICghaXNQbGFpbk9iamVjdChjYXBhYmlsaXR5KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBic3RhY2tPcHRpb25zUmF3ID0gY2FwYWJpbGl0eVsnYnN0YWNrOm9wdGlvbnMnXVxuXG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KGJzdGFja09wdGlvbnNSYXcpKSB7XG4gICAgICAgICAgICBjb25zdCBidWlsZE5hbWUgPSBhc1N0cmluZyhic3RhY2tPcHRpb25zUmF3LmJ1aWxkTmFtZSlcbiAgICAgICAgICAgIGNvbnN0IHByb2plY3ROYW1lID0gYXNTdHJpbmcoYnN0YWNrT3B0aW9uc1Jhdy5wcm9qZWN0TmFtZSlcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkSWRlbnRpZmllciA9IGFzU3RyaW5nKGJzdGFja09wdGlvbnNSYXcuYnVpbGRJZGVudGlmaWVyKVxuXG4gICAgICAgICAgICBpZiAoYnVpbGROYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZE5hbWUgPSBidWlsZE5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9qZWN0TmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ1aWxkSWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRJZGVudGlmaWVyID0gYnVpbGRJZGVudGlmaWVyXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsZWdhY3lCdWlsZElkZW50aWZpZXIgPSBhc1N0cmluZyhjYXBhYmlsaXR5Wydicm93c2Vyc3RhY2suYnVpbGRJZGVudGlmaWVyJ10pXG4gICAgICAgICAgICBjb25zdCBsZWdhY3lCdWlsZE5hbWUgPSBhc1N0cmluZyhjYXBhYmlsaXR5LmJ1aWxkKVxuXG4gICAgICAgICAgICBpZiAobGVnYWN5QnVpbGRJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZElkZW50aWZpZXIgPSBsZWdhY3lCdWlsZElkZW50aWZpZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZWdhY3lCdWlsZE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkTmFtZSA9IGxlZ2FjeUJ1aWxkTmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IG9yIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBPcmNoZXN0cmF0aW9uVXRpbHNcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoY29uZmlnPzogT3JjaGVzdHJhdGlvbkNvbmZpZyk6IE9yY2hlc3RyYXRpb25VdGlscyB8IG51bGwge1xuICAgICAgICBpZiAoIU9yY2hlc3RyYXRpb25VdGlscy5faW5zdGFuY2UgJiYgY29uZmlnKSB7XG4gICAgICAgICAgICBPcmNoZXN0cmF0aW9uVXRpbHMuX2luc3RhbmNlID0gbmV3IE9yY2hlc3RyYXRpb25VdGlscyhjb25maWcpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9yY2hlc3RyYXRpb25VdGlscy5faW5zdGFuY2VcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgb3JjaGVzdHJhdGlvbiBkYXRhIGZyb20gY29uZmlnXG4gICAgICovXG4gICAgc3RhdGljIGdldE9yY2hlc3RyYXRpb25EYXRhKGNvbmZpZzogT3JjaGVzdHJhdGlvbkNvbmZpZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAgICAgY29uc3QgY29uZmlnUmVjb3JkID0gaXNQbGFpbk9iamVjdChjb25maWcpID8gY29uZmlnIDoge31cbiAgICAgICAgY29uc3Qgb3JjaGVzdHJhdGlvbkRhdGEgPSBpc1BsYWluT2JqZWN0KGNvbmZpZ1JlY29yZC50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnMpXG4gICAgICAgICAgICA/IGNvbmZpZ1JlY29yZC50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnNcbiAgICAgICAgICAgIDoge31cbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMob3JjaGVzdHJhdGlvbkRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgaWYgKEFMTE9XRURfT1JDSEVTVFJBVElPTl9LRVlTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBydW4gc21hcnQgc2VsZWN0aW9uIHNldHRpbmdcbiAgICAgKi9cbiAgICBnZXRSdW5TbWFydFNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuU21hcnRTZWxlY3Rpb25cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc21hcnQgc2VsZWN0aW9uIG1vZGVcbiAgICAgKi9cbiAgICBnZXRTbWFydFNlbGVjdGlvbk1vZGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNtYXJ0IHNlbGVjdGlvbiBzb3VyY2VcbiAgICAgKi9cbiAgICBnZXRTbWFydFNlbGVjdGlvblNvdXJjZSgpOiBTbWFydFNlbGVjdGlvblNvdXJjZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHByb2plY3QgbmFtZVxuICAgICAqL1xuICAgIGdldFByb2plY3ROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2plY3ROYW1lXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJ1aWxkIG5hbWVcbiAgICAgKi9cbiAgICBnZXRCdWlsZE5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGROYW1lXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJ1aWxkIGlkZW50aWZpZXJcbiAgICAgKi9cbiAgICBnZXRCdWlsZElkZW50aWZpZXIoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRJZGVudGlmaWVyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGJ1aWxkIGRldGFpbHNcbiAgICAgKi9cbiAgICBzZXRCdWlsZERldGFpbHMocHJvamVjdE5hbWU/OiBzdHJpbmcsIGJ1aWxkTmFtZT86IHN0cmluZywgYnVpbGRJZGVudGlmaWVyPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZVxuICAgICAgICB0aGlzLmJ1aWxkTmFtZSA9IGJ1aWxkTmFtZVxuICAgICAgICB0aGlzLmJ1aWxkSWRlbnRpZmllciA9IGJ1aWxkSWRlbnRpZmllclxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtzZXRCdWlsZERldGFpbHNdIFNldCAtIHByb2plY3ROYW1lOiAke3RoaXMucHJvamVjdE5hbWV9LCBidWlsZE5hbWU6ICR7dGhpcy5idWlsZE5hbWV9LCBidWlsZElkZW50aWZpZXI6ICR7dGhpcy5idWlsZElkZW50aWZpZXJ9YClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcnVuIHNtYXJ0IHNlbGVjdGlvblxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldFJ1blNtYXJ0U2VsZWN0aW9uKGVuYWJsZWQ6IGJvb2xlYW4gfCBzdHJpbmcsIG1vZGU6IHN0cmluZywgc291cmNlOiBzdHJpbmdbXSB8IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXSB8IHN0cmluZyB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBQcm9wZXJseSB2YWxpZGF0ZSBlbmFibGVkIHZhbHVlIC0gb25seSBhY2NlcHQgdHJ1ZSBib29sZWFuIG9yIHN0cmluZyBcInRydWVcIlxuICAgICAgICAgICAgdGhpcy5ydW5TbWFydFNlbGVjdGlvbiA9IGlzVmFsaWRFbmFibGVkVmFsdWUoZW5hYmxlZClcbiAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlID0gbW9kZVxuICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IFtdXG5cbiAgICAgICAgICAgIC8vIExvZyB0aGUgY29uZmlndXJhdGlvbiBmb3IgZGVidWdnaW5nXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFNldHRpbmcgcnVuU21hcnRTZWxlY3Rpb246IGVuYWJsZWQ9JHt0aGlzLnJ1blNtYXJ0U2VsZWN0aW9ufSwgbW9kZT0ke3RoaXMuc21hcnRTZWxlY3Rpb25Nb2RlfWApXG4gICAgICAgICAgICBpZiAodGhpcy5ydW5TbWFydFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIE1vZGUgdmFsaWRhdGlvbiAtIG9ubHkgd2hlbiBzbWFydCBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkTW9kZXMgPSBbU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1QsIFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX09OTFldXG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZE1vZGVzLmluY2x1ZGVzKHRoaXMuc21hcnRTZWxlY3Rpb25Nb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgSW52YWxpZCBzbWFydCBzZWxlY3Rpb24gbW9kZSAnJHt0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZX0nIHByb3ZpZGVkLiBEZWZhdWx0aW5nIHRvICcke1NNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNUfScuYClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvbk1vZGUgPSBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2UgPSBudWxsXG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnTm8gc291cmNlIHByb3ZpZGVkIGZvciBzbWFydCBzZWxlY3Rpb247IGRlZmF1bHRpbmcgdG8gbnVsbC4nKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2UgPSBzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTbWFydCBzZWxlY3Rpb24gc291cmNlIHNldCB0byBhcnJheTogJHtKU09OLnN0cmluZ2lmeShzb3VyY2UpfWApXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJyAmJiBzb3VyY2UuZW5kc1dpdGgoJy5qc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IHRoaXMuX2xvYWRTb3VyY2VGcm9tRmlsZShzb3VyY2UpIHx8IFtdXG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgU21hcnQgc2VsZWN0aW9uIHNvdXJjZSBsb2FkZWQgZnJvbSBmaWxlOiAke3NvdXJjZX1gKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRUZXN0T3JkZXJpbmcoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFtfc2V0UnVuU21hcnRTZWxlY3Rpb25dICR7ZX1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgSlNPTiBzb3VyY2UgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBmb3JtYXQgaXQgZm9yIHNtYXJ0IHNlbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlUGF0aCAtIFBhdGggdG8gdGhlIEpTT04gY29uZmlndXJhdGlvbiBmaWxlXG4gICAgICogQHJldHVybnMgRm9ybWF0dGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uc1xuICAgICAqL1xuICAgIHByaXZhdGUgX2xvYWRTb3VyY2VGcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nKTogU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBTb3VyY2UgZmlsZSAnJHtmaWxlUGF0aH0nIGRvZXMgbm90IGV4aXN0LmApXG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXRhOiB1bmtub3duID0gbnVsbFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JylcbiAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBwYXJzaW5nIEpTT04gZnJvbSBzb3VyY2UgZmlsZSAnJHtmaWxlUGF0aH0nOiAke21lc3NhZ2V9YClcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FjaGUgZmVhdHVyZSBicmFuY2ggbWFwcGluZ3MgZnJvbSBlbnYgdG8gYXZvaWQgcmVwZWF0ZWQgcGFyc2luZ1xuICAgICAgICBsZXQgZmVhdHVyZUJyYW5jaEVudk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgY29uc3QgbG9hZEZlYXR1cmVCcmFuY2hNYXBzID0gKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICAgICAgICAgICAgY29uc3QgZW52VmFyID0gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX09SQ0hFU1RSQVRJT05fU01BUlRfU0VMRUNUSU9OX0ZFQVRVUkVfQlJBTkNIRVMgfHwgJydcbiAgICAgICAgICAgIGxldCBlbnZNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGVudk1hcCA9IGVudlZhci5zdGFydHNXaXRoKCd7JykgJiYgZW52VmFyLmVuZHNXaXRoKCd9JylcbiAgICAgICAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKGVudlZhcilcbiAgICAgICAgICAgICAgICAgICAgOiBlbnZWYXIuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0uaW5jbHVkZXMoJzonKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGFjYzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgaXRlbTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gaXRlbS5zcGxpdCgnOicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nba2V5LnRyaW0oKV0gPSB2YWx1ZS50cmltKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgcGFyc2luZyBmZWF0dXJlIGJyYW5jaCBtYXBwaW5nczogJHtlcnJvcn1gKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZlYXR1cmUgYnJhbmNoIG1hcHBpbmdzIGZyb20gZW52OiAke0pTT04uc3RyaW5naWZ5KGVudk1hcCl9YClcbiAgICAgICAgICAgIHJldHVybiBlbnZNYXBcbiAgICAgICAgfVxuXG4gICAgICAgIGZlYXR1cmVCcmFuY2hFbnZNYXAgPSBsb2FkRmVhdHVyZUJyYW5jaE1hcHMoKVxuXG4gICAgICAgIGNvbnN0IGdldEZlYXR1cmVCcmFuY2ggPSAobmFtZTogc3RyaW5nLCByZXBvSW5mbzogU21hcnRTZWxlY3Rpb25SZXBvSW5mbyk6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgICAgICAgICAgLy8gMS4gQ2hlY2sgaW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbWFwXG4gICAgICAgICAgICBpZiAoZmVhdHVyZUJyYW5jaEVudk1hcCAmJiBmZWF0dXJlQnJhbmNoRW52TWFwW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVCcmFuY2hFbnZNYXBbbmFtZV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDIuIENoZWNrIGluIHJlcG9faW5mb1xuICAgICAgICAgICAgaWYgKHJlcG9JbmZvLmZlYXR1cmVCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwb0luZm8uZmVhdHVyZUJyYW5jaFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0YTogU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdID0gW11cbiAgICAgICAgICAgIGNvbnN0IG5hbWVQYXR0ZXJuID0gL15bQS1aMC05X10rJC9cblxuICAgICAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgcmVwb0luZm9dIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KHJlcG9JbmZvKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUmVwb0luZm8gPSByZXBvSW5mbyBhcyBTbWFydFNlbGVjdGlvblJlcG9JbmZvXG5cbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHVybCBpcyBhIHN0cmluZyBhbmQgaXMgcHJlc2VudFxuICAgICAgICAgICAgICAgIGlmICghdHlwZWRSZXBvSW5mby51cmwgfHwgdHlwZW9mIHR5cGVkUmVwb0luZm8udXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgUmVwb3NpdG9yeSBVUkwgaXMgbWlzc2luZyBvciBpbnZhbGlkIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgYmFzZUJyYW5jaCwgaWYgcHJvdmlkZWQsIGlzIGEgc3RyaW5nXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVkUmVwb0luZm8uYmFzZUJyYW5jaCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0eXBlZFJlcG9JbmZvLmJhc2VCcmFuY2ggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBCYXNlIGJyYW5jaCBtdXN0IGJlIGEgc3RyaW5nIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgZmVhdHVyZUJyYW5jaCwgaWYgcHJvdmlkZWQsIGlzIGEgc3RyaW5nXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVkUmVwb0luZm8uZmVhdHVyZUJyYW5jaCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0eXBlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2ggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBGZWF0dXJlIGJyYW5jaCBtdXN0IGJlIGEgc3RyaW5nIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIG5hbWVcbiAgICAgICAgICAgICAgICBpZiAoIW5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEludmFsaWQgc291cmNlIGlkZW50aWZpZXIgZm9ybWF0IGZvciAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgbGVuZ3RoXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUubGVuZ3RoID4gMzAgfHwgbmFtZS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBTb3VyY2UgaWRlbnRpZmllciAnJHtuYW1lfScgbXVzdCBoYXZlIGEgbGVuZ3RoIGJldHdlZW4gMSBhbmQgMzAgY2hhcmFjdGVycy5gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgdXJsLCBiYXNlQnJhbmNoLCBhbmQgZmVhdHVyZUJyYW5jaCAtIGlnbm9yZSBhbGwgb3RoZXIga2V5c1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVCcmFuY2ggPSBnZXRGZWF0dXJlQnJhbmNoKG5hbWUsIHR5cGVkUmVwb0luZm8pXG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFJlcG9JbmZvOiBTbWFydFNlbGVjdGlvblJlcG9JbmZvID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHR5cGVkUmVwb0luZm8udXJsLFxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlQnJhbmNoOiBmZWF0dXJlQnJhbmNoID8/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE9ubHkgYWRkIGJhc2VCcmFuY2ggaWYgaXQncyBwcm92aWRlZFxuICAgICAgICAgICAgICAgIGlmICh0eXBlZFJlcG9JbmZvLmJhc2VCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRSZXBvSW5mby5iYXNlQnJhbmNoID0gdHlwZWRSZXBvSW5mby5iYXNlQnJhbmNoXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2ggfHwgZmlsdGVyZWRSZXBvSW5mby5mZWF0dXJlQnJhbmNoID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgRmVhdHVyZSBicmFuY2ggbm90IHNwZWNpZmllZCBmb3Igc291cmNlICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRSZXBvSW5mby5iYXNlQnJhbmNoICYmIGZpbHRlcmVkUmVwb0luZm8uYmFzZUJyYW5jaCA9PT0gZmlsdGVyZWRSZXBvSW5mby5mZWF0dXJlQnJhbmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBGZWF0dXJlIGJyYW5jaCBhbmQgYmFzZSBicmFuY2ggY2Fubm90IGJlIHRoZSBzYW1lIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvcm1hdHRlZERhdGEucHVzaChmaWx0ZXJlZFJlcG9JbmZvKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0dGVkRGF0YVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmZpbHRlcihpc1BsYWluT2JqZWN0KSBhcyBTbWFydFNlbGVjdGlvblJlcG9JbmZvW11cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0ZXN0IG9yZGVyaW5nIGJhc2VkIG9uIHByaW9yaXRpZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXRUZXN0T3JkZXJpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uKSB7IC8vIEhpZ2hlc3QgcHJpb3JpdHlcbiAgICAgICAgICAgIHRoaXMudGVzdE9yZGVyaW5nLmVuYWJsZShSVU5fU01BUlRfU0VMRUNUSU9OKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50ZXN0T3JkZXJpbmcuZGlzYWJsZSgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0ZXN0IG9yZGVyaW5nIGlzIGVuYWJsZWRcbiAgICAgKi9cbiAgICB0ZXN0T3JkZXJpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXN0T3JkZXJpbmcuZ2V0RW5hYmxlZCgpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRlc3Qgb3JkZXJpbmcgbmFtZVxuICAgICAqL1xuICAgIGdldFRlc3RPcmRlcmluZ05hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RPcmRlcmluZy5nZXRFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlc3RPcmRlcmluZy5nZXROYW1lKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0ZXN0IG9yY2hlc3RyYXRpb24gbWV0YWRhdGFcbiAgICAgKi9cbiAgICBnZXRUZXN0T3JjaGVzdHJhdGlvbk1ldGFkYXRhKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgICdydW5fc21hcnRfc2VsZWN0aW9uJzoge1xuICAgICAgICAgICAgICAgICdlbmFibGVkJzogdGhpcy5nZXRSdW5TbWFydFNlbGVjdGlvbigpLFxuICAgICAgICAgICAgICAgICdtb2RlJzogdGhpcy5nZXRTbWFydFNlbGVjdGlvbk1vZGUoKSxcbiAgICAgICAgICAgICAgICAnc291cmNlJzogdGhpcy5nZXRTbWFydFNlbGVjdGlvblNvdXJjZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYnVpbGQgc3RhcnQgZGF0YVxuICAgICAqL1xuICAgIGdldEJ1aWxkU3RhcnREYXRhKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJ1bl9zbWFydF9zZWxlY3Rpb246IHtcbiAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLmdldFJ1blNtYXJ0U2VsZWN0aW9uKCksXG4gICAgICAgICAgICAgICAgbW9kZTogdGhpcy5nZXRTbWFydFNlbGVjdGlvbk1vZGUoKVxuICAgICAgICAgICAgICAgIC8vIE5vdCBzZW5kaW5nIFwic291cmNlXCIgdG8gVEggYnVpbGRzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE9yY2hlc3RyYXRpb25VdGlsc1xuIiwgImltcG9ydCB0eXBlIHsgQ2FwYWJpbGl0aWVzLCBPcHRpb25zIH0gZnJvbSAnQHdkaW8vdHlwZXMnXG5cbmltcG9ydCB7IEJTVEFDS19TRVJWSUNFX1ZFUlNJT04sIEJST1dTRVJTVEFDS19URVNUSFVCX1VVSUQsIFdESU9fTkFNSU5HX1BSRUZJWCB9IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHR5cGUgeyBCcm93c2Vyc3RhY2tDb25maWcsIENyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQsIFVzZXJDb25maWdmb3JSZXBvcnRpbmcgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgREVGQVVMVF9SRVFVRVNUX0NPTkZJRywgZ2V0T2JzZXJ2YWJpbGl0eUtleSwgZ2V0T2JzZXJ2YWJpbGl0eVVzZXIgfSBmcm9tICcuL3V0aWwuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuL2NsaS9hcGlVdGlscy5qcydcblxuaW1wb3J0IHsgX2ZldGNoIGFzIGZldGNoIH0gZnJvbSAnLi9mZXRjaFdyYXBwZXIuanMnXG5cbnR5cGUgRGljdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENyYXNoUmVwb3J0ZXIge1xuICAgIC8qIFVzZXIgdGVzdCBjb25maWcgZm9yIGJ1aWxkIHJ1biBtaW51cyBQSUkgKi9cbiAgICBwdWJsaWMgc3RhdGljIHVzZXJDb25maWdGb3JSZXBvcnRpbmc6IFVzZXJDb25maWdmb3JSZXBvcnRpbmcgPSB7fVxuICAgIC8qIFVzZXIgY3JlZGVudGlhbHMgdXNlZCBmb3IgcmVwb3J0aW5nIGNyYXNoZXMgaW4gYnJvd3NlcnN0YWNrIHNlcnZpY2UgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBjcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkOiBDcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkID0ge31cblxuICAgIHN0YXRpYyBzZXRDcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkID0ge1xuICAgICAgICAgICAgdXNlcm5hbWU6IGdldE9ic2VydmFiaWxpdHlVc2VyKG9wdGlvbnMsIGNvbmZpZyksXG4gICAgICAgICAgICBwYXNzd29yZDogZ2V0T2JzZXJ2YWJpbGl0eUtleShvcHRpb25zLCBjb25maWcpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzcy5lbnYuQ1JFREVOVElBTFNfRk9SX0NSQVNIX1JFUE9SVElORyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZClcbiAgICB9XG5cbiAgICBzdGF0aWMgc2V0Q29uZmlnRGV0YWlscyh1c2VyQ29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsIGNhcGFiaWxpdGllczogQ2FwYWJpbGl0aWVzLlRlc3RydW5uZXJDYXBhYmlsaXRpZXMsIG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgICAgICBjb25zdCBjb25maWdXaXRob3V0UElJID0gdGhpcy5maWx0ZXJQSUkodXNlckNvbmZpZylcbiAgICAgICAgY29uc3QgZmlsdGVyZWRDYXBhYmlsaXRpZXMgPSB0aGlzLmZpbHRlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpXG4gICAgICAgIHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZyA9IHtcbiAgICAgICAgICAgIGZyYW1ld29yazogdXNlckNvbmZpZy5mcmFtZXdvcmssXG4gICAgICAgICAgICBzZXJ2aWNlczogY29uZmlnV2l0aG91dFBJSS5zZXJ2aWNlcyxcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogZmlsdGVyZWRDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAnQlJPV1NFUlNUQUNLX0JVSUxEJzogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0JVSUxELFxuICAgICAgICAgICAgICAgICdCUk9XU0VSU1RBQ0tfQlVJTERfTkFNRSc6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19CVUlMRF9OQU1FLFxuICAgICAgICAgICAgICAgICdCVUlMRF9UQUcnOiBwcm9jZXNzLmVudi5CVUlMRF9UQUdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HID0gSlNPTi5zdHJpbmdpZnkodGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nKVxuICAgICAgICB0aGlzLnNldENyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQob3B0aW9ucywgdXNlckNvbmZpZylcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgdXBsb2FkQ3Jhc2hSZXBvcnQoZXhjZXB0aW9uOiBzdHJpbmcsIHN0YWNrVHJhY2U6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQudXNlcm5hbWUgfHwgIXRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC5wYXNzd29yZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZCA9IHByb2Nlc3MuZW52LkNSRURFTlRJQUxTX0ZPUl9DUkFTSF9SRVBPUlRJTkcgIT09IHVuZGVmaW5lZCA/IEpTT04ucGFyc2UocHJvY2Vzcy5lbnYuQ1JFREVOVElBTFNfRk9SX0NSQVNIX1JFUE9SVElORykgOiB0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBCU3RhY2tMb2dnZXIuZXJyb3IoYFtDcmFzaF9SZXBvcnRfVXBsb2FkXSBGYWlsZWQgdG8gcGFyc2UgdXNlciBjcmVkZW50aWFscyB3aGlsZSByZXBvcnRpbmcgY3Jhc2ggZHVlIHRvICR7ZXJyb3J9YClcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC51c2VybmFtZSB8fCAhdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gQlN0YWNrTG9nZ2VyLmVycm9yKCdbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIHRvIHBhcnNlIHVzZXIgY3JlZGVudGlhbHMgd2hpbGUgcmVwb3J0aW5nIGNyYXNoJylcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcgPSBwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HICE9PSB1bmRlZmluZWQgPyBKU09OLnBhcnNlKHByb2Nlc3MuZW52LlVTRVJfQ09ORklHX0ZPUl9SRVBPUlRJTkcpIDoge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgW0NyYXNoX1JlcG9ydF9VcGxvYWRdIEZhaWxlZCB0byBwYXJzZSB1c2VyIGNvbmZpZyB3aGlsZSByZXBvcnRpbmcgY3Jhc2ggZHVlIHRvICR7ZXJyb3J9YClcbiAgICAgICAgICAgIHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZyA9IHt9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgaGFzaGVkX2lkOiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXSxcbiAgICAgICAgICAgIG9ic2VydmFiaWxpdHlfdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIGZyYW1ld29ya05hbWU6IFdESU9fTkFNSU5HX1BSRUZJWCArICh0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcuZnJhbWV3b3JrIHx8ICdudWxsJyksXG4gICAgICAgICAgICAgICAgc2RrVmVyc2lvbjogQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4Y2VwdGlvbjoge1xuICAgICAgICAgICAgICAgIGVycm9yOiBleGNlcHRpb24udG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBzdGFja1RyYWNlOiBzdGFja1RyYWNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlnOiB0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmdcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElVdGlscy5EQVRBX0VORFBPSU5UfS9hcGkvdjEvYW5hbHl0aWNzYFxuXG4gICAgICAgIGNvbnN0IGVuY29kZWRBdXRoID0gQnVmZmVyLmZyb20oYCR7dGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnVzZXJuYW1lfToke3RoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC5wYXNzd29yZH1gLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgLi4uREVGQVVMVF9SRVFVRVNUX0NPTkZJRy5oZWFkZXJzLFxuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7ZW5jb2RlZEF1dGh9YCxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgbGV0IGJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KClcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UoYm9keSkpXG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNwb25zZSBpcyBub3QgSlNPTiwgdXNlIHRleHQgYXMtaXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW0NyYXNoX1JlcG9ydF9VcGxvYWRdIFN1Y2Nlc3MgcmVzcG9uc2U6ICR7Ym9keX1gKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIGR1ZSB0byAke3Jlc3BvbnNlLmJvZHl9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyByZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KG9iajogRGljdCB8IEFycmF5PERpY3Q+LCBrZXlzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgb2JqLm1hcChlbGUgPT4gdGhpcy5yZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KGVsZSwga2V5cykpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleXMuaW5jbHVkZXMocHJvcC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICBvYmpbcHJvcF0gPSAnW1JFREFDVEVEXSdcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpbcHJvcF0gPT09ICdvYmplY3QnICYmIG9ialtwcm9wXSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3Qob2JqW3Byb3BdIGFzIERpY3QgfCBBcnJheTxEaWN0Piwga2V5cylcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpbcHJvcF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKG9ialtwcm9wXSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcgJiYgcGFyc2VkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KHBhcnNlZCBhcyBEaWN0IHwgQXJyYXk8RGljdD4sIGtleXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqW3Byb3BdID0gSlNPTi5zdHJpbmdpZnkocGFyc2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCB2YWxpZCBKU09OLCBsZWF2ZSBhcy1pc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGRlbGV0ZVBJSUtleXNGcm9tT2JqZWN0KG9iajogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pIHtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIFsndXNlcicsICd1c2VybmFtZScsICdrZXknLCAnYWNjZXNzS2V5J10uZm9yRWFjaChrZXkgPT4gZGVsZXRlIG9ialtrZXldKVxuICAgIH1cblxuICAgIHN0YXRpYyBmaWx0ZXJDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXRpZXMuVGVzdHJ1bm5lckNhcGFiaWxpdGllcykge1xuICAgICAgICBjb25zdCBjYXBzQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY2FwYWJpbGl0aWVzKSlcbiAgICAgICAgdGhpcy5yZWN1cnNpdmVseVJlZGFjdEtleXNGcm9tT2JqZWN0KGNhcHNDb3B5LCBbJ2V4dGVuc2lvbnMnXSlcbiAgICAgICAgcmV0dXJuIGNhcHNDb3B5XG4gICAgfVxuXG4gICAgc3RhdGljIGZpbHRlclBJSSh1c2VyQ29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICAgICAgY29uc3QgY29uZmlnV2l0aG91dFBJSSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodXNlckNvbmZpZykpXG4gICAgICAgIHRoaXMuZGVsZXRlUElJS2V5c0Zyb21PYmplY3QoY29uZmlnV2l0aG91dFBJSSlcbiAgICAgICAgY29uc3QgZmluYWxTZXJ2aWNlcyA9IFtdXG4gICAgICAgIGNvbnN0IGluaXRpYWxTZXJ2aWNlcyA9IGNvbmZpZ1dpdGhvdXRQSUkuc2VydmljZXNcbiAgICAgICAgZGVsZXRlIGNvbmZpZ1dpdGhvdXRQSUkuc2VydmljZXNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VydmljZUFycmF5IG9mIGluaXRpYWxTZXJ2aWNlcykge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlcnZpY2VBcnJheSkgJiYgc2VydmljZUFycmF5Lmxlbmd0aCA+PSAyICYmIHNlcnZpY2VBcnJheVswXSA9PT0gJ2Jyb3dzZXJzdGFjaycpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMTsgaWR4IDwgc2VydmljZUFycmF5Lmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlUElJS2V5c0Zyb21PYmplY3Qoc2VydmljZUFycmF5W2lkeF0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZUFycmF5W2lkeF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYm90aCBuZXcgdGVzdFJlcG9ydGluZ09wdGlvbnMgYW5kIGxlZ2FjeSB0ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVBJSUtleXNGcm9tT2JqZWN0KHNlcnZpY2VBcnJheVtpZHhdLnRlc3RSZXBvcnRpbmdPcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlUElJS2V5c0Zyb21PYmplY3Qoc2VydmljZUFycmF5W2lkeF0udGVzdE9ic2VydmFiaWxpdHlPcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsU2VydmljZXMucHVzaChzZXJ2aWNlQXJyYXkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8qIFdyb25nIGNvbmZpZ3VyYXRpb24gbGlrZSBzdHJpbmdzIGluc3RlYWQgb2YganNvbiBvYmplY3RzIGNvdWxkIGJyZWFrIHRoaXMgbWV0aG9kLCBuZWVkcyBubyBhY3Rpb24gKi9cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGFyc2luZyB1c2VyIGNvbmZpZyBQSUkgd2l0aCBlcnJvciAke2VyciA/ICgoZXJyIGFzIEVycm9yKS5zdGFjayB8fCBlcnIpIDogZXJyfWApXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnV2l0aG91dFBJSVxuICAgICAgICB9XG4gICAgICAgIGNvbmZpZ1dpdGhvdXRQSUkuc2VydmljZXMgPSBmaW5hbFNlcnZpY2VzXG4gICAgICAgIHJldHVybiBjb25maWdXaXRob3V0UElJXG4gICAgfVxufVxuIiwgImltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB0eXBlIHsgRmVhdHVyZVN0YXRzT3ZlcnZpZXcgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGlzT2JqZWN0RW1wdHkgfSBmcm9tICcuLi91dGlsLmpzJ1xuXG5pbnRlcmZhY2UgRmVhdHVyZVN0YXRzTWFwIHtcbiAgICBbZ3JvdXBJZDogc3RyaW5nXTogRmVhdHVyZVN0YXRzO1xufVxuXG5pbnRlcmZhY2UgSlNPTkNvbnZlcnNpb25TZXR0aW5ncyB7XG4gICAgb21pdEdyb3Vwcz86IGJvb2xlYW5cbiAgICBvbmx5R3JvdXBzPzogYm9vbGVhblxuICAgIG5lc3RlZEdyb3Vwcz86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlIHtcbiAgICB0cmlnZ2VyZWRDb3VudDogbnVtYmVyXG4gICAgc2VudENvdW50OiBudW1iZXJcbiAgICBmYWlsZWRDb3VudDogbnVtYmVyXG4gICAgZ3JvdXBzOiBGZWF0dXJlW11cbn1cblxuY2xhc3MgRmVhdHVyZVN0YXRzIHtcbiAgICBwcml2YXRlIHRyaWdnZXJlZENvdW50OiBudW1iZXIgPSAwXG4gICAgcHJpdmF0ZSBzZW50Q291bnQ6IG51bWJlciA9IDBcbiAgICBwcml2YXRlIGZhaWxlZENvdW50OiBudW1iZXIgPSAwXG4gICAgcHJpdmF0ZSBncm91cHM6IEZlYXR1cmVTdGF0c01hcCA9IHt9XG5cbiAgICBwdWJsaWMgbWFyayhzdGF0dXM6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgJ3RyaWdnZXJlZCc6XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJlZChncm91cElkKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgIGNhc2UgJ3NlbnQnOlxuICAgICAgICAgICAgdGhpcy5zZW50KGdyb3VwSWQpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdmYWlsZWQnOlxuICAgICAgICAgICAgdGhpcy5mYWlsZWQoZ3JvdXBJZClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1JlcXVlc3QgdG8gbWFyayB1c2FnZSBmb3IgdW5rbm93biBzdGF0dXMgLSAnICsgc3RhdHVzKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyZWQoZ3JvdXBJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyaWdnZXJlZENvdW50ICs9IDFcbiAgICAgICAgaWYgKGdyb3VwSWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoZ3JvdXBJZCkudHJpZ2dlcmVkKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZW50KGdyb3VwSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZW50Q291bnQgKz0gMVxuICAgICAgICBpZiAoZ3JvdXBJZCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVHcm91cChncm91cElkKS5zZW50KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBmYWlsZWQoZ3JvdXBJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmZhaWxlZENvdW50ICs9IDFcbiAgICAgICAgaWYgKGdyb3VwSWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlR3JvdXAoZ3JvdXBJZCkuZmFpbGVkKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdWNjZXNzKGdyb3VwSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZW50KGdyb3VwSWQpXG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUdyb3VwKGdyb3VwSWQ6IHN0cmluZyk6IEZlYXR1cmVTdGF0cyB7XG4gICAgICAgIGlmICghdGhpcy5ncm91cHNbZ3JvdXBJZF0pIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzW2dyb3VwSWRdID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzW2dyb3VwSWRdXG4gICAgfVxuXG4gICAgcHVibGljIGdldFRyaWdnZXJlZENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyaWdnZXJlZENvdW50XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNlbnRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW50Q291bnRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmFpbGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbGVkQ291bnRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VXNhZ2VGb3JHcm91cChncm91cElkOiBzdHJpbmcpOiBGZWF0dXJlU3RhdHMge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNbZ3JvdXBJZF0gfHwgbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgfVxuXG4gICAgcHVibGljIGdldE92ZXJ2aWV3KCk6IEZlYXR1cmVTdGF0c092ZXJ2aWV3IHtcbiAgICAgICAgcmV0dXJuIHsgdHJpZ2dlcmVkQ291bnQ6IHRoaXMudHJpZ2dlcmVkQ291bnQsIHNlbnRDb3VudDogdGhpcy5zZW50Q291bnQsIGZhaWxlZENvdW50OiB0aGlzLmZhaWxlZENvdW50IH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0R3JvdXBzKCk6IEZlYXR1cmVTdGF0c01hcCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwc1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGQoZmVhdHVyZVN0YXRzOiBGZWF0dXJlU3RhdHMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyZWRDb3VudCArPSBmZWF0dXJlU3RhdHMuZ2V0VHJpZ2dlcmVkQ291bnQoKVxuICAgICAgICB0aGlzLnNlbnRDb3VudCArPSBmZWF0dXJlU3RhdHMuZ2V0U2VudENvdW50KClcbiAgICAgICAgdGhpcy5mYWlsZWRDb3VudCArPSBmZWF0dXJlU3RhdHMuZ2V0RmFpbGVkQ291bnQoKVxuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGZlYXR1cmVTdGF0cy5nZXRHcm91cHMoKSkuZm9yRWFjaCgoW2dyb3VwSWQsIGdyb3VwXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVHcm91cChncm91cElkKS5hZGQoZ3JvdXApXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gb21pdEdyb3VwczogdHJ1ZS9mYWxzZSAtPiBJbmNsdWRlIGdyb3VwcyBvciBub3RcbiAgICAvLyBvbmx5R3JvdXBzOiB0cnVlL2ZhbHNlIC0+IGRhdGEgaW5jbHVkZXMgb25seSBncm91cHNcbiAgICAvLyBuZXN0ZWRHcm91cHM6IHRydWUvZmFsc2UgLT4gZ3JvdXBzIHdpbGwgYmUgbmVzdGVkIGluIGdyb3VwcyBpZiB0cnVlXG4gICAgcHVibGljIHRvSlNPTihjb25maWc6IEpTT05Db252ZXJzaW9uU2V0dGluZ3MgPSB7fSkge1xuICAgICAgICBjb25zdCBvdmVydmlld0RhdGE6IEZlYXR1cmVTdGF0c092ZXJ2aWV3fFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9ICFjb25maWcub25seUdyb3VwcyA/IHtcbiAgICAgICAgICAgIHRyaWdnZXJlZENvdW50OiB0aGlzLnRyaWdnZXJlZENvdW50LFxuICAgICAgICAgICAgc2VudENvdW50OiB0aGlzLnNlbnRDb3VudCxcbiAgICAgICAgICAgIGZhaWxlZENvdW50OiB0aGlzLmZhaWxlZENvdW50XG4gICAgICAgIH0gOiB7fVxuXG4gICAgICAgIGNvbnN0IGdyb3Vwc0RhdGE6IFJlY29yZDxzdHJpbmcsIEZlYXR1cmVTdGF0c092ZXJ2aWV3PiA9IHt9XG4gICAgICAgIGlmICghY29uZmlnLm9taXRHcm91cHMpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZ3JvdXBzKS5mb3JFYWNoKChbZ3JvdXBJZCwgZ3JvdXBdKSA9PiB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzRGF0YVtncm91cElkXSA9IChncm91cC50b0pTT04oKSBhcyBGZWF0dXJlU3RhdHNPdmVydmlldykgLy8gQ3VycmVudGx5IE5lc3RlZCBncm91cHMgYXJlIG9ubHkgb3ZlcnZpZXdzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdyb3VwID0gY29uZmlnLm5lc3RlZEdyb3VwcyA/IHsgZ3JvdXBzOiBncm91cHNEYXRhIH0gOiBncm91cHNEYXRhXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLm92ZXJ2aWV3RGF0YSxcbiAgICAgICAgICAgIC4uLmdyb3VwXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21KU09OKGpzb246IEZlYXR1cmUpOiBGZWF0dXJlU3RhdHMge1xuICAgICAgICBjb25zdCBzdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuXG4gICAgICAgIGlmICghanNvbiB8fCBpc09iamVjdEVtcHR5KGpzb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHNcbiAgICAgICAgfVxuICAgICAgICBzdGF0cy50cmlnZ2VyZWRDb3VudCA9IGpzb24udHJpZ2dlcmVkQ291bnRcbiAgICAgICAgc3RhdHMuc2VudENvdW50ID0ganNvbi5zZW50Q291bnRcbiAgICAgICAgc3RhdHMuZmFpbGVkQ291bnQgPSBqc29uLmZhaWxlZENvdW50XG5cbiAgICAgICAgaWYgKCFqc29uLmdyb3Vwcykge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRzXG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoanNvbi5ncm91cHMpLmZvckVhY2goKFtncm91cElkLCBncm91cF0pID0+IHtcbiAgICAgICAgICAgIHN0YXRzLmdyb3Vwc1tncm91cElkXSA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihncm91cClcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHN0YXRzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGZWF0dXJlU3RhdHNcbiIsICJpbXBvcnQgeyBnZXRFcnJvclN0cmluZyB9IGZyb20gJy4uL3V0aWwuanMnXG5cbmNsYXNzIEZlYXR1cmVVc2FnZSB7XG4gICAgcHJpdmF0ZSBpc1RyaWdnZXJlZD86IGJvb2xlYW5cbiAgICBwcml2YXRlIHN0YXR1cz86IHN0cmluZ1xuICAgIHByaXZhdGUgZXJyb3I/OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKGlzVHJpZ2dlcmVkPzogYm9vbGVhbikge1xuICAgICAgICBpZiAoaXNUcmlnZ2VyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5pc1RyaWdnZXJlZCA9IGlzVHJpZ2dlcmVkXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJpZ2dlcmVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1RyaWdnZXJlZFxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmlnZ2VyZWQodHJpZ2dlcmVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNUcmlnZ2VyZWQgPSB0cmlnZ2VyZWRcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U3RhdHVzKHN0YXR1czogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXG4gICAgfVxuXG4gICAgcHVibGljIHNldEVycm9yKGVycm9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHRyaWdnZXJlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1RyaWdnZXJlZCA9IHRydWVcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFpbGVkKGU6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICB0aGlzLmVycm9yID0gZ2V0RXJyb3JTdHJpbmcoZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3VjY2VzcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSAnc3VjY2VzcydcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3RhdHVzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXR1c1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFcnJvcigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1RyaWdnZXJlZDogdGhpcy5pc1RyaWdnZXJlZCxcbiAgICAgICAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICBlcnJvcjogdGhpcy5lcnJvclxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGZWF0dXJlVXNhZ2VcbiIsICJjbGFzcyBUZXN0T3BzQ29uZmlnIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFRlc3RPcHNDb25maWdcbiAgICBwdWJsaWMgYnVpbGRTdG9wcGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgYnVpbGRIYXNoZWRJZD86IHN0cmluZ1xuXG4gICAgc3RhdGljIGdldEluc3RhbmNlKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhc3NpbmcgYXJncyB0byBjb25zdHJ1Y3RvclxuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgVGVzdE9wc0NvbmZpZyguLi5hcmdzKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIHB1YmxpYyBtYW51YWxseVNldDogYm9vbGVhbiA9IGZhbHNlLFxuICAgICl7XG4gICAgICAgIFRlc3RPcHNDb25maWcuX2luc3RhbmNlID0gdGhpc1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGVzdE9wc0NvbmZpZ1xuIiwgImltcG9ydCBGZWF0dXJlU3RhdHMsIHsgdHlwZSBGZWF0dXJlIH0gZnJvbSAnLi9mZWF0dXJlU3RhdHMuanMnXG5pbXBvcnQgRmVhdHVyZVVzYWdlIGZyb20gJy4vZmVhdHVyZVVzYWdlLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IFRlc3RPcHNDb25maWcgZnJvbSAnLi90ZXN0T3BzQ29uZmlnLmpzJ1xuaW1wb3J0IHR5cGUgeyBUT1VzYWdlU3RhdHMgfSBmcm9tICcuLi90eXBlcy5qcydcblxuZXhwb3J0IGludGVyZmFjZSBVc2FnZVN0YXQge1xuICAgIHRlc3RFdmVudHM6IHtcbiAgICAgICAgc3RhcnRlZDogRmVhdHVyZVxuICAgICAgICBmaW5pc2hlZDogRmVhdHVyZVxuICAgIH1cbiAgICBob29rRXZlbnRzOiB7XG4gICAgICAgIHN0YXJ0ZWQ6IEZlYXR1cmVcbiAgICAgICAgZmluaXNoZWQ6IEZlYXR1cmVcbiAgICB9XG4gICAgbG9nRXZlbnRzOiBGZWF0dXJlXG4gICAgY2J0U2Vzc2lvbkV2ZW50czogRmVhdHVyZVxuICAgIGNidFNlc3Npb25TdGF0czogRmVhdHVyZVxufVxuXG5jbGFzcyBVc2FnZVN0YXRzIHtcbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlOiBVc2FnZVN0YXRzXG4gICAgcHVibGljIHRlc3RTdGFydGVkU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyB0ZXN0RmluaXNoZWRTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGhvb2tTdGFydGVkU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyBob29rRmluaXNoZWRTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGNidFNlc3Npb25TdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGxvZ1N0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgbGF1bmNoQnVpbGRVc2FnZTogRmVhdHVyZVVzYWdlXG4gICAgcHVibGljIHN0b3BCdWlsZFVzYWdlOiBGZWF0dXJlVXNhZ2VcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVXNhZ2VTdGF0cyB7XG4gICAgICAgIGlmICghVXNhZ2VTdGF0cy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgVXNhZ2VTdGF0cy5pbnN0YW5jZSA9IG5ldyBVc2FnZVN0YXRzKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVXNhZ2VTdGF0cy5pbnN0YW5jZVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRlc3RTdGFydGVkU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy50ZXN0RmluaXNoZWRTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmhvb2tTdGFydGVkU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy5ob29rRmluaXNoZWRTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmNidFNlc3Npb25TdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmxvZ1N0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMubGF1bmNoQnVpbGRVc2FnZSA9IG5ldyBGZWF0dXJlVXNhZ2UoKVxuICAgICAgICB0aGlzLnN0b3BCdWlsZFVzYWdlID0gbmV3IEZlYXR1cmVVc2FnZSgpXG4gICAgfVxuXG4gICAgcHVibGljIGFkZCh1c2FnZVN0YXRzOiBVc2FnZVN0YXRzKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGVzdFN0YXJ0ZWRTdGF0cy5hZGQodXNhZ2VTdGF0cy50ZXN0U3RhcnRlZFN0YXRzKVxuICAgICAgICB0aGlzLnRlc3RGaW5pc2hlZFN0YXRzLmFkZCh1c2FnZVN0YXRzLnRlc3RGaW5pc2hlZFN0YXRzKVxuICAgICAgICB0aGlzLmhvb2tTdGFydGVkU3RhdHMuYWRkKHVzYWdlU3RhdHMuaG9va1N0YXJ0ZWRTdGF0cylcbiAgICAgICAgdGhpcy5ob29rRmluaXNoZWRTdGF0cy5hZGQodXNhZ2VTdGF0cy5ob29rRmluaXNoZWRTdGF0cylcbiAgICAgICAgdGhpcy5jYnRTZXNzaW9uU3RhdHMuYWRkKHVzYWdlU3RhdHMuY2J0U2Vzc2lvblN0YXRzKVxuICAgICAgICB0aGlzLmxvZ1N0YXRzLmFkZCh1c2FnZVN0YXRzLmxvZ1N0YXRzKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtYXR0ZWREYXRhKHdvcmtlcnNEYXRhOiB7IHVzYWdlU3RhdHM6IFVzYWdlU3RhdCB9W10pIHtcbiAgICAgICAgdGhpcy5hZGREYXRhRnJvbVdvcmtlcnMod29ya2Vyc0RhdGEpXG4gICAgICAgIGNvbnN0IHRlc3RPcHNDb25maWcgPSBUZXN0T3BzQ29uZmlnLmdldEluc3RhbmNlKClcbiAgICAgICAgY29uc3QgdXNhZ2U6IFRPVXNhZ2VTdGF0cyA9IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRlc3RPcHNDb25maWcuZW5hYmxlZCxcbiAgICAgICAgICAgIG1hbnVhbGx5U2V0OiB0ZXN0T3BzQ29uZmlnLm1hbnVhbGx5U2V0LFxuICAgICAgICAgICAgYnVpbGRIYXNoZWRJZDogdGVzdE9wc0NvbmZpZy5idWlsZEhhc2hlZElkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXVzYWdlLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1c2FnZVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHVzYWdlLmV2ZW50cyA9IHRoaXMuZ2V0RXZlbnRzRGF0YSgpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnZXhjZXB0aW9uIGluIGdldEZvcm1hdHRlZERhdGE6ICcgKyBlKVxuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVzYWdlXG4gICAgfVxuXG4gICAgcHVibGljIGFkZERhdGFGcm9tV29ya2Vycyh3b3JrZXJzRGF0YTogeyB1c2FnZVN0YXRzOiBVc2FnZVN0YXQgfVtdKSB7XG4gICAgICAgIHdvcmtlcnNEYXRhLm1hcCh3b3JrZXJEYXRhID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNhZ2VTdGF0c0ZvcldvcmtlciA9IFVzYWdlU3RhdHMuZnJvbUpTT04od29ya2VyRGF0YS51c2FnZVN0YXRzKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkKHVzYWdlU3RhdHNGb3JXb3JrZXIpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdFeGNlcHRpb24gaW4gYWRkaW5nIHdvcmtlckRhdGE6ICcgKyBlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFdmVudHNEYXRhKCl7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBidWlsZEV2ZW50czoge1xuICAgICAgICAgICAgICAgIHN0YXJ0ZWQ6IHRoaXMubGF1bmNoQnVpbGRVc2FnZS50b0pTT04oKSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogdGhpcy5zdG9wQnVpbGRVc2FnZS50b0pTT04oKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlc3RFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLnRlc3RTdGFydGVkU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMudGVzdEZpbmlzaGVkU3RhdHMudG9KU09OKHsgb21pdEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICAuLi50aGlzLnRlc3RGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG9ubHlHcm91cHM6IHRydWUgfSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBob29rRXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy5ob29rU3RhcnRlZFN0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLmhvb2tGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG9taXRHcm91cHM6IHRydWUgfSksXG4gICAgICAgICAgICAgICAgLi4udGhpcy5ob29rRmluaXNoZWRTdGF0cy50b0pTT04oeyBvbmx5R3JvdXBzOiB0cnVlIH0pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbG9nRXZlbnRzOiB0aGlzLmxvZ1N0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgY2J0U2Vzc2lvbkV2ZW50czogdGhpcy5jYnRTZXNzaW9uU3RhdHMudG9KU09OKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXREYXRhVG9TYXZlKCl7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXN0RXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy50ZXN0U3RhcnRlZFN0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLnRlc3RGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG5lc3RlZEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBob29rRXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy5ob29rU3RhcnRlZFN0YXRzLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLmhvb2tGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG5lc3RlZEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2dFdmVudHM6IHRoaXMubG9nU3RhdHMudG9KU09OKHsgbmVzdGVkR3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgY2J0U2Vzc2lvbkV2ZW50czogdGhpcy5jYnRTZXNzaW9uU3RhdHMudG9KU09OKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUpTT04oZGF0YTogVXNhZ2VTdGF0KSB7XG4gICAgICAgIGNvbnN0IHVzYWdlU3RhdHMgPSBuZXcgVXNhZ2VTdGF0cygpXG4gICAgICAgIHVzYWdlU3RhdHMudGVzdFN0YXJ0ZWRTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLnRlc3RFdmVudHMuc3RhcnRlZClcbiAgICAgICAgdXNhZ2VTdGF0cy50ZXN0RmluaXNoZWRTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLnRlc3RFdmVudHMuZmluaXNoZWQpXG4gICAgICAgIHVzYWdlU3RhdHMuaG9va1N0YXJ0ZWRTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLmhvb2tFdmVudHMuc3RhcnRlZClcbiAgICAgICAgdXNhZ2VTdGF0cy5ob29rRmluaXNoZWRTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLmhvb2tFdmVudHMuZmluaXNoZWQpXG4gICAgICAgIHVzYWdlU3RhdHMubG9nU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS5sb2dFdmVudHMpXG4gICAgICAgIHVzYWdlU3RhdHMuY2J0U2Vzc2lvblN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEuY2J0U2Vzc2lvblN0YXRzKVxuICAgICAgICByZXR1cm4gdXNhZ2VTdGF0c1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVXNhZ2VTdGF0c1xuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnXG5cbmludGVyZmFjZSBTY3JpcHRzIHtcbiAgICBzY2FuOiBzdHJpbmdcbiAgICBnZXRSZXN1bHRzOiBzdHJpbmdcbiAgICBnZXRSZXN1bHRzU3VtbWFyeTogc3RyaW5nXG4gICAgc2F2ZVJlc3VsdHM6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgQ29tbWFuZCB7XG4gICAgbmFtZTogc3RyaW5nXG4gICAgY2xhc3M6IHN0cmluZ1xufVxuXG5jbGFzcyBBY2Nlc3NpYmlsaXR5U2NyaXB0cyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEFjY2Vzc2liaWxpdHlTY3JpcHRzIHwgbnVsbCA9IG51bGxcblxuICAgIHB1YmxpYyBwZXJmb3JtU2Nhbjogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgZ2V0UmVzdWx0czogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgZ2V0UmVzdWx0c1N1bW1hcnk6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIHNhdmVUZXN0UmVzdWx0czogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgY29tbWFuZHNUb1dyYXA6IEFycmF5PENvbW1hbmQ+IHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgQ2hyb21lRXh0ZW5zaW9uOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSA9IHt9XG5cbiAgICBwdWJsaWMgYnJvd3NlcnN0YWNrRm9sZGVyUGF0aCA9ICcnXG4gICAgcHVibGljIGNvbW1hbmRzUGF0aCA9ICcnXG5cbiAgICAvLyBkb24ndCBhbGxvdyB0byBjcmVhdGUgaW5zdGFuY2VzIGZyb20gaXQgb3RoZXIgdGhhbiB0aHJvdWdoIGBjaGVja0FuZEdldEluc3RhbmNlYFxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYnJvd3NlcnN0YWNrRm9sZGVyUGF0aCA9IHRoaXMuZ2V0V3JpdGFibGVEaXIoKVxuICAgICAgICB0aGlzLmNvbW1hbmRzUGF0aCA9IHBhdGguam9pbih0aGlzLmJyb3dzZXJzdGFja0ZvbGRlclBhdGgsICdjb21tYW5kcy5qc29uJylcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrQW5kR2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghQWNjZXNzaWJpbGl0eVNjcmlwdHMuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmluc3RhbmNlID0gbmV3IEFjY2Vzc2liaWxpdHlTY3JpcHRzKClcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmluc3RhbmNlLnJlYWRGcm9tRXhpc3RpbmdGaWxlKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQWNjZXNzaWJpbGl0eVNjcmlwdHMuaW5zdGFuY2VcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbiAgICBwdWJsaWMgZ2V0V3JpdGFibGVEaXIoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgb3JkZXJlZFBhdGhzID0gW1xuICAgICAgICAgICAgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5icm93c2Vyc3RhY2snKSxcbiAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICBvcy50bXBkaXIoKVxuICAgICAgICBdXG4gICAgICAgIGZvciAoY29uc3Qgb3JkZXJlZFBhdGggb2Ygb3JkZXJlZFBhdGhzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKG9yZGVyZWRQYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICBmcy5hY2Nlc3NTeW5jKG9yZGVyZWRQYXRoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JkZXJlZFBhdGhcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmcy5ta2RpclN5bmMob3JkZXJlZFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yZGVyZWRQYXRoXG5cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLyogbm8tZW1wdHkgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJydcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZyb21FeGlzdGluZ0ZpbGUoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLmNvbW1hbmRzUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuY29tbWFuZHNQYXRoLCAndXRmOCcpXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoSlNPTi5wYXJzZShkYXRhKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogRG8gbm90aGluZyAqL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZShkYXRhOiB7IGNvbW1hbmRzOiBbXSwgc2NyaXB0czogU2NyaXB0cywgbm9uQlN0YWNrSW5mcmFBMTF5Q2hyb21lT3B0aW9uczoge30gfSkge1xuICAgICAgICBpZiAoZGF0YS5zY3JpcHRzKSB7XG4gICAgICAgICAgICB0aGlzLnBlcmZvcm1TY2FuID0gZGF0YS5zY3JpcHRzLnNjYW5cbiAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cyA9IGRhdGEuc2NyaXB0cy5nZXRSZXN1bHRzXG4gICAgICAgICAgICB0aGlzLmdldFJlc3VsdHNTdW1tYXJ5ID0gZGF0YS5zY3JpcHRzLmdldFJlc3VsdHNTdW1tYXJ5XG4gICAgICAgICAgICB0aGlzLnNhdmVUZXN0UmVzdWx0cyA9IGRhdGEuc2NyaXB0cy5zYXZlUmVzdWx0c1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmNvbW1hbmRzICYmIGRhdGEuY29tbWFuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1hbmRzVG9XcmFwID0gZGF0YS5jb21tYW5kc1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLm5vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnMpe1xuICAgICAgICAgICAgdGhpcy5DaHJvbWVFeHRlbnNpb24gPSBkYXRhLm5vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnNcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHVibGljIHN0b3JlKCkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5icm93c2Vyc3RhY2tGb2xkZXJQYXRoKSl7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5icm93c2Vyc3RhY2tGb2xkZXJQYXRoKVxuICAgICAgICB9XG5cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmNvbW1hbmRzUGF0aCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgY29tbWFuZHM6IHRoaXMuY29tbWFuZHNUb1dyYXAsXG4gICAgICAgICAgICBzY3JpcHRzOiB7XG4gICAgICAgICAgICAgICAgc2NhbjogdGhpcy5wZXJmb3JtU2NhbixcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzOiB0aGlzLmdldFJlc3VsdHMsXG4gICAgICAgICAgICAgICAgZ2V0UmVzdWx0c1N1bW1hcnk6IHRoaXMuZ2V0UmVzdWx0c1N1bW1hcnksXG4gICAgICAgICAgICAgICAgc2F2ZVJlc3VsdHM6IHRoaXMuc2F2ZVRlc3RSZXN1bHRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnM6IHRoaXMuQ2hyb21lRXh0ZW5zaW9uLFxuICAgICAgICB9KSlcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFjY2Vzc2liaWxpdHlTY3JpcHRzLmNoZWNrQW5kR2V0SW5zdGFuY2UoKVxuZXhwb3J0IHsgQ29tbWFuZCB9XG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5cbmltcG9ydCB0eXBlIHsgVGVzdERhdGEsIFVwbG9hZFR5cGUgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGJhdGNoQW5kUG9zdEV2ZW50cyB9IGZyb20gJy4uL3V0aWwuanMnXG5pbXBvcnQgeyBEQVRBX0JBVENIX0VORFBPSU5UIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuXG4vKipcbiAqIENyYXNoLXJlc2lsaWVudCBqb3VybmFsIG9mIHRlc3QgcnVucyB0aGF0IGhhdmUgc2VudCBUZXN0UnVuU3RhcnRlZCBidXQgbm90IHlldFxuICogVGVzdFJ1bkZpbmlzaGVkLiBFYWNoIG9wZW4gcnVuIGlzIHBlcnNpc3RlZCBhcyBhIHNtYWxsIGZpbGUgc28gdGhhdCBpZiB0aGUgd29ya2VyXG4gKiAob3IgdGhlIHdob2xlIHdkaW8gcHJvY2VzcyB0cmVlKSBpcyBraWxsZWQgbWlkLXRlc3QsIHRoZSBsYXVuY2hlcidzIHNodXRkb3duIHBhdGhcbiAqIG9yIHRoZSBkZXRhY2hlZCBleGl0IGNsZWFudXAgY2FuIHN0aWxsIHNlbmQgYSBzeW50aGV0aWMgVGVzdFJ1bkZpbmlzaGVkIFx1MjAxNCBvdGhlcndpc2VcbiAqIHRoZSB0ZXN0IGNhc2Ugc3RheXMgXCJpbiBwcm9ncmVzc1wiIG9uIHRoZSBUZXN0IFJlcG9ydGluZyAmIEFuYWx5dGljcyBkYXNoYm9hcmQgZm9yZXZlci5cbiAqL1xuXG5jb25zdCBPUEVOX1JVTlNfRElSID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdsb2dzJywgJ2JzdGFja19vcGVuX3J1bnMnKVxuXG5leHBvcnQgY29uc3QgT1JQSEFOX0ZBSUxVUkVfUkVBU09OID0gJ1Rlc3QgcnVuIGRpZCBub3QgY29tcGxldGU6IHRoZSBwcm9jZXNzIHdhcyBpbnRlcnJ1cHRlZCBvciB0ZXJtaW5hdGVkIGJlZm9yZSB0aGUgdGVzdCBmaW5pc2hlZCAoZmluYWxpemVkIGJ5IEJyb3dzZXJTdGFjayBTREsgZXhpdCBjbGVhbnVwKSdcblxuZnVuY3Rpb24gb3BlblJ1bkZpbGVQYXRoKHV1aWQ6IHN0cmluZykge1xuICAgIHJldHVybiBwYXRoLmpvaW4oT1BFTl9SVU5TX0RJUiwgYG9wZW4tcnVuLSR7dXVpZH0uanNvbmApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRPcGVuUnVuKHRlc3REYXRhOiBUZXN0RGF0YSkge1xuICAgIGlmICghdGVzdERhdGEgfHwgIXRlc3REYXRhLnV1aWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGZzLm1rZGlyU3luYyhPUEVOX1JVTlNfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG9wZW5SdW5GaWxlUGF0aCh0ZXN0RGF0YS51dWlkKSwgSlNPTi5zdHJpbmdpZnkodGVzdERhdGEpKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdvcGVuUnVuc0pvdXJuYWw6IGZhaWxlZCB0byByZWNvcmQgb3BlbiBydW46ICcgKyBlKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyT3BlblJ1bih1dWlkPzogc3RyaW5nKSB7XG4gICAgaWYgKCF1dWlkKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmcy5ybVN5bmMob3BlblJ1bkZpbGVQYXRoKHV1aWQpLCB7IGZvcmNlOiB0cnVlIH0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ29wZW5SdW5zSm91cm5hbDogZmFpbGVkIHRvIGNsZWFyIG9wZW4gcnVuOiAnICsgZSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0T3JwaGFuZWRSdW5zKCk6IFRlc3REYXRhW10ge1xuICAgIGNvbnN0IG9ycGhhbnM6IFRlc3REYXRhW10gPSBbXVxuICAgIHRyeSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhPUEVOX1JVTlNfRElSKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9ycGhhbnNcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoT1BFTl9SVU5TX0RJUikpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb3JwaGFucy5wdXNoKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihPUEVOX1JVTlNfRElSLCBmaWxlKSwgJ3V0ZjgnKSkpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBvcGVuUnVuc0pvdXJuYWw6IHNraXBwaW5nIHVucmVhZGFibGUgam91cm5hbCBmaWxlICR7ZmlsZX06ICR7ZX1gKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhPUEVOX1JVTlNfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zygnb3BlblJ1bnNKb3VybmFsOiBmYWlsZWQgdG8gY29sbGVjdCBvcnBoYW5lZCBydW5zOiAnICsgZSlcbiAgICB9XG4gICAgcmV0dXJuIG9ycGhhbnNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmFsaXplT3JwaGFuZWRSdW5zKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3JwaGFucyA9IGNvbGxlY3RPcnBoYW5lZFJ1bnMoKVxuICAgICAgICBpZiAoIW9ycGhhbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgY29uc3QgZXZlbnRzOiBVcGxvYWRUeXBlW10gPSBvcnBoYW5zLm1hcCgodGVzdERhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRBdE1zID0gdGVzdERhdGEuc3RhcnRlZF9hdCA/IG5ldyBEYXRlKHRlc3REYXRhLnN0YXJ0ZWRfYXQpLmdldFRpbWUoKSA6IE5hTlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnVGVzdFJ1bkZpbmlzaGVkJyxcbiAgICAgICAgICAgICAgICB0ZXN0X3J1bjoge1xuICAgICAgICAgICAgICAgICAgICAuLi50ZXN0RGF0YSxcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRfYXQ6IGZpbmlzaGVkQXQsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX2luX21zOiBOdW1iZXIuaXNOYU4oc3RhcnRlZEF0TXMpID8gdW5kZWZpbmVkIDogTWF0aC5tYXgoMCwgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdE1zKSxcbiAgICAgICAgICAgICAgICAgICAgZmFpbHVyZTogW3sgYmFja3RyYWNlOiBbT1JQSEFOX0ZBSUxVUkVfUkVBU09OXSB9XSxcbiAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV9yZWFzb246IE9SUEhBTl9GQUlMVVJFX1JFQVNPTixcbiAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV90eXBlOiAnVW5oYW5kbGVkRXJyb3InXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBhd2FpdCBiYXRjaEFuZFBvc3RFdmVudHMoREFUQV9CQVRDSF9FTkRQT0lOVCwgJ09SUEhBTkVEX1RFU1RfUlVOX0ZJTkFMSVpBVElPTicsIGV2ZW50cylcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oYEZpbmFsaXplZCAke2V2ZW50cy5sZW5ndGh9IG9ycGhhbmVkIHRlc3QgcnVuKHMpIGxlZnQgYmVoaW5kIGJ5IGFuIGludGVycnVwdGVkIHJ1bmApXG4gICAgICAgIHJldHVybiBldmVudHMubGVuZ3RoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ29wZW5SdW5zSm91cm5hbDogZmFpbGVkIHRvIGZpbmFsaXplIG9ycGhhbmVkIHJ1bnM6ICcgKyBlKVxuICAgICAgICByZXR1cm4gMFxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRFcnJvclN0cmluZywgc3RvcEJ1aWxkVXBzdHJlYW0gfSBmcm9tICcuL3V0aWwuanMnXG5pbXBvcnQgeyBmaW5hbGl6ZU9ycGhhbmVkUnVucyB9IGZyb20gJy4vdGVzdE9wcy9vcGVuUnVuc0pvdXJuYWwuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHV0aWwgZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHsgZmlyZUZ1bm5lbFJlcXVlc3QgfSBmcm9tICcuL2luc3RydW1lbnRhdGlvbi9mdW5uZWxJbnN0cnVtZW50YXRpb24uanMnXG5pbXBvcnQgeyBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsIEJST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgdHlwZSB7IEZ1bm5lbERhdGEgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL3BlcmZvcm1hbmNlLXRlc3Rlci5qcydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQlN0YWNrQ2xlYW51cCB7XG4gICAgc3RhdGljIGFzeW5jIHN0YXJ0Q2xlYW51cCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEdldCBmdW5uZWwgZGF0YSBvYmplY3QgZnJvbSBzYXZlZCBmaWxlXG4gICAgICAgICAgICBjb25zdCBmdW5uZWxEYXRhQ2xlYW51cCA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1mdW5uZWxEYXRhJylcbiAgICAgICAgICAgIGxldCBmdW5uZWxEYXRhOiBGdW5uZWxEYXRhIHwgbnVsbCA9IG51bGxcbiAgICAgICAgICAgIGlmIChmdW5uZWxEYXRhQ2xlYW51cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcHJvY2Vzcy5hcmd2LmluZGV4T2YoJy0tZnVubmVsRGF0YScpXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmFyZ3ZbaW5kZXggKyAxXVxuICAgICAgICAgICAgICAgIGZ1bm5lbERhdGEgPSBCU3RhY2tDbGVhbnVwLmdldEZ1bm5lbERhdGFGcm9tRmlsZShmaWxlUGF0aClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1vYnNlcnZhYmlsaXR5JykgJiYgZnVubmVsRGF0YSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU9ic2VydmFiaWxpdHlDbGVhbnVwKGZ1bm5lbERhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmdW5uZWxEYXRhQ2xlYW51cCAmJiBmdW5uZWxEYXRhKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kRnVubmVsRGF0YShmdW5uZWxEYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZXJyIGFzIHN0cmluZ1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGVycm9yKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tcGVyZm9ybWFuY2VEYXRhJykpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBQZXJmb3JtYW5jZVRlc3Rlci51cGxvYWRFdmVudHNEYXRhKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3IgaW4gc2VuZGluZyBldmVudHMgZGF0YSAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBleGVjdXRlT2JzZXJ2YWJpbGl0eUNsZWFudXAoZnVubmVsRGF0YTogRnVubmVsRGF0YSkge1xuICAgICAgICBpZiAoIXByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF0pIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nIFRlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MgY2xlYW51cCcpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBTREstNDY3MTogZmluYWxpemUgYW55IHRlc3QgcnVucyBvcnBoYW5lZCBieSB0aGUgaW50ZXJydXB0ZWQgcHJvY2Vzc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBidWlsZCBpdHNlbGYgaXMgc3RvcHBlZC5cbiAgICAgICAgICAgIGF3YWl0IGZpbmFsaXplT3JwaGFuZWRSdW5zKClcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3BCdWlsZFVwc3RyZWFtKClcbiAgICAgICAgICAgIGlmICgocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFldKSAmJiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXSkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBcXG5WaXNpdCBodHRwczovL2F1dG9tYXRpb24uYnJvd3NlcnN0YWNrLmNvbS9idWlsZHMvJHtwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXX0gdG8gdmlldyBidWlsZCByZXBvcnQsIGluc2lnaHRzLCBhbmQgbWFueSBtb3JlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhbGwgYXQgb25lIHBsYWNlIVxcbmApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSAocmVzdWx0ICYmIHJlc3VsdC5zdGF0dXMpIHx8ICdmYWlsZWQnXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gKHJlc3VsdCAmJiByZXN1bHQubWVzc2FnZSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTzExeVN0b3BEYXRhKGZ1bm5lbERhdGEsIHN0YXR1cywgc3RhdHVzID09PSAnZmFpbGVkJyA/IG1lc3NhZ2UgOiB1bmRlZmluZWQpXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignRXJyb3IgaW4gc3RvcHBpbmcgVGVzdCBSZXBvcnRpbmcgYW5kIEFuYWx5dGljcyBidWlsZDogJyArIGUpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU8xMXlTdG9wRGF0YShmdW5uZWxEYXRhLCAnZmFpbGVkJywgZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB1cGRhdGVPMTF5U3RvcERhdGEoZnVubmVsRGF0YTogRnVubmVsRGF0YSwgc3RhdHVzOiBzdHJpbmcsIGVycm9yOiB1bmtub3duID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHRvRGF0YSA9IGZ1bm5lbERhdGE/LmV2ZW50X3Byb3BlcnRpZXM/LnByb2R1Y3RVc2FnZT8udGVzdE9ic2VydmFiaWxpdHlcbiAgICAgICAgLy8gUmV0dXJuIGlmIG5vIFRlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MgZGF0YSBpbiBmdW5uZWwgZGF0YVxuICAgICAgICBpZiAoIXRvRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV4aXN0aW5nU3RvcERhdGEgPSB0b0RhdGEuZXZlbnRzLmJ1aWxkRXZlbnRzLmZpbmlzaGVkXG4gICAgICAgIGV4aXN0aW5nU3RvcERhdGEgPSBleGlzdGluZ1N0b3BEYXRhIHx8IHt9XG5cbiAgICAgICAgZXhpc3RpbmdTdG9wRGF0YSA9IHtcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nU3RvcERhdGEsXG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBlcnJvcjogZ2V0RXJyb3JTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgc3RvcHBlZEZyb206ICdleGl0SG9vaydcbiAgICAgICAgfVxuICAgICAgICB0b0RhdGEuZXZlbnRzLmJ1aWxkRXZlbnRzLmZpbmlzaGVkID0gZXhpc3RpbmdTdG9wRGF0YVxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBzZW5kRnVubmVsRGF0YShmdW5uZWxEYXRhOiBGdW5uZWxEYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmaXJlRnVubmVsUmVxdWVzdChmdW5uZWxEYXRhKVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdGdW5uZWwgZGF0YSBzZW50IHN1Y2Nlc3NmdWxseSBmcm9tIGNsZWFudXAnKVxuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0Vycm9yIGluIHNlbmRpbmcgZnVubmVsIGRhdGE6ICcgKyBlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEZ1bm5lbERhdGFGcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpXG5cbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoY29udGVudClcbiAgICAgICAgdGhpcy5yZW1vdmVGdW5uZWxEYXRhRmlsZShmaWxlUGF0aClcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVtb3ZlRnVubmVsRGF0YUZpbGUoZmlsZVBhdGg/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZnMucm1TeW5jKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pXG4gICAgfVxufVxuXG52b2lkIEJTdGFja0NsZWFudXAuc3RhcnRDbGVhbnVwKClcbiIsICJpbXBvcnQgb3MgZnJvbSAnbm9kZTpvcydcbmltcG9ydCB1dGlsLCB7IGZvcm1hdCB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IFVzYWdlU3RhdHMsIHsgdHlwZSBVc2FnZVN0YXQgfSBmcm9tICcuLi90ZXN0T3BzL3VzYWdlU3RhdHMuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi4vY29uZmlnLmpzJ1xuaW1wb3J0IHsgQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTiwgV0RJT19OQU1JTkdfUFJFRklYIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgZ2V0RGF0YUZyb21Xb3JrZXJzIH0gZnJvbSAnLi4vZGF0YS1zdG9yZS5qcydcbmltcG9ydCB7IGdldFByb2R1Y3RNYXAgfSBmcm9tICcuLi90ZXN0SHViL3V0aWxzLmpzJ1xuaW1wb3J0IGZldGNoV3JhcCBmcm9tICcuLi9mZXRjaFdyYXBwZXIuanMnXG5pbXBvcnQgdHlwZSB7IEJyb3dzZXJzdGFja0hlYWxpbmcgfSBmcm9tICdAYnJvd3NlcnN0YWNrL2FpLXNkay1ub2RlJ1xuaW1wb3J0IHR5cGUgeyBGdW5uZWxEYXRhLCBFdmVudFByb3BlcnRpZXMgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCBUZXN0T3BzQ29uZmlnIGZyb20gJy4uL3Rlc3RPcHMvdGVzdE9wc0NvbmZpZy5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuLi9jbGkvYXBpVXRpbHMuanMnXG5pbXBvcnQgUGVyZm9ybWFuY2VUZXN0ZXIgZnJvbSAnLi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgeyBFVkVOVFMgfSBmcm9tICcuL3BlcmZvcm1hbmNlL2NvbnN0YW50cy5qcydcblxuYXN5bmMgZnVuY3Rpb24gZmlyZUZ1bm5lbFRlc3RFdmVudChldmVudFR5cGU6IHN0cmluZywgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzQ0xJRW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgaWYgKCFjb25maWcudXNlck5hbWUgfHwgIWNvbmZpZy5hY2Nlc3NLZXkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCd1c2VybmFtZS9hY2Nlc3NrZXkgbm90IHBhc3NlZCcpXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBidWlsZEV2ZW50RGF0YShldmVudFR5cGUsIGNvbmZpZywgaXNDTElFbmFibGVkKVxuICAgICAgICBhd2FpdCBmaXJlRnVubmVsUmVxdWVzdChkYXRhKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0Z1bm5lbCBldmVudCBzdWNjZXNzJylcbiAgICAgICAgY29uZmlnLnNlbnRGdW5uZWxEYXRhKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEV4Y2VwdGlvbiBpbiBzZW5kaW5nIGZ1bm5lbCBkYXRhOiAke2Zvcm1hdChlcnJvcil9YClcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kU3RhcnQoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpIHtcblxuICAgIC8vIFRyYWNrIGZ1bm5lbCB0ZXN0IGF0dGVtcHRlZCBldmVudFxuICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfQVRURU1QVEVEKVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RBdHRlbXB0ZWQnLCBjb25maWcpXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX0FUVEVNUFRFRCwgdHJ1ZSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9BVFRFTVBURUQsIGZhbHNlLCBlcnJvcilcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kRmluaXNoKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc0NMSUVuYWJsZWQgPSBmYWxzZSkge1xuICAgIC8vIFRyYWNrIGZ1bm5lbCB0ZXN0IHN1Y2Nlc3NmdWwgZXZlbnRcbiAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX1NVQ0NFU1NGVUwpXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZmlyZUZ1bm5lbFRlc3RFdmVudCgnU0RLVGVzdFN1Y2Nlc3NmdWwnLCBjb25maWcsIGlzQ0xJRW5hYmxlZClcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfU1VDQ0VTU0ZVTCwgdHJ1ZSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9TVUNDRVNTRlVMLCBmYWxzZSwgZXJyb3IpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZUZ1bm5lbERhdGEoZXZlbnRUeXBlOiBzdHJpbmcsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc0NMSUVuYWJsZWQgPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YSA9IGJ1aWxkRXZlbnREYXRhKGV2ZW50VHlwZSwgY29uZmlnLCBpc0NMSUVuYWJsZWQpXG5cbiAgICBCU3RhY2tMb2dnZXIuZW5zdXJlTG9nc0ZvbGRlcigpXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oQlN0YWNrTG9nZ2VyLmxvZ0ZvbGRlclBhdGgsICdmdW5uZWxEYXRhLmpzb24nKVxuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuICAgIHJldHVybiBmaWxlUGF0aFxufVxuXG5mdW5jdGlvbiByZWRhY3RDcmVkZW50aWFsc0Zyb21GdW5uZWxEYXRhKGRhdGE6IEZ1bm5lbERhdGEpIHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS51c2VyTmFtZSkge1xuICAgICAgICAgICAgZGF0YS51c2VyTmFtZSA9ICdbUkVEQUNURURdJ1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmFjY2Vzc0tleSkge1xuICAgICAgICAgICAgZGF0YS5hY2Nlc3NLZXkgPSAnW1JFREFDVEVEXSdcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxufVxuXG4vLyBDYWxsZWQgZnJvbSB0d28gZGlmZmVyZW50IHByb2Nlc3NcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXJlRnVubmVsUmVxdWVzdChkYXRhOiBGdW5uZWxEYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB1c2VyTmFtZSwgYWNjZXNzS2V5IH0gPSBkYXRhXG4gICAgcmVkYWN0Q3JlZGVudGlhbHNGcm9tRnVubmVsRGF0YShkYXRhKVxuXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdTZW5kaW5nIFNESyBldmVudCB3aXRoIGRhdGEgJyArIHV0aWwuaW5zcGVjdChkYXRhLCB7IGRlcHRoOiA2IH0pKVxuXG4gICAgY29uc3QgZW5jb2RlZEF1dGggPSBCdWZmZXIuZnJvbShgJHt1c2VyTmFtZX06JHthY2Nlc3NLZXl9YCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV3JhcChBUElVdGlscy5GVU5ORUxfSU5TVFJVTUVOVEFUSU9OX1VSTCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke2VuY29kZWRBdXRofWAsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gICAgfSlcbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0Z1bm5lbCBFdmVudCBSZXNwb25zZTogJyArIEpTT04uc3RyaW5naWZ5KGF3YWl0IHJlc3BvbnNlLnRleHQoKSkpXG59XG5cbmZ1bmN0aW9uIGdldFByb2R1Y3RMaXN0KGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSB7XG4gICAgY29uc3QgcHJvZHVjdHM6IHN0cmluZ1tdID0gW11cbiAgICBpZiAoY29uZmlnLnRlc3RPYnNlcnZhYmlsaXR5LmVuYWJsZWQpIHtcbiAgICAgICAgcHJvZHVjdHMucHVzaCgnb2JzZXJ2YWJpbGl0eScpXG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5hY2Nlc3NpYmlsaXR5KSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ2FjY2Vzc2liaWxpdHknKVxuICAgIH1cblxuICAgIGlmIChjb25maWcucGVyY3kpIHtcbiAgICAgICAgcHJvZHVjdHMucHVzaCgncGVyY3knKVxuICAgIH1cblxuICAgIGlmIChjb25maWcuYXV0b21hdGUpIHtcbiAgICAgICAgcHJvZHVjdHMucHVzaCgnYXV0b21hdGUnKVxuICAgIH1cblxuICAgIGlmIChjb25maWcuYXBwQXV0b21hdGUpIHtcbiAgICAgICAgcHJvZHVjdHMucHVzaCgnYXBwLWF1dG9tYXRlJylcbiAgICB9XG4gICAgcmV0dXJuIHByb2R1Y3RzXG59XG5cbmZ1bmN0aW9uIGJ1aWxkRXZlbnREYXRhKGV2ZW50VHlwZTogc3RyaW5nLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNDTElFbmFibGVkID0gZmFsc2UpIHtcbiAgICBjb25zdCBldmVudFByb3BlcnRpZXM6IEV2ZW50UHJvcGVydGllcyA9IHtcbiAgICAgICAgLy8gRnJhbWV3b3JrIERldGFpbHNcbiAgICAgICAgc2RrUnVuSWQ6IGNvbmZpZz8uc2RrUnVuSUQsXG4gICAgICAgIHRlc3RodWJfdXVpZDogVGVzdE9wc0NvbmZpZy5nZXRJbnN0YW5jZSgpLmJ1aWxkSGFzaGVkSWQsXG4gICAgICAgIGxhbmd1YWdlX2ZyYW1ld29yazogZ2V0TGFuZ3VhZ2VGcmFtZXdvcmsoY29uZmlnLmZyYW1ld29yayksXG4gICAgICAgIHJlZmVycmVyOiBnZXRSZWZlcnJlcihjb25maWcuZnJhbWV3b3JrKSxcbiAgICAgICAgbGFuZ3VhZ2U6ICdXZWJkcml2ZXJJTycsXG4gICAgICAgIGxhbmd1YWdlVmVyc2lvbjogcHJvY2Vzcy52ZXJzaW9uLFxuXG4gICAgICAgIC8vIEJ1aWxkIERldGFpbHNcbiAgICAgICAgYnVpbGROYW1lOiBjb25maWcuYnVpbGROYW1lIHx8ICd1bmRlZmluZWQnLFxuICAgICAgICBidWlsZElkZW50aWZpZXI6IFN0cmluZyhjb25maWcuYnVpbGRJZGVudGlmaWVyKSxcblxuICAgICAgICAvLyBIb3N0IGRldGFpbHNcbiAgICAgICAgb3M6IG9zLnR5cGUoKSB8fCAndW5rbm93bicsXG4gICAgICAgIGhvc3RuYW1lOiBvcy5ob3N0bmFtZSgpIHx8ICd1bmtub3duJyxcblxuICAgICAgICAvLyBQcm9kdWN0IERldGFpbHNcbiAgICAgICAgcHJvZHVjdE1hcDogZ2V0UHJvZHVjdE1hcChjb25maWcpLFxuICAgICAgICBwcm9kdWN0OiBnZXRQcm9kdWN0TGlzdChjb25maWcpLFxuXG4gICAgICAgIC8vIGZyYW1ld29yayBkZXRhaWxzXG4gICAgICAgIGZyYW1ld29yazogY29uZmlnLmZyYW1ld29yayxcblxuICAgICAgICAvLyBDTEkgRGV0YWlsc1xuICAgICAgICBpc0NMSUVuYWJsZWQ6IGlzQ0xJRW5hYmxlZFxuICAgIH1cblxuICAgIGlmIChldmVudFR5cGUgPT09ICdTREtUZXN0U3VjY2Vzc2Z1bCcpIHtcbiAgICAgICAgY29uc3Qgd29ya2VyRGF0YSA9IGdldERhdGFGcm9tV29ya2VycygpXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLnByb2R1Y3RVc2FnZSA9IGdldFByb2R1Y3RVc2FnZSh3b3JrZXJEYXRhKVxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUKSB7XG4gICAgICAgICAgICBldmVudFByb3BlcnRpZXMucG9sbGluZ1RpbWVvdXQgPSBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9QT0xMSU5HX1RJTUVPVVQgYXMgc3RyaW5nXG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgYW55IHdvcmtlciBjYWxsZWQgYnJvd3Nlci5yZWxvYWRTZXNzaW9uKCksIG1hcmsgdGhlIGJ1aWxkIHNvIHRoZVxuICAgICAgICAvLyBzZXNzaW9uLWxpbmtpbmcgZGFzaGJvYXJkIGNhbiBleGNsdWRlIGl0cyAoZXhwZWN0ZWQpIHJlbG9hZC1vcnBoYW5lZCBzZXNzaW9ucy5cbiAgICAgICAgdHlwZSBXb3JrZXJSZWNvcmQgPSB7IHJlbG9hZEhhcHBlbmVkPzogYm9vbGVhbjsgdXNhZ2VTdGF0cz86IHVua25vd24gfVxuICAgICAgICBjb25zdCByZWxvYWRIYXBwZW5lZCA9IHdvcmtlckRhdGEuc29tZSgod29ya2VyKSA9PiAod29ya2VyIGFzIFdvcmtlclJlY29yZCkucmVsb2FkSGFwcGVuZWQgPT09IHRydWUpXG4gICAgICAgIGlmIChyZWxvYWRIYXBwZW5lZCkge1xuICAgICAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLmZpbmlzaGVkTWV0YWRhdGEgPSB7IHJlYXNvbjogJ3Nlc3Npb25fcmVsb2FkZWQnIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJOYW1lOiBjb25maWcudXNlck5hbWUsXG4gICAgICAgIGFjY2Vzc0tleTogY29uZmlnLmFjY2Vzc0tleSxcbiAgICAgICAgZXZlbnRfdHlwZTogZXZlbnRUeXBlLFxuICAgICAgICBkZXRlY3RlZEZyYW1ld29yazogV0RJT19OQU1JTkdfUFJFRklYICsgY29uZmlnLmZyYW1ld29yayxcbiAgICAgICAgZXZlbnRfcHJvcGVydGllczogZXZlbnRQcm9wZXJ0aWVzXG4gICAgfSBhcyB1bmtub3duIGFzIEZ1bm5lbERhdGFcblxufVxuXG5mdW5jdGlvbiBnZXRQcm9kdWN0VXNhZ2Uod29ya2Vyc0RhdGE6IHsgdXNhZ2VTdGF0czogVXNhZ2VTdGF0IH1bXSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHRlc3RPYnNlcnZhYmlsaXR5OiBVc2FnZVN0YXRzLmdldEluc3RhbmNlKCkuZ2V0Rm9ybWF0dGVkRGF0YSh3b3JrZXJzRGF0YSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldExhbmd1YWdlRnJhbWV3b3JrKGZyYW1ld29yaz86IHN0cmluZykge1xuICAgIHJldHVybiAnV2ViZHJpdmVySU9fJyArIGZyYW1ld29ya1xufVxuXG5mdW5jdGlvbiBnZXRSZWZlcnJlcihmcmFtZXdvcms/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBmdWxsTmFtZSA9IGZyYW1ld29yayA/IFdESU9fTkFNSU5HX1BSRUZJWCArIGZyYW1ld29yayA6ICdXZWJkcml2ZXJJTydcbiAgICByZXR1cm4gYCR7ZnVsbE5hbWV9LyR7QlNUQUNLX1NFUlZJQ0VfVkVSU0lPTn1gXG59XG5cbmNvbnN0IHNlbmRFdmVudCA9IHtcbiAgICB0Y2dEb3duOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RUY2dEb3duUmVzcG9uc2UnLCBjb25maWcpLFxuICAgIGludmFsaWRUY2dBdXRoOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RJbnZhbGlkVGNnQXV0aFJlc3BvbnNlV2l0aFVzZXJJbXBhY3QnLCBjb25maWcpLFxuICAgIHRjZ0F1dGhGYWlsdXJlOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RUY2dBdXRoRmFpbHVyZScsIGNvbmZpZyksXG4gICAgdGNndEluaXRTdWNjZXNzZnVsOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RUY2d0SW5pdFN1Y2Nlc3NmdWwnLCBjb25maWcpLFxuICAgIGluaXRGYWlsZWQ6IChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZykgPT4gZmlyZUZ1bm5lbFRlc3RFdmVudCgnU0RLVGVzdEluaXRGYWlsZWRSZXNwb25zZScsIGNvbmZpZyksXG4gICAgdGNnUHJveHlGYWlsdXJlOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RUY2dQcm94eUZhaWx1cmUnLCBjb25maWcpLFxufVxuXG5mdW5jdGlvbiBpc1Byb3h5RXJyb3IoYXV0aFJlc3VsdDogeyBzdGF0dXM/OiBudW1iZXIgfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoYXV0aFJlc3VsdCBhcyBCcm93c2Vyc3RhY2tIZWFsaW5nLkluaXRFcnJvclJlc3BvbnNlKT8uc3RhdHVzID09PSA1MDJcbn1cblxuZnVuY3Rpb24gaGFuZGxlUHJveHlFcnJvcihjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBzZW5kRXZlbnQudGNnUHJveHlGYWlsdXJlKGNvbmZpZylcbiAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ1Byb3h5IEVycm9yLiBEaXNhYmxpbmcgSGVhbGluZyBmb3IgdGhpcyBzZXNzaW9uLicpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVVcGdyYWRlUmVxdWlyZWQoaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ1BsZWFzZSB1cGdyYWRlIEJyb3dzZXJzdGFjayBTZXJ2aWNlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiB0byB1c2UgdGhlIHNlbGYtaGVhbGluZyBmZWF0dXJlLicpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVBdXRoZW50aWNhdGlvbkZhaWx1cmUoc3RhdHVzOiBudW1iZXIsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgIGlmIChpc1NlbGZIZWFsRW5hYmxlZCkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ1NvbWV0aGluZyB3ZW50IHdyb25nLiBEaXNhYmxpbmcgaGVhbGluZyBmb3IgdGhpcyBzZXNzaW9uLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicpXG4gICAgICAgIH1cbiAgICAgICAgc2VuZEV2ZW50LnRjZ0Rvd24oY29uZmlnKVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1NlbGZIZWFsRW5hYmxlZCkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0F1dGhlbnRpY2F0aW9uIEZhaWxlZC4gRGlzYWJsaW5nIEhlYWxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4nKVxuICAgICAgICB9XG4gICAgICAgIHNlbmRFdmVudC50Y2dBdXRoRmFpbHVyZShjb25maWcpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVBdXRoZW50aWNhdGlvblN1Y2Nlc3MoXG4gICAgaXNIZWFsaW5nRW5hYmxlZEZvclVzZXI6IGJvb2xlYW4sXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsXG4gICAgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWRcbikge1xuICAgIGlmICghaXNIZWFsaW5nRW5hYmxlZEZvclVzZXIgJiYgaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0hlYWxpbmcgaXMgbm90IGVuYWJsZWQgZm9yIHlvdXIgZ3JvdXAsIHBsZWFzZSBjb250YWN0IHRoZSBhZG1pbicpXG4gICAgfSBlbHNlIGlmICh1c2VySWQgJiYgaXNIZWFsaW5nRW5hYmxlZEZvclVzZXIpIHtcbiAgICAgICAgc2VuZEV2ZW50LnRjZ3RJbml0U3VjY2Vzc2Z1bChjb25maWcpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVJbml0aWFsaXphdGlvbkZhaWx1cmUoc3RhdHVzOiBudW1iZXIsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIHNlbmRFdmVudC5pbml0RmFpbGVkKGNvbmZpZylcbiAgICB9IGVsc2UgaWYgKCFzdGF0dXMgJiYgaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgc2VuZEV2ZW50LmludmFsaWRUY2dBdXRoKGNvbmZpZylcbiAgICB9XG5cbiAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0F1dGhlbnRpY2F0aW9uIEZhaWxlZC4gSGVhbGluZyB3aWxsIGJlIGRpc2FibGVkIGZvciB0aGlzIHNlc3Npb24uJylcbiAgICB9XG59XG5cbmludGVyZmFjZSBBdXRoUmVzdWx0IHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBpc0F1dGhlbnRpY2F0ZWQ6IGJvb2xlYW5cbiAgICBzdGF0dXM6IG51bWJlclxuICAgIHVzZXJJZDogc3RyaW5nXG4gICAgZ3JvdXBJZDogc3RyaW5nXG4gICAgaXNIZWFsaW5nRW5hYmxlZDogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlSGVhbGluZ0luc3RydW1lbnRhdGlvbihcbiAgICBhdXRoUmVzdWx0OiBBdXRoUmVzdWx0LFxuICAgIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLFxuICAgIGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGlzUHJveHlFcnJvcihhdXRoUmVzdWx0KSkge1xuICAgICAgICAgICAgaGFuZGxlUHJveHlFcnJvcihjb25maWcsIGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIGlzQXV0aGVudGljYXRlZCwgc3RhdHVzLCB1c2VySWQsIGdyb3VwSWQsIGlzSGVhbGluZ0VuYWJsZWQ6IGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyIH0gPSBhdXRoUmVzdWx0XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UgPT09ICdVcGdyYWRlIHJlcXVpcmVkJykge1xuICAgICAgICAgICAgaGFuZGxlVXBncmFkZVJlcXVpcmVkKGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQXV0aGVudGljYXRlZCkge1xuICAgICAgICAgICAgaGFuZGxlQXV0aGVudGljYXRpb25GYWlsdXJlKHN0YXR1cywgY29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXV0aGVudGljYXRlZCAmJiB1c2VySWQgJiYgZ3JvdXBJZCkge1xuICAgICAgICAgICAgaGFuZGxlQXV0aGVudGljYXRpb25TdWNjZXNzKGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyLCB1c2VySWQsIGNvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNDAwIHx8ICFzdGF0dXMpIHtcbiAgICAgICAgICAgIGhhbmRsZUluaXRpYWxpemF0aW9uRmFpbHVyZShzdGF0dXMsIGNvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRXJyb3IgaW4gaGFuZGxpbmcgaGVhbGluZyBpbnN0cnVtZW50YXRpb246ICcgKyBlcnIpXG4gICAgfVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcblxuY29uc3Qgd29ya2Vyc0RhdGFEaXJQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdsb2dzJywgJ3dvcmtlcl9kYXRhJylcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFGcm9tV29ya2Vycygpe1xuICAgIGNvbnN0IHdvcmtlcnNEYXRhOiBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+W10gPSBbXVxuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHdvcmtlcnNEYXRhRGlyUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHdvcmtlcnNEYXRhXG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyh3b3JrZXJzRGF0YURpclBhdGgpXG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1JlYWRpbmcgd29ya2VyIGZpbGUgJyArIGZpbGUpXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtlcnNEYXRhRGlyUGF0aCwgZmlsZSlcbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JylcbiAgICAgICAgY29uc3Qgd29ya2VyRGF0YSA9IEpTT04ucGFyc2UoZmlsZUNvbnRlbnQpXG4gICAgICAgIHdvcmtlcnNEYXRhLnB1c2god29ya2VyRGF0YSlcbiAgICB9KVxuXG4gICAgLy8gUmVtb3ZlIHdvcmtlciBkYXRhIGFmdGVyIGFsbCByZWFkaW5nXG4gICAgcmVtb3ZlV29ya2Vyc0RhdGFEaXIoKVxuXG4gICAgcmV0dXJuIHdvcmtlcnNEYXRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYXZlV29ya2VyRGF0YShkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtlcnNEYXRhRGlyUGF0aCwgJ3dvcmtlci1kYXRhLScgKyBwcm9jZXNzLnBpZCArICcuanNvbicpXG5cbiAgICB0cnkge1xuICAgICAgICBjcmVhdGVXb3JrZXJzRGF0YURpcigpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdFeGNlcHRpb24gaW4gc2F2aW5nIHdvcmtlciBkYXRhOiAnICsgZSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVdvcmtlcnNEYXRhRGlyKCk6IGJvb2xlYW4ge1xuICAgIGZzLnJtU3luYyh3b3JrZXJzRGF0YURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtlcnNEYXRhRGlyKCkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh3b3JrZXJzRGF0YURpclBhdGgpKSB7XG4gICAgICAgIGZzLm1rZGlyU3luYyh3b3JrZXJzRGF0YURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxZQUFBQSxXQUFVLFlBQUFDLFdBQVUsUUFBQUMsT0FBTSxXQUFBQyxVQUFTLFFBQUFDLE9BQU0sY0FBYztBQUNoRSxPQUFPLFlBQVk7QUFDbkIsT0FBT0MsU0FBUTtBQUNmLE9BQU8sVUFBVTtBQUNqQixTQUFTLFFBQVEsYUFBQUMsa0JBQWlCO0FBQ2xDLE9BQU9DLFdBQVU7QUFDakIsT0FBT0MsV0FBVTtBQU1qQixPQUFPLGlCQUFpQjtBQUN4QixPQUFPLGVBQWU7QUFFdEIsU0FBUyxlQUFBQyxvQkFBbUI7OztBQ2Y1QixPQUFPLGVBQWU7QUFFdEIsSUFBTSxhQUFhO0FBQUEsRUFDZixNQUFNO0FBQUEsRUFBUSxPQUFPO0FBQUEsRUFBUyxPQUFPO0FBQUEsRUFBUyxPQUFPO0FBQUEsRUFBUyxNQUFNO0FBQ3hFO0FBRUEsSUFBTSxhQUFOLGNBQXlCLFVBQVU7QUFBQSxFQUMvQixlQUFlLENBQUMsUUFBUSxXQUFXLE1BQU0sVUFBVSxDQUFDLEVBQUUsTUFBbUI7QUFDckUsSUFBQyxRQUFRLEtBQWtCLGFBQWEsUUFBUSxHQUFHLElBQUk7QUFBQSxNQUNuRCxZQUFXLG9CQUFJLEtBQUssR0FBRSxZQUFZO0FBQUEsTUFDbEMsT0FBTyxNQUFNLFlBQVk7QUFBQSxNQUN6QixTQUFTLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQztBQUFBLE1BQy9CLE1BQU07QUFBQSxNQUNOLGVBQWUsQ0FBQztBQUFBLElBQ3BCLENBQUM7QUFBQSxFQUNMO0FBQUE7QUFBQSxFQUdBLFFBQVEsSUFB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QSxVQUFNLFVBQVVDLEtBQUcsYUFBYSxVQUFVLE1BQU07QUFFaEQsVUFBTSxPQUFPLEtBQUssTUFBTSxPQUFPO0FBQy9CLFNBQUsscUJBQXFCLFFBQVE7QUFDbEMsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVBLE9BQU8scUJBQXFCLFVBQW1CO0FBQzNDLFFBQUksQ0FBQyxVQUFVO0FBQ1g7QUFBQSxJQUNKO0FBQ0EsSUFBQUEsS0FBRyxPQUFPLFVBQVUsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUFBLEVBQ3ZDO0FBQ0o7QUFFQSxLQUFLLGNBQWMsYUFBYTsiLAogICJuYW1lcyI6IFsiaG9zdG5hbWUiLCAicGxhdGZvcm0iLCAidHlwZSIsICJ2ZXJzaW9uIiwgImFyY2giLCAiZnMiLCAicHJvbWlzaWZ5IiwgInBhdGgiLCAidXRpbCIsICJwZXJmb3JtYW5jZSIsICJmcyIsICJ1dGlsIiwgInBhdGgiLCAiYXJjaCIsICJwbGF0Zm9ybSIsICJmcyIsICJwYXRoIiwgInBhdGgiLCAiZnMiLCAiY2hhbGsiLCAibG9nZ2VyIiwgImxvZyIsICJsb2dnZXIiLCAiQlN0YWNrTG9nZ2VyIiwgInBhdGgiLCAiZnMiLCAiY2hhbGsiLCAicGxhdGZvcm0iLCAiQlN0YWNrTG9nZ2VyIiwgImZzIiwgInZlcnNpb24iLCAicGF0aCIsICJwcm9jZXNzIiwgIm9wZW5SZWFkU3RyZWFtUHJvbWlzZSIsICJwYXRoIiwgImZzIiwgInV0aWwiLCAidHlwZSIsICJwbGF0Zm9ybSIsICJhcmNoIiwgImZzIiwgImZzIiwgImdyb3VwIiwgInBhdGgiLCAiZnMiLCAicHJvbWlzaWZ5IiwgInV0aWwiLCAicGVyZm9ybWFuY2UiLCAibGF1bmNoVGVzdFNlc3Npb24iLCAiaG9zdG5hbWUiLCAicGxhdGZvcm0iLCAidHlwZSIsICJ2ZXJzaW9uIiwgImFyY2giLCAidXRpbCIsICJzdG9wQnVpbGRVcHN0cmVhbSIsICJwYXRoIiwgImdldFBsYXRmb3JtVmVyc2lvbiIsICJnZXRSZXNvbHZlZERldmljZU5hbWUiLCAicGF0aCIsICJoYXNoIiwgImZzIiwgInBhdGgiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAiZnMiLCAidXRpbCIsICJvcyIsICJ1dGlsIiwgImZvcm1hdCIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJ1dGlsIiwgInV0aWwiLCAiZnMiXQp9Cg==
|
|
3939
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWwudHMiLCAiLi4vc3JjL2xvZ1BhdGNoZXIudHMiLCAiLi4vc3JjL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIudHMiLCAiLi4vc3JjL2JzdGFja0xvZ2dlci50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2FwaVV0aWxzLnRzIiwgIi4uL3NyYy9jbGkvY2xpVXRpbHMudHMiLCAiLi4vc3JjL2ZldGNoV3JhcHBlci50cyIsICIuLi9zcmMvaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2NsaUxvZ2dlci50cyIsICIuLi9zcmMvY2xpL2ZyYW1ld29ya3MvY29uc3RhbnRzL3Rlc3RGcmFtZXdvcmtDb25zdGFudHMudHMiLCAiLi4vc3JjL3Rlc3RIdWIvdXRpbHMudHMiLCAiLi4vc3JjL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLnRzIiwgIi4uL3NyYy9jcmFzaC1yZXBvcnRlci50cyIsICIuLi9zcmMvdGVzdE9wcy9mZWF0dXJlU3RhdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvZmVhdHVyZVVzYWdlLnRzIiwgIi4uL3NyYy90ZXN0T3BzL3Rlc3RPcHNDb25maWcudHMiLCAiLi4vc3JjL3Rlc3RPcHMvdXNhZ2VTdGF0cy50cyIsICIuLi9zcmMvc2NyaXB0cy9hY2Nlc3NpYmlsaXR5LXNjcmlwdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvb3BlblJ1bnNKb3VybmFsLnRzIiwgIi4uL3NyYy9jbGVhbnVwLnRzIiwgIi4uL3NyYy9pbnN0cnVtZW50YXRpb24vZnVubmVsSW5zdHJ1bWVudGF0aW9uLnRzIiwgIi4uL3NyYy9kYXRhLXN0b3JlLnRzIl0sCiAgInNvdXJjZVJvb3QiOiAiL2hvbWUvcnVubmVyL3dvcmsvd2Rpby1icm93c2Vyc3RhY2stc2VydmljZS93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlL3BhY2thZ2VzL2Jyb3dzZXJzdGFjay1zZXJ2aWNlIiwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGhvc3RuYW1lLCBwbGF0Zm9ybSwgdHlwZSwgdmVyc2lvbiwgYXJjaCwgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCB6bGliIGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB7IGZvcm1hdCwgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHV0aWwgZnJvbSAnbm9kZTp1dGlsJ1xuXG5pbXBvcnQgdHlwZSB7IENhcGFiaWxpdGllcywgRnJhbWV3b3JrcywgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBCZWZvcmVDb21tYW5kQXJncywgQWZ0ZXJDb21tYW5kQXJncyB9IGZyb20gJ0B3ZGlvL3JlcG9ydGVyJ1xuXG5pbXBvcnQgdHlwZSB7IEdpdFJlcG9JbmZvIH0gZnJvbSAnZ2l0LXJlcG8taW5mbydcbmltcG9ydCBnaXRSZXBvSW5mbyBmcm9tICdnaXQtcmVwby1pbmZvJ1xuaW1wb3J0IGdpdGNvbmZpZyBmcm9tICdnaXRjb25maWdsb2NhbCdcbmltcG9ydCB0eXBlIHsgQ29sb3JOYW1lIH0gZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBwZXJmb3JtYW5jZSB9IGZyb20gJ25vZGU6cGVyZl9ob29rcydcbmltcG9ydCBsb2dQYXRjaGVyIGZyb20gJy4vbG9nUGF0Y2hlci5qcydcbmltcG9ydCBQZXJmb3JtYW5jZVRlc3RlciBmcm9tICcuL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgKiBhcyBQRVJGT1JNQU5DRV9TREtfRVZFTlRTIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IGxvZ0J1aWxkRXJyb3IsIGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eSwgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5LCBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5pbXBvcnQgeyBPcmNoZXN0cmF0aW9uVXRpbHMgfSBmcm9tICcuL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLmpzJ1xuaW1wb3J0IHR5cGUgeyBFcnJvcnMgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSB7IFVzZXJDb25maWcsIFVwbG9hZFR5cGUsIEJyb3dzZXJzdGFja0NvbmZpZywgQnJvd3NlcnN0YWNrT3B0aW9ucywgTGF1bmNoUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHR5cGUgeyBJVGVzdENhc2VIb29rUGFyYW1ldGVyIH0gZnJvbSAnLi9jdWN1bWJlci10eXBlcy5qcydcbmltcG9ydCB7XG4gICAgQlJPV1NFUl9ERVNDUklQVElPTixcbiAgICBVUExPQURfTE9HU19FTkRQT0lOVCxcbiAgICBjb25zb2xlSG9sZGVyLFxuICAgIFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsXG4gICAgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0xUUyxcbiAgICBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQsXG4gICAgVEVTVE9QU19TQ1JFRU5TSE9UX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELFxuICAgIFBFUkZfTUVBU1VSRU1FTlRfRU5WLFxuICAgIFJFUlVOX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVF9QTEFOX0lELFxuICAgIE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVMsXG4gICAgR0lUX01FVEFfREFUQV9UUlVOQ0FURUQsXG4gICAgQVBQX0FMTFlfSVNTVUVTX1NVTU1BUllfRU5EUE9JTlQsXG4gICAgQVBQX0FMTFlfSVNTVUVTX0VORFBPSU5ULFxuICAgIENMSV9ERUJVR19MT0dTX0ZJTEUsXG4gICAgV0RJT19OQU1JTkdfUFJFRklYXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IENyYXNoUmVwb3J0ZXIgZnJvbSAnLi9jcmFzaC1yZXBvcnRlci5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IFVzYWdlU3RhdHMgZnJvbSAnLi90ZXN0T3BzL3VzYWdlU3RhdHMuanMnXG5pbXBvcnQgVGVzdE9wc0NvbmZpZyBmcm9tICcuL3Rlc3RPcHMvdGVzdE9wc0NvbmZpZy5qcydcbmltcG9ydCB0eXBlIHsgU3RhcnRCaW5TZXNzaW9uUmVzcG9uc2UgfSBmcm9tICcuL2dycGMvaW5kZXguanMnXG5pbXBvcnQgQVBJVXRpbHMgZnJvbSAnLi9jbGkvYXBpVXRpbHMuanMnXG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd0YXInXG5cbmltcG9ydCBBY2Nlc3NpYmlsaXR5U2NyaXB0cyBmcm9tICcuL3NjcmlwdHMvYWNjZXNzaWJpbGl0eS1zY3JpcHRzLmpzJ1xuXG5pbXBvcnQgeyBfZmV0Y2ggYXMgZmV0Y2ggfSBmcm9tICcuL2ZldGNoV3JhcHBlci5qcydcblxuY29uc3QgcEdpdGNvbmZpZyA9IHByb21pc2lmeShnaXRjb25maWcpXG5cbmV4cG9ydCB0eXBlIEdpdE1ldGFEYXRhID0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzaGE6IHN0cmluZztcbiAgICBzaG9ydF9zaGE6IHN0cmluZztcbiAgICBicmFuY2g6IHN0cmluZztcbiAgICB0YWc6IHN0cmluZyB8IG51bGw7XG4gICAgY29tbWl0dGVyOiBzdHJpbmc7XG4gICAgY29tbWl0dGVyX2RhdGU6IHN0cmluZztcbiAgICBhdXRob3I6IHN0cmluZztcbiAgICBhdXRob3JfZGF0ZTogc3RyaW5nO1xuICAgIGNvbW1pdF9tZXNzYWdlOiBzdHJpbmc7XG4gICAgcm9vdDogc3RyaW5nO1xuICAgIGNvbW1vbl9naXRfZGlyOiBzdHJpbmc7XG4gICAgd29ya3RyZWVfZ2l0X2Rpcjogc3RyaW5nO1xuICAgIGxhc3RfdGFnOiBzdHJpbmcgfCBudWxsO1xuICAgIGNvbW1pdHNfc2luY2VfbGFzdF90YWc6IG51bWJlcjtcbiAgICByZW1vdGVzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdXJsOiBzdHJpbmcgfT47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1JFUVVFU1RfQ09ORklHID0ge1xuICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgJ1gtQlNUQUNLLU9CUyc6ICd0cnVlJ1xuICAgIH0sXG59XG5cbmV4cG9ydCBjb25zdCBDT0xPUlM6IFJlY29yZDxzdHJpbmcsIENvbG9yTmFtZT4gPSB7XG4gICAgZXJyb3I6ICdyZWQnLFxuICAgIHdhcm46ICd5ZWxsb3cnLFxuICAgIGluZm86ICdjeWFuQnJpZ2h0JyxcbiAgICBkZWJ1ZzogJ2dyZWVuJyxcbiAgICB0cmFjZTogJ2N5YW4nLFxuICAgIHByb2dyZXNzOiAnbWFnZW50YSdcbn1cblxuLyoqXG4gKiBnZXQgYnJvd3NlciBkZXNjcmlwdGlvbiBmb3IgQnJvd3NlcnN0YWNrIHNlcnZpY2VcbiAqIEBwYXJhbSBjYXAgYnJvd3NlciBjYXBhYmxpdGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJvd3NlckRlc2NyaXB0aW9uKGNhcDogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKSB7XG4gICAgY2FwID0gY2FwIHx8IHt9XG4gICAgaWYgKGNhcFsnYnN0YWNrOm9wdGlvbnMnXSkge1xuICAgICAgICBjYXAgPSB7IC4uLmNhcCwgLi4uY2FwWydic3RhY2s6b3B0aW9ucyddIH0gYXMgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlc2Uga2V5cyBkZXNjcmliZSB0aGUgYnJvd3NlciB0aGUgdGVzdCB3YXMgcnVuIG9uXG4gICAgICovXG4gICAgcmV0dXJuIEJST1dTRVJfREVTQ1JJUFRJT05cbiAgICAgICAgLm1hcCgoaykgPT4gKGNhcClbayBhcyBrZXlvZiB0eXBlb2YgY2FwXSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuam9pbignICcpXG59XG5cbi8qKlxuICogZ2V0IGNvcnJlY3QgYnJvd3NlciBjYXBhYmlsaXRpZXMgb2JqZWN0IGluIGJvdGggbXVsdGlyZW1vdGUgYW5kIG5vcm1hbCBzZXR1cHNcbiAqIEBwYXJhbSBicm93c2VyIGJyb3dzZXIgb2JqZWN0XG4gKiBAcGFyYW0gY2FwcyBicm93c2VyIGNhcGJpbGl0aWVzIG9iamVjdC4gSW4gY2FzZSBvZiBtdWx0aXJlbW90ZSwgdGhlIG9iamVjdCBpdHNlbGYgc2hvdWxkIGhhdmUgYSBwcm9wZXJ0eSBuYW1lZCAnY2FwYWJpbGl0aWVzJ1xuICogQHBhcmFtIGJyb3dzZXJOYW1lIGJyb3dzZXIgbmFtZSBpbiBjYXNlIG9mIG11bHRpcmVtb3RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyQ2FwYWJpbGl0aWVzKGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIgfCBXZWJkcml2ZXJJTy5NdWx0aVJlbW90ZUJyb3dzZXIsIGNhcHM/OiBDYXBhYmlsaXRpZXMuUmVzb2x2ZWRUZXN0cnVubmVyQ2FwYWJpbGl0aWVzLCBicm93c2VyTmFtZT86IHN0cmluZykge1xuICAgIGlmICghYnJvd3Nlci5pc011bHRpcmVtb3RlKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmJyb3dzZXIuY2FwYWJpbGl0aWVzLCAuLi5jYXBzIH0gYXMgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXG4gICAgfVxuXG4gICAgY29uc3QgbXVsdGlDYXBzID0gY2FwcyBhcyBDYXBhYmlsaXRpZXMuUmVxdWVzdGVkTXVsdGlyZW1vdGVDYXBhYmlsaXRpZXNcbiAgICBjb25zdCBnbG9iYWxDYXAgPSBicm93c2VyTmFtZSAmJiBicm93c2VyLmdldEluc3RhbmNlKGJyb3dzZXJOYW1lKSA/IGJyb3dzZXIuZ2V0SW5zdGFuY2UoYnJvd3Nlck5hbWUpLmNhcGFiaWxpdGllcyA6IHt9XG4gICAgY29uc3QgY2FwID0gYnJvd3Nlck5hbWUgJiYgbXVsdGlDYXBzW2Jyb3dzZXJOYW1lXSA/IG11bHRpQ2Fwc1ticm93c2VyTmFtZV0uY2FwYWJpbGl0aWVzIDoge31cbiAgICByZXR1cm4geyAuLi5nbG9iYWxDYXAsIC4uLmNhcCB9IGFzIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc1xufVxuXG4vKipcbiAqIGNoZWNrIGZvciBicm93c2Vyc3RhY2sgVzNDIGNhcGFiaWxpdGllcy4gRG9lcyBub3Qgc3VwcG9ydCBsZWdhY3kgY2FwYWJpbGl0aWVzXG4gKiBAcGFyYW0gY2FwIGJyb3dzZXIgY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jyb3dzZXJzdGFja0NhcGFiaWxpdHkoY2FwPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICAgIGNhcCAmJlxuICAgICAgICAgICAgY2FwWydic3RhY2s6b3B0aW9ucyddICYmXG4gICAgICAgICAgICAvLyByZXR1cm4gZmFsc2UgaWYgdGhlIG9ubHkgY2FwIGluIGJzdGFjazpvcHRpb25zIGlzIHdkaW9TZXJ2aWNlLFxuICAgICAgICAgICAgLy8gYXMgdGhhdCBpcyBhZGRlZCBieSB0aGUgc2VydmljZSBhbmQgbm90IHByZXNlbnQgaW4gdXNlciBwYXNzZWQgY2Fwc1xuICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjYXBbJ2JzdGFjazpvcHRpb25zJ10pLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIGNhcFsnYnN0YWNrOm9wdGlvbnMnXS53ZGlvU2VydmljZVxuICAgICAgICAgICAgKVxuICAgIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudFN1aXRlTmFtZShmdWxsVGl0bGU6IHN0cmluZywgdGVzdFN1aXRlVGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZnVsbFRpdGxlV29yZHMgPSBmdWxsVGl0bGUuc3BsaXQoJyAnKVxuICAgIGNvbnN0IHRlc3RTdWl0ZVRpdGxlV29yZHMgPSB0ZXN0U3VpdGVUaXRsZS5zcGxpdCgnICcpXG4gICAgY29uc3Qgc2hvcnRlc3RMZW5ndGggPSBNYXRoLm1pbihmdWxsVGl0bGVXb3Jkcy5sZW5ndGgsIHRlc3RTdWl0ZVRpdGxlV29yZHMubGVuZ3RoKVxuICAgIGxldCBjID0gMFxuICAgIGxldCBwYXJlbnRTdWl0ZU5hbWUgPSAnJ1xuICAgIHdoaWxlIChjIDwgc2hvcnRlc3RMZW5ndGggJiYgZnVsbFRpdGxlV29yZHNbY10gPT09IHRlc3RTdWl0ZVRpdGxlV29yZHNbY10pIHtcbiAgICAgICAgcGFyZW50U3VpdGVOYW1lICs9IGZ1bGxUaXRsZVdvcmRzW2MrK10gKyAnICdcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudFN1aXRlTmFtZS50cmltKClcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Vycm9yKGVycm9yOiBFcnJvciwgZm46IEZ1bmN0aW9uLCBhcmdzOiB1bmtub3duW10pIHtcbiAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIGluIGV4ZWN1dGluZyAke2ZuLm5hbWV9IHdpdGggYXJncyAke2FyZ3N9OiAke2Vycm9yfWApXG4gICAgbGV0IGFyZ3NTdHJpbmc6IHN0cmluZ1xuICAgIHRyeSB7XG4gICAgICAgIGFyZ3NTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShhcmdzKVxuICAgIH0gY2F0Y2gge1xuICAgICAgICBhcmdzU3RyaW5nID0gdXRpbC5pbnNwZWN0KGFyZ3MsIHsgZGVwdGg6IDIgfSlcbiAgICB9XG4gICAgQ3Jhc2hSZXBvcnRlci51cGxvYWRDcmFzaFJlcG9ydChgRXJyb3IgaW4gZXhlY3V0aW5nICR7Zm4ubmFtZX0gd2l0aCBhcmdzICR7YXJnc1N0cmluZ30gOiAke2Vycm9yfWAsIGVycm9yICYmIGVycm9yLnN0YWNrIHx8ICd1bmtub3duIGVycm9yJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG8xMXlFcnJvckhhbmRsZXIoZm46IEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBmdW5jdGlvblRvSGFuZGxlID0gZm5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uVG9IYW5kbGUgPSBwZXJmb3JtYW5jZS50aW1lcmlmeShmdW5jdGlvblRvSGFuZGxlIGFzIGFueSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZ1bmN0aW9uVG9IYW5kbGUoLi4uYXJncylcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jYXRjaChlcnJvciA9PiBwcm9jZXNzRXJyb3IoZXJyb3IsIGZuLCBhcmdzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHByb2Nlc3NFcnJvcihlcnJvciBhcyBFcnJvciwgZm4sIGFyZ3MpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckhhbmRsZXIoZm46IEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uVG9IYW5kbGUgPSBmblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZnVuY3Rpb25Ub0hhbmRsZSguLi5hcmdzKVxuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhdGNoKGVycm9yID0+IEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgaW4gZXhlY3V0aW5nICR7Zm4ubmFtZX0gd2l0aCBhcmdzICR7YXJnc306ICR7ZXJyb3J9YCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIGluIGV4ZWN1dGluZyAke2ZuLm5hbWV9IHdpdGggYXJncyAke2FyZ3N9OiAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBub2RlUmVxdWVzdChyZXF1ZXN0VHlwZTogc3RyaW5nLCBhcGlFbmRwb2ludDogc3RyaW5nLCBvcHRpb25zOiBSZXF1ZXN0SW5pdCwgYXBpVXJsOiBzdHJpbmcsIHRpbWVvdXQ6IG51bWJlciA9IDEyMDAwMCkge1xuICAgIHRyeSB7XG5cbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGltZW91dClcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vJHthcGlFbmRwb2ludH1gLCB7XG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3RUeXBlLFxuICAgICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBDbGVhciB0aGUgdGltZW91dCBhcyB0aGUgcmVxdWVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIGluIGZpcmluZyByZXF1ZXN0ICR7YXBpVXJsfS8ke2FwaUVuZHBvaW50fTogJHtmb3JtYXQoZXJyb3IpfWApXG4gICAgICAgIGNvbnN0IGlzTG9nVXBsb2FkID0gYXBpRW5kcG9pbnQgPT09IFVQTE9BRF9MT0dTX0VORFBPSU5UXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci5yZXNwb25zZSkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlSnNvbiA9IGVycm9yLnJlc3BvbnNlLmJvZHkgPyBKU09OLnBhcnNlKGVycm9yLnJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKSkgOiBudWxsXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2VKc29uID8gZXJyb3JNZXNzYWdlSnNvbi5tZXNzYWdlIDogbnVsbFxuICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgJHtlcnJvck1lc3NhZ2V9IC0gJHtlcnJvci5zdGFja31gXG4gICAgICAgICAgICAgICAgaWYgKGlzTG9nVXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhtZXNzYWdlKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihtZXNzYWdlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzTG9nVXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzTG9nVXBsb2FkKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBGYWlsZWQgdG8gZmlyZSBhcGkgcmVxdWVzdCBkdWUgdG8gJHtlcnJvcn0gLSAke2Vycm9yLnN0YWNrfWApXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZhaWxlZCB0byBmaXJlIGFwaSByZXF1ZXN0IGR1ZSB0byAke2Vycm9yfSAtICR7ZXJyb3Iuc3RhY2t9YClcbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIGh0dHBzOi8vdHVnYXlpbGlrLm1lZGl1bS5jb20vZXJyb3ItaGFuZGxpbmctdmlhLXRyeS1jYXRjaC1wcm94eS1pbi1qYXZhc2NyaXB0LTU0MTE2ZGJmNzgzZlxuLypcbiAgICBBIGNsYXNzIHdyYXBwZXIgZm9yIGVycm9yIGhhbmRsaW5nLiBUaGUgd3JhcHBlciB3cmFwcyBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIGNsYXNzIHdpdGggYSBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLlxuICAgIElmIGFueSBleGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhc3MgbWV0aG9kLCB0aGF0IHdpbGwgZ2V0IGNhdWdodCBpbiB0aGUgd3JhcHBlciB3aGljaCBsb2dzIGFuZCByZXBvcnRzIHRoZSBlcnJvci5cbiAqL1xudHlwZSBDbGFzc1R5cGUgPSB7IG5ldyguLi5hcmdzOiB1bmtub3duW10pOiB1bmtub3duOyB9IC8vIEEgZ2VuZXJpYyB0eXBlIGZvciBhIGNsYXNzXG5leHBvcnQgZnVuY3Rpb24gbzExeUNsYXNzRXJyb3JIYW5kbGVyPFQgZXh0ZW5kcyBDbGFzc1R5cGU+KGVycm9yQ2xhc3M6IFQpOiBUIHtcbiAgICBjb25zdCBwcm90b3R5cGUgPSBlcnJvckNsYXNzLnByb3RvdHlwZVxuXG4gICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvdHlwZSkubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gZXJyb3JDbGFzc1xuICAgIH1cblxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvdHlwZSkuZm9yRWFjaCgobWV0aG9kTmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBtZXRob2QgPSBwcm90b3R5cGVbbWV0aG9kTmFtZV1cbiAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdmdW5jdGlvbicgJiYgbWV0aG9kTmFtZSAhPT0gJ2NvbnN0cnVjdG9yJyAmJiBtZXRob2ROYW1lICE9PSAnY29tbWFuZFdyYXBwZXInKSB7XG4gICAgICAgICAgICAvLyBJbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGlzIGNvbnRleHQsIG5lZWQgdG8gZGVmaW5lIGxpa2UgdGhpc1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0gPyBwZXJmb3JtYW5jZS50aW1lcmlmeShtZXRob2QpIDogbWV0aG9kKS5jYWxsKHRoaXMsIC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2F0Y2goZXJyb3IgPT4gcHJvY2Vzc0Vycm9yKGVycm9yLCBtZXRob2QsIGFyZ3MpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGVyciBhcyBFcnJvciwgbWV0aG9kLCBhcmdzKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gZXJyb3JDbGFzc1xufVxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc1Rlc3RPYnNlcnZhYmlsaXR5UmVzcG9uc2UgPSAocmVzcG9uc2U6IExhdW5jaFJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKCFyZXNwb25zZS5vYnNlcnZhYmlsaXR5KSB7XG4gICAgICAgIGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eShudWxsKVxuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFyZXNwb25zZS5vYnNlcnZhYmlsaXR5LnN1Y2Nlc3MpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGb3JPYnNlcnZhYmlsaXR5KHJlc3BvbnNlLm9ic2VydmFiaWxpdHkgYXMgRXJyb3JzKVxuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFldID0gJ3RydWUnXG4gICAgaWYgKHJlc3BvbnNlLm9ic2VydmFiaWxpdHkub3B0aW9ucy5hbGxvd19zY3JlZW5zaG90cykge1xuICAgICAgICBwcm9jZXNzLmVudltURVNUT1BTX1NDUkVFTlNIT1RfRU5WXSA9IHJlc3BvbnNlLm9ic2VydmFiaWxpdHkub3B0aW9ucy5hbGxvd19zY3JlZW5zaG90cy50b1N0cmluZygpXG4gICAgfVxufVxuXG5pbnRlcmZhY2UgRGF0YUVsZW1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuZXhwb3J0IGNvbnN0IGpzb25pZnlBY2Nlc3NpYmlsaXR5QXJyYXkgPSAoXG4gICAgZGF0YUFycmF5OiBEYXRhRWxlbWVudFtdLFxuICAgIGtleU5hbWU6IGtleW9mIERhdGFFbGVtZW50LFxuICAgIHZhbHVlTmFtZToga2V5b2YgRGF0YUVsZW1lbnRcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICBkYXRhQXJyYXkuZm9yRWFjaCgoZWxlbWVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgcmVzdWx0W2VsZW1lbnRba2V5TmFtZV0gYXMgc3RyaW5nXSA9IGVsZW1lbnRbdmFsdWVOYW1lXVxuICAgIH0pXG4gICAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc0FjY2Vzc2liaWxpdHlSZXNwb25zZSA9IChyZXNwb25zZTogTGF1bmNoUmVzcG9uc2UgfCBTdGFydEJpblNlc3Npb25SZXNwb25zZSwgb3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyKSA9PiB7XG4gICAgaWYgKCFyZXNwb25zZS5hY2Nlc3NpYmlsaXR5KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmFjY2Vzc2liaWxpdHkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGhhbmRsZUVycm9yRm9yQWNjZXNzaWJpbGl0eShudWxsKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLmFjY2Vzc2liaWxpdHkuc3VjY2Vzcykge1xuICAgICAgICBoYW5kbGVFcnJvckZvckFjY2Vzc2liaWxpdHkocmVzcG9uc2UuYWNjZXNzaWJpbGl0eSBhcyBFcnJvcnMpXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5hY2Nlc3NpYmlsaXR5Lm9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBhY2Nlc3NpYmlsaXR5VG9rZW4sIHBvbGxpbmdUaW1lb3V0LCBzY2FubmVyVmVyc2lvbiB9ID0ganNvbmlmeUFjY2Vzc2liaWxpdHlBcnJheShyZXNwb25zZS5hY2Nlc3NpYmlsaXR5Lm9wdGlvbnMuY2FwYWJpbGl0aWVzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiwgJ25hbWUnLCAndmFsdWUnKVxuICAgICAgICBjb25zdCByZXN1bHQgPSBqc29uaWZ5QWNjZXNzaWJpbGl0eUFycmF5KHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucy5jYXBhYmlsaXRpZXMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCAnbmFtZScsICd2YWx1ZScpXG4gICAgICAgIGNvbnN0IHNjcmlwdHNKc29uID0ge1xuICAgICAgICAgICAgJ3NjcmlwdHMnOiBqc29uaWZ5QWNjZXNzaWJpbGl0eUFycmF5KHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucy5zY3JpcHRzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiwgJ25hbWUnLCAnY29tbWFuZCcpLFxuICAgICAgICAgICAgJ2NvbW1hbmRzJzogcmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zLmNvbW1hbmRzVG9XcmFwPy5jb21tYW5kcyA/PyBbXSxcbiAgICAgICAgICAgICdub25CU3RhY2tJbmZyYUExMXlDaHJvbWVPcHRpb25zJzogcmVzdWx0Wydnb29nOmNocm9tZU9wdGlvbnMnXVxuICAgICAgICB9XG4gICAgICAgIGlmIChzY2FubmVyVmVyc2lvbikge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfU0NBTk5FUl9WRVJTSU9OID0gc2Nhbm5lclZlcnNpb24gYXMgc3RyaW5nXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEFjY2Vzc2liaWxpdHkgc2Nhbm5lclZlcnNpb24gJHtzY2FubmVyVmVyc2lvbn1gKVxuICAgICAgICB9XG4gICAgICAgIGlmIChhY2Nlc3NpYmlsaXR5VG9rZW4pIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCA9IGFjY2Vzc2liaWxpdHlUb2tlbiBhcyBzdHJpbmdcbiAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZXSA9ICd0cnVlJ1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb2xsaW5nVGltZW91dCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUID0gcG9sbGluZ1RpbWVvdXQgYXMgc3RyaW5nXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjcmlwdHNKc29uKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGZpeCB0eXBlXG4gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2NyaXB0cy51cGRhdGUoc2NyaXB0c0pzb24pXG4gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5zdG9yZSgpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzTGF1bmNoQnVpbGRSZXNwb25zZSA9IChyZXNwb25zZTogTGF1bmNoUmVzcG9uc2UsIG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lcikgPT4ge1xuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5KSB7XG4gICAgICAgIHByb2Nlc3NUZXN0T2JzZXJ2YWJpbGl0eVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgIH1cbiAgICBwcm9jZXNzQWNjZXNzaWJpbGl0eVJlc3BvbnNlKHJlc3BvbnNlLCBvcHRpb25zKVxufVxuXG5leHBvcnQgY29uc3QgbGF1bmNoVGVzdFNlc3Npb24gPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLlRFU1RIVUJfRVZFTlRTLlNUQVJULCBvMTF5RXJyb3JIYW5kbGVyKGFzeW5jIGZ1bmN0aW9uIGxhdW5jaFRlc3RTZXNzaW9uKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsIGJzQ29uZmlnOiBVc2VyQ29uZmlnLCBiU3RhY2tDb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24/OiBib29sZWFuKSB7XG4gICAgY29uc3QgbGF1bmNoQnVpbGRVc2FnZSA9IFVzYWdlU3RhdHMuZ2V0SW5zdGFuY2UoKS5sYXVuY2hCdWlsZFVzYWdlXG4gICAgbGF1bmNoQnVpbGRVc2FnZS50cmlnZ2VyZWQoKVxuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgZm9ybWF0OiAnanNvbicsXG4gICAgICAgIHByb2plY3RfbmFtZTogZ2V0T2JzZXJ2YWJpbGl0eVByb2plY3Qob3B0aW9ucywgYnNDb25maWcucHJvamVjdE5hbWUpLFxuICAgICAgICBuYW1lOiBnZXRPYnNlcnZhYmlsaXR5QnVpbGQob3B0aW9ucywgYnNDb25maWcuYnVpbGROYW1lKSxcbiAgICAgICAgYnVpbGRfaWRlbnRpZmllcjogYnNDb25maWcuYnVpbGRJZGVudGlmaWVyLFxuICAgICAgICBzdGFydGVkX2F0OiAobmV3IERhdGUoKSkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgdGFnczogZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhvcHRpb25zLCBic0NvbmZpZy5idWlsZFRhZyksXG4gICAgICAgIGhvc3RfaW5mbzoge1xuICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3RuYW1lKCksXG4gICAgICAgICAgICBwbGF0Zm9ybTogcGxhdGZvcm0oKSxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUoKSxcbiAgICAgICAgICAgIHZlcnNpb246IHZlcnNpb24oKSxcbiAgICAgICAgICAgIGFyY2g6IGFyY2goKVxuICAgICAgICB9LFxuICAgICAgICBjaV9pbmZvOiBnZXRDaUluZm8oKSxcbiAgICAgICAgYnVpbGRfcnVuX2lkZW50aWZpZXI6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19CVUlMRF9SVU5fSURFTlRJRklFUixcbiAgICAgICAgZmFpbGVkX3Rlc3RzX3JlcnVuOiBwcm9jZXNzLmVudltSRVJVTl9FTlZdIHx8IGZhbHNlLFxuICAgICAgICB2ZXJzaW9uX2NvbnRyb2w6IGF3YWl0IGdldEdpdE1ldGFEYXRhKCksXG4gICAgICAgIGFjY2Vzc2liaWxpdHk6IHtcbiAgICAgICAgICAgIHNldHRpbmdzOiBvcHRpb25zLmFjY2Vzc2liaWxpdHlPcHRpb25zXG4gICAgICAgIH0sXG4gICAgICAgIGJyb3dzZXJzdGFja0F1dG9tYXRpb246IHNob3VsZEFkZFNlcnZpY2VWZXJzaW9uKGNvbmZpZywgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eSksXG4gICAgICAgIGZyYW1ld29ya19kZXRhaWxzOiB7XG4gICAgICAgICAgICBmcmFtZXdvcmtOYW1lOiBXRElPX05BTUlOR19QUkVGSVggKyBjb25maWcuZnJhbWV3b3JrLFxuICAgICAgICAgICAgZnJhbWV3b3JrVmVyc2lvbjogYnNDb25maWcuYnN0YWNrU2VydmljZVZlcnNpb24sXG4gICAgICAgICAgICBzZGtWZXJzaW9uOiBic0NvbmZpZy5ic3RhY2tTZXJ2aWNlVmVyc2lvbixcbiAgICAgICAgICAgIGxhbmd1YWdlOiAnRUNNQVNjcmlwdCcsXG4gICAgICAgICAgICB0ZXN0RnJhbWV3b3JrOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1dlYmRyaXZlcklPJyxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBic0NvbmZpZy5ic3RhY2tTZXJ2aWNlVmVyc2lvblxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwcm9kdWN0X21hcDogZ2V0UHJvZHVjdE1hcEZvckJ1aWxkU3RhcnRDYWxsKGJTdGFja0NvbmZpZywgYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24pLFxuICAgICAgICBjb25maWc6IHt9LFxuICAgICAgICB0ZXN0X29yY2hlc3RyYXRpb246IE9yY2hlc3RyYXRpb25VdGlscy5nZXRJbnN0YW5jZShjb25maWcpPy5nZXRCdWlsZFN0YXJ0RGF0YSgpIHx8IHt9LFxuICAgICAgICB0ZXN0X21hbmFnZW1lbnQ6IHtcbiAgICAgICAgICAgIHRlc3RfcGxhbl9pZDogZ2V0VGVzdFBsYW5JZChvcHRpb25zKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uICYmIChpc1R1cmJvU2NhbGUob3B0aW9ucykgfHwgZGF0YS5icm93c2Vyc3RhY2tBdXRvbWF0aW9uID09PSBmYWxzZSkpe1xuICAgICAgICBkYXRhLmFjY2Vzc2liaWxpdHkuc2V0dGluZ3MgPz89IHt9XG4gICAgICAgIGRhdGEuYWNjZXNzaWJpbGl0eS5zZXR0aW5ncy5pbmNsdWRlRW5jb2RlZEV4dGVuc2lvbiA9IHRydWVcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoQ3Jhc2hSZXBvcnRlci51c2VyQ29uZmlnRm9yUmVwb3J0aW5nKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIENyYXNoUmVwb3J0ZXIudXNlckNvbmZpZ0ZvclJlcG9ydGluZyA9IHByb2Nlc3MuZW52LlVTRVJfQ09ORklHX0ZPUl9SRVBPUlRJTkcgIT09IHVuZGVmaW5lZCA/IEpTT04ucGFyc2UocHJvY2Vzcy5lbnYuVVNFUl9DT05GSUdfRk9SX1JFUE9SVElORykgOiB7fVxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIEJTdGFja0xvZ2dlci5lcnJvcihgW0NyYXNoX1JlcG9ydF9VcGxvYWRdIEZhaWxlZCB0byBwYXJzZSB1c2VyIGNvbmZpZyB3aGlsZSBzZW5kaW5nIGJ1aWxkIHN0YXJ0IGV2ZW50IGR1ZSB0byAke2Vycm9yfWApXG4gICAgfVxuICAgIGRhdGEuY29uZmlnID0gQ3Jhc2hSZXBvcnRlci51c2VyQ29uZmlnRm9yUmVwb3J0aW5nXG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElVdGlscy5EQVRBX0VORFBPSU5UfS9hcGkvdjIvYnVpbGRzYFxuICAgICAgICBjb25zdCBlbmNvZGVkQXV0aCA9IEJ1ZmZlci5mcm9tKGAke2dldE9ic2VydmFiaWxpdHlVc2VyKG9wdGlvbnMsIGNvbmZpZyl9OiR7Z2V0T2JzZXJ2YWJpbGl0eUtleShvcHRpb25zLCBjb25maWcpfWAsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICAuLi5ERUZBVUxUX1JFUVVFU1RfQ09ORklHLmhlYWRlcnMsXG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gLFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKVxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBqc29uUmVzcG9uc2U6IExhdW5jaFJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIGRlbGV0ZSBkYXRhPy5hY2Nlc3NpYmlsaXR5Py5zZXR0aW5ncz8uaW5jbHVkZUVuY29kZWRFeHRlbnNpb25cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbU3RhcnRfQnVpbGRdIFN1Y2Nlc3MgcmVzcG9uc2U6ICR7SlNPTi5zdHJpbmdpZnkoanNvblJlc3BvbnNlKX1gKVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFRlc3QgUGxhbiBJZCBzZW50IGluIHJlcXVlc3Q6ICR7Z2V0VGVzdFBsYW5JZChvcHRpb25zKX1gKVxuICAgICAgICBwcm9jZXNzLmVudltURVNUT1BTX0JVSUxEX0NPTVBMRVRFRF9FTlZdID0gJ3RydWUnXG4gICAgICAgIGlmIChqc29uUmVzcG9uc2Uuand0KSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1RdID0ganNvblJlc3BvbnNlLmp3dFxuICAgICAgICB9XG4gICAgICAgIGlmIChqc29uUmVzcG9uc2UuYnVpbGRfaGFzaGVkX2lkKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXSA9IGpzb25SZXNwb25zZS5idWlsZF9oYXNoZWRfaWRcbiAgICAgICAgICAgIFRlc3RPcHNDb25maWcuZ2V0SW5zdGFuY2UoKS5idWlsZEhhc2hlZElkID0ganNvblJlc3BvbnNlLmJ1aWxkX2hhc2hlZF9pZFxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oYFRlc3RodWIgc3RhcnRlZCB3aXRoIGlkOiAke1Rlc3RPcHNDb25maWcuZ2V0SW5zdGFuY2UoKT8uYnVpbGRIYXNoZWRJZH1gKVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NMYXVuY2hCdWlsZFJlc3BvbnNlKGpzb25SZXNwb25zZSwgb3B0aW9ucylcbiAgICAgICAgbGF1bmNoQnVpbGRVc2FnZS5zdWNjZXNzKClcbiAgICAgICAgcmV0dXJuIGpzb25SZXNwb25zZVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgVGVzdEh1YiBidWlsZCBzdGFydCBmYWlsZWQ6ICR7Zm9ybWF0KGVycm9yKX1gKVxuICAgICAgICBpZiAoIShlcnJvciBhcyBFcnJvciAmIHsgc3VjY2VzczogYm9vbGVhbiB9KS5zdWNjZXNzKSB7XG4gICAgICAgICAgICBsYXVuY2hCdWlsZFVzYWdlLmZhaWxlZChlcnJvcilcbiAgICAgICAgICAgIGxvZ0J1aWxkRXJyb3IoZXJyb3IgYXMgRXJyb3JzKVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgIH1cbn0pKVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQ2Fwc1dpdGhBcHBBMTF5ID0gKHBsYXRmb3JtTWV0YT86IHsgW2tleTogc3RyaW5nXTogYW55OyB9KSA9PiB7XG4gICAgLyogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZHJpdmVyIHBsYXRmb3JtIGlzIGVsaWdpYmxlIGZvciBBcHBBY2Nlc3NpYmlsaXR5IHNjYW4gKi9cbiAgICBpZiAoXG4gICAgICAgIChwbGF0Zm9ybU1ldGE/LnBsYXRmb3JtX25hbWUgJiYgU3RyaW5nKHBsYXRmb3JtTWV0YT8ucGxhdGZvcm1fbmFtZSkudG9Mb3dlckNhc2UoKSA9PT0gJ2FuZHJvaWQnKSAmJlxuICAgICAgICAocGxhdGZvcm1NZXRhPy5wbGF0Zm9ybV92ZXJzaW9uICYmIHBhcnNlSW50KHBsYXRmb3JtTWV0YT8ucGxhdGZvcm1fdmVyc2lvbj8udG9TdHJpbmcoKSkgPCAxMSlcbiAgICApIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FwcCBBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gdGVzdHMgYXJlIHN1cHBvcnRlZCBvbiBPUyB2ZXJzaW9uIDExIGFuZCBhYm92ZSBmb3IgQW5kcm9pZCBkZXZpY2VzLicpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQ2Fwc1dpdGhBMTF5ID0gKGRldmljZU5hbWU/OiBhbnksIHBsYXRmb3JtTWV0YT86IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCBjaHJvbWVPcHRpb25zPzogYW55KSA9PiB7XG4gICAgLyogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZHJpdmVyIHBsYXRmb3JtIGlzIGVsaWdpYmxlIGZvciBBY2Nlc3NpYmlsaXR5IHNjYW4gKi9cbiAgICB0cnkge1xuICAgICAgICBpZiAoZGV2aWNlTmFtZSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB3aWxsIHJ1biBvbmx5IG9uIERlc2t0b3AgYnJvd3NlcnMuJylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsYXRmb3JtTWV0YT8uYnJvd3Nlcl9uYW1lPy50b0xvd2VyQ2FzZSgpICE9PSAnY2hyb21lJykge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB3aWxsIHJ1biBvbmx5IG9uIENocm9tZSBicm93c2Vycy4nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnJvd3NlclZlcnNpb24gPSBwbGF0Zm9ybU1ldGE/LmJyb3dzZXJfdmVyc2lvblxuICAgICAgICBpZiAoICFpc1VuZGVmaW5lZChicm93c2VyVmVyc2lvbikgJiYgIShicm93c2VyVmVyc2lvbiA9PT0gJ2xhdGVzdCcgfHwgcGFyc2VGbG9hdChicm93c2VyVmVyc2lvbiArICcnKSA+IDk0KSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB3aWxsIHJ1biBvbmx5IG9uIENocm9tZSBicm93c2VyIHZlcnNpb24gZ3JlYXRlciB0aGFuIDk0LicpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaHJvbWVPcHRpb25zPy5hcmdzPy5pbmNsdWRlcygnLS1oZWFkbGVzcycpKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgbm90IHJ1biBvbiBsZWdhY3kgaGVhZGxlc3MgbW9kZS4gU3dpdGNoIHRvIG5ldyBoZWFkbGVzcyBtb2RlIG9yIGF2b2lkIHVzaW5nIGhlYWRsZXNzIG1vZGUuJylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFeGNlcHRpb24gaW4gY2hlY2tpbmcgY2FwYWJpbGl0aWVzIGNvbXBhdGliaWxpdHkgd2l0aCBBY2Nlc3NpYmlsaXR5LiBFcnJvcjogJHtlcnJvcn1gKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQ2Fwc1dpdGhOb25Cc3RhY2tBMTF5ID0gKGJyb3dzZXJOYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBicm93c2VyVmVyc2lvbj86c3RyaW5nIHwgdW5kZWZpbmVkICkgID0+IHtcblxuICAgIGlmIChicm93c2VyTmFtZT8udG9Mb3dlckNhc2UoKSAhPT0gJ2Nocm9tZScpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB3aWxsIHJ1biBvbmx5IG9uIENocm9tZSBicm93c2Vycy4nKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKCFpc1VuZGVmaW5lZChicm93c2VyVmVyc2lvbikgJiYgIShicm93c2VyVmVyc2lvbiA9PT0gJ2xhdGVzdCcgfHwgcGFyc2VGbG9hdChicm93c2VyVmVyc2lvbiArICcnKSA+IDEwMCkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0FjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB3aWxsIHJ1biBvbmx5IG9uIENocm9tZSBicm93c2VyIHZlcnNpb24gZ3JlYXRlciB0aGFuIDEwMC4nKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcblxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkU2NhblRlc3RGb3JBY2Nlc3NpYmlsaXR5ID0gKHN1aXRlVGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVzdFRpdGxlOiBzdHJpbmcsIGFjY2Vzc2liaWxpdHlPcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0sIHdvcmxkPzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duOyB9LCBpc0N1Y3VtYmVyPzogYm9vbGVhbiApID0+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBpbmNsdWRlVGFncyA9IEFycmF5LmlzQXJyYXkoYWNjZXNzaWJpbGl0eU9wdGlvbnM/LmluY2x1ZGVUYWdzSW5UZXN0aW5nU2NvcGUpID8gYWNjZXNzaWJpbGl0eU9wdGlvbnM/LmluY2x1ZGVUYWdzSW5UZXN0aW5nU2NvcGUgOiBbXVxuICAgICAgICBjb25zdCBleGNsdWRlVGFncyA9IEFycmF5LmlzQXJyYXkoYWNjZXNzaWJpbGl0eU9wdGlvbnM/LmV4Y2x1ZGVUYWdzSW5UZXN0aW5nU2NvcGUpID8gYWNjZXNzaWJpbGl0eU9wdGlvbnM/LmV4Y2x1ZGVUYWdzSW5UZXN0aW5nU2NvcGUgOiBbXVxuXG4gICAgICAgIGlmIChpc0N1Y3VtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdzTGlzdDogc3RyaW5nW10gPSBbXVxuICAgICAgICAgICAgOyh3b3JsZD8ucGlja2xlIGFzIHsgdGFnczogeyBuYW1lOiBzdHJpbmcgfVtdIH0pPy50YWdzLm1hcCgodGFnOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSkgPT4gdGFnc0xpc3QucHVzaCh0YWcubmFtZSkpXG4gICAgICAgICAgICBjb25zdCBleGNsdWRlZCA9IGV4Y2x1ZGVUYWdzPy5zb21lKChleGNsdWRlKSA9PiB0YWdzTGlzdC5pbmNsdWRlcyhleGNsdWRlKSlcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVkID0gaW5jbHVkZVRhZ3M/Lmxlbmd0aCA9PT0gMCB8fCBpbmNsdWRlVGFncz8uc29tZSgoaW5jbHVkZSkgPT4gdGFnc0xpc3QuaW5jbHVkZXMoaW5jbHVkZSkpXG5cbiAgICAgICAgICAgIHJldHVybiAhZXhjbHVkZWQgJiYgaW5jbHVkZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZ1bGxUZXN0TmFtZSA9IHN1aXRlVGl0bGUgKyAnICcgKyB0ZXN0VGl0bGVcbiAgICAgICAgY29uc3QgZXhjbHVkZWQgPSBleGNsdWRlVGFncz8uc29tZSgoZXhjbHVkZSkgPT4gZnVsbFRlc3ROYW1lLmluY2x1ZGVzKGV4Y2x1ZGUpKVxuICAgICAgICBjb25zdCBpbmNsdWRlZCA9IGluY2x1ZGVUYWdzPy5sZW5ndGggPT09IDAgfHwgaW5jbHVkZVRhZ3M/LnNvbWUoKGluY2x1ZGUpID0+IGZ1bGxUZXN0TmFtZS5pbmNsdWRlcyhpbmNsdWRlKSlcblxuICAgICAgICByZXR1cm4gIWV4Y2x1ZGVkICYmIGluY2x1ZGVkXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciB3aGlsZSB2YWxpZGF0aW5nIHRlc3QgY2FzZSBmb3IgYWNjZXNzaWJpbGl0eSBiZWZvcmUgc2Nhbm5pbmcuIEVycm9yIDogJHtlcnJvcn1gKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IGlzQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uID0gKGFjY2Vzc2liaWxpdHlGbGFnPzogYm9vbGVhbiB8IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBoYXNBMTF5Snd0VG9rZW4gPSB0eXBlb2YgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldUID09PSAnc3RyaW5nJyAmJiBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1QubGVuZ3RoID4gMCAmJiBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1QgIT09ICdudWxsJyAmJiBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1QgIT09ICd1bmRlZmluZWQnXG4gICAgICAgIHJldHVybiBhY2Nlc3NpYmlsaXR5RmxhZyAmJiBoYXNBMTF5Snd0VG9rZW5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEV4Y2VwdGlvbiBpbiB2ZXJpZnlpbmcgdGhlIEFjY2Vzc2liaWxpdHkgc2Vzc2lvbiB3aXRoIGVycm9yIDogJHtlcnJvcn1gKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IGlzQXBwQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uID0gKGFjY2Vzc2liaWxpdHlGbGFnPzogYm9vbGVhbiB8IHN0cmluZywgaXNBcHBBdXRvbWF0ZT86IGJvb2xlYW4pID0+IHtcbiAgICBjb25zdCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbiA9IGlzQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGFjY2Vzc2liaWxpdHlGbGFnKVxuICAgIHJldHVybiBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbiAmJiBpc0FwcEF1dG9tYXRlXG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRTdHJpbmcgPSAodGVtcGxhdGU6IChzdHJpbmcgfCBudWxsKSwgLi4udmFsdWVzOiAoc3RyaW5nIHwgbnVsbClbXSk6IHN0cmluZyA9PiB7XG4gICAgbGV0IGkgPSAwXG4gICAgaWYgKHRlbXBsYXRlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvJXMvZywgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tpKytdXG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiAnJ1xuICAgIH0pXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgX2dldFBhcmFtc0ZvckFwcEFjY2Vzc2liaWxpdHkgPSAoIGNvbW1hbmROYW1lPzogc3RyaW5nLCB0ZXN0TmFtZT86IHN0cmluZywgaG9va1J1blV1aWQ/OiBzdHJpbmcgfCBudWxsICk6IHsgdGhUZXN0UnVuVXVpZDogYW55LCB0aEhvb2tSdW5VdWlkOiBhbnksIHRoQnVpbGRVdWlkOiBhbnksIHRoSnd0VG9rZW46IGFueSwgYXV0aEhlYWRlcjogYW55LCBzY2FuVGltZXN0YW1wOiBudW1iZXIsIG1ldGhvZDogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZXN0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkICB9ID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICAndGhUZXN0UnVuVXVpZCc6IHByb2Nlc3MuZW52LlRFU1RfQU5BTFlUSUNTX0lELFxuICAgICAgICAvLyBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc2NhbiBmaXJlcyBpbnNpZGUgYSBob29rIChkcm9wcGVkIGJ5IEpTT04uc3RyaW5naWZ5IHdoZW4gdW5kZWZpbmVkLFxuICAgICAgICAvLyBzbyBpbi10ZXN0IHNjYW5zIGFyZSB1bmNoYW5nZWQpLiBTZWxlbml1bUh1YiBhcHBBbGx5SGFuZGxlciByZWxheXMgdGhpcyBhcyBgaG9va19ydW5fdXVpZGAuXG4gICAgICAgICd0aEhvb2tSdW5VdWlkJzogaG9va1J1blV1aWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAndGhCdWlsZFV1aWQnOiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELFxuICAgICAgICAndGhKd3RUb2tlbic6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUSFVCX0pXVCxcbiAgICAgICAgJ2F1dGhIZWFkZXInOiBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1QsXG4gICAgICAgICdzY2FuVGltZXN0YW1wJzogRGF0ZS5ub3coKSxcbiAgICAgICAgJ21ldGhvZCc6IGNvbW1hbmROYW1lLFxuICAgICAgICAndGVzdE5hbWUnOiB0ZXN0TmFtZVxuICAgIH1cbn1cblxuLyogZXNsaW50LWRpc2FibGUgIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmV4cG9ydCBjb25zdCBwZXJmb3JtQTExeVNjYW4gPSBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciB8IFdlYmRyaXZlcklPLk11bHRpUmVtb3RlQnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZywgIGNvbW1hbmROYW1lPzogc3RyaW5nLCB0ZXN0TmFtZT86IHN0cmluZywgaG9va1J1blV1aWQ/OiBzdHJpbmcgfCBudWxsLCkgOiBQcm9taXNlPHsgW2tleTogc3RyaW5nXTogYW55OyB9IHwgdW5kZWZpbmVkPiA9PiB7XG5cbiAgICBpZiAoIWlzQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGlzQWNjZXNzaWJpbGl0eSkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ05vdCBhbiBBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gc2Vzc2lvbiwgY2Fubm90IHBlcmZvcm0gQWNjZXNzaWJpbGl0eSBzY2FuLicpXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGlmIChpc0FwcEFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHksIGlzQXBwQXV0b21hdGUpKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzOiB1bmtub3duID0gYXdhaXQgKGJyb3dzZXIgYXMgV2ViZHJpdmVySU8uQnJvd3NlcikuZXhlY3V0ZShmb3JtYXRTdHJpbmcoQWNjZXNzaWJpbGl0eVNjcmlwdHMucGVyZm9ybVNjYW4sIEpTT04uc3RyaW5naWZ5KF9nZXRQYXJhbXNGb3JBcHBBY2Nlc3NpYmlsaXR5KGNvbW1hbmROYW1lLCB0ZXN0TmFtZSwgaG9va1J1blV1aWQpKSkgYXMgc3RyaW5nLCB7fSlcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zyh1dGlsLmZvcm1hdChyZXN1bHRzIGFzIHN0cmluZykpXG4gICAgICAgICAgICByZXR1cm4gKCByZXN1bHRzIGFzIHsgW2tleTogc3RyaW5nXTogYW55OyB9IHwgdW5kZWZpbmVkIClcbiAgICAgICAgfVxuICAgICAgICBpZiAoQWNjZXNzaWJpbGl0eVNjcmlwdHMucGVyZm9ybVNjYW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBleGVjdXRlQWNjZXNzaWJpbGl0eVNjcmlwdChicm93c2VyLCBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5wZXJmb3JtU2NhbiwgeyBtZXRob2Q6IGNvbW1hbmROYW1lIHx8ICcnIH0pXG4gICAgICAgICAgICByZXR1cm4gKCByZXN1bHRzIGFzIHsgW2tleTogc3RyaW5nXTogdW5rbm93bjsgfSB8IHVuZGVmaW5lZCApXG4gICAgICAgIH1cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdBY2Nlc3NpYmlsaXR5U2NyaXB0cy5wZXJmb3JtU2NhbiBpcyBudWxsJylcbiAgICAgICAgcmV0dXJuXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignQWNjZXNzaWJpbGl0eSBTY2FuIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgOiAnICsgZXJyKVxuICAgICAgICByZXR1cm5cbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRBMTF5UmVzdWx0cyA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuQTExWV9FVkVOVFMuR0VUX1JFU1VMVFMsIGFzeW5jIChpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nKSA6IFByb21pc2U8QXJyYXk8eyBba2V5OiBzdHJpbmddOiBhbnk7IH0+PiA9PiB7XG5cbiAgICBpZiAoIWlzQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGlzQWNjZXNzaWJpbGl0eSkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ05vdCBhbiBBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gc2Vzc2lvbiwgY2Fubm90IHJldHJpZXZlIEFjY2Vzc2liaWxpdHkgcmVzdWx0cy4nKVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1BlcmZvcm1pbmcgc2NhbiBiZWZvcmUgZ2V0dGluZyByZXN1bHRzJylcbiAgICAgICAgYXdhaXQgcGVyZm9ybUExMXlTY2FuKGlzQXBwQXV0b21hdGUsIGJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5KVxuICAgICAgICBpZiAoQWNjZXNzaWJpbGl0eVNjcmlwdHMuZ2V0UmVzdWx0cykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0czogQXJyYXk8eyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0+ID0gYXdhaXQgZXhlY3V0ZUFjY2Vzc2liaWxpdHlTY3JpcHQoYnJvd3NlciwgQWNjZXNzaWJpbGl0eVNjcmlwdHMuZ2V0UmVzdWx0cylcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgICAgIH1cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzIGlzIG51bGwnKVxuICAgICAgICByZXR1cm4gW11cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignTm8gYWNjZXNzaWJpbGl0eSByZXN1bHRzIHdlcmUgZm91bmQuJylcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBnZXRBMTF5UmVzdWx0cyBGYWlsZWQuIEVycm9yOiAke2Vycm9yfWApXG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBnZXRBcHBBMTF5UmVzdWx0cyA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuQTExWV9FVkVOVFMuR0VUX1JFU1VMVFMsIGFzeW5jIChpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyLCAgdGVzdE5hbWU6IHN0cmluZywgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZywgc2Vzc2lvbklkPzogc3RyaW5nIHwgbnVsbCkgOiBQcm9taXNlPEFycmF5PHsgW2tleTogc3RyaW5nXTogYW55OyB9Pj4gPT4ge1xuICAgIGlmICghaXNCcm93c2VyU3RhY2tTZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBbXSAvLyBzaW5jZSB3ZSBhcmUgcnVubmluZyBvbmx5IG9uIEF1dG9tYXRlIGFzIG9mIG5vd1xuICAgIH1cblxuICAgIGlmICghaXNBcHBBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5LCBpc0FwcEF1dG9tYXRlKSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcmV0cmlldmUgQWNjZXNzaWJpbGl0eSByZXN1bHRzIHN1bW1hcnkuJylcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7QVBJVXRpbHMuQVBQX0FMTFlfRU5EUE9JTlR9LyR7QVBQX0FMTFlfSVNTVUVTX0VORFBPSU5UfWBcbiAgICAgICAgY29uc3QgYXBpUmVzcG9uZSA9IGF3YWl0IGdldEFwcEExMXlSZXN1bHRSZXNwb25zZShhcGlVcmwsIGlzQXBwQXV0b21hdGUsIGJyb3dzZXIsIHRlc3ROYW1lLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24sIGlzQWNjZXNzaWJpbGl0eSwgc2Vzc2lvbklkKVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhcGlSZXNwb25lPy5kYXRhPy5kYXRhPy5pc3N1ZXNcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBQb2xsaW5nIFJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSAge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ05vIGFjY2Vzc2liaWxpdHkgc3VtbWFyeSB3YXMgZm91bmQuJylcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBnZXRBcHBBMTF5UmVzdWx0cyBGYWlsZWQuIEVycm9yOiAke2Vycm9yfWApXG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBnZXRBcHBBMTF5UmVzdWx0c1N1bW1hcnkgPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLkExMVlfRVZFTlRTLkdFVF9SRVNVTFRTX1NVTU1BUlksIGFzeW5jIChpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyLCB0ZXN0TmFtZTogc3RyaW5nLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nLCBzZXNzaW9uSWQ/OiBzdHJpbmcgfCBudWxsKSA6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBhbnk7IH0+ID0+IHtcbiAgICBpZiAoIWlzQnJvd3NlclN0YWNrU2Vzc2lvbikge1xuICAgICAgICByZXR1cm4ge30gLy8gc2luY2Ugd2UgYXJlIHJ1bm5pbmcgb25seSBvbiBBdXRvbWF0ZSBhcyBvZiBub3dcbiAgICB9XG5cbiAgICBpZiAoIWlzQXBwQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGlzQWNjZXNzaWJpbGl0eSwgaXNBcHBBdXRvbWF0ZSkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ05vdCBhbiBBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gc2Vzc2lvbiwgY2Fubm90IHJldHJpZXZlIEFjY2Vzc2liaWxpdHkgcmVzdWx0cyBzdW1tYXJ5LicpXG4gICAgICAgIHJldHVybiB7fVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke0FQSVV0aWxzLkFQUF9BTExZX0VORFBPSU5UfS8ke0FQUF9BTExZX0lTU1VFU19TVU1NQVJZX0VORFBPSU5UfWBcbiAgICAgICAgY29uc3QgYXBpUmVzcG9uZSA9IGF3YWl0IGdldEFwcEExMXlSZXN1bHRSZXNwb25zZShhcGlVcmwsIGlzQXBwQXV0b21hdGUsIGJyb3dzZXIsIHRlc3ROYW1lLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24sIGlzQWNjZXNzaWJpbGl0eSwgc2Vzc2lvbklkKVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhcGlSZXNwb25lPy5kYXRhPy5kYXRhPy5zdW1tYXJ5XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgUG9sbGluZyBSZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignTm8gYWNjZXNzaWJpbGl0eSBzdW1tYXJ5IHdhcyBmb3VuZC4nKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9XG59KVxuXG5jb25zdCBnZXRBcHBBMTF5UmVzdWx0UmVzcG9uc2UgPSBhc3luYyAoYXBpVXJsOiBzdHJpbmcsIGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsIHRlc3ROYW1lOiBzdHJpbmcsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcsIHNlc3Npb25JZD86IHN0cmluZyB8IG51bGwpIDogUHJvbWlzZTxQb2xsaW5nUmVzdWx0PiA9PiB7XG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdQZXJmb3JtaW5nIHNjYW4gYmVmb3JlIGdldHRpbmcgcmVzdWx0cyBzdW1tYXJ5JylcbiAgICBhd2FpdCBwZXJmb3JtQTExeVNjYW4oaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHksIHVuZGVmaW5lZCwgdGVzdE5hbWUpXG4gICAgY29uc3QgdXBwZXJUaW1lTGltaXQgPSBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9QT0xMSU5HX1RJTUVPVVQgPyBEYXRlLm5vdygpICsgcGFyc2VJbnQocHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUKSAqIDEwMDAgOiBEYXRlLm5vdygpICsgMzAwMDBcbiAgICBjb25zdCBwYXJhbXMgPSB7IHRlc3RfcnVuX3V1aWQ6IHByb2Nlc3MuZW52LlRFU1RfQU5BTFlUSUNTX0lELCBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9IC8vIFF1ZXJ5IHBhcmFtcyB0byBwYXNzXG4gICAgY29uc3QgaGVhZGVyID0geyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7cHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldUfWAgfVxuICAgIGNvbnN0IGFwaVJlc3BvbmUgPSBhd2FpdCBwb2xsQXBpKGFwaVVybCwgcGFyYW1zLCBoZWFkZXIsIHVwcGVyVGltZUxpbWl0KVxuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgUG9sbGluZyBSZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkoYXBpUmVzcG9uZSl9YClcbiAgICByZXR1cm4gYXBpUmVzcG9uZVxufVxuXG5leHBvcnQgY29uc3QgZ2V0QTExeVJlc3VsdHNTdW1tYXJ5ID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5BMTFZX0VWRU5UUy5HRVRfUkVTVUxUU19TVU1NQVJZLCBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZykgOiBQcm9taXNlPHsgW2tleTogc3RyaW5nXTogYW55OyB9PiA9PiB7XG5cbiAgICBpZiAoIWlzQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGlzQWNjZXNzaWJpbGl0eSkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ05vdCBhbiBBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gc2Vzc2lvbiwgY2Fubm90IHJldHJpZXZlIEFjY2Vzc2liaWxpdHkgcmVzdWx0cyBzdW1tYXJ5LicpXG4gICAgICAgIHJldHVybiB7fVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnUGVyZm9ybWluZyBzY2FuIGJlZm9yZSBnZXR0aW5nIHJlc3VsdHMgc3VtbWFyeScpXG4gICAgICAgIGF3YWl0IHBlcmZvcm1BMTF5U2Nhbihpc0FwcEF1dG9tYXRlLCBicm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24sIGlzQWNjZXNzaWJpbGl0eSlcbiAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHNTdW1tYXJ5KSB7XG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5UmVzdWx0czogeyBba2V5OiBzdHJpbmddOiB1bmtub3duOyB9ID0gYXdhaXQgZXhlY3V0ZUFjY2Vzc2liaWxpdHlTY3JpcHQoYnJvd3NlciwgQWNjZXNzaWJpbGl0eVNjcmlwdHMuZ2V0UmVzdWx0c1N1bW1hcnkpXG4gICAgICAgICAgICByZXR1cm4gc3VtbWFyeVJlc3VsdHNcbiAgICAgICAgfVxuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0FjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHNTdW1tYXJ5IGlzIG51bGwnKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9IGNhdGNoIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdObyBhY2Nlc3NpYmlsaXR5IHN1bW1hcnkgd2FzIGZvdW5kLicpXG4gICAgICAgIHJldHVybiB7fVxuICAgIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBzdG9wQnVpbGRVcHN0cmVhbSA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuVEVTVEhVQl9FVkVOVFMuU1RPUCwgbzExeUVycm9ySGFuZGxlcihhc3luYyBmdW5jdGlvbiBzdG9wQnVpbGRVcHN0cmVhbSgpIHtcbiAgICBjb25zdCBzdG9wQnVpbGRVc2FnZSA9IFVzYWdlU3RhdHMuZ2V0SW5zdGFuY2UoKS5zdG9wQnVpbGRVc2FnZVxuICAgIHN0b3BCdWlsZFVzYWdlLnRyaWdnZXJlZCgpXG4gICAgaWYgKCFwcm9jZXNzLmVudltURVNUT1BTX0JVSUxEX0NPTVBMRVRFRF9FTlZdKSB7XG4gICAgICAgIHN0b3BCdWlsZFVzYWdlLmZhaWxlZCgnQnVpbGQgaXMgbm90IGNvbXBsZXRlZCB5ZXQnKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0J1aWxkIGlzIG5vdCBjb21wbGV0ZWQgeWV0J1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1RdKSB7XG4gICAgICAgIHN0b3BCdWlsZFVzYWdlLmZhaWxlZCgnVG9rZW4vYnVpbGRJRCBpcyB1bmRlZmluZWQsIGJ1aWxkIGNyZWF0aW9uIG1pZ2h0IGhhdmUgZmFpbGVkJylcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdbU1RPUF9CVUlMRF0gTWlzc2luZyBBdXRoZW50aWNhdGlvbiBUb2tlbi8gQnVpbGQgSUQnKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1Rva2VuL2J1aWxkSUQgaXMgdW5kZWZpbmVkLCBidWlsZCBjcmVhdGlvbiBtaWdodCBoYXZlIGZhaWxlZCdcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAnc3RvcF90aW1lJzogKG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKClcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElVdGlscy5EQVRBX0VORFBPSU5UfS9hcGkvdjEvYnVpbGRzLyR7cHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF19L3N0b3BgXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1RdfWBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKVxuICAgICAgICB9KVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtTVE9QX0JVSUxEXSBTdWNjZXNzIHJlc3BvbnNlOiAke2F3YWl0IHJlc3BvbnNlLnRleHQoKX1gKVxuICAgICAgICBzdG9wQnVpbGRVc2FnZS5zdWNjZXNzKClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgbWVzc2FnZTogJydcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHN0b3BCdWlsZFVzYWdlLmZhaWxlZChlcnJvcilcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbU1RPUF9CVUlMRF0gRmFpbGVkLiBFcnJvcjogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlXG4gICAgICAgIH1cbiAgICB9XG59KSlcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENpSW5mbyAoKSB7XG4gICAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnZcbiAgICAvLyBKZW5raW5zXG4gICAgaWYgKCh0eXBlb2YgZW52LkpFTktJTlNfVVJMID09PSAnc3RyaW5nJyAmJiBlbnYuSkVOS0lOU19VUkwubGVuZ3RoID4gMCkgfHwgKHR5cGVvZiBlbnYuSkVOS0lOU19IT01FID09PSAnc3RyaW5nJyAmJiBlbnYuSkVOS0lOU19IT01FLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnSmVua2lucycsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkpPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2lyY2xlQ0lcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgaXNUcnVlKGVudi5DSVJDTEVDSSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdDaXJjbGVDSScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5DSVJDTEVfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5DSVJDTEVfSk9CLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ0lSQ0xFX0JVSUxEX05VTVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyYXZpcyBDSVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LlRSQVZJUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdUcmF2aXMgQ0knLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuVFJBVklTX0JVSUxEX1dFQl9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlRSQVZJU19KT0JfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LlRSQVZJU19CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb2Rlc2hpcFxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBlbnYuQ0lfTkFNRSA9PT0gJ2NvZGVzaGlwJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0NvZGVzaGlwJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBudWxsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQml0YnVja2V0XG4gICAgaWYgKGVudi5CSVRCVUNLRVRfQlJBTkNIICYmIGVudi5CSVRCVUNLRVRfQ09NTUlUKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQml0YnVja2V0JyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkJJVEJVQ0tFVF9HSVRfSFRUUF9PUklHSU4sXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJJVEJVQ0tFVF9CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBEcm9uZVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LkRST05FKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0Ryb25lJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkRST05FX0JVSUxEX0xJTkssXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkRST05FX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNlbWFwaG9yZVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LlNFTUFQSE9SRSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdTZW1hcGhvcmUnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuU0VNQVBIT1JFX09SR0FOSVpBVElPTl9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNFTUFQSE9SRV9KT0JfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LlNFTUFQSE9SRV9KT0JfSURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBHaXRMYWJcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgaXNUcnVlKGVudi5HSVRMQUJfQ0kpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnR2l0TGFiJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkNJX0pPQl9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkNJX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ0lfSk9CX0lEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQnVpbGRraXRlXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuQlVJTERLSVRFKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0J1aWxka2l0ZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5CVUlMREtJVEVfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5CVUlMREtJVEVfTEFCRUwgfHwgZW52LkJVSUxES0lURV9QSVBFTElORV9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERLSVRFX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFZpc3VhbCBTdHVkaW8gVGVhbSBTZXJ2aWNlc1xuICAgIGlmIChpc1RydWUoZW52LlRGX0JVSUxEKSAmJiBlbnYuVEZfQlVJTERfQlVJTEROVU1CRVIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdWaXN1YWwgU3R1ZGlvIFRlYW0gU2VydmljZXMnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBgJHtlbnYuU1lTVEVNX1RFQU1GT1VOREFUSU9OU0VSVkVSVVJJfSR7ZW52LlNZU1RFTV9URUFNUFJPSkVDVElEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNZU1RFTV9ERUZJTklUSU9OSUQsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9CVUlMRElEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXBwdmV5b3JcbiAgICBpZiAoaXNUcnVlKGVudi5BUFBWRVlPUikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdBcHB2ZXlvcicsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5BUFBWRVlPUl9VUkx9L3Byb2plY3QvJHtlbnYuQVBQVkVZT1JfQUNDT1VOVF9OQU1FfS8ke2Vudi5BUFBWRVlPUl9QUk9KRUNUX1NMVUd9L2J1aWxkcy8ke2Vudi5BUFBWRVlPUl9CVUlMRF9JRH1gLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5BUFBWRVlPUl9KT0JfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkFQUFZFWU9SX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEF6dXJlIENJXG4gICAgaWYgKGVudi5BWlVSRV9IVFRQX1VTRVJfQUdFTlQgJiYgZW52LlRGX0JVSUxEKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQXp1cmUgQ0knLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBgJHtlbnYuU1lTVEVNX1RFQU1GT1VOREFUSU9OU0VSVkVSVVJJfSR7ZW52LlNZU1RFTV9URUFNUFJPSkVDVElEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkJVSUxEX0JVSUxESUQsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9CVUlMRElEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQVdTIENvZGVCdWlsZFxuICAgIGlmIChlbnYuQ09ERUJVSUxEX0JVSUxEX0lEIHx8IGVudi5DT0RFQlVJTERfUkVTT0xWRURfU09VUkNFX1ZFUlNJT04gfHwgZW52LkNPREVCVUlMRF9TT1VSQ0VfVkVSU0lPTikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0FXUyBDb2RlQnVpbGQnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQ09ERUJVSUxEX1BVQkxJQ19CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkNPREVCVUlMRF9CVUlMRF9JRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkNPREVCVUlMRF9CVUlMRF9JRFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJhbWJvb1xuICAgIGlmIChlbnYuYmFtYm9vX2J1aWxkTnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQmFtYm9vJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LmJhbWJvb19idWlsZFJlc3VsdHNVcmwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LmJhbWJvb19zaG9ydEpvYk5hbWUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5iYW1ib29fYnVpbGROdW1iZXJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBXZXJja2VyXG4gICAgaWYgKGVudi5XRVJDS0VSIHx8IGVudi5XRVJDS0VSX01BSU5fUElQRUxJTkVfU1RBUlRFRCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1dlcmNrZXInLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuV0VSQ0tFUl9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LldFUkNLRVJfTUFJTl9QSVBFTElORV9TVEFSVEVEID8gJ01haW4gUGlwZWxpbmUnIDogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LldFUkNLRVJfR0lUX0NPTU1JVFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdvb2dsZSBDbG91ZFxuICAgIGlmIChlbnYuR0NQX1BST0pFQ1QgfHwgZW52LkdDTE9VRF9QUk9KRUNUIHx8IGVudi5HT09HTEVfQ0xPVURfUFJPSkVDVCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0dvb2dsZSBDbG91ZCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IG51bGwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlBST0pFQ1RfSUQsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9JRCxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTaGlwcGFibGVcbiAgICBpZiAoZW52LlNISVBQQUJMRSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1NoaXBwYWJsZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5TSElQUEFCTEVfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5TSElQUEFCTEVfSk9CX0lEID8gYEpvYiAjJHtlbnYuU0hJUFBBQkxFX0pPQl9JRH1gIDogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LlNISVBQQUJMRV9CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBOZXRsaWZ5XG4gICAgaWYgKGlzVHJ1ZShlbnYuTkVUTElGWSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdOZXRsaWZ5JyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkRFUExPWV9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNJVEVfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0lEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR2l0aHViIEFjdGlvbnNcbiAgICBpZiAoaXNUcnVlKGVudi5HSVRIVUJfQUNUSU9OUykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdHaXRIdWIgQWN0aW9ucycsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5HSVRIVUJfU0VSVkVSX1VSTH0vJHtlbnYuR0lUSFVCX1JFUE9TSVRPUll9L2FjdGlvbnMvcnVucy8ke2Vudi5HSVRIVUJfUlVOX0lEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkdJVEhVQl9XT1JLRkxPVyxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkdJVEhVQl9SVU5fSUQsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVmVyY2VsXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGVudi5WRVJDRUwgPT09ICcxJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1ZlcmNlbCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IGBodHRwOi8vJHtlbnYuVkVSQ0VMX1VSTH1gLFxuICAgICAgICAgICAgam9iX25hbWU6IG51bGwsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IG51bGwsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVGVhbWNpdHlcbiAgICBpZiAoZW52LlRFQU1DSVRZX1ZFUlNJT04pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdUZWFtY2l0eScsXG4gICAgICAgICAgICBidWlsZF91cmw6IG51bGwsXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX05VTUJFUixcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb25jb3Vyc2VcbiAgICBpZiAoZW52LkNPTkNPVVJTRSB8fCBlbnYuQ09OQ09VUlNFX1VSTCB8fCBlbnYuQ09OQ09VUlNFX1VTRVJOQU1FIHx8IGVudi5DT05DT1VSU0VfVEVBTSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0NvbmNvdXJzZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IG51bGwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkJVSUxEX0pPQl9OQU1FIHx8IG51bGwsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9JRCB8fCBudWxsLFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdvQ0RcbiAgICBpZiAoZW52LkdPX0pPQl9OQU1FKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnR29DRCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IG51bGwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkdPX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuR09fUElQRUxJTkVfQ09VTlRFUixcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb2RlRnJlc2hcbiAgICBpZiAoZW52LkNGX0JVSUxEX0lEKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQ29kZUZyZXNoJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkNGX0JVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQ0ZfUElQRUxJTkVfTkFNRSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkNGX0JVSUxEX0lELFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGlmIG5vIG1hdGNoZXMsIHJldHVybiBudWxsXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEdpdE1ldGFEYXRhICgpIHtcbiAgICBjb25zdCBpbmZvOiBHaXRSZXBvSW5mbyA9IGdpdFJlcG9JbmZvKClcbiAgICBpZiAoIWluZm8uY29tbW9uR2l0RGlyKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCB7IHJlbW90ZSB9ID0gYXdhaXQgcEdpdGNvbmZpZyhpbmZvLmNvbW1vbkdpdERpcilcbiAgICBjb25zdCByZW1vdGVzID0gcmVtb3RlID8gT2JqZWN0LmtleXMocmVtb3RlKS5tYXAocmVtb3RlTmFtZSA9PiAgKHsgbmFtZTogcmVtb3RlTmFtZSwgdXJsOiByZW1vdGVbcmVtb3RlTmFtZV0udXJsIH0pKSA6IFtdXG5cbiAgICBsZXQgZ2l0TWV0YURhdGEgOiBHaXRNZXRhRGF0YSA9IHtcbiAgICAgICAgbmFtZTogJ2dpdCcsXG4gICAgICAgIHNoYTogaW5mby5zaGEsXG4gICAgICAgIHNob3J0X3NoYTogaW5mby5hYmJyZXZpYXRlZFNoYSxcbiAgICAgICAgYnJhbmNoOiBpbmZvLmJyYW5jaCxcbiAgICAgICAgdGFnOiBpbmZvLnRhZyxcbiAgICAgICAgY29tbWl0dGVyOiBpbmZvLmNvbW1pdHRlcixcbiAgICAgICAgY29tbWl0dGVyX2RhdGU6IGluZm8uY29tbWl0dGVyRGF0ZSxcbiAgICAgICAgYXV0aG9yOiBpbmZvLmF1dGhvcixcbiAgICAgICAgYXV0aG9yX2RhdGU6IGluZm8uYXV0aG9yRGF0ZSxcbiAgICAgICAgY29tbWl0X21lc3NhZ2U6IGluZm8uY29tbWl0TWVzc2FnZSxcbiAgICAgICAgcm9vdDogaW5mby5yb290LFxuICAgICAgICBjb21tb25fZ2l0X2RpcjogaW5mby5jb21tb25HaXREaXIsXG4gICAgICAgIHdvcmt0cmVlX2dpdF9kaXI6IGluZm8ud29ya3RyZWVHaXREaXIsXG4gICAgICAgIGxhc3RfdGFnOiBpbmZvLmxhc3RUYWcsXG4gICAgICAgIGNvbW1pdHNfc2luY2VfbGFzdF90YWc6IGluZm8uY29tbWl0c1NpbmNlTGFzdFRhZyxcbiAgICAgICAgcmVtb3RlczogcmVtb3Rlc1xuICAgIH1cblxuICAgIGdpdE1ldGFEYXRhID0gY2hlY2tBbmRUcnVuY2F0ZVZDU0luZm8oZ2l0TWV0YURhdGEpXG5cbiAgICByZXR1cm4gZ2l0TWV0YURhdGFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZUlkZW50aWZpZXIodGVzdDogRnJhbWV3b3Jrcy5UZXN0LCBmcmFtZXdvcms/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChmcmFtZXdvcmsgPT09ICdqYXNtaW5lJykge1xuICAgICAgICByZXR1cm4gdGVzdC5mdWxsTmFtZVxuICAgIH1cblxuICAgIGxldCBwYXJlbnRUaXRsZSA9IHRlc3QucGFyZW50XG4gICAgLy8gU29tZXRpbWVzIHBhcmVudCB3aWxsIGJlIGFuIG9iamVjdCBpbnN0ZWFkIG9mIGEgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBwYXJlbnRUaXRsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcGFyZW50VGl0bGUgPSAocGFyZW50VGl0bGUgYXMgeyB0aXRsZTogc3RyaW5nIH0pLnRpdGxlXG4gICAgfVxuICAgIHJldHVybiBgJHtwYXJlbnRUaXRsZX0gLSAke3Rlc3QudGl0bGV9YFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcXVlSWRlbnRpZmllckZvckN1Y3VtYmVyKHdvcmxkOiBJVGVzdENhc2VIb29rUGFyYW1ldGVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gd29ybGQucGlja2xlLnVyaSArICdfJyArIHdvcmxkLnBpY2tsZS5hc3ROb2RlSWRzLmpvaW4oJywnKVxufVxuXG4vLyBMb2FkIFRlc3RpbmcgU2VydmljZSAoTFRTKSBnYXRpbmcgaGVscGVycyBcdTIwMTQgbWlycm9yIG9mIGJzdGFja191dGlscy9oZWxwZXIucHlcbi8vIGlzX2xvYWRfdGVzdGluZ19zZXNzaW9uKCkgLyBnZXRfbHRzX3Nlc3Npb25faWQoKSBpbiBicm93c2Vyc3RhY2stcHl0aG9uLXNka1xuLy8gKGJyYW5jaCBMVFMtdHJhLXB5dGhvbi1zdXBwb3J0KS4gTFRTIHBvZC1pdGVyYXRpb25zIGV4cG9ydFxuLy8gQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEIGJlZm9yZSBpbnZva2luZyB0aGUgdGVzdCBydW5uZXI7IHByZXNlbmNlIG9mXG4vLyB0aGF0IGVudiB2YXIgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIFwidGhpcyBydW4gaXMgYW4gTFRTIHBvZFxuLy8gaXRlcmF0aW9uXCIuIE9wdGlvbmFsIEJST1dTRVJTVEFDS19MVFM9dHJ1ZXwxIGxldHMgdGhlIHJ1bm5lciBvcHQtaW4gd2l0aG91dFxuLy8gc3VwcGx5aW5nIGEgc2Vzc2lvbiBpZCAodXNlZnVsIGZvciBsb2NhbCByZXBybykuXG5leHBvcnQgZnVuY3Rpb24gaXNMb2FkVGVzdGluZ1Nlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRF0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgY29uc3QgZmxhZyA9IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19MVFNdXG4gICAgcmV0dXJuIGZsYWcgPT09ICd0cnVlJyB8fCBmbGFnID09PSAnMSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEx0c1Nlc3Npb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSURdIHx8ICcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbG91ZFByb3ZpZGVyKGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIgfCBXZWJkcml2ZXJJTy5NdWx0aVJlbW90ZUJyb3dzZXIpOiBzdHJpbmcge1xuICAgIC8vIE5PVEU6IGRvIE5PVCBicmFuY2ggb24gaXNMb2FkVGVzdGluZ1Nlc3Npb24oKSBoZXJlLiBnZXRDbG91ZFByb3ZpZGVyIGlzXG4gICAgLy8gc2hhcmVkIHdpdGggQXV0b21hdGUtc2lkZSBndWFyZHMgKGF1dG9tYXRlTW9kdWxlIG9uQmVmb3JlL29uQWZ0ZXJUZXN0LFxuICAgIC8vIHdlYmRyaXZlcklPTW9kdWxlIEtFWV9JU19CUk9XU0VSU1RBQ0tfSFVCLCBhY2Nlc3NpYmlsaXR5LWhhbmRsZXIsXG4gICAgLy8gc2VydmljZS50cykgXHUyMDE0IGZsaXBwaW5nIGl0IHRvICdicm93c2Vyc3RhY2snIHVuZGVyIExUUyB3b3VsZCBtYWtlXG4gICAgLy8gaXNCcm93c2Vyc3RhY2tTZXNzaW9uKCkgcmV0dXJuIHRydWUgZm9yIGxvY2FsLVNlbGVuaXVtIHBvZCBzZXNzaW9ucyxcbiAgICAvLyBjYXVzaW5nIG1hcmtTZXNzaW9uTmFtZSAvIG1hcmtTZXNzaW9uU3RhdHVzIHRvIFBVVCBhZ2FpbnN0IEF1dG9tYXRlXG4gICAgLy8gUkVTVCBBUElzIHdpdGggc2Vzc2lvbiBpZHMgdGhhdCBkb24ndCBleGlzdCB0aGVyZS4gVGVzdEh1Yi1yZXBvcnRpbmdcbiAgICAvLyBjYWxsZXJzIHRoYXQgbmVlZCAnYnJvd3NlcnN0YWNrJyB1bmRlciBMVFMgZGVyaXZlIGl0IGxvY2FsbHkgd2l0aFxuICAgIC8vIGBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpID8gJ2Jyb3dzZXJzdGFjaycgOiBnZXRDbG91ZFByb3ZpZGVyKGJyb3dzZXIpYFxuICAgIC8vIChzZWUgcmVwb3J0ZXIudHMsIGluc2lnaHRzLWhhbmRsZXIudHMpLlxuICAgIGlmIChicm93c2VyICYmICdpbnN0YW5jZXMnIGluIGJyb3dzZXIpIHtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBpbnN0YW5jZXNcbiAgICAgICAgZm9yIChjb25zdCBpbnN0YW5jZU5hbWUgb2YgYnJvd3Nlci5pbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gKGJyb3dzZXIgYXMgYW55KVtpbnN0YW5jZU5hbWVdIGFzIFdlYmRyaXZlcklPLkJyb3dzZXJcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZS5vcHRpb25zICYmIGluc3RhbmNlLm9wdGlvbnMuaG9zdG5hbWUgJiYgaW5zdGFuY2Uub3B0aW9ucy5ob3N0bmFtZS5pbmNsdWRlcygnYnJvd3NlcnN0YWNrJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Jyb3dzZXJzdGFjaydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYnJvd3Nlci5vcHRpb25zICYmIGJyb3dzZXIub3B0aW9ucy5ob3N0bmFtZSAmJiBicm93c2VyLm9wdGlvbnMuaG9zdG5hbWUuaW5jbHVkZXMoJ2Jyb3dzZXJzdGFjaycpKSB7IC8vIFNpbmdsZSBicm93c2VyIGluc3RhbmNlXG4gICAgICAgIHJldHVybiAnYnJvd3NlcnN0YWNrJ1xuICAgIH1cbiAgICByZXR1cm4gJ3Vua25vd25fZ3JpZCdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcnN0YWNrU2Vzc2lvbihicm93c2VyPzogV2ViZHJpdmVySU8uQnJvd3NlciB8IFdlYmRyaXZlcklPLk11bHRpUmVtb3RlQnJvd3Nlcikge1xuICAgIHJldHVybiBicm93c2VyICYmIGdldENsb3VkUHJvdmlkZXIoYnJvd3NlcikudG9Mb3dlckNhc2UoKSA9PT0gJ2Jyb3dzZXJzdGFjaydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjZW5hcmlvRXhhbXBsZXMod29ybGQ6IElUZXN0Q2FzZUhvb2tQYXJhbWV0ZXIpIHtcbiAgICBjb25zdCBzY2VuYXJpbyA9IHdvcmxkLnBpY2tsZVxuXG4gICAgLy8gbm8gZXhhbXBsZXMgcHJlc2VudFxuICAgIGlmICgoc2NlbmFyaW8uYXN0Tm9kZUlkcyAmJiBzY2VuYXJpby5hc3ROb2RlSWRzLmxlbmd0aCA8PSAxKSB8fCBzY2VuYXJpby5hc3ROb2RlSWRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGlja2xlSWQ6IHN0cmluZyA9IHNjZW5hcmlvLmFzdE5vZGVJZHNbMF1cbiAgICBjb25zdCBleGFtcGxlc0lkOiBzdHJpbmcgPSBzY2VuYXJpby5hc3ROb2RlSWRzWzFdXG4gICAgY29uc3QgZ2hlcmtpbkRvY3VtZW50Q2hpbGRyZW4gPSB3b3JsZC5naGVya2luRG9jdW1lbnQuZmVhdHVyZT8uY2hpbGRyZW5cblxuICAgIGxldCBleGFtcGxlczogc3RyaW5nW10gPSBbXVxuXG4gICAgZ2hlcmtpbkRvY3VtZW50Q2hpbGRyZW4/LmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICBpZiAoY2hpbGQucnVsZSkge1xuICAgICAgICAgICAgLy8gaGFuZGxlIGlmIHJ1bGUgaXMgcHJlc2VudFxuICAgICAgICAgICAgY2hpbGQucnVsZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkTGV2ZWwyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRMZXZlbDIuc2NlbmFyaW8gJiYgY2hpbGRMZXZlbDIuc2NlbmFyaW8uaWQgPT09IHBpY2tsZUlkICYmIGNoaWxkTGV2ZWwyLnNjZW5hcmlvLmV4YW1wbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3NlZEV4YW1wbGVzID0gY2hpbGRMZXZlbDIuc2NlbmFyaW8uZXhhbXBsZXMuZmxhdE1hcCgodmFsKSA9PiAodmFsLnRhYmxlQm9keSkpLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGV4YW1wbGVzSWQpPy5jZWxscy5tYXAoKHZhbCkgPT4gKHZhbC52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWRFeGFtcGxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZXMgPSBwYXNzZWRFeGFtcGxlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5zY2VuYXJpbyAmJiBjaGlsZC5zY2VuYXJpby5pZCA9PT0gcGlja2xlSWQgJiYgY2hpbGQuc2NlbmFyaW8uZXhhbXBsZXMpIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBpZiBzY2VuYXJpbyBvdXRzaWRlIHJ1bGVcbiAgICAgICAgICAgIGNvbnN0IHBhc3NlZEV4YW1wbGVzID0gY2hpbGQuc2NlbmFyaW8uZXhhbXBsZXMuZmxhdE1hcCgodmFsKSA9PiAodmFsLnRhYmxlQm9keSkpLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGV4YW1wbGVzSWQpPy5jZWxscy5tYXAoKHZhbCkgPT4gKHZhbC52YWx1ZSkpXG4gICAgICAgICAgICBpZiAocGFzc2VkRXhhbXBsZXMpIHtcbiAgICAgICAgICAgICAgICBleGFtcGxlcyA9IHBhc3NlZEV4YW1wbGVzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKGV4YW1wbGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZXhhbXBsZXNcbiAgICB9XG4gICAgcmV0dXJuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBbnNpQ29sb3JzKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjk0OTc2ODBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UoL1tcXHUwMDFiXFx1MDA5Yl1bWygpIzs/XSooPzpbMC05XXsxLDR9KD86O1swLTldezAsNH0pKik/WzAtOUEtT1JaY2YtbnFyeT0+PF0vZywgJycpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2dUYWcoZXZlbnRUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChldmVudFR5cGUgPT09ICdUZXN0UnVuU3RhcnRlZCcgfHwgZXZlbnRUeXBlID09PSAnVGVzdFJ1bkZpbmlzaGVkJykge1xuICAgICAgICByZXR1cm4gJ1Rlc3RfVXBsb2FkJ1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnSG9va1J1blN0YXJ0ZWQnIHx8IGV2ZW50VHlwZSA9PT0gJ0hvb2tSdW5GaW5pc2hlZCcpIHtcbiAgICAgICAgcmV0dXJuICdIb29rX1VwbG9hZCdcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ1NjcmVlbnNob3RDcmVhdGVkJykge1xuICAgICAgICByZXR1cm4gJ1NjcmVlbnNob3RfVXBsb2FkJ1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnTG9nQ3JlYXRlZCcpIHtcbiAgICAgICAgcmV0dXJuICdMb2dfVXBsb2FkJ1xuICAgIH1cbiAgICByZXR1cm4gJ3VuZGVmaW5lZCdcbn1cblxuLy8gZ2V0IGhpZXJhcmNoeSBmb3IgYSBwYXJ0aWN1bGFyIHRlc3QgKGNhbGxlZCBieSByZXBvcnRlciBmb3Igc2tpcHBlZCB0ZXN0cylcbmV4cG9ydCBmdW5jdGlvbiBnZXRIaWVyYXJjaHkoZnVsbFRpdGxlPzogc3RyaW5nKSB7XG4gICAgaWYgKCFmdWxsVGl0bGUpIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICAgIHJldHVybiBmdWxsVGl0bGUuc3BsaXQoJy4nKS5zbGljZSgwLCAtMSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhvb2tUeXBlIChob29rTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoaG9va05hbWUuc3RhcnRzV2l0aCgnXCJiZWZvcmUgZWFjaFwiJykpIHtcbiAgICAgICAgcmV0dXJuICdCRUZPUkVfRUFDSCdcbiAgICB9IGVsc2UgaWYgKGhvb2tOYW1lLnN0YXJ0c1dpdGgoJ1wiYmVmb3JlIGFsbFwiJykpIHtcbiAgICAgICAgcmV0dXJuICdCRUZPUkVfQUxMJ1xuICAgIH0gZWxzZSBpZiAoaG9va05hbWUuc3RhcnRzV2l0aCgnXCJhZnRlciBlYWNoXCInKSkge1xuICAgICAgICByZXR1cm4gJ0FGVEVSX0VBQ0gnXG4gICAgfSBlbHNlIGlmIChob29rTmFtZS5zdGFydHNXaXRoKCdcImFmdGVyIGFsbFwiJykpIHtcbiAgICAgICAgcmV0dXJuICdBRlRFUl9BTEwnXG4gICAgfVxuICAgIHJldHVybiAndW5rbm93bidcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NyZWVuc2hvdENvbW1hbmQgKGFyZ3M6IEJlZm9yZUNvbW1hbmRBcmdzIHwgQWZ0ZXJDb21tYW5kQXJncykge1xuICAgIHJldHVybiBhcmdzLmVuZHBvaW50ICYmIGFyZ3MuZW5kcG9pbnQuaW5jbHVkZXMoJy9zY3JlZW5zaG90Jylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQlN0YWNrU2Vzc2lvbihjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnVzZXIgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBjb25maWcua2V5ID09PSAnc3RyaW5nJyAmJiBjb25maWcua2V5Lmxlbmd0aCA9PT0gMjApIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Jyb3dzZXJzdGFja0luZnJhKGNvbmZpZzogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBjYXBzPzogQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIC8vIHRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBiYXNpYyBzZXNzaW9uIG9yIG11bHRpIHJlbW90ZSBzZXNzaW9uIGlzIHJ1bm5pbmcgb24gQnJvd3NlcnN0YWNrLCBtYWlubHkgYnkgY2hlY2tpbmcgdGhlIGhvc3RuYW1lIHBhcmFtZXRlciBpbiB0aGUgZ2l2ZW4gY29uZmlnXG4gICAgLy8gSW4gY2FzZSBob3N0bmFtZSBpcyBub3QgcHJlc2VudCBhbnl3aGVyZSBpbiB0aGUgY29uZmlnLCBpdCByZXR1cm5zIHRydWUgYnkgZGVmYXVsdCBhcyBob3N0bmFtZSBpcyBub3QgYSBtYW5kYXRvcnkgcGFyYW1ldGVyIGluIHRoZSBjb25maWdcblxuICAgIGNvbnN0IGlzQnJvd3NlcnN0YWNrID0gKHN0cjogc3RyaW5nICk6IGJvb2xlYW4gPT4ge1xuICAgICAgICByZXR1cm4gc3RyID09PSAnYnJvd3NlcnN0YWNrLmNvbScgfHwgc3RyLmVuZHNXaXRoKCcuYnJvd3NlcnN0YWNrLmNvbScpXG4gICAgfVxuXG4gICAgaWYgKChjb25maWcuaG9zdG5hbWUpICYmICFpc0Jyb3dzZXJzdGFjayhjb25maWcuaG9zdG5hbWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChjYXBzICYmIHR5cGVvZiBjYXBzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjYXBzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIGNhcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoKChjYXBhYmlsaXR5IGFzIE9wdGlvbnMuVGVzdHJ1bm5lcikuaG9zdG5hbWUpICYmICFpc0Jyb3dzZXJzdGFjaygoY2FwYWJpbGl0eSBhcyBPcHRpb25zLlRlc3RydW5uZXIpLmhvc3RuYW1lIGFzIHN0cmluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY2Fwcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBjYXBzW2tleSBhcyBrZXlvZiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzXVxuICAgICAgICAgICAgICAgIGlmICgoKGNhcGFiaWxpdHkgYXMgT3B0aW9ucy5UZXN0cnVubmVyKS5ob3N0bmFtZSkgJiYgIWlzQnJvd3NlcnN0YWNrKChjYXBhYmlsaXR5IGFzIE9wdGlvbnMuVGVzdHJ1bm5lcikuaG9zdG5hbWUgYXMgc3RyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWlzQlN0YWNrU2Vzc2lvbihjb25maWcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyU3RhY2tVc2VyQW5kS2V5KGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLCBvcHRpb25zOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcblxuICAgIC8vIEZhbGxiYWNrIDE6IEVudiB2YXJpYWJsZXNcbiAgICAvLyBGYWxsYmFjayAyOiBTZXJ2aWNlIHZhcmlhYmxlcyBpbiB3ZGlvLmNvbmYuanMgKHRoYXQgYXJlIHJlY2VpdmVkIGluc2lkZSBvcHRpb25zIG9iamVjdClcbiAgICBjb25zdCBlbnZPclNlcnZpY2VWYXJpYWJsZXMgPSB7XG4gICAgICAgIHVzZXI6IGdldEJyb3dzZXJTdGFja1VzZXIob3B0aW9ucyksXG4gICAgICAgIGtleTogZ2V0QnJvd3NlclN0YWNrS2V5KG9wdGlvbnMpXG4gICAgfVxuICAgIGlmIChlbnZPclNlcnZpY2VWYXJpYWJsZXMudXNlciAmJiBlbnZPclNlcnZpY2VWYXJpYWJsZXMua2V5KSB7XG4gICAgICAgIHJldHVybiBlbnZPclNlcnZpY2VWYXJpYWJsZXNcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAzOiBTZXJ2aWNlIHZhcmlhYmxlcyBpbiB0ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgb2JqZWN0XG4gICAgLy8gRmFsbGJhY2sgNDogU2VydmljZSB2YXJpYWJsZXMgaW4gdGhlIHRvcCBsZXZlbCBjb25maWcgb2JqZWN0XG4gICAgY29uc3QgbzExeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdXNlcjogZ2V0T2JzZXJ2YWJpbGl0eVVzZXIob3B0aW9ucywgY29uZmlnKSxcbiAgICAgICAga2V5OiBnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnMsIGNvbmZpZylcbiAgICB9XG4gICAgcmV0dXJuIG8xMXlWYXJpYWJsZXNcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkQWRkU2VydmljZVZlcnNpb24oY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsIHRlc3RPYnNlcnZhYmlsaXR5PzogYm9vbGVhbiwgY2Fwcz86IENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXMpOiBib29sZWFuIHtcbiAgICBpZiAoKGNvbmZpZy5zZXJ2aWNlcyAmJiBjb25maWcuc2VydmljZXMudG9TdHJpbmcoKS5pbmNsdWRlcygnY2hyb21lZHJpdmVyJykgJiYgdGVzdE9ic2VydmFiaWxpdHkgIT09IGZhbHNlKSB8fCAhaXNCcm93c2Vyc3RhY2tJbmZyYShjb25maWcsIGNhcHMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmF0Y2hBbmRQb3N0RXZlbnRzIChldmVudFVybDogc3RyaW5nLCBraW5kOiBzdHJpbmcsIGRhdGE6IFVwbG9hZFR5cGVbXSkge1xuICAgIGlmICghcHJvY2Vzcy5lbnZbVEVTVE9QU19CVUlMRF9DT01QTEVURURfRU5WXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1aWxkIG5vdCBjb21wbGV0ZWQgeWV0JylcbiAgICB9XG5cbiAgICBjb25zdCBqd3RUb2tlbiA9IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF1cbiAgICBpZiAoIWp3dFRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBhdXRoZW50aWNhdGlvbiBUb2tlbicpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJVXRpbHMuREFUQV9FTkRQT0lOVH0vJHtldmVudFVybH1gXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAuLi5ERUZBVUxUX1JFUVVFU1RfQ09ORklHLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7and0VG9rZW59YFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gICAgICAgIH0pXG4gICAgICAgIC8vIHJlYWQgYXMgdGV4dCBmaXJzdDogZXJyb3IgcmVzcG9uc2VzICg0MDEvNXh4KSBhbmQgZW1wdHkgYm9kaWVzIGFyZSBub3QgSlNPTiwgYW5kIGEgYmxpbmRcbiAgICAgICAgLy8gcmVzcG9uc2UuanNvbigpIHN1cmZhY2VkIHRoZW0gYXMgYSBtaXNsZWFkaW5nIFwiVW5leHBlY3RlZCBlbmQgb2YgSlNPTiBpbnB1dFwiXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0ke3Jlc3BvbnNlQm9keSA/IGAgXHUyMDE0ICR7cmVzcG9uc2VCb2R5LnNsaWNlKDAsIDMwMCl9YCA6ICcgKGVtcHR5IGJvZHkpJ31gKVxuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgWyR7a2luZH1dIFN1Y2Nlc3MgcmVzcG9uc2U6ICR7cmVzcG9uc2VCb2R5fWApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbJHtraW5kfV0gRVhDRVBUSU9OIElOICR7a2luZH0gUkVRVUVTVCBUTyBURVNUIFJFUE9SVElORyBBTkQgQU5BTFlUSUNTIDogJHtlcnJvcn1gKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4Y2VwdGlvbiBpbiByZXF1ZXN0ICcgKyBlcnJvcilcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5VXNlcihvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19VU0VSTkFNRSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy51c2VyKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy51c2VyXG4gICAgfVxuICAgIHJldHVybiBjb25maWcudXNlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eUtleShvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BQ0NFU1NfS0VZKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQUNDRVNTX0tFWVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgJiYgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMua2V5KSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5rZXlcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy5rZXlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2VydmFiaWxpdHlQcm9qZWN0KG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgYnN0YWNrUHJvamVjdE5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX1BST0pFQ1RfTkFNRSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX1BST0pFQ1RfTkFNRVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgJiYgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMucHJvamVjdE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnByb2plY3ROYW1lXG4gICAgfVxuICAgIHJldHVybiBic3RhY2tQcm9qZWN0TmFtZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgYnN0YWNrQnVpbGROYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LlRFU1RfT0JTRVJWQUJJTElUWV9CVUlMRF9OQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfTkFNRVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgJiYgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGROYW1lKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZE5hbWVcbiAgICB9XG4gICAgcmV0dXJuIGJzdGFja0J1aWxkTmFtZSB8fCBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2VydmFiaWxpdHlCdWlsZFRhZ3Mob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBic3RhY2tCdWlsZFRhZz86IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX1RBRykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX1RBRy5zcGxpdCgnLCcpXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZFRhZykge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGRUYWdcbiAgICB9XG4gICAgaWYgKGJzdGFja0J1aWxkVGFnKSB7XG4gICAgICAgIHJldHVybiBbYnN0YWNrQnVpbGRUYWddXG4gICAgfVxuICAgIHJldHVybiBbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVzdFBsYW5JZChvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVF9QTEFOX0lEXSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRF1cbiAgICB9XG4gICAgY29uc3QgQ0xJX0FSRyA9ICctLWJyb3dzZXJzdGFjay50ZXN0TWFuYWdlbWVudE9wdGlvbnMudGVzdFBsYW5JZCdcbiAgICBjb25zdCBhcmdJbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKENMSV9BUkcpXG4gICAgaWYgKGFyZ0luZGV4ICE9PSAtMSAmJiBwcm9jZXNzLmFyZ3ZbYXJnSW5kZXggKyAxXSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5hcmd2W2FyZ0luZGV4ICsgMV1cbiAgICB9XG4gICAgY29uc3QgYXJnV2l0aEVxdWFscyA9IHByb2Nlc3MuYXJndi5maW5kKChhcmcpID0+IGFyZy5zdGFydHNXaXRoKGAke0NMSV9BUkd9PWApKVxuICAgIGlmIChhcmdXaXRoRXF1YWxzKSB7XG4gICAgICAgIHJldHVybiBhcmdXaXRoRXF1YWxzLnNwbGl0KCc9JylbMV1cbiAgICB9XG4gICAgY29uc3QgdGVzdFBsYW5JZCA9IG9wdGlvbnMudGVzdE1hbmFnZW1lbnRPcHRpb25zPy50ZXN0UGxhbklkXG4gICAgaWYgKHR5cGVvZiB0ZXN0UGxhbklkID09PSAnc3RyaW5nJyAmJiB0ZXN0UGxhbklkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB0ZXN0UGxhbklkLnRyaW0oKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyU3RhY2tVc2VyKGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19VU0VSTkFNRSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FIGFzIHN0cmluZ1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnLnVzZXIgYXMgc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyU3RhY2tLZXkoY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FDQ0VTU19LRVkpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BQ0NFU1NfS0VZXG4gICAgfVxuICAgIHJldHVybiBjb25maWcua2V5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZTogdW5rbm93bikge1xuICAgIGxldCByZXMgPSAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbClcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXMgPSByZXMgfHwgdmFsdWUgPT09ICcnXG4gICAgfVxuICAgIHJldHVybiByZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVHJ1ZSh2YWx1ZT86IHVua25vd24pIHtcbiAgICByZXR1cm4gKHZhbHVlICsgJycpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGYWxzZSh2YWx1ZT86IHVua25vd24pIHtcbiAgICByZXR1cm4gKHZhbHVlICsgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdmYWxzZSdcbn1cblxuLyoqXG4gKiBza2lwQXBwT3ZlcnJpZGUgdmFsaWRhdGlvbiBjaG9rZXBvaW50IFx1MjAxNCBwb3J0ZWQgZnJvbSB0aGUgTm9kZSBTREsnc1xuICogdmFsaWRhdGVTa2lwQXBwT3ZlcnJpZGUgKGhlbHBlci5qcykgLyBKYXZhIEJyb3dzZXJTdGFja0phdmFBZ2VudC5wcm9jZXNzQXBwT3B0aW9ucy5cbiAqIENhbGxlZCBPTkNFIGZyb20gdGhlIGxhdW5jaGVyIChtYWluIHByb2Nlc3MsIHByZS1zZXNzaW9uKS4gRW1pdHMgdGhlIGZpeGVkIHdhcm5pbmcsXG4gKiBoYW5kbGVzIHRoZSB0aHJlZSBlZGdlIGNhc2VzLCBhbmQgY2xlYXJzIHRoZSBhcHAgb24gY29uZmxpY3Qgc28gaXQgaXMgbmVpdGhlciB1cGxvYWRlZFxuICogbm9yIGluamVjdGVkLiBUaGVyZSBpcyBOTyBUaWVyLTIgYnJhbmNoOiBldmVyeSBXZWJkcml2ZXJJTyB0ZXN0IGZyYW1ld29ya1xuICogKG1vY2hhL2phc21pbmUvY3VjdW1iZXIpIHN1cHBvcnRzIEFwcCBBdXRvbWF0ZS5cbiAqXG4gKiBUaGUgc3RhbmRhcmQgd2FybmluZyBhbmQgdGhlIGVkZ2UtMiBlcnJvciBhcmUgdmVyYmF0aW0gd2l0aCB0aGUgb3RoZXIgQnJvd3NlclN0YWNrIFNES3NcbiAqIChCcm93c2VyU3RhY2tKYXZhQWdlbnQjcHJvY2Vzc0FwcE9wdGlvbnMpLiBUaGUgZWRnZS0xIGNvbmZsaWN0IHdhcm5pbmcgaXMgSU5URU5USU9OQUxMWSBhZGFwdGVkIGZvclxuICogV2ViZHJpdmVySU8gXHUyMDE0IGl0IHNheXMgXCJicm93c2Vyc3RhY2sgc2VydmljZSBvcHRpb25zXCIgKHdoZXJlIFdESU8gcmVhZHMgYGFwcGApLCBub3QgXCJicm93c2Vyc3RhY2sueW1sXCIgXHUyMDE0XG4gKiBzbyBwbGVhc2UgZG8gTk9UIFwiZml4XCIgaXQgYmFjayB0byB0aGUgeW1sIHdvcmRpbmcgdG8gbWF0Y2ggdGhlIG90aGVyIFNES3MuXG4gKiBHcmFjZWZ1bDogbmV2ZXIgdGhyb3dzIGV4Y2VwdCB0aGUgZGVsaWJlcmF0ZSBlZGdlLTIgY29uZmlnIGVycm9yIChleHBsaWNpdCBmYWxzZSArIG5vIGFwcCksXG4gKiB3aGljaCBmaXJlcyBwcmUtc2Vzc2lvbiBzbyB0aGUgcnVuIGFib3J0cyBjbGVhbmx5LlxuICpcbiAqIE11dGF0ZXMgYG9wdGlvbnMuYXBwYCAoZWRnZS0xKS4gMy1zdGF0ZSB2aWEgaXNUcnVlL2lzRmFsc2UgXHUyMDE0IG5ldmVyIGAhb3B0aW9ucy5za2lwQXBwT3ZlcnJpZGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTa2lwQXBwT3ZlcnJpZGUob3B0aW9ucz86IEJyb3dzZXJzdGFja0NvbmZpZyAmIEJyb3dzZXJzdGFja09wdGlvbnMpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQob3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2tpcEFwcE92ZXJyaWRlID0gKG9wdGlvbnMgYXMgQnJvd3NlcnN0YWNrQ29uZmlnKS5za2lwQXBwT3ZlcnJpZGVcbiAgICBjb25zdCBhbHJlYWR5V2FybmVkID0gaXNUcnVlKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19TS0lQX0FQUF9PVkVSUklERV9XQVJORUQpXG5cbiAgICAvLyBTdGFuZGFyZCB3YXJuaW5nIFx1MjAxNCBmaXJlcyB3aGVuZXZlciBza2lwQXBwT3ZlcnJpZGUgaXMgdHJ1ZSwgYmVmb3JlIGFueSBlZGdlIHJldHVybi5cbiAgICBpZiAoaXNUcnVlKHNraXBBcHBPdmVycmlkZSkgJiYgIWFscmVhZHlXYXJuZWQpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ1tCcm93c2VyU3RhY2tdIFxcJ3NraXBBcHBPdmVycmlkZTogdHJ1ZVxcJyBpcyBzZXQuIFRoZSBTREsgd2lsbCB0cmVhdCB0aGlzIHNlc3Npb24gYXMgQXBwIEF1dG9tYXRlIGFuZCB3aWxsIE5PVCBtYW5hZ2UgYXBwIHVwbG9hZCBvciBpbmplY3QgYXBwIGNhcGFiaWxpdGllcy4gSWYgeW91IGludGVuZGVkIHRvIHJ1biBhbiBBdXRvbWF0ZSAoYnJvd3Nlci93ZWJzaXRlKSBzZXNzaW9uLCByZW1vdmUgXFwnc2tpcEFwcE92ZXJyaWRlXFwnIFx1MjAxNCBsZWF2aW5nIGl0IHNldCB3aWxsIGNhdXNlIEF1dG9tYXRlIHNlc3Npb25zIHRvIGJlaGF2ZSBpbmNvcnJlY3RseS4nKVxuICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfU0tJUF9BUFBfT1ZFUlJJREVfV0FSTkVEID0gJ3RydWUnXG4gICAgfVxuXG4gICAgLy8gRWRnZSAxOiBhcHAgc3BlY2lmaWVkICsgc2tpcEFwcE92ZXJyaWRlOnRydWUgXHUyMTkyIHdhcm4sIGNsZWFyIHRoZSBhcHAgc28gaXQgaXMgbm90XG4gICAgLy8gdXBsb2FkZWQvaW5qZWN0ZWQsIHByb2NlZWQgQXBwIEF1dG9tYXRlLlxuICAgIGlmIChpc1RydWUoc2tpcEFwcE92ZXJyaWRlKSAmJiAhaXNVbmRlZmluZWQoKG9wdGlvbnMgYXMgQnJvd3NlcnN0YWNrQ29uZmlnKS5hcHApKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdDb25mbGljdCBkZXRlY3RlZC4gc2tpcEFwcE92ZXJyaWRlOiB0cnVlIGlzIGFjdGl2ZTsgaWdub3JpbmcgdGhlIGFwcCBwcm92aWRlZCBpbiB0aGUgYnJvd3NlcnN0YWNrIHNlcnZpY2Ugb3B0aW9ucy4nKVxuICAgICAgICA7KG9wdGlvbnMgYXMgQnJvd3NlcnN0YWNrQ29uZmlnKS5hcHAgPSB1bmRlZmluZWRcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gRWRnZSAyOiBhcHAgbm90IHNwZWNpZmllZCArIHNraXBBcHBPdmVycmlkZSBleHBsaWNpdGx5IGZhbHNlIFx1MjE5MiBwcmUtc2Vzc2lvbiBjb25maWcgZXJyb3IuXG4gICAgaWYgKGlzRmFsc2Uoc2tpcEFwcE92ZXJyaWRlKSAmJiBpc1VuZGVmaW5lZCgob3B0aW9ucyBhcyBCcm93c2Vyc3RhY2tDb25maWcpLmFwcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHAgY2FwYWJpbGl0eSBpcyBtaXNzaW5nLiBXaGVuIHNraXBBcHBPdmVycmlkZSBpcyBzZXQgdG8gXFwnZmFsc2VcXCcsIGEgdmFsaWQgYXBwIGNhcGFiaWxpdHkgKGhhc2gvc2hhcmVhYmxlIGlkL3BhdGgvY3VzdG9tX2lkKSBtdXN0IGJlIHByb3ZpZGVkLicpXG4gICAgfVxuXG4gICAgLy8gRWRnZSAzIChhbmQgZGVmYXVsdCk6IHVuc2V0ICsgbm8gYXBwIFx1MjE5MiB1bmNoYW5nZWQgYmVoYXZpb3IgKG5vLW9wKS5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZyYW1ld29ya1N1cHBvcnRzSG9vayhob29rOiBzdHJpbmcsIGZyYW1ld29yaz86IHN0cmluZykge1xuICAgIGlmIChmcmFtZXdvcmsgPT09ICdtb2NoYScgJiYgKGhvb2sgPT09ICdiZWZvcmUnIHx8IGhvb2sgPT09ICdhZnRlcicgfHwgaG9vayA9PT0gJ2JlZm9yZUVhY2gnIHx8IGhvb2sgPT09ICdhZnRlckVhY2gnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmIChmcmFtZXdvcmsgPT09ICdjdWN1bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IHBhdGNoQ29uc29sZUxvZ3MgPSBvMTF5RXJyb3JIYW5kbGVyKCgpID0+IHtcbiAgICBjb25zdCBCU1Rlc3RPcHNQYXRjaGVyID0gbmV3IGxvZ1BhdGNoZXIoe30pXG5cbiAgICBPYmplY3Qua2V5cyhjb25zb2xlSG9sZGVyKS5mb3JFYWNoKChtZXRob2Q6IGtleW9mIHR5cGVvZiBjb25zb2xlKSA9PiB7XG4gICAgICAgIGlmICghKG1ldGhvZCBpbiBjb25zb2xlKSB8fCBtZXRob2QgPT09ICdDb25zb2xlJyB8fCB0eXBlb2YgY29uc29sZVttZXRob2RdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFNraXBwaW5nIG1ldGhvZDogJHttZXRob2R9LCBleGlzdHM6ICR7bWV0aG9kIGluIGNvbnNvbGV9LCB0eXBlOiAke3R5cGVvZiBjb25zb2xlW21ldGhvZF19YClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yaWdNZXRob2Q6IEZ1bmN0aW9uID0gY29uc29sZVttZXRob2RdLmJpbmQoY29uc29sZSlcblxuICAgICAgICBjb25zb2xlW21ldGhvZF0gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXMoQlNUZXN0T3BzUGF0Y2hlcikuaW5jbHVkZXMobWV0aG9kKSkge1xuICAgICAgICAgICAgICAgICAgICBvcmlnTWV0aG9kKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ01ldGhvZCguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgKEJTVGVzdE9wc1BhdGNoZXIgYXMgYW55KVttZXRob2RdKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIHdoaWxlIHBhdGNoaW5nIGNvbnNvbGUgbG9ncyA6ICR7ZXJyb3J9YClcbiAgICAgICAgICAgICAgICBvcmlnTWV0aG9kKC4uLmFyZ3MpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxufSlcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZhaWx1cmVPYmplY3QoZXJyb3I6IHN0cmluZ3xFcnJvcikge1xuICAgIGNvbnN0IHN0YWNrID0gKGVycm9yIGFzIEVycm9yKS5zdGFja1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnID8gZXJyb3IgOiBlcnJvci5tZXNzYWdlXG4gICAgY29uc3QgYmFja3RyYWNlID0gc3RhY2sgPyByZW1vdmVBbnNpQ29sb3JzKHN0YWNrLnRvU3RyaW5nKCkpIDogJydcblxuICAgIHJldHVybiB7XG4gICAgICAgIGZhaWx1cmU6IFt7IGJhY2t0cmFjZTogW2JhY2t0cmFjZV0gfV0sXG4gICAgICAgIGZhaWx1cmVfcmVhc29uOiByZW1vdmVBbnNpQ29sb3JzKG1lc3NhZ2UudG9TdHJpbmcoKSksXG4gICAgICAgIGZhaWx1cmVfdHlwZTogbWVzc2FnZSA/IChtZXNzYWdlLnRvU3RyaW5nKCkubWF0Y2goL0Fzc2VydGlvbkVycm9yLykgPyAnQXNzZXJ0aW9uRXJyb3InIDogJ1VuaGFuZGxlZEVycm9yJykgOiBudWxsXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobXMgPSAxMDApID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSlcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwbG9hZExvZ3ModXNlcjogc3RyaW5nIHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2xpZW50QnVpbGRVdWlkOiBzdHJpbmcpIHtcbiAgICAvLyBNYW51YWwgaW5zdHJ1bWVudGF0aW9uOiB0YWcgZXZlcnkgcmV0dXJuIHBhdGggb24gdGhlIFNES19VUExPQURfTE9HUyBldmVudCBzb1xuICAgIC8vIHRoZSBtZXRyaWMgaWRlbnRpZmllcyB0aGUgc3BlY2lmaWMgcmVhc29uIGxvZ3Mgd2VyZSBub3QgdXBsb2FkZWQgKG5vIGNyZWRzLFxuICAgIC8vIHBlci1maWxlIGNvcHkgZmFpbHVyZSwgdXBsb2FkIG5vLXJlc3BvbnNlLCBleGNlcHRpb24pLiBtZWFzdXJlV3JhcHBlciB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBtYXJrIGFsbCBub24tdGhyb3dpbmcgcGF0aHMgYXMgc3VjY2Vzcy5cbiAgICBjb25zdCBldmVudE5hbWUgPSBQRVJGT1JNQU5DRV9TREtfRVZFTlRTLkVWRU5UUy5TREtfVVBMT0FEX0xPR1NcbiAgICBsZXQgc3VjY2VzcyA9IHRydWVcbiAgICBsZXQgZmFpbHVyZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgUGVyZm9ybWFuY2VUZXN0ZXIuc3RhcnQoZXZlbnROYW1lKVxuXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCF1c2VyIHx8ICFrZXkpIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9ICdza2lwcGVkOiBtaXNzaW5nX2NyZWRlbnRpYWxzJ1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdVcGxvYWRpbmcgbG9ncyBmYWlsZWQgZHVlIHRvIG5vIGNyZWRlbnRpYWxzJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG1wRGlyID0gdG1wZGlyKClcbiAgICAgICAgY29uc3QgdGFyUGF0aCA9IHBhdGguam9pbih0bXBEaXIsICdsb2dzLnRhcicpXG4gICAgICAgIGNvbnN0IHRhckd6UGF0aCA9IHBhdGguam9pbih0bXBEaXIsICdsb2dzLnRhci5neicpXG5cbiAgICAgICAgY29uc3QgZmlsZXNUb0FyY2hpdmUgPSBbXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIubG9nRmlsZVBhdGgsXG4gICAgICAgICAgICBDTElfREVCVUdfTE9HU19GSUxFLFxuICAgICAgICBdLmZpbHRlcihmID0+IGZzLmV4aXN0c1N5bmMoZikpXG5cbiAgICAgICAgY29uc3QgY29waWVkRmlsZU5hbWVzOiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGNvbnN0IGFyY2hpdmVBZGRGYWlsdXJlczogc3RyaW5nW10gPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZmlsZXNUb0FyY2hpdmUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdCA9IHBhdGguam9pbih0bXBEaXIsIHBhdGguYmFzZW5hbWUoZikpXG4gICAgICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKGYsIGRlc3QpXG4gICAgICAgICAgICAgICAgY29waWVkRmlsZU5hbWVzLnB1c2gocGF0aC5iYXNlbmFtZShmKSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGNvcHlFcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAoY29weUVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgfHwgU3RyaW5nKGNvcHlFcnIpXG4gICAgICAgICAgICAgICAgYXJjaGl2ZUFkZEZhaWx1cmVzLnB1c2goYCR7cGF0aC5iYXNlbmFtZShmKX06ICR7bXNnfWApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJjaGl2ZUFkZEZhaWx1cmVzLmxlbmd0aCA+IDAgJiYgZmFpbHVyZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgICAgIGZhaWx1cmUgPSBgYXJjaGl2ZV9hZGRfZmFpbGVkIFske2FyY2hpdmVBZGRGYWlsdXJlcy5sZW5ndGh9XTogJHthcmNoaXZlQWRkRmFpbHVyZXMuam9pbignOyAnKX1gLnN1YnN0cmluZygwLCAzMDApXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBjcmVhdGUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZmlsZTogdGFyUGF0aCxcbiAgICAgICAgICAgICAgICBjd2Q6IHRtcERpcixcbiAgICAgICAgICAgICAgICBwb3J0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBub0RpclJlY3Vyc2U6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3BpZWRGaWxlTmFtZXNcbiAgICAgICAgKVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGFyUGF0aClcbiAgICAgICAgICAgIGNvbnN0IGRlc3QgPSBmcy5jcmVhdGVXcml0ZVN0cmVhbSh0YXJHelBhdGgpXG4gICAgICAgICAgICBjb25zdCBnemlwID0gemxpYi5jcmVhdGVHemlwKHsgbGV2ZWw6IDEgfSlcblxuICAgICAgICAgICAgc291cmNlLnBpcGUoZ3ppcCkucGlwZShkZXN0KVxuICAgICAgICAgICAgZGVzdC5vbignZmluaXNoJywgcmVzb2x2ZSlcbiAgICAgICAgICAgIGRlc3Qub24oJ2Vycm9yJywgcmVqZWN0KVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgLy8gb3BlbkFzQmxvYiAoTm9kZSA+PTIwKSByZXR1cm5zIGEgQmxvYiBiYWNrZWQgYnkgYSBmaWxlIGRlc2NyaXB0b3IgXHUyMDE0IHVuZGljaVxuICAgICAgICAvLyBzdHJlYW1zIGZyb20gZGlzayBkdXJpbmcgdGhlIHVwbG9hZCBpbnN0ZWFkIG9mIG1hdGVyaWFsaXNpbmcgdGhlIGZ1bGwgYXJjaGl2ZVxuICAgICAgICAvLyBpbiBWOCBoZWFwICh3aGljaCByZWFkRmlsZVN5bmMgKyBuZXcgQmxvYihbQnVmZmVyXSkgd291bGQgZG8gdHdpY2UpLlxuICAgICAgICAvLyBOb2RlIDE4LjIwIChzdGlsbCBzdXBwb3J0ZWQgcGVyIGBlbmdpbmVzYCkgbGFja3MgZnMub3BlbkFzQmxvYiwgc28gZmFsbCBiYWNrXG4gICAgICAgIC8vIHRvIHJlYWRpbmcgdGhlIChzbWFsbCkgbG9nIGFyY2hpdmUgaW50byBhIEJsb2IgdGhlcmUuXG4gICAgICAgIGNvbnN0IGZpbGUgPSB0eXBlb2YgZnMub3BlbkFzQmxvYiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBmcy5vcGVuQXNCbG9iKHRhckd6UGF0aCwgeyB0eXBlOiAnYXBwbGljYXRpb24veC1nemlwJyB9KVxuICAgICAgICAgICAgOiBuZXcgQmxvYihbZnMucmVhZEZpbGVTeW5jKHRhckd6UGF0aCldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi94LWd6aXAnIH0pXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZGF0YScsIGZpbGUsICdsb2dzLnRhci5neicpXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnY2xpZW50QnVpbGRVdWlkJywgY2xpZW50QnVpbGRVdWlkKVxuXG4gICAgICAgIGNvbnN0IGF1dGggPSBCdWZmZXIuZnJvbShgJHt1c2VyfToke2tleX1gKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgYm9keTogZm9ybURhdGEgYXMgQm9keUluaXQsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmFzaWMgJHthdXRofWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbm9kZVJlcXVlc3QoXG4gICAgICAgICAgICAnUE9TVCcsIFVQTE9BRF9MT0dTX0VORFBPSU5ULCByZXF1ZXN0T3B0aW9ucywgQVBJVXRpbHMuVVBMT0FEX0xPR1NfQUREUkVTU1xuICAgICAgICApXG5cbiAgICAgICAgZnMudW5saW5rU3luYyh0YXJQYXRoKVxuICAgICAgICBmcy51bmxpbmtTeW5jKHRhckd6UGF0aClcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIGNvcGllZEZpbGVOYW1lcykge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odG1wRGlyLCBmKVxuICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhmaWxlUGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlbGV0ZSB0aGUgU0RLIENMSSBsb2cgZmlsZSBhZnRlciB1cGxvYWRcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoQ0xJX0RFQlVHX0xPR1NfRklMRSkpIHtcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmMoQ0xJX0RFQlVHX0xPR1NfRklMRSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIC8vIG5vZGVSZXF1ZXN0IHN3YWxsb3dzIGVycm9ycyBmb3IgdGhlIGxvZy11cGxvYWQgcGF0aCBhbmQgcmV0dXJucyB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyByZWNvcmQgdGhlIHNpbGVudCB1cGxvYWQgZmFpbHVyZSBvbiB0aGUgbWV0cmljLlxuICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICAgICAgICBmYWlsdXJlID0gJ3VwbG9hZF9ub19yZXNwb25zZSdcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgJiYgcmVzcG9uc2Uuc3RhdHVzICE9PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgIC8vIFNlcnZlci1zaWRlIHJlamVjdGlvbiAoZS5nLiBcIkZpbGUgbm90IGF0dGFjaGVkXCIpIFx1MjAxNCByZXNwb25zZSBpcyB0cnV0aHlcbiAgICAgICAgICAgIC8vIGJ1dCB0aGUgdXBsb2FkIGRpZG4ndCBhY3R1YWxseSBsYW5kLlxuICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICAgICAgICBmYWlsdXJlID0gYHVwbG9hZF9zdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfSR7cmVzcG9uc2UubWVzc2FnZSA/ICcgLSAnICsgU3RyaW5nKHJlc3BvbnNlLm1lc3NhZ2UpLnNsaWNlKDAsIDIwMCkgOiAnJ31gXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgZmFpbHVyZSA9IGB1cGxvYWRMb2dzIGV4Y2VwdGlvbjogJHtnZXRFcnJvclN0cmluZyhlcnJvcil9YFxuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIHdoaWxlIHVwbG9hZGluZyBsb2dzOiAke2dldEVycm9yU3RyaW5nKGVycm9yKX1gKVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChldmVudE5hbWUsIHN1Y2Nlc3MsIGZhaWx1cmUpXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaXNPYmplY3QgPSAob2JqZWN0OiB1bmtub3duKSA9PiB7XG4gICAgcmV0dXJuIG9iamVjdCAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvYmplY3QpXG59XG5cbmV4cG9ydCBjb25zdCBPYmplY3RzQXJlRXF1YWwgPSAob2JqZWN0MTogb2JqZWN0LCBvYmplY3QyOiBvYmplY3QpID0+IHtcbiAgICBjb25zdCBvYmplY3RLZXlzMSA9IE9iamVjdC5rZXlzKG9iamVjdDEpXG4gICAgY29uc3Qgb2JqZWN0S2V5czIgPSBPYmplY3Qua2V5cyhvYmplY3QyKVxuICAgIGlmIChvYmplY3RLZXlzMS5sZW5ndGggIT09IG9iamVjdEtleXMyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2Ygb2JqZWN0S2V5czEpIHtcbiAgICAgICAgY29uc3QgdmFsdWUxID0gb2JqZWN0MVtrZXkgYXMga2V5b2YgdHlwZW9mIG9iamVjdDFdXG4gICAgICAgIGNvbnN0IHZhbHVlMiA9IG9iamVjdDJba2V5IGFzIGtleW9mIHR5cGVvZiBvYmplY3QxXVxuICAgICAgICBjb25zdCBpc0JvdGhBcmVPYmplY3RzID0gaXNPYmplY3QodmFsdWUxKSAmJiBpc09iamVjdCh2YWx1ZTIpXG4gICAgICAgIGlmICgoaXNCb3RoQXJlT2JqZWN0cyAmJiAhT2JqZWN0c0FyZUVxdWFsKHZhbHVlMSwgdmFsdWUyKSkgfHwgKCFpc0JvdGhBcmVPYmplY3RzICYmIHZhbHVlMSAhPT0gdmFsdWUyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IGdldFBsYXRmb3JtVmVyc2lvbiA9IG8xMXlFcnJvckhhbmRsZXIoZnVuY3Rpb24gZ2V0UGxhdGZvcm1WZXJzaW9uKGNhcHM6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcywgdXNlckNhcHM6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcykge1xuICAgIGlmICghY2FwcyAmJiAhdXNlckNhcHMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IGJzdGFja09wdGlvbnMgPSAodXNlckNhcHMpPy5bJ2JzdGFjazpvcHRpb25zJ11cbiAgICBjb25zdCBrZXlzID0gWydwbGF0Zm9ybVZlcnNpb24nLCAncGxhdGZvcm1fdmVyc2lvbicsICdvc1ZlcnNpb24nLCAnb3NfdmVyc2lvbiddXG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGlmIChjYXBzPy5ba2V5IGFzIGtleW9mIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc10pIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgR290ICR7a2V5fSBmcm9tIGRyaXZlciBjYXBzYClcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoY2Fwcz8uW2tleSBhcyBrZXlvZiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNdKVxuICAgICAgICB9IGVsc2UgaWYgKGJzdGFja09wdGlvbnMgJiYgYnN0YWNrT3B0aW9ucz8uW2tleSBhcyBrZXlvZiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzXSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBHb3QgJHtrZXl9IGZyb20gdXNlciBic3RhY2sgb3B0aW9uc2ApXG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKGJzdGFja09wdGlvbnM/LltrZXkgYXMga2V5b2YgQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllc10pXG4gICAgICAgIH0gZWxzZSBpZiAodXNlckNhcHNba2V5IGFzIGtleW9mIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc10pIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgR290ICR7a2V5fSBmcm9tIHVzZXIgY2Fwc2ApXG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKHVzZXJDYXBzW2tleSBhcyBrZXlvZiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNdKVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn0pXG5cbi8qKlxuICogUmVzb2x2ZSBhIHN0YWJsZSwgaHVtYW4tcmVhZGFibGUgZGV2aWNlIGlkZW50aWZpZXIgZm9yIHRoZVxuICogYGRldmljZWAgZmllbGQgb24gdGVzdF9ydW4gaW50ZWdyYXRpb25zIHBheWxvYWRzLlxuICpcbiAqIFRlc3RIdWIgZGVkdXBlcyB0ZXN0X3J1bnMgYnkgYSBoYXNoIHRoYXQgaW5jbHVkZXMgYGRldmljZWAuIEZvclxuICogQXBwLUF1dG9tYXRlIGZsb3dzIHRoYXQgcGFzcyBhIHJlZ2V4IGRldmljZSByZXF1ZXN0IChlLmcuIGAuKlBpeGVsLipgKVxuICogYWNyb3NzIG11bHRpcGxlIHBsYXRmb3JtcywgdGhlIFNESyBwcmV2aW91c2x5IHNlbnQgdGhlIGlucHV0IHJlZ2V4XG4gKiBzdHJpbmcsIGNhdXNpbmcgdHdvIHBhcmFsbGVsIHNlc3Npb25zIG9uIHBoeXNpY2FsbHkgZGlmZmVyZW50IGRldmljZXNcbiAqIHRvIGNvbGxpZGUgb24gdGhlIGhhc2ggYW5kIG1lcmdlLiBUaGlzIGhlbHBlciBwcmVmZXJzIHRoZSBBcHBpdW1cbiAqIHNlcnZlci1yZXNvbHZlZCBmaWVsZHMgKGBkZXZpY2VNb2RlbGAgLyBgYXBwaXVtOmRldmljZU1vZGVsYCkgYmVmb3JlXG4gKiBmYWxsaW5nIGJhY2sgdG8gdGhlIHJlcXVlc3RlZCBjYXBhYmlsaXRpZXMuXG4gKlxuICogTXVsdGlyZW1vdGU6IGBkcml2ZXJDYXBzYCBmb3IgYSBgTXVsdGlSZW1vdGVCcm93c2VyYCBpcyBhIG1hcCBvZlxuICogYHtpbnN0YW5jZU5hbWU6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcywgXHUyMDI2fWAgcmF0aGVyIHRoYW4gZmxhdCBjYXBzO1xuICogdGhlIGhlbHBlciBkZXRlY3RzIHRoYXQgc2hhcGUgYW5kIHdhbGtzIGVhY2ggaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIGRyaXZlckNhcHMgLSBsaXZlIGRyaXZlciBjYXBhYmlsaXRpZXMgKGBicm93c2VyLmNhcGFiaWxpdGllc2ApXG4gKiAgICAgICAgICAgICAgICAgICAgIHdoZXJlIEFwcGl1bSBzZXJ2ZXItcmVzb2x2ZWQgZmllbGRzIGFyZSBwb3B1bGF0ZWRcbiAqIEBwYXJhbSByZXF1ZXN0ZWRDYXBzIC0gdXNlci1yZXF1ZXN0ZWQgY2FwYWJpbGl0aWVzIChydW5uZXIgY2FwcyAvIHltbClcbiAqICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBhcyBhIGZhbGxiYWNrXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRSZXNvbHZlZERldmljZU5hbWUgPSBvMTF5RXJyb3JIYW5kbGVyKGZ1bmN0aW9uIGdldFJlc29sdmVkRGV2aWNlTmFtZShcbiAgICBkcml2ZXJDYXBzPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIHwgUmVjb3JkPHN0cmluZywgeyBjYXBhYmlsaXRpZXM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfT4sXG4gICAgcmVxdWVzdGVkQ2Fwcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB8IFJlY29yZDxzdHJpbmcsIHsgY2FwYWJpbGl0aWVzPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIH0+LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmbGF0dGVuTXVsdGlyZW1vdGUgPSAoXG4gICAgICAgIGNhcHM6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB8IFJlY29yZDxzdHJpbmcsIHsgY2FwYWJpbGl0aWVzPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIH0+IHwgdW5kZWZpbmVkLFxuICAgICk6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc1tdID0+IHtcbiAgICAgICAgaWYgKCFjYXBzKSB7cmV0dXJuIFtdfVxuICAgICAgICBjb25zdCBvYmogPSBjYXBzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgIGlmIChvYmouZGV2aWNlTW9kZWwgfHwgb2JqWydhcHBpdW06ZGV2aWNlTW9kZWwnXSB8fCBvYmouZGV2aWNlTmFtZSB8fCBvYmpbJ2JzdGFjazpvcHRpb25zJ10pIHtcbiAgICAgICAgICAgIC8vIGxvb2tzIGxpa2UgZmxhdCBjYXBzXG4gICAgICAgICAgICByZXR1cm4gW2NhcHMgYXMgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXVxuICAgICAgICB9XG4gICAgICAgIC8vIGxvb2tzIGxpa2UgYSBtdWx0aXJlbW90ZSBtYXA6IHtpbnN0YW5jZU5hbWU6IHtjYXBhYmlsaXRpZXM6IHsuLi59fX1cbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMob2JqKVxuICAgICAgICAgICAgLmZpbHRlcigodik6IHYgaXMgeyBjYXBhYmlsaXRpZXM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfSA9PlxuICAgICAgICAgICAgICAgIHYgIT09IG51bGwgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnICYmICdjYXBhYmlsaXRpZXMnIGluICh2IGFzIG9iamVjdCkpXG4gICAgICAgICAgICAubWFwKHYgPT4gdi5jYXBhYmlsaXRpZXMgYXMgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZXM6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc1tdID0gW1xuICAgICAgICAuLi5mbGF0dGVuTXVsdGlyZW1vdGUoZHJpdmVyQ2FwcyksXG4gICAgICAgIC4uLmZsYXR0ZW5NdWx0aXJlbW90ZShyZXF1ZXN0ZWRDYXBzKSxcbiAgICBdXG4gICAgaWYgKCFzb3VyY2VzLmxlbmd0aCkge3JldHVybiB1bmRlZmluZWR9XG5cbiAgICBjb25zdCBwaWNrU3RyaW5nID0gKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgY29uc3QgdiA9IG9iaj8uW2tleV1cbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA+IDAgPyB2IDogdW5kZWZpbmVkXG4gICAgfVxuICAgIC8vIFByZWNlZGVuY2U6IHByZWZlciBBcHBpdW0gc2VydmVyLXJlc29sdmVkIGRldmljZU1vZGVsOyBmYWxsIGJhY2sgdGhyb3VnaFxuICAgIC8vIHJlcXVlc3RlZCBjYXAgdmFyaWFudHMuIGBic3RhY2s6b3B0aW9ucy5kZXZpY2VOYW1lYCBpcyB0aGUgdXNlcidzIHJlZ2V4XG4gICAgLy8gZm9yIEFwcC1BdXRvbWF0ZSBydW5zLCBrZXB0IGFzIGEgZmFsbGJhY2sgZm9yIHRoZSBub24tcmVzb2x2ZWQgY2FzZS5cbiAgICBjb25zdCBwYXRoczogQXJyYXk8KGM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ+ID0gW1xuICAgICAgICBjID0+IHBpY2tTdHJpbmcoYywgJ2RldmljZU1vZGVsJyksXG4gICAgICAgIGMgPT4gcGlja1N0cmluZyhjLCAnYXBwaXVtOmRldmljZU1vZGVsJyksXG4gICAgICAgIGMgPT4gcGlja1N0cmluZyhjWydic3RhY2s6b3B0aW9ucyddIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLCAnZGV2aWNlTmFtZScpLFxuICAgICAgICBjID0+IHBpY2tTdHJpbmcoYywgJ2FwcGl1bTpkZXZpY2VOYW1lJyksXG4gICAgICAgIGMgPT4gcGlja1N0cmluZyhjLCAnZGV2aWNlTmFtZScpLFxuICAgIF1cbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBzcmMgb2Ygc291cmNlcykge1xuICAgICAgICAgICAgY29uc3QgdiA9IHBhdGgoc3JjIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgICBpZiAodikge3JldHVybiB2fVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn0pXG5cbmV4cG9ydCBjb25zdCBnZXRCYXNpY0F1dGhIZWFkZXIgPSAodXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGVuY29kZWRBdXRoID0gQnVmZmVyLmZyb20oYCR7dXNlcm5hbWV9OiR7cGFzc3dvcmR9YCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICByZXR1cm4gYEJhc2ljICR7ZW5jb2RlZEF1dGh9YFxufVxuXG5leHBvcnQgY29uc3QgaXNPYmplY3RFbXB0eSA9IChvYmplY3ROYW1lOiB1bmtub3duKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgb2JqZWN0TmFtZSAmJlxuICAgICAgICBPYmplY3Qua2V5cyhvYmplY3ROYW1lKS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgb2JqZWN0TmFtZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0XG4gICAgKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0RXJyb3JTdHJpbmcgPSAoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKCFlcnIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICBlcnIgLy8gd29ya3MsIGBlYCBuYXJyb3dlZCB0byBzdHJpbmdcbiAgICB9IGVsc2UgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiBlcnIubWVzc2FnZSAvLyB3b3JrcywgYGVgIG5hcnJvd2VkIHRvIEVycm9yXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGVTdHJpbmcoZmllbGQ6IHN0cmluZywgdHJ1bmNhdGVTaXplSW5CeXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBidWZmZXJTaXplSW5CeXRlcyA9IEJ1ZmZlci5mcm9tKEdJVF9NRVRBX0RBVEFfVFJVTkNBVEVEKS5sZW5ndGhcblxuICAgICAgICBjb25zdCBmaWVsZEJ1ZmZlck9iaiA9IEJ1ZmZlci5mcm9tKGZpZWxkKVxuICAgICAgICBjb25zdCBsZW5PZkZpZWxkQnVmZmVyT2JqID0gZmllbGRCdWZmZXJPYmoubGVuZ3RoXG4gICAgICAgIGNvbnN0IGZpbmFsTGVuID0gTWF0aC5jZWlsKGxlbk9mRmllbGRCdWZmZXJPYmogLSB0cnVuY2F0ZVNpemVJbkJ5dGVzIC0gYnVmZmVyU2l6ZUluQnl0ZXMpXG4gICAgICAgIGlmIChmaW5hbExlbiA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHRydW5jYXRlZFN0cmluZyA9IGZpZWxkQnVmZmVyT2JqLnN1YmFycmF5KDAsIGZpbmFsTGVuKS50b1N0cmluZygpICsgR0lUX01FVEFfREFUQV9UUlVOQ0FURURcbiAgICAgICAgICAgIHJldHVybiB0cnVuY2F0ZWRTdHJpbmdcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3Igd2hpbGUgdHJ1bmNhdGluZyBmaWVsZCwgbm90aGluZyB3YXMgdHJ1bmNhdGVkIGhlcmU6ICR7ZXJyb3J9YClcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaXplT2ZKc29uT2JqZWN0SW5CeXRlcyhqc29uRGF0YTogR2l0TWV0YURhdGEpOiBudW1iZXIge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGpzb25EYXRhKSlcblxuICAgICAgICByZXR1cm4gYnVmZmVyLmxlbmd0aFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2hpbGUgY2FsY3VsYXRpbmcgc2l6ZSBvZiBKU09OIG9iamVjdDogJHtlcnJvcn1gKVxuICAgIH1cblxuICAgIHJldHVybiAtMVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBbmRUcnVuY2F0ZVZDU0luZm8oZ2l0TWV0YURhdGE6IEdpdE1ldGFEYXRhKTogR2l0TWV0YURhdGEge1xuICAgIGNvbnN0IGdpdE1ldGFEYXRhU2l6ZUluQnl0ZXMgPSBnZXRTaXplT2ZKc29uT2JqZWN0SW5CeXRlcyhnaXRNZXRhRGF0YSlcblxuICAgIGlmIChnaXRNZXRhRGF0YVNpemVJbkJ5dGVzICYmIGdpdE1ldGFEYXRhU2l6ZUluQnl0ZXMgPiBNQVhfR0lUX01FVEFfREFUQV9TSVpFX0lOX0JZVEVTKSB7XG4gICAgICAgIGNvbnN0IHRydW5jYXRlU2l6ZSA9IGdpdE1ldGFEYXRhU2l6ZUluQnl0ZXMgLSBNQVhfR0lUX01FVEFfREFUQV9TSVpFX0lOX0JZVEVTXG4gICAgICAgIGNvbnN0IHRydW5jYXRlZENvbW1pdE1lc3NhZ2UgPSB0cnVuY2F0ZVN0cmluZyhnaXRNZXRhRGF0YS5jb21taXRfbWVzc2FnZSwgdHJ1bmNhdGVTaXplKVxuICAgICAgICBnaXRNZXRhRGF0YS5jb21taXRfbWVzc2FnZSA9IHRydW5jYXRlZENvbW1pdE1lc3NhZ2VcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oYFRoZSBjb21taXQgaGFzIGJlZW4gdHJ1bmNhdGVkLiBTaXplIG9mIGNvbW1pdCBhZnRlciB0cnVuY2F0aW9uIGlzICR7IGdldFNpemVPZkpzb25PYmplY3RJbkJ5dGVzKGdpdE1ldGFEYXRhKSAvIDEwMjQgfSBLQmApXG4gICAgfVxuXG4gICAgcmV0dXJuIGdpdE1ldGFEYXRhXG59XG5cbmV4cG9ydCBjb25zdCBoYXNCcm93c2VyTmFtZSA9IChjYXA6IENhcGFiaWxpdGllcy5XZWJkcml2ZXJJT0NvbmZpZyk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghY2FwIHx8ICFjYXAuY2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBicm93c2VyU3RhY2tDYXBhYmlsaXRpZXMgPSBjYXAuY2FwYWJpbGl0aWVzIGFzIENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXNcbiAgICByZXR1cm4gYnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lICE9PSB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGNvbnN0IGlzVmFsaWRDYXBzRm9ySGVhbGluZyA9IChjYXBzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpOiBib29sZWFuID0+IHtcblxuICAgIC8vIEdldCBhbGwgY2FwYWJpbGl0eSB2YWx1ZXNcbiAgICBjb25zdCBjYXBWYWx1ZXMgPSBPYmplY3QudmFsdWVzKGNhcHMpXG5cbiAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGNhcGFiaWxpdGllcyBhbmQgaWYgYXQgbGVhc3Qgb25lIGhhcyBhIGJyb3dzZXIgbmFtZVxuICAgIHJldHVybiBjYXBWYWx1ZXMubGVuZ3RoID4gMCAmJiBjYXBWYWx1ZXMuc29tZShoYXNCcm93c2VyTmFtZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVHVyYm9TY2FsZShvcHRpb25zOiAoQnJvd3NlcnN0YWNrQ29uZmlnICYgQnJvd3NlcnN0YWNrT3B0aW9ucykgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbihvcHRpb25zPy50dXJib1NjYWxlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eVByb2R1Y3Qob3B0aW9uczogKEJyb3dzZXJzdGFja0NvbmZpZyAmIEJyb3dzZXJzdGFja09wdGlvbnMpIHwgdW5kZWZpbmVkLCBpc0FwcEF1dG9tYXRlOiBib29sZWFuIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXNBcHBBdXRvbWF0ZVxuICAgICAgICA/ICdhcHAtYXV0b21hdGUnXG4gICAgICAgIDogKGlzVHVyYm9TY2FsZShvcHRpb25zKSA/ICd0dXJib3NjYWxlJyA6ICdhdXRvbWF0ZScpXG59XG5cbnR5cGUgUG9sbGluZ1Jlc3VsdCA9IHtcbiAgICBkYXRhOiBhbnk7XG4gICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBtZXNzYWdlPzogc3RyaW5nOyAvLyBPcHRpb25hbCBtZXNzYWdlIGZvciB0aW1lb3V0IGNhc2VzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb2xsQXBpKFxuICAgIHVybDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIHVwcGVyTGltaXQ6IG51bWJlcixcbiAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4pOiBQcm9taXNlPFBvbGxpbmdSZXN1bHQ+IHtcbiAgICBwYXJhbXMudGltZXN0YW1wID0gTWF0aC5yb3VuZChEYXRlLm5vdygpIC8gMTAwMClcbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoYGN1cnJlbnQgdGltZXN0YW1wICR7cGFyYW1zLnRpbWVzdGFtcH1gKVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWtlR2V0UmVxdWVzdCh1cmwsIHBhcmFtcywgaGVhZGVycylcbiAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgICAgICBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1BvbGxpbmcgc3VjY2VlZGVkLicsXG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGlmIChlcnJvci5yZXNwb25zZSAmJiBlcnJvci5yZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dFBvbGxUaW1lID0gcGFyc2VJbnQoZXJyb3IucmVzcG9uc2UuaGVhZGVycy5nZXQoJ25leHRfcG9sbF90aW1lJyksIDEwKSAqIDEwMDBcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgdGltZUluTWlsbGlzICR7bmV4dFBvbGxUaW1lfWApXG5cbiAgICAgICAgICAgIGlmIChpc05hTihuZXh0UG9sbFRpbWUpKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ0ludmFsaWQgb3IgbWlzc2luZyBgbmV4dFBvbGxUaW1lYCBoZWFkZXIuIFN0b3BwaW5nIHBvbGxpbmcuJylcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogZXJyb3IucmVzcG9uc2UuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgbmV4dFBvbGxUaW1lIGhlYWRlciB2YWx1ZS4gUG9sbGluZyBzdG9wcGVkLicsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbGFwc2VkVGltZSA9IG5leHRQb2xsVGltZSAtIERhdGUubm93KClcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgZWxhcHNlZFRpbWUgJHtlbGFwc2VkVGltZX0gdGltZUluTWlsbGlzICR7bmV4dFBvbGxUaW1lfSB1cHBlckxpbWl0ICR7dXBwZXJMaW1pdH1gXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmIChuZXh0UG9sbFRpbWUgPiB1cHBlckxpbWl0KSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ1BvbGxpbmcgc3RvcHBlZCBkdWUgdG8gdXBwZXIgdGltZSBsaW1pdC4nKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBlcnJvci5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUG9sbGluZyBzdG9wcGVkIGR1ZSB0byB1cHBlciB0aW1lIGxpbWl0LicsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFBvbGxpbmcgYWdhaW4gaW4gJHtlbGFwc2VkVGltZX1tcyB3aXRoIHBhcmFtczpgLCBwYXJhbXMpXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBlbGFwc2VkVGltZSkpXG4gICAgICAgICAgICByZXR1cm4gcG9sbEFwaSh1cmwsIHBhcmFtcywgaGVhZGVycywgdXBwZXJMaW1pdCwgc3RhcnRUaW1lKVxuICAgICAgICB9IGVsc2UgaWYgKGVycm9yLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gZXJyb3IucmVzcG9uc2Uuc3RhdHVzVGV4dFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRFcnJvciA9IEpTT04ucGFyc2UoZXJyb3IucmVzcG9uc2UuanNvbigpKVxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IHBhcnNlZEVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3IgcGFyc2luZyBwb2xsQXBpIHJlcXVlc3QgYm9keSAke2Vycm9yLnJlc3BvbnNlLmJvZHl9YClcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnVW5rbm93biBlcnJvcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQ6ICR7ZXJyb3J9YClcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBoZWFkZXJzOiB7fSwgbWVzc2FnZTogJ1VuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQuJyB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1ha2VHZXRSZXF1ZXN0KHVybDogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4sIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpXG4gICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChrZXkpID0+IHVybE9iai5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgcGFyYW1zW2tleV0pKVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmxPYmoudG9TdHJpbmcoKSwge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICBoZWFkZXJzLFxuICAgIH0pXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdSZXF1ZXN0IGZhaWxlZCcpXG4gICAgICAgIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2VcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2Vcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBY2Nlc3NpYmlsaXR5U2NyaXB0PFJldHVyblR5cGU+KFxuICAgIGJyb3dzZXI6IGFueSxcbiAgICBmbkJvZHk6IHN0cmluZyxcbiAgICBhcmc/OiB1bmtub3duXG4pOiBQcm9taXNlPFJldHVyblR5cGU+IHtcbiAgICByZXR1cm4gYnJvd3Nlci5leGVjdXRlKFxuICAgICAgICBgcmV0dXJuIChmdW5jdGlvbiAoLi4uYnN0YWNrU2RrQXJncykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYnN0YWNrU2RrQXJnc1swXTtcbiAgICAgICAgICAgICAgICBic3RhY2tTZGtBcmdzLnB1c2gocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgJHtmbkJvZHkucmVwbGFjZSgvYXJndW1lbnRzL2csICdic3RhY2tTZGtBcmdzJyl9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkoJHthcmcgPyBKU09OLnN0cmluZ2lmeShhcmcpIDogJyd9KWBcbiAgICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUhhc2hDb2RlRnJvbUZpZWxkcyhmaWVsZHM6IEFycmF5PHN0cmluZyB8IG9iamVjdD4pIHtcbiAgICBjb25zdCBzZXJpYWxpemUgPSAodmFsdWU6IHt9KSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgICB9XG5cbiAgICBjb25zdCBzZXJpYWxpemVkID0gZmllbGRzLm1hcChzZXJpYWxpemUpLmpvaW4oJ3wnKVxuICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHNlcmlhbGl6ZWQpLmRpZ2VzdCgnaGV4Jylcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRCb29sZWFuVmFsdWVGcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gWyd0cnVlJ10uaW5jbHVkZXModmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpXG59XG5cbi8qKlxuICogU0RLLTM3Mzc6IENvZXJjZSBzdHJpbmdpZmllZCBib29sZWFucyAoJ3RydWUnLydmYWxzZScsIGFueSBjYXNlKSBpbiBhIGZsYXRcbiAqIG9wdGlvbnMgb2JqZWN0IHRvIHJlYWwgYm9vbGVhbnMsIGxlYXZpbmcgZXZlcnkgb3RoZXIgdmFsdWUgdW50b3VjaGVkLiBCb29sZWFuLVxuICogdHlwZWQgYWNjZXNzaWJpbGl0eSBvcHRpb25zIChlLmcuIGF1dG9TY2FubmluZykgYXJlIGNvbW1vbmx5IHN1cHBsaWVkIGFzXG4gKiBzdHJpbmdzIGZyb20gSlMgY29uZmlnIC8gZW52OyB3aXRob3V0IGNvZXJjaW9uIHRoZXkgZmFpbCBXM0MgY2FwcyB2YWxpZGF0aW9uXG4gKiBhbmQgYXJlIHNpbGVudGx5IGRyb3BwZWQuIE9ubHkgdGhlIGV4YWN0IHN0cmluZ3MgJ3RydWUnLydmYWxzZScgYXJlIGNvbnZlcnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvZXJjZVN0cmluZ0Jvb2xlYW5zPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIHJldHVybiBvYmpcbiAgICB9XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXNlZCA9IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICBpZiAobm9ybWFsaXNlZCA9PT0gJ3RydWUnIHx8IG5vcm1hbGlzZWQgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgICAgICBvdXRba2V5XSA9IG5vcm1hbGlzZWQgPT09ICd0cnVlJ1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3V0W2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgICByZXR1cm4gb3V0IGFzIFRcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBrZXkgaXMgc2FmZSB0byB1c2UgZm9yIG9iamVjdCBwcm9wZXJ0eSBhc3NpZ25tZW50IHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICogQHBhcmFtIGtleSAtIFRoZSBrZXkgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGtleSBpcyBzYWZlLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZnVuY3Rpb24gaXNTYWZlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGFuZ2Vyb3VzS2V5cyA9IFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddXG4gICAgcmV0dXJuICFkYW5nZXJvdXNLZXlzLmluY2x1ZGVzKGtleSlcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBib29sZWFuIHZhbHVlIGZyb20gbWl4ZWQgdHlwZXMgKGJvb2xlYW4gb3Igc3RyaW5nKVxuICogT25seSBhY2NlcHRzIHRydWUgYm9vbGVhbiBvciBzdHJpbmcgXCJ0cnVlXCIgKGNhc2UgaW5zZW5zaXRpdmUpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRW5hYmxlZFZhbHVlKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWVcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGdldEJvb2xlYW5WYWx1ZUZyb21TdHJpbmcodmFsdWUpXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEZWVwKHRhcmdldDogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uc291cmNlczogYW55W10pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7cmV0dXJuIHRhcmdldH1cbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KClcblxuICAgIGlmIChpc09iamVjdCh0YXJnZXQpICYmIGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGRhbmdlcm91cyBrZXlzIHRoYXQgY291bGQgbGVhZCB0byBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAgICAgICAgICBpZiAoIWlzU2FmZUtleShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBzb3VyY2Vba2V5XVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSB0YXJnZXRba2V5XVxuXG4gICAgICAgICAgICBpZiAoaXNPYmplY3Qoc291cmNlVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRWYWx1ZSB8fCAhaXNPYmplY3QodGFyZ2V0VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0ge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWVyZ2VEZWVwKHRhcmdldFtrZXldLCBzb3VyY2VWYWx1ZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2VWYWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlRGVlcCh0YXJnZXQsIC4uLnNvdXJjZXMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNocm9tZU9wdGlvbnMoYmFzZTogQ2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnMsIG92ZXJyaWRlOiBQYXJ0aWFsPENhcGFiaWxpdGllcy5DaHJvbWVPcHRpb25zPik6IENhcGFiaWxpdGllcy5DaHJvbWVPcHRpb25zIHtcbiAgICBjb25zdCBtZXJnZWQ6IENhcGFiaWxpdGllcy5DaHJvbWVPcHRpb25zID0geyAuLi5iYXNlIH1cblxuICAgIGlmIChvdmVycmlkZS5hcmdzKSB7XG4gICAgICAgIG1lcmdlZC5hcmdzID0gWy4uLihiYXNlLmFyZ3MgfHwgW10pLCAuLi5vdmVycmlkZS5hcmdzXVxuICAgIH1cblxuICAgIGlmIChvdmVycmlkZS5leHRlbnNpb25zKSB7XG4gICAgICAgIG1lcmdlZC5leHRlbnNpb25zID0gWy4uLihiYXNlLmV4dGVuc2lvbnMgfHwgW10pLCAuLi5vdmVycmlkZS5leHRlbnNpb25zXVxuICAgIH1cblxuICAgIGlmIChvdmVycmlkZS5wcmVmcykge1xuICAgICAgICBtZXJnZWQucHJlZnMgPSBtZXJnZURlZXAoeyAuLi4oYmFzZS5wcmVmcyB8fCB7fSkgfSwgb3ZlcnJpZGUucHJlZnMpXG4gICAgfVxuICAgIHJldHVybiBtZXJnZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbE9yRW1wdHkoc3RyaW5nOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXN0cmluZyB8fCBzdHJpbmcudHJpbSgpID09PSAnJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNIYXNoKGVudGl0eTogYW55KSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oZW50aXR5ICYmIHR5cGVvZihlbnRpdHkpID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShlbnRpdHkpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbmVzdGVkS2V5VmFsdWUoaGFzaDogYW55LCBrZXlzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgcmV0dXJuIGtleXMucmVkdWNlKChoYXNoLCBrZXkpID0+IChpc0hhc2goaGFzaCkgPyBoYXNoW2tleV0gOiB1bmRlZmluZWQpLCBoYXNoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRGlyKGRpcjogc3RyaW5nKSB7XG4gICAgY29uc3QgbGlzdCA9IGZzLnJlYWRkaXJTeW5jKGRpcilcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmpvaW4oZGlyLCBsaXN0W2ldKVxuICAgICAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZmlsZW5hbWUpXG5cbiAgICAgICAgaWYgKGZpbGVuYW1lID09PSAnLicgfHwgZmlsZW5hbWUgPT09ICcuLicpIHtcbiAgICAgICAgICAgIC8vIHBhc3MgdGhlc2UgZmlsZXNcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgIC8vIHJtZGlyIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICByZW1vdmVEaXIoZmlsZW5hbWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBybSBmaWxlbmFtZVxuICAgICAgICAgICAgZnMudW5saW5rU3luYyhmaWxlbmFtZSlcbiAgICAgICAgfVxuICAgIH1cbiAgICBmcy5ybWRpclN5bmMoZGlyKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGlyKGRpcjogc3RyaW5nKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyKSl7XG4gICAgICAgIHJlbW92ZURpcihkaXIpXG4gICAgfVxuICAgIGZzLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dyaXRhYmxlKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIGZzLmFjY2Vzc1N5bmMoZGlyUGF0aCwgZnMuY29uc3RhbnRzLldfT0spXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFJlYWRXcml0ZUFjY2VzcyhkaXJQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgICBmcy5jaG1vZFN5bmMoZGlyUGF0aCwgMG82NjYpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRGlyZWN0b3J5ICR7ZGlyUGF0aH0gaXMgbm93IHJlYWQvd3JpdGUgYWNjZXNzaWJsZS5gKVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHNldCBkaXJlY3RvcnkgYWNjZXNzOiAke2Vyci5zdGFja31gKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vY2hhVGVzdEhpZXJhcmNoeSh0ZXN0OiBGcmFtZXdvcmtzLlRlc3QpIHtcbiAgICBjb25zdCB2YWx1ZTogc3RyaW5nW10gPSBbXVxuICAgIGlmICh0ZXN0LmN0eCAmJiB0ZXN0LmN0eC50ZXN0KSB7XG4gICAgICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcGFyZW50IG9iamVjdCwgdXRpbGl6ZSBpdCBlbHNlIGdldCBmcm9tIGNvbnRleHRcbiAgICAgICAgbGV0IHBhcmVudCA9IHR5cGVvZiB0ZXN0LnBhcmVudCA9PT0gJ29iamVjdCcgPyB0ZXN0LnBhcmVudCA6IHRlc3QuY3R4LnRlc3QucGFyZW50XG4gICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50LnRpdGxlICE9PSAnJykge1xuICAgICAgICAgICAgdmFsdWUucHVzaChwYXJlbnQudGl0bGUpXG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRlc3QuZGVzY3JpcHRpb24gJiYgdGVzdC5mdWxsTmFtZSkge1xuICAgICAgICAvLyBmb3IgSmFzbWluZVxuICAgICAgICB2YWx1ZS5wdXNoKHRlc3QuZGVzY3JpcHRpb24pXG4gICAgICAgIC8vIFN0cmlwIHRoZSB0cmFpbGluZyBcIiA8ZGVzY3JpcHRpb24+XCIgc3VmZml4IHdpdGhvdXQgYnVpbGRpbmcgYSByZWdleCBmcm9tXG4gICAgICAgIC8vIGEgdmFyaWFibGUgKGF2b2lkcyBSZURvUyBhbmQgcmVnZXgtbWV0YWNoYXJhY3RlciBtaXNtYXRjaGVzIGluIGRlc2NyaXB0aW9ucykuXG4gICAgICAgIGNvbnN0IGRlc2NTdWZmaXggPSBgICR7dGVzdC5kZXNjcmlwdGlvbn1gXG4gICAgICAgIHZhbHVlLnB1c2godGVzdC5mdWxsTmFtZS5lbmRzV2l0aChkZXNjU3VmZml4KSA/IHRlc3QuZnVsbE5hbWUuc2xpY2UoMCwgLWRlc2NTdWZmaXgubGVuZ3RoKSA6IHRlc3QuZnVsbE5hbWUpXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5yZXZlcnNlKClcbn1cblxuZXhwb3J0IGNvbnN0IHBlcmZvcm1PMTF5U3luYyA9IGFzeW5jIChicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyKSA9PiB7XG4gICAgaWYgKGlzQnJvd3NlcnN0YWNrU2Vzc2lvbihicm93c2VyKSkge1xuICAgICAgICBhd2FpdCBicm93c2VyLmV4ZWN1dGUoYGJyb3dzZXJzdGFja19leGVjdXRvcjogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBhY3Rpb246ICdhbm5vdGF0ZScsXG4gICAgICAgICAgICBhcmd1bWVudHM6IHtcbiAgICAgICAgICAgICAgICBkYXRhOiBgT2JzZXJ2YWJpbGl0eVN5bmM6JHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdkZWJ1ZydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSl9YClcbiAgICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjYXBhYmlsaXRpZXMgcmVwcmVzZW50IGEgbXVsdGlyZW1vdGUgY29uZmlndXJhdGlvblxuICogQHBhcmFtIGNhcGFiaWxpdGllcyAtIFRoZSBjYXBhYmlsaXRpZXMgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHRydWUgaWYgY2FwYWJpbGl0aWVzIHJlcHJlc2VudCBhbnkgbXVsdGlyZW1vdGUgY29uZmlndXJhdGlvbiAocmVndWxhciBvciBwYXJhbGxlbClcbiAqXG4gKiBAZXhhbXBsZVxuICogUmVndWxhciBtdWx0aXJlbW90ZSAob2JqZWN0KTpcbiAqIHsgYnJvd3NlckE6IHsgY2FwYWJpbGl0aWVzOiB7Li4ufSB9LCBicm93c2VyQjogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0gfVxuICpcbiAqIFBhcmFsbGVsIG11bHRpcmVtb3RlIChhcnJheSB3aXRoIG5lc3RlZCBzdHJ1Y3R1cmUpOlxuICogW3sgYnJvd3NlckE6IHsgY2FwYWJpbGl0aWVzOiB7Li4ufSB9LCBicm93c2VyQjogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0gfV1cbiAqXG4gKiBSZWd1bGFyIGNhcGFiaWxpdGllcyAoYXJyYXkpOlxuICogW3sgYnJvd3Nlck5hbWU6ICdjaHJvbWUnLCAuLi4gfV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlSZW1vdGVDYXBzKGNhcGFiaWxpdGllczogQ2FwYWJpbGl0aWVzLlRlc3RydW5uZXJDYXBhYmlsaXRpZXMpOiBib29sZWFuIHtcbiAgICAvLyBSZWd1bGFyIG11bHRpcmVtb3RlIGlzIGFuIG9iamVjdCAobm90IGFycmF5KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShjYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gRW1wdHkgYXJyYXkgaXMgbm90IG11bHRpcmVtb3RlXG4gICAgaWYgKGNhcGFiaWxpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gUGFyYWxsZWwgbXVsdGlyZW1vdGUgaXMgYW4gYXJyYXkgd2l0aCBuZXN0ZWQgY2FwYWJpbGl0aWVzIHN0cnVjdHVyZVxuICAgIHJldHVybiBjYXBhYmlsaXRpZXMuZXZlcnkoY2FwID0+XG4gICAgICAgIE9iamVjdC52YWx1ZXMoY2FwKS5sZW5ndGggPiAwICYmXG4gICAgICAgIE9iamVjdC52YWx1ZXMoY2FwKS5ldmVyeShjID0+IGMgIT09IG51bGwgJiYgdHlwZW9mIGMgPT09ICdvYmplY3QnICYmIChjIGFzIHsgY2FwYWJpbGl0aWVzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfSkuY2FwYWJpbGl0aWVzKVxuICAgIClcbn1cbiIsICJpbXBvcnQgVHJhbnNwb3J0IGZyb20gJ3dpbnN0b24tdHJhbnNwb3J0J1xuXG5jb25zdCBMT0dfTEVWRUxTID0ge1xuICAgIElORk86ICdJTkZPJywgRVJST1I6ICdFUlJPUicsIERFQlVHOiAnREVCVUcnLCBUUkFDRTogJ1RSQUNFJywgV0FSTjogJ1dBUk4nLFxufVxuXG5jbGFzcyBsb2dQYXRjaGVyIGV4dGVuZHMgVHJhbnNwb3J0IHtcbiAgICBsb2dUb1Rlc3RPcHMgPSAobGV2ZWwgPSBMT0dfTEVWRUxTLklORk8sIG1lc3NhZ2UgPSBbJyddIGFzIHVua25vd25bXSkgPT4ge1xuICAgICAgICAocHJvY2Vzcy5lbWl0IGFzIEZ1bmN0aW9uKShgYnM6YWRkTG9nOiR7cHJvY2Vzcy5waWR9YCwge1xuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICBsZXZlbDogbGV2ZWwudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7bWVzc2FnZS5qb2luKCcsICcpfVwiYCxcbiAgICAgICAgICAgIGtpbmQ6ICdURVNUX0xPRycsXG4gICAgICAgICAgICBodHRwX3Jlc3BvbnNlOiB7fVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qIFBhdGNoaW5nIHRoaXMgd291bGQgc2hvdyB1c2VyIGFuIGV4dGVuZGVkIHRyYWNlIG9uIHRoZWlyIGNsaSAqL1xuICAgIHRyYWNlID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLlRSQUNFLCBtZXNzYWdlKVxuICAgIH1cblxuICAgIGRlYnVnID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLkRFQlVHLCBtZXNzYWdlKVxuICAgIH1cblxuICAgIGluZm8gPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuSU5GTywgbWVzc2FnZSlcbiAgICB9XG5cbiAgICB3YXJuID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLldBUk4sIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgZXJyb3IgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuRVJST1IsIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgbG9nID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLklORk8sIG1lc3NhZ2UpXG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgbG9nUGF0Y2hlclxuIiwgImltcG9ydCB7IGNyZWF0ZU9iamVjdENzdldyaXRlciB9IGZyb20gJ2Nzdi13cml0ZXInXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBmc1Byb21pc2UgZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB0eXBlIHsgRW50cnlUeXBlIH0gZnJvbSAnbm9kZTpwZXJmX2hvb2tzJ1xuaW1wb3J0IHsgcGVyZm9ybWFuY2UsIFBlcmZvcm1hbmNlT2JzZXJ2ZXIgfSBmcm9tICdub2RlOnBlcmZfaG9va3MnXG5pbXBvcnQgdXRpbCBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgd29ya2VyIGZyb20gJ25vZGU6d29ya2VyX3RocmVhZHMnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgeyBhcmNoLCBob3N0bmFtZSwgcGxhdGZvcm0sIHR5cGUsIHZlcnNpb24gfSBmcm9tICdub2RlOm9zJ1xuXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi8uLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgeyBQRVJGX01FQVNVUkVNRU5UX0VOViB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuLi8uLi9jbGkvYXBpVXRpbHMuanMnXG5pbXBvcnQgeyBDTElVdGlscyB9IGZyb20gJy4uLy4uL2NsaS9jbGlVdGlscy5qcydcbmltcG9ydCB7IEVWRU5UUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IGZldGNoV3JhcCBmcm9tICcuLi8uLi9mZXRjaFdyYXBwZXIuanMnXG5pbXBvcnQgdHlwZSB7IENzdldyaXRlciB9IGZyb20gJ2Nzdi13cml0ZXIvc3JjL2xpYi9jc3Ytd3JpdGVyLmpzJ1xuaW1wb3J0IHR5cGUgeyBPYmplY3RNYXAgfSBmcm9tICdjc3Ytd3JpdGVyL3NyYy9saWIvbGFuZy9vYmplY3QuanMnXG5pbXBvcnQgdHlwZSB7IEJyb3dzZXIgfSBmcm9tICd3ZWJkcml2ZXJpbydcblxuLy8gVGVsZW1ldHJ5IG11c3QgbmV2ZXIgdGhyb3cgaW50byBidXNpbmVzcyBsb2dpYy4gTm9kZSAxOCdzIHBlcmZfaG9va3MgcmVqZWN0c1xuLy8gbmVnYXRpdmUgdGltZXN0YW1wcyAoZS5nLiBwZXJmb3JtYW5jZS5ub3coKSB1bmRlciBmYWtlZCB0aW1lcnMsIG9yIGFueSBvdGhlclxuLy8gZWRnZSkgd2l0aCBFUlJfUEVSRk9STUFOQ0VfSU5WQUxJRF9USU1FU1RBTVA7IE5vZGUgMjArIHRvbGVyYXRlcyB0aGVtLiBXcmFwcGluZ1xuLy8gbWFyay9tZWFzdXJlIGtlZXBzIGFuIGluc3RydW1lbnRhdGlvbiBmYWlsdXJlIGZyb20gYnJlYWtpbmcgYSBjYWxsZXIncyBob29rXG4vLyAoZS5nLiBhIHNlcnZpY2UgYmVmb3JlKCkpLCBhbmQgaXMgYSBuby1vcCBvbiB0aGUgaGFwcHkgcGF0aC5cbmZ1bmN0aW9uIHNhZmVNYXJrKG1hcmtOYW1lOiBzdHJpbmcpIHtcbiAgICB0cnkgeyBwZXJmb3JtYW5jZS5tYXJrKG1hcmtOYW1lKSB9IGNhdGNoIHsgLyogaW5zdHJ1bWVudGF0aW9uIG11c3Qgbm90IHRocm93ICovIH1cbn1cbmZ1bmN0aW9uIHNhZmVNZWFzdXJlKG1lYXN1cmVOYW1lOiBzdHJpbmcsIHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nKSB7XG4gICAgdHJ5IHsgcGVyZm9ybWFuY2UubWVhc3VyZShtZWFzdXJlTmFtZSwgc3RhcnQsIGVuZCkgfSBjYXRjaCB7IC8qIGluc3RydW1lbnRhdGlvbiBtdXN0IG5vdCB0aHJvdyAqLyB9XG59XG5cbnR5cGUgUGVyZm9ybWFuY2VEZXRhaWxzID0ge1xuICAgIHN1Y2Nlc3M/OiB0cnVlLFxuICAgIGZhaWx1cmU/OiBzdHJpbmcsXG4gICAgdGVzdE5hbWU/OiBzdHJpbmcsXG4gICAgd29ya2VyPzogc3RyaW5nIHwgbnVtYmVyLFxuICAgIGNsaWVudFdvcmtlcklkPzogc3RyaW5nLFxuICAgIGNvbW1hbmQ/OiBzdHJpbmcsXG4gICAgaG9va1R5cGU/OiBzdHJpbmcsXG4gICAgcGxhdGZvcm0/OiBzdHJpbmcgfCBudW1iZXJcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVyZm9ybWFuY2VUZXN0ZXIge1xuICAgIHN0YXRpYyBfb2JzZXJ2ZXI6IFBlcmZvcm1hbmNlT2JzZXJ2ZXJcbiAgICBzdGF0aWMgX2NzdldyaXRlcjogQ3N2V3JpdGVyPE9iamVjdE1hcDx7fT4+XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2V2ZW50czogUGVyZm9ybWFuY2VFbnRyeVtdID0gW11cbiAgICBwcml2YXRlIHN0YXRpYyBfbWVhc3VyZWRFdmVudHM6IEFycmF5PFBlcmZvcm1hbmNlRW50cnkgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSBbXVxuICAgIHByaXZhdGUgc3RhdGljIF9oYXNTdG9wcGVkR2VuZXJhdGlvbiA9IGZhbHNlXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3N0b3BHZW5lcmF0ZUNhbGxDb3VudCA9IDBcbiAgICBzdGF0aWMgc3RhcnRlZCA9IGZhbHNlXG4gICAgc3RhdGljIGRldGFpbHM6IHsgW2tleTogc3RyaW5nXTogUGVyZm9ybWFuY2VEZXRhaWxzIH0gPSB7fVxuICAgIHN0YXRpYyBldmVudHNNYXA6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fVxuICAgIHN0YXRpYyBicm93c2VyPzogQnJvd3NlclxuICAgIHN0YXRpYyBzY2VuYXJpb1RoYXRSYW46IHN0cmluZ1tdXG4gICAgc3RhdGljIGpzb25SZXBvcnREaXJOYW1lID0gJ3BlcmZvcm1hbmNlLXJlcG9ydCdcbiAgICBzdGF0aWMganNvblJlcG9ydERpclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnLCB0aGlzLmpzb25SZXBvcnREaXJOYW1lKVxuICAgIHN0YXRpYyBqc29uUmVwb3J0RmlsZU5hbWUgPSBgJHt0aGlzLmpzb25SZXBvcnREaXJQYXRofS9wZXJmb3JtYW5jZS1yZXBvcnQtJHtQZXJmb3JtYW5jZVRlc3Rlci5nZXRQcm9jZXNzSWQoKX0uanNvbmBcblxuICAgIHN0YXRpYyBzdGFydE1vbml0b3JpbmcoY3N2TmFtZTogc3RyaW5nID0gJ3BlcmZvcm1hbmNlLXJlcG9ydC5jc3YnKSB7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHBlcmZvcm1hbmNlLXJlcG9ydCBkaXIgaWYgbm90IGV4aXN0cyBhbHJlYWR5XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmpzb25SZXBvcnREaXJQYXRoKSkge1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuanNvblJlcG9ydERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBuZXcgUGVyZm9ybWFuY2VPYnNlcnZlcihsaXN0ID0+IHtcbiAgICAgICAgICAgIGxpc3QuZ2V0RW50cmllcygpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmVudHJ5VHlwZSA9PT0gJ21lYXN1cmUnKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsRW50cnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gZW50cnkudG9KU09OKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaW5hbEVudHJ5LnN0YXJ0VGltZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydFRpbWUgPSBmaW5hbEVudHJ5LnN0YXJ0VGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsRW50cnkuc3RhcnRUaW1lID0gcGVyZm9ybWFuY2UudGltZU9yaWdpbiArIGZpbmFsRW50cnkuc3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUaW1lc3RhbXAgY29udmVyc2lvbiBmb3IgJHtlbnRyeS5uYW1lfTogJHtvcmlnaW5hbFN0YXJ0VGltZX0gLT4gJHtmaW5hbEVudHJ5LnN0YXJ0VGltZX0gKHRpbWVPcmlnaW46ICR7cGVyZm9ybWFuY2UudGltZU9yaWdpbn0pYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBjb252ZXJ0aW5nIHN0YXJ0VGltZSB0byBlcG9jaDogJHt1dGlsLmZvcm1hdChlKX1gKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV0YWlsc1tlbnRyeS5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxFbnRyeSA9IE9iamVjdC5hc3NpZ24oZmluYWxFbnRyeSwgdGhpcy5kZXRhaWxzW2VudHJ5Lm5hbWVdKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRldGFpbHNbZW50cnkubmFtZV1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZWRFdmVudHMucHVzaChmaW5hbEVudHJ5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgICAgICBsaXN0LmdldEVudHJpZXMoKS5mb3JFYWNoKChlbnRyeSkgPT4gdGhpcy5fZXZlbnRzLnB1c2goZW50cnkpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBlbnRyeVR5cGVzOiBFbnRyeVR5cGVbXSA9IFsnbWVhc3VyZSddXG4gICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZXMucHVzaCgnZnVuY3Rpb24nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUoeyBidWZmZXJlZDogdHJ1ZSwgZW50cnlUeXBlczogZW50cnlUeXBlcyB9KVxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlXG4gICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgIHRoaXMuX2NzdldyaXRlciA9IGNyZWF0ZU9iamVjdENzdldyaXRlcih7XG4gICAgICAgICAgICAgICAgcGF0aDogY3N2TmFtZSxcbiAgICAgICAgICAgICAgICBoZWFkZXI6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBpZDogJ25hbWUnLCB0aXRsZTogJ0Z1bmN0aW9uIE5hbWUnIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6ICd0aW1lJywgdGl0bGU6ICdFeGVjdXRpb24gVGltZSAobXMpJyB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBjYWxjdWxhdGVUaW1lcyhtZXRob2RzOiBzdHJpbmdbXSkgOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aW1lczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgICAgIHRoaXMuX2V2ZW50cy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRpbWVzW2VudHJ5Lm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgdGltZXNbZW50cnkubmFtZV0gPSAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lc1tlbnRyeS5uYW1lXSArPSBlbnRyeS5kdXJhdGlvblxuICAgICAgICB9KVxuICAgICAgICBjb25zdCB0aW1lVGFrZW4gPSBtZXRob2RzLnJlZHVjZSgoYSwgYykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRpbWVzW2NdICsgKGEgfHwgMClcbiAgICAgICAgfSwgMClcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUaW1lIGZvciAke21ldGhvZHN9IGlzICR7dGltZVRha2VufWApXG4gICAgICAgIHJldHVybiB0aW1lVGFrZW5cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgc3RvcEFuZEdlbmVyYXRlKGZpbGVuYW1lOiBzdHJpbmcgPSAncGVyZm9ybWFuY2Utb3duLmh0bWwnKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnRzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHRoaXMuX21lYXN1cmVkRXZlbnRzKVxuICAgICAgICAgICAgLy8gcmVtb3ZlIGVuY2xvc2luZyBhcnJheSBhbmQgYWRkIGEgdHJhaWxpbmcgY29tbWEgc28gdGhhdCB3ZVxuICAgICAgICAgICAgLy8gZG9udCBuZWVkIHRvIGJvdGggcmVhZCBhbmQgdGhlbiB3cml0ZSB0aGUgZmlsZSwgd2UgY2FuIHVzZSBhcHBlbmQgaW5zdGVhZFxuICAgICAgICAgICAgY29uc3QgZmluYWxKU09OU3RyID0gZXZlbnRzSnNvbi5zbGljZSgxLCAtMSkgKyAnLCdcbiAgICAgICAgICAgIGF3YWl0IGZzUHJvbWlzZS5hcHBlbmRGaWxlKHRoaXMuanNvblJlcG9ydEZpbGVOYW1lLCBmaW5hbEpTT05TdHIpXG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZhaWxlZCB0byB3cml0ZSBldmVudHMgb2YgdGhlIHdvcmtlciB0byAke3RoaXMuanNvblJlcG9ydEZpbGVOYW1lfTogJHt1dGlsLmZvcm1hdChlcil9YClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KClcblxuICAgICAgICBpZiAoIXByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIENTViBhbmQgSFRNTCByZXBvcnRzIHVzaW5nIGRpcmVjdGx5IGNvbGxlY3RlZCBldmVudHNcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNTVih0aGlzLl9ldmVudHMpXG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVSZXBvcnQodGhpcy5fZXZlbnRzKVxuICAgICAgICBjb25zdCBkaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZmlsZW5hbWUpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmc1Byb21pc2Uud3JpdGVGaWxlKGRpciwgY29udGVudClcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBQZXJmb3JtYW5jZSByZXBvcnQgaXMgYXQgJHtwYXRofWApXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiB3cml0aW5nIGh0bWwgJHt1dGlsLmZvcm1hdChlcnIpfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2VuZXJhdGVSZXBvcnQoZW50cmllczogUGVyZm9ybWFuY2VFbnRyeVtdKSB7XG4gICAgICAgIGxldCBodG1sID0gJzwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPjx0aXRsZT5QZXJmb3JtYW5jZSBSZXBvcnQ8L3RpdGxlPjwvaGVhZD48Ym9keT4nXG4gICAgICAgIGh0bWwgKz0gJzxoMT5QZXJmb3JtYW5jZSBSZXBvcnQ8L2gxPidcbiAgICAgICAgaHRtbCArPSAnPHRhYmxlPjx0aGVhZD48dHI+PHRoPkZ1bmN0aW9uIE5hbWU8L3RoPjx0aD5EdXJhdGlvbiAobXMpPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PidcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaHRtbCArPSBgPHRyPjx0ZD4ke2VudHJ5Lm5hbWV9PC90ZD48dGQ+JHtlbnRyeS5kdXJhdGlvbn08L3RkPjwvdHI+YFxuICAgICAgICB9KVxuICAgICAgICBodG1sICs9ICc8L3Rib2R5PjwvdGFibGU+PC9ib2R5PjwvaHRtbD4nXG4gICAgICAgIHJldHVybiBodG1sXG4gICAgfVxuXG4gICAgc3RhdGljIGdlbmVyYXRlQ1NWKGVudHJpZXM6IFBlcmZvcm1hbmNlRW50cnlbXSkge1xuICAgICAgICBjb25zdCB0aW1lczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgICAgIGVudHJpZXMubWFwKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aW1lc1tlbnRyeS5uYW1lXSkge1xuICAgICAgICAgICAgICAgIHRpbWVzW2VudHJ5Lm5hbWVdID0gMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGltZXNbZW50cnkubmFtZV0gKz0gZW50cnkuZHVyYXRpb25cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICAgICAgICAgIHRpbWU6IGVudHJ5LmR1cmF0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGRhdCA9IE9iamVjdC5lbnRyaWVzKHRpbWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgdGltZTogdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5fY3N2V3JpdGVyLndyaXRlUmVjb3JkcyhkYXQpXG4gICAgICAgICAgICAudGhlbigoKSA9PiBCU3RhY2tMb2dnZXIuaW5mbygnUGVyZm9ybWFuY2UgQ1NWIHJlcG9ydCBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5JykpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihlcnJvcikpXG4gICAgfVxuXG4gICAgc3RhdGljIE1lYXN1cmUobGFiZWw6IHN0cmluZywgZGV0YWlsczogUGVyZm9ybWFuY2VEZXRhaWxzID0ge30pIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICAgICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICAgICAgICBkZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxGdW5jdGlvbj4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kOiBGdW5jdGlvbnx1bmRlZmluZWQgPSBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiguLi5hcmdzOiBvYmplY3RbXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZS5hcHBseShzZWxmLCBbbGFiZWwsIG9yaWdpbmFsTWV0aG9kIGFzIEZ1bmN0aW9uLCB7IG1ldGhvZE5hbWU6IGtleS50b1N0cmluZygpLCAuLi5kZXRhaWxzIH0sIGFyZ3MsIHRoaXNdKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBtZWFzdXJlV3JhcHBlcihuYW1lOiBzdHJpbmcsIGZuOiBGdW5jdGlvbiwgZGV0YWlsczogUGVyZm9ybWFuY2VEZXRhaWxzID0ge30pIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcblxuICAgICAgICBkZXRhaWxzLndvcmtlciA9IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpXG4gICAgICAgIGRldGFpbHMudGVzdE5hbWUgPSBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4gJiYgUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuW1BlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbi5sZW5ndGggLSAxXVxuICAgICAgICBkZXRhaWxzLnBsYXRmb3JtID0gUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkXG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzOiAob2JqZWN0fGJvb2xlYW58dW5kZWZpbmVkfG51bGx8c3RyaW5nKVtdKSB7XG5cbiAgICAgICAgICAgIHJldHVybiBzZWxmLm1lYXN1cmUobmFtZSwgZm4sIGRldGFpbHMsIGFyZ3MpXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHN0YXRpYyBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19TREtfSU5TVFJVTUVOVEFUSU9OID09PSAnZmFsc2UnKVxuICAgIH1cblxuICAgIHN0YXRpYyBtZWFzdXJlKGxhYmVsOiBzdHJpbmcsIGZuOiBGdW5jdGlvbiwgZGV0YWlscyA9IHt9LCBhcmdzPzogKG9iamVjdHxib29sZWFufHVuZGVmaW5lZHxudWxsfHN0cmluZylbXSwgdGhpc0FyZzogb2JqZWN0fG51bGwgPSBudWxsKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkIHx8ICF0aGlzLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBtYXJrIG5hbWVzIGZvciB0aGlzIHNwZWNpZmljIGNhbGwgdG8gYXZvaWQgdGltaW5nIGNvbmZsaWN0c1xuICAgICAgICBjb25zdCB1bmlxdWVJZCA9IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpfWBcbiAgICAgICAgY29uc3Qgc3RhcnRNYXJrID0gYCR7bGFiZWx9LXN0YXJ0LSR7dW5pcXVlSWR9YFxuICAgICAgICBjb25zdCBlbmRNYXJrID0gYCR7bGFiZWx9LWVuZC0ke3VuaXF1ZUlkfWBcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIHN0YXJ0IG1hcmsgd2l0aCB1bmlxdWUgSURcbiAgICAgICAgc2FmZU1hcmsoc3RhcnRNYXJrKVxuXG4gICAgICAgIC8vIFN0b3JlIGRldGFpbHMgd2l0aCBtZWFzdXJlbWVudCBjb250ZXh0XG4gICAgICAgIGNvbnN0IGRldGFpbHNXaXRoQ29udGV4dCA9IHtcbiAgICAgICAgICAgIC4uLmRldGFpbHMsXG4gICAgICAgICAgICBtZWFzdXJlbWVudElkOiB1bmlxdWVJZFxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbCA9IGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpXG5cbiAgICAgICAgICAgIGlmIChyZXR1cm5WYWwgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugc3BlY2lmaWMgbWFya3MgZm9yIHRoaXMgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVNYXJrKGVuZE1hcmspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tsYWJlbF0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZTogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50V29ya2VySWQ6IFBlcmZvcm1hbmNlVGVzdGVyLmdldENsaWVudFdvcmtlcklkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3ROYW1lOiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4/LnBvcCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHYpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlTWFyayhlbmRNYXJrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVNZWFzdXJlKGxhYmVsLCBzdGFydE1hcmssIGVuZE1hcmspXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldGFpbHNbbGFiZWxdID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlOiB1dGlsLmZvcm1hdChlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybTogUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuPy5wb3AoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN5bmNocm9ub3VzIGV4ZWN1dGlvblxuICAgICAgICAgICAgc2FmZU1hcmsoZW5kTWFyaylcbiAgICAgICAgICAgIHNhZmVNZWFzdXJlKGxhYmVsLCBzdGFydE1hcmssIGVuZE1hcmspXG5cbiAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tsYWJlbF0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGZhaWx1cmU6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbj8ucG9wKClcbiAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsXG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBzYWZlTWFyayhlbmRNYXJrKVxuICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgdGhpcy5kZXRhaWxzW2xhYmVsXSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWx1cmU6IHV0aWwuZm9ybWF0KGVyKVxuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbj8ucG9wKClcbiAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICB0aHJvdyBlclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHN0YXJ0KGV2ZW50OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmluYWxFdmVudCA9IGV2ZW50ICsgJy1zdGFydCdcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRzTWFwW2ZpbmFsRXZlbnRdKSB7cmV0dXJufVxuICAgICAgICBzYWZlTWFyayhmaW5hbEV2ZW50KVxuICAgICAgICB0aGlzLmV2ZW50c01hcFtmaW5hbEV2ZW50XSA9IDFcbiAgICB9XG5cbiAgICBzdGF0aWMgZW5kKGV2ZW50OiBzdHJpbmcsIHN1Y2Nlc3MgPSB0cnVlLCBmYWlsdXJlPzogc3RyaW5nIHwgdW5rbm93biwgZGV0YWlscyA9IHt9KSB7XG4gICAgICAgIHNhZmVNYXJrKGV2ZW50ICsgJy1lbmQnKVxuICAgICAgICBzYWZlTWVhc3VyZShldmVudCwgZXZlbnQgKyAnLXN0YXJ0JywgZXZlbnQgKyAnLWVuZCcpXG4gICAgICAgIC8vIENsZWFyIHRoZSBzdGFydC1tYXJrIGd1YXJkIHNvIGEgc3Vic2VxdWVudCBzdGFydChldmVudCkgZm9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGV2ZW50IGFjdHVhbGx5IG1hcmtzIGEgbmV3IHN0YXJ0LiBXaXRob3V0IHRoaXMsIHN0YXJ0KCkgc2hvcnQtY2lyY3VpdHNcbiAgICAgICAgLy8gYW5kIHRoZSBuZXh0IGVuZCgpIG1lYXN1cmVzIGZyb20gdGhlIG9yaWdpbmFsIHN0YXJ0IG1hcmsgXHUyMDE0IGluZmxhdGVkXG4gICAgICAgIC8vIGR1cmF0aW9ucyBpbiB0ZWxlbWV0cnkgb24gZXZlcnkgY2FsbCBhZnRlciB0aGUgZmlyc3QuXG4gICAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50c01hcFtldmVudCArICctc3RhcnQnXVxuICAgICAgICB0aGlzLmRldGFpbHNbZXZlbnRdID0gT2JqZWN0LmFzc2lnbih7IHN1Y2Nlc3MsIGZhaWx1cmU6IHV0aWwuZm9ybWF0KGZhaWx1cmUpIH0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICBwbGF0Zm9ybTogUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkLFxuICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbiAmJiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW5bUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuLmxlbmd0aCAtIDFdXG4gICAgICAgIH0sIGRldGFpbHMpLCB0aGlzLmRldGFpbHNbZXZlbnRdIHx8IHt9KSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY2xpZW50IHdvcmtlciBJRCBpbiBmb3JtYXQgXCJ0aHJlYWRJZC1wcm9jZXNzSWRcIi5cbiAgICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgaWRlbnRpZmllciBhY3Jvc3MgdGhlIFNESyBmb3IgdHJhY2tpbmdcbiAgICAgKiB3b3JrZXItc3BlY2lmaWMgZXZlbnRzIGFuZCBwZXJmb3JtYW5jZSBtZXRyaWNzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV29ya2VyIElEIHN0cmluZyBpbiBmb3JtYXQgXCJ0aHJlYWRJZC1wcm9jZXNzSWRcIlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDbGllbnRXb3JrZXJJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gQ0xJVXRpbHMuZ2V0Q2xpZW50V29ya2VySWQoKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRQcm9jZXNzSWQoKSB7XG4gICAgICAgIHJldHVybiBgJHtwcm9jZXNzLnBpZH0tJHt3b3JrZXIudGhyZWFkSWR9YFxuICAgIH1cblxuICAgIHN0YXRpYyBzbGVlcCA9IChtcyA9IDEwMCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuXG4gICAgc3RhdGljIGFzeW5jIHVwbG9hZEV2ZW50c0RhdGEoKSB7XG4gICAgICAgIC8vIFRyYWNrIG92ZXJhbGwga2V5IG1ldHJpY3Mgb3BlcmF0aW9uXG4gICAgICAgIHRoaXMuc3RhcnQoRVZFTlRTLlNES19TRU5EX0tFWV9NRVRSSUNTKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJJZCA9IGAke3Byb2Nlc3MucGlkfWBcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gU3RhcnRpbmcgdXBsb2FkIGZvciB3b3JrZXIgJHt3b3JrZXJJZH1gKVxuXG4gICAgICAgICAgICAvLyBUcmFjayBwcmVwYXJhdGlvbiBwaGFzZSAoY29sbGVjdGlvbiBhbmQgZGVkdXBsaWNhdGlvbilcbiAgICAgICAgICAgIHRoaXMuc3RhcnQoRVZFTlRTLlNES19LRVlfTUVUUklDU19QUkVQQVJBVElPTilcblxuICAgICAgICAgICAgLy8gQ29sbGVjdCBhbGwgbWVhc3VyZXMgZnJvbSBwZXJmb3JtYW5jZSByZXBvcnQgZmlsZXMgYW5kIGluLW1lbW9yeSBldmVudHNcbiAgICAgICAgICAgIGxldCBtZWFzdXJlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdXG4gICAgICAgICAgICBpZiAoYXdhaXQgZnNQcm9taXNlLmFjY2Vzcyh0aGlzLmpzb25SZXBvcnREaXJQYXRoKS50aGVuKCgpID0+IHRydWUpLmNhdGNoKCgpID0+IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gKGF3YWl0IGZzUHJvbWlzZS5yZWFkZGlyKHRoaXMuanNvblJlcG9ydERpclBhdGgpKS5tYXAoZmlsZSA9PiBwYXRoLnJlc29sdmUodGhpcy5qc29uUmVwb3J0RGlyUGF0aCwgZmlsZSkpXG4gICAgICAgICAgICAgICAgbWVhc3VyZXMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXMubWFwKChmaWxlKSA9PiBmc1Byb21pc2UucmVhZEZpbGUoZmlsZSwgJ3V0Zi04JykpKSkubWFwKGVsID0+IGBbJHtlbC5zbGljZSgwLCAtMSl9XWApLm1hcChlbCA9PiBKU09OLnBhcnNlKGVsKSkuZmxhdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIFRvdGFsIGV2ZW50cyBmcm9tIGZpbGVzOiAke21lYXN1cmVzLmxlbmd0aH1gKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fbWVhc3VyZWRFdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gQWRkaW5nICR7dGhpcy5fbWVhc3VyZWRFdmVudHMubGVuZ3RofSBpbi1tZW1vcnkgZXZlbnRzYClcbiAgICAgICAgICAgICAgICBtZWFzdXJlcyA9IG1lYXN1cmVzLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZWRFdmVudHMubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBQZXJmb3JtYW5jZUVudHJ5IHRvIHBsYWluIG9iamVjdCBpZiBpdCBoYXMgdG9KU09OXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChlIGFzIFBlcmZvcm1hbmNlRW50cnkpLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSBhcyBQZXJmb3JtYW5jZUVudHJ5KS50b0pTT04oKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbnN1cmVFcG9jaFRpbWVzID0gKGFycjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAgICAgICAgICAgICBjb25zdCBjdXRvZmYgPSAxZTEyIC8vIH55ZWFyIDIwMDEsIG1zIGVwb2NoXG4gICAgICAgICAgICAgICAgY29uc3QgdGltZU9yaWdpbiA9IChcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UudGltZU9yaWdpbiA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgID8gcGVyZm9ybWFuY2UudGltZU9yaWdpblxuICAgICAgICAgICAgICAgICAgICA6IChub3cgLSBwcm9jZXNzLnVwdGltZSgpICogMTAwMClcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyLm1hcChlbnRyeSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkuc3RhcnRUaW1lID09PSAnbnVtYmVyJyAmJiBlbnRyeS5zdGFydFRpbWUgPCBjdXRvZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0VGltZSA9IHRpbWVPcmlnaW4gKyBlbnRyeS5zdGFydFRpbWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWVhc3VyZXMgPSBlbnN1cmVFcG9jaFRpbWVzKG1lYXN1cmVzKVxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICAgICAgICAgIC8vIHl5eXktTU0tZGQnVCdISDptbTpzcy5TU1NTU1MgWlxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdGltZVpvbmU6ICdVVEMnLFxuICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIGRheTogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOiAzLCAvLyBUbyBpbmNsdWRlIG1pY3Jvc2Vjb25kc1xuICAgICAgICAgICAgICAgIGhvdXIxMjogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZvcm1hdCB0aGUgZGF0ZSBhbmQgcmVwbGFjZSB0aGUgZGVmYXVsdCBzZXBhcmF0b3IgZm9yIHRpbWUgem9uZVxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbi1HQicsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgLmZvcm1hdFRvUGFydHMoZGF0ZSlcbiAgICAgICAgICAgICAgICAubWFwKCh7IHR5cGUsIHZhbHVlIH0pID0+IHR5cGUgPT09ICd0aW1lWm9uZU5hbWUnID8gJ1onIDogdmFsdWUpXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJywnLCAnVCcpXG5cbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfS0VZX01FVFJJQ1NfUFJFUEFSQVRJT04sIHRydWUpXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdzZGtfZXZlbnRzJyxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RodWJfdXVpZDogcHJvY2Vzcy5lbnYuUEVSRl9URVNUSFVCX1VVSUQgfHwgcHJvY2Vzcy5lbnYuU0RLX1JVTl9JRCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZF9kYXk6IGZvcm1hdHRlZERhdGUsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X25hbWU6ICdTREtGZWF0dXJlUGVyZm9ybWFuY2UnLFxuICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGE6IHByb2Nlc3MuZW52LlBFUkZfVVNFUl9OQU1FLFxuICAgICAgICAgICAgICAgICAgICBob3N0X2luZm86IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiBob3N0bmFtZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06IHBsYXRmb3JtKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmNoOiBhcmNoKClcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X2pzb246IHsgbWVhc3VyZXM6IG1lYXN1cmVzLCBzZGtSdW5JZDogcHJvY2Vzcy5lbnYuU0RLX1JVTl9JRCB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hXcmFwKGAke0FQSVV0aWxzLkVEU19VUkx9L3NlbmRfc2RrX2V2ZW50c2AsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIFN1Y2Nlc3NmdWxseSB1cGxvYWRlZCB0byBFRFM6ICR7dXRpbC5mb3JtYXQoYXdhaXQgcmVzdWx0LnRleHQoKSl9YClcblxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19TRU5EX0tFWV9NRVRSSUNTLCB0cnVlKVxuICAgICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBGYWlsZWQgdG8gdXBsb2FkIGV2ZW50czogJHt1dGlsLmZvcm1hdChlcil9YClcbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfS0VZX01FVFJJQ1NfUFJFUEFSQVRJT04sIGZhbHNlLCBlcilcbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfU0VORF9LRVlfTUVUUklDUywgZmFsc2UsIGVyKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBmc1Byb21pc2UuYWNjZXNzKHRoaXMuanNvblJlcG9ydERpclBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSwgKCkgPT4gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmc1Byb21pc2UucmVhZGRpcih0aGlzLmpzb25SZXBvcnREaXJQYXRoKVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzUHJvbWlzZS51bmxpbmsocGF0aC5qb2luKHRoaXMuanNvblJlcG9ydERpclBhdGgsIGZpbGUpKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gQ2xlYW5lZCB1cCAke2ZpbGVzLmxlbmd0aH0gdGVtcG9yYXJ5IHJlcG9ydCBmaWxlc2ApXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIEZhaWxlZCB0byBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzOiAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQgbG9nZ2VyIGZyb20gJ0B3ZGlvL2xvZ2dlcidcblxuaW1wb3J0IHsgTE9HU19GSUxFIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tICcuL3V0aWwuanMnXG5cbmNvbnN0IGxvZyA9IGxvZ2dlcignQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2UnKVxuXG5leHBvcnQgY2xhc3MgQlN0YWNrTG9nZ2VyIHtcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIExPR1NfRklMRSlcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZvbGRlclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnKVxuICAgIHByaXZhdGUgc3RhdGljIGxvZ0ZpbGVTdHJlYW06IGZzLldyaXRlU3RyZWFtIHwgbnVsbFxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVkYWN0Q3JlZGVudGlhbHMobG9nTWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGxvZ01lc3NhZ2VcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oW1wiJ10/KD86dXNlcm5hbWV8dXNlck5hbWV8YWNjZXNza2V5fGFjY2Vzc0tleXx1c2VyfGtleSlbXCInXT9cXHMqWzo9XVxccypbXCInXT8pKFteXCInXFxzLH1dKykvZ2ksICckMScpXG4gICAgICAgICAgICAucmVwbGFjZSgvKFs/Jl0oPzp1c2VybmFtZXx1c2VyTmFtZXxhY2Nlc3Nfa2V5fGFjY2Vzc2tleXxhY2Nlc3NLZXl8dXNlcnxrZXkpPSkoW14mI1xcc10rKS9naSwgJyQxJylcbiAgICB9XG5cbiAgICBzdGF0aWMgbG9nVG9GaWxlKGxvZ01lc3NhZ2U6IHN0cmluZywgbG9nTGV2ZWw6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhsb2dNZXNzYWdlKVxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuc3VyZUxvZ3NGb2xkZXIoKVxuICAgICAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRoaXMubG9nRmlsZVBhdGgsIHsgZmxhZ3M6ICdhJyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubG9nRmlsZVN0cmVhbSAmJiB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGUodGhpcy5mb3JtYXRMb2cocmVkYWN0ZWRNZXNzYWdlLCBsb2dMZXZlbCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYEZhaWxlZCB0byBsb2cgdG8gZmlsZS4gRXJyb3IgJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0TG9nKGxvZ01lc3NhZ2U6IHN0cmluZywgbGV2ZWw6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYCR7Y2hhbGsuZ3JheShuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpfSAke2NoYWxrW0NPTE9SU1tsZXZlbF1dKGxldmVsLnRvVXBwZXJDYXNlKCkpfSAke2NoYWxrLndoaXRlQnJpZ2h0KCdAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZScpfSAke2xvZ01lc3NhZ2V9XFxuYFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICdpbmZvJylcbiAgICAgICAgbG9nLmluZm8ocmVkYWN0ZWRNZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJlZGFjdGVkTWVzc2FnZSA9IHRoaXMucmVkYWN0Q3JlZGVudGlhbHMobWVzc2FnZSlcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUocmVkYWN0ZWRNZXNzYWdlLCAnZXJyb3InKVxuICAgICAgICBsb2cuZXJyb3IocmVkYWN0ZWRNZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBwYXJhbT86IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICdkZWJ1ZycpXG4gICAgICAgIGlmIChwYXJhbSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKHJlZGFjdGVkTWVzc2FnZSwgcGFyYW0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cuZGVidWcocmVkYWN0ZWRNZXNzYWdlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ3dhcm4nKVxuICAgICAgICBsb2cud2FybihyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0cmFjZShtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICd0cmFjZScpXG4gICAgICAgIGxvZy50cmFjZShyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckxvZ2dlcigpIHtcbiAgICAgICAgaWYgKHRoaXMubG9nRmlsZVN0cmVhbSkge1xuICAgICAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtLmVuZCgpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtID0gbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJMb2dGaWxlKCkge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLmxvZ0ZpbGVQYXRoKSkge1xuICAgICAgICAgICAgZnMudHJ1bmNhdGVTeW5jKHRoaXMubG9nRmlsZVBhdGgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGVuc3VyZUxvZ3NGb2xkZXIoKSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmxvZ0ZvbGRlclBhdGgpKXtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyh0aGlzLmxvZ0ZvbGRlclBhdGgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAie1xuICBcIm5hbWVcIjogXCJAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZVwiLFxuICBcInZlcnNpb25cIjogXCI5LjMyLjBcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIldlYmRyaXZlcklPIHNlcnZpY2UgZm9yIGJldHRlciBCcm93c2Vyc3RhY2sgaW50ZWdyYXRpb25cIixcbiAgXCJhdXRob3JcIjogXCJCcm93c2VyU3RhY2sgPHN1cHBvcnRAYnJvd3NlcnN0YWNrLmNvbT5cIixcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9icm93c2Vyc3RhY2svd2Rpby1icm93c2Vyc3RhY2stc2VydmljZVwiLFxuICBcImxpY2Vuc2VcIjogXCJNSVRcIixcbiAgXCJlbmdpbmVzXCI6IHtcbiAgICBcIm5vZGVcIjogXCI+PTE4LjIwLjBcIlxuICB9LFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9icm93c2Vyc3RhY2svd2Rpby1icm93c2Vyc3RhY2stc2VydmljZS5naXRcIixcbiAgICBcImRpcmVjdG9yeVwiOiBcInBhY2thZ2VzL2Jyb3dzZXJzdGFjay1zZXJ2aWNlXCJcbiAgfSxcbiAgXCJrZXl3b3Jkc1wiOiBbXG4gICAgXCJ3ZWJkcml2ZXJpb1wiLFxuICAgIFwid2Rpb1wiLFxuICAgIFwiYnJvd3NlcnN0YWNrXCIsXG4gICAgXCJ3ZGlvLXNlcnZpY2VcIlxuICBdLFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJzdGFjay93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlL2lzc3Vlc1wiXG4gIH0sXG4gIFwidHlwZVwiOiBcIm1vZHVsZVwiLFxuICBcInR5cGVzXCI6IFwiLi9idWlsZC9pbmRleC5kLnRzXCIsXG4gIFwiZXhwb3J0c1wiOiB7XG4gICAgXCIuXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2J1aWxkL2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9idWlsZC9pbmRleC5qc1wiXG4gICAgfSxcbiAgICBcIi4vY2xlYW51cFwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9idWlsZC9jbGVhbnVwLmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9idWlsZC9jbGVhbnVwLmpzXCIsXG4gICAgICBcInNvdXJjZVwiOiBcIi4vc3JjL2NsZWFudXAudHNcIlxuICAgIH1cbiAgfSxcbiAgXCJ0eXBlU2NyaXB0VmVyc2lvblwiOiBcIjMuOC4zXCIsXG4gIFwiZmlsZXNcIjogW1xuICAgIFwiYnVpbGRcIixcbiAgICBcInNyYy9wcm90by8qKi8qLnByb3RvXCIsXG4gICAgXCJicm93c2Vyc3RhY2stc2VydmljZS5kLnRzXCIsXG4gICAgXCJSRUFETUUubWRcIixcbiAgICBcIkxJQ0VOU0VcIlxuICBdLFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiY2xlYW5cIjogXCJyaW1yYWYgLi9idWlsZCBzcmMvZ3JwYy9nZW5lcmF0ZWRcIixcbiAgICBcImdlbmVyYXRlXCI6IFwiYnVmIGdlbmVyYXRlXCIsXG4gICAgXCJidWlsZFwiOiBcInJpbXJhZiAuL2J1aWxkIHNyYy9ncnBjL2dlbmVyYXRlZCAmJiBidWYgZ2VuZXJhdGUgJiYgbm9kZSAuL3NjcmlwdHMvYnVpbGQubWpzICYmIHRzYyAtcCB0c2NvbmZpZy5wcm9kLmpzb25cIixcbiAgICBcImJ1aWxkOndhdGNoXCI6IFwibm9kZSAuL3NjcmlwdHMvYnVpbGQubWpzIC0td2F0Y2hcIixcbiAgICBcInRlc3RcIjogXCJ2aXRlc3QgLS1ydW5cIixcbiAgICBcInRlc3Q6d2F0Y2hcIjogXCJ2aXRlc3RcIixcbiAgICBcInByZXBhY2tcIjogXCJucG0gcnVuIGJ1aWxkXCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGJyb3dzZXJzdGFjay9haS1zZGstbm9kZVwiOiBcIjEuNS4xN1wiLFxuICAgIFwiQGJ1ZmJ1aWxkL3Byb3RvYnVmXCI6IFwiXjIuNS4yXCIsXG4gICAgXCJAZ3JwYy9ncnBjLWpzXCI6IFwiMS4xMy4zXCIsXG4gICAgXCJAcGVyY3kvYXBwaXVtLWFwcFwiOiBcIl4yLjAuOVwiLFxuICAgIFwiQHBlcmN5L3NlbGVuaXVtLXdlYmRyaXZlclwiOiBcIl4yLjIuMlwiLFxuICAgIFwiQHR5cGVzL2dpdGNvbmZpZ2xvY2FsXCI6IFwiXjIuMC4xXCIsXG4gICAgXCJicm93c2Vyc3RhY2stbG9jYWxcIjogXCJeMS41LjFcIixcbiAgICBcImNoYWxrXCI6IFwiXjUuMy4wXCIsXG4gICAgXCJjc3Ytd3JpdGVyXCI6IFwiXjEuNi4wXCIsXG4gICAgXCJnaXQtcmVwby1pbmZvXCI6IFwiXjIuMS4xXCIsXG4gICAgXCJnaXRjb25maWdsb2NhbFwiOiBcIl4yLjEuMFwiLFxuICAgIFwiZ2xvYlwiOiBcIl4xMS4wLjBcIixcbiAgICBcInRhclwiOiBcIl43LjUuMTFcIixcbiAgICBcInVuZGljaVwiOiBcIl42LjI0LjBcIixcbiAgICBcInV1aWRcIjogXCJeMTEuMS4wXCIsXG4gICAgXCJ3aW5zdG9uLXRyYW5zcG9ydFwiOiBcIl40LjUuMFwiLFxuICAgIFwieWF1emxcIjogXCJeMy40LjBcIixcbiAgICBcIkB3ZGlvL2xvZ2dlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vcmVwb3J0ZXJcIjogXCJeOS4wLjBcIixcbiAgICBcIkB3ZGlvL3R5cGVzXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJ3ZWJkcml2ZXJpb1wiOiBcIl45LjAuMFwiXG4gIH0sXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAd2Rpby9jbGlcIjogXCJeNS4wLjAgfHwgXjYuMC4wIHx8IF43LjAuMCB8fCBeOC4wLjAgfHwgXjkuMC4wXCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGJ1ZmJ1aWxkL2J1ZlwiOiBcIl4xLjU1LjFcIixcbiAgICBcIkBjaGFuZ2VzZXRzL2NsaVwiOiBcIl4yLjI3LjlcIixcbiAgICBcIkB0eXBlcy9ub2RlXCI6IFwiXjIwLjEuMFwiLFxuICAgIFwiQHR5cGVzL3RhclwiOiBcIl43LjAuODdcIixcbiAgICBcIkB0eXBlcy95YXV6bFwiOiBcIl4yLjEwLjNcIixcbiAgICBcIkB3ZGlvL2dsb2JhbHNcIjogXCJeOS4wLjBcIixcbiAgICBcIkB3ZGlvL2xvZ2dlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vcmVwb3J0ZXJcIjogXCJeOS4wLjBcIixcbiAgICBcIkB3ZGlvL3R5cGVzXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJlc2J1aWxkXCI6IFwiXjAuMjcuMlwiLFxuICAgIFwicmltcmFmXCI6IFwiXjYuMC4xXCIsXG4gICAgXCJ0cy1wcm90b1wiOiBcIl4yLjcuNVwiLFxuICAgIFwidHlwZXNjcmlwdFwiOiBcIl41LjguM1wiLFxuICAgIFwidml0ZXN0XCI6IFwiXjMuMi40XCIsXG4gICAgXCJ3ZWJkcml2ZXJpb1wiOiBcIl45LjAuMFwiXG4gIH0sXG4gIFwicHVibGlzaENvbmZpZ1wiOiB7XG4gICAgXCJhY2Nlc3NcIjogXCJwdWJsaWNcIlxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCcm93c2Vyc3RhY2tDb25maWcgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nIHdpdGggeyB0eXBlOiAnanNvbicgfVxuXG5jb25zdCBic3RhY2tTZXJ2aWNlVmVyc2lvbiA9IHBrZy52ZXJzaW9uXG5cbmV4cG9ydCBjb25zdCBCUk9XU0VSX0RFU0NSSVBUSU9OID0gW1xuICAgICdkZXZpY2UnLFxuICAgICdvcycsXG4gICAgJ29zVmVyc2lvbicsXG4gICAgJ29zX3ZlcnNpb24nLFxuICAgICdicm93c2VyTmFtZScsXG4gICAgJ2Jyb3dzZXInLFxuICAgICdicm93c2VyVmVyc2lvbicsXG4gICAgJ2Jyb3dzZXJfdmVyc2lvbidcbl0gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IFZBTElEX0FQUF9FWFRFTlNJT04gPSBbXG4gICAgJy5hcGsnLFxuICAgICcuYWFiJyxcbiAgICAnLmlwYSdcbl1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1BUSU9OUzogUGFydGlhbDxCcm93c2Vyc3RhY2tDb25maWc+ID0ge1xuICAgIHNldFNlc3Npb25OYW1lOiB0cnVlLFxuICAgIHNldFNlc3Npb25TdGF0dXM6IHRydWUsXG4gICAgdGVzdE9ic2VydmFiaWxpdHk6IHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnNvbGVIb2xkZXI6IHR5cGVvZiBjb25zb2xlID0gT2JqZWN0LmFzc2lnbih7fSwgY29uc29sZSlcblxuZXhwb3J0IGNvbnN0IERBVEFfRU5EUE9JTlQgPSAnaHR0cHM6Ly9jb2xsZWN0b3Itb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuZXhwb3J0IGNvbnN0IEFQUF9BTExZX0VORFBPSU5UID0gJ2h0dHBzOi8vYXBwLWFjY2Vzc2liaWxpdHkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZSdcbmV4cG9ydCBjb25zdCBBUFBfQUxMWV9JU1NVRVNfRU5EUE9JTlQgPSAnYXBpL3YxL2lzc3VlcydcbmV4cG9ydCBjb25zdCBBUFBfQUxMWV9JU1NVRVNfU1VNTUFSWV9FTkRQT0lOVCA9ICdhcGkvdjEvaXNzdWVzLXN1bW1hcnknXG5leHBvcnQgY29uc3QgREFUQV9FVkVOVF9FTkRQT0lOVCA9ICdhcGkvdjEvZXZlbnQnXG5leHBvcnQgY29uc3QgREFUQV9CQVRDSF9FTkRQT0lOVCA9ICdhcGkvdjEvYmF0Y2gnXG5leHBvcnQgY29uc3QgREFUQV9TQ1JFRU5TSE9UX0VORFBPSU5UID0gJ2FwaS92MS9zY3JlZW5zaG90cydcbmV4cG9ydCBjb25zdCBEQVRBX0JBVENIX1NJWkUgPSAxMDAwXG5leHBvcnQgY29uc3QgREFUQV9CQVRDSF9JTlRFUlZBTCA9IDIwMDBcbmV4cG9ydCBjb25zdCBCQVRDSF9FVkVOVF9UWVBFUyA9IFsnTG9nQ3JlYXRlZCcsICdUZXN0UnVuU3RhcnRlZCcsICdUZXN0UnVuRmluaXNoZWQnLCAnSG9va1J1bkZpbmlzaGVkJywgJ0hvb2tSdW5TdGFydGVkJywgJ1NjcmVlbnNob3RDcmVhdGVkJ11cbmV4cG9ydCBjb25zdCBERUZBVUxUX1dBSVRfVElNRU9VVF9GT1JfUEVORElOR19VUExPQURTID0gNTAwMCAvLyA1c1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0FJVF9JTlRFUlZBTF9GT1JfUEVORElOR19VUExPQURTID0gMTAwIC8vIDEwMG1zXG5leHBvcnQgY29uc3QgQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTiA9IGJzdGFja1NlcnZpY2VWZXJzaW9uXG5cbmV4cG9ydCBjb25zdCBOT1RfQUxMT1dFRF9LRVlTX0lOX0NBUFMgPSBbJ2luY2x1ZGVUYWdzSW5UZXN0aW5nU2NvcGUnLCAnZXhjbHVkZVRhZ3NJblRlc3RpbmdTY29wZScsICd0ZXN0TWFuYWdlbWVudE9wdGlvbnMnLCAnc2tpcEFwcE92ZXJyaWRlJ11cbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVF9QTEFOX0lEID0gJ0JST1dTRVJTVEFDS19URVNUX1BMQU5fSUQnXG5cbmV4cG9ydCBjb25zdCBMT0dTX0ZJTEUgPSAnbG9ncy9ic3RhY2std2Rpby1zZXJ2aWNlLmxvZydcbmV4cG9ydCBjb25zdCBDTElfREVCVUdfTE9HU19GSUxFID0gJ2xvZy9zZGstY2xpLWRlYnVnLmxvZydcbmV4cG9ydCBjb25zdCBVUExPQURfTE9HU19BRERSRVNTID0gJ2h0dHBzOi8vdXBsb2FkLW9ic2VydmFiaWxpdHkuYnJvd3NlcnN0YWNrLmNvbSdcbmV4cG9ydCBjb25zdCBVUExPQURfTE9HU19FTkRQT0lOVCA9ICdjbGllbnQtbG9ncy91cGxvYWQnXG5cbmV4cG9ydCBjb25zdCBQRVJDWV9MT0dTX0ZJTEUgPSAnbG9ncy9wZXJjeS5sb2cnXG5cbmV4cG9ydCBjb25zdCBQRVJDWV9ET01fQ0hBTkdJTkdfQ09NTUFORFNfRU5EUE9JTlRTID0gW1xuICAgICcvc2Vzc2lvbi86c2Vzc2lvbklkL3VybCcsXG4gICAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvZm9yd2FyZCcsXG4gICAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYmFjaycsXG4gICAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvcmVmcmVzaCcsXG4gICAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvc2NyZWVuc2hvdCcsXG4gICAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYWN0aW9ucycsXG4gICAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvYXBwaXVtL2RldmljZS9zaGFrZSdcbl1cblxuZXhwb3J0IGNvbnN0IENBUFRVUkVfTU9ERVMgPSBbJ2NsaWNrJywgJ2F1dG8nLCAnc2NyZWVuc2hvdCcsICdtYW51YWwnLCAndGVzdGNhc2UnXVxuZXhwb3J0IGNvbnN0IExPR19LSU5EX1VTQUdFX01BUCA9IHtcbiAgICAnVEVTVF9MT0cnOiAnbG9nJyxcbiAgICAnVEVTVF9TQ1JFRU5TSE9UJzogJ3NjcmVlbnNob3QnLFxuICAgICdURVNUX1NURVAnOiAnc3RlcCcsXG4gICAgJ0hUVFAnOiAnaHR0cCdcbn1cblxuZXhwb3J0IGNvbnN0IEZVTk5FTF9JTlNUUlVNRU5UQVRJT05fVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20vc2RrL3YxL2V2ZW50J1xuXG5leHBvcnQgY29uc3QgRURTX1VSTCA9ICdodHRwczovL2Vkcy5icm93c2Vyc3RhY2suY29tJ1xuXG5leHBvcnQgY29uc3QgU1VQUE9SVEVEX0JST1dTRVJTX0ZPUl9BSSA9IFsnY2hyb21lJywgJ21pY3Jvc29mdGVkZ2UnLCAnZmlyZWZveCddXG5cbmV4cG9ydCBjb25zdCBUQ0dfVVJMID0gJ2h0dHBzOi8vdGNnLmJyb3dzZXJzdGFjay5jb20nXG5cbmV4cG9ydCBjb25zdCBUQ0dfSU5GTyA9IHtcbiAgICB0Y2dSZWdpb246ICd1c2UnLFxuICAgIHRjZ1VybDogVENHX1VSTCxcbn1cblxuLy8gU21hcnQgU2VsZWN0aW9uIE1vZGUgQ29uc3RhbnRzXG5leHBvcnQgY29uc3QgU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1QgPSAncmVsZXZhbnRGaXJzdCdcbmV4cG9ydCBjb25zdCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9PTkxZID0gJ3JlbGV2YW50T25seSdcblxuLy8gRW52IHZhcmlhYmxlcyAtIERlZmluZSBhbGwgdGhlIGVudiB2YXJpYWJsZSBjb25zdGFudHMgb3ZlciBoZXJlXG5cbi8vIFRvIHN0b3JlIHRoZSBKV1QgdG9rZW4gcmV0dXJuZWQgdGhlIHNlc3Npb24gbGF1bmNoXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUID0gJ0JST1dTRVJTVEFDS19URVNUSFVCX0pXVCdcblxuLy8gVG8gc3RvcmUgdGNnIGF1dGggcmVzdWx0IGZvciBzZWxmSGVhbGluZyBmZWF0dXJlOlxuZXhwb3J0IGNvbnN0IEJTVEFDS19UQ0dfQVVUSF9SRVNVTFQgPSAnQlNUQUNLX1RDR19BVVRIX1JFU1VMVCdcblxuLy8gVG8gc3RvcmUgdGhlIHNldHRpbmcgb2Ygd2hldGhlciB0byBzZW5kIHNjcmVlbnNob3RzIG9yIG5vdFxuZXhwb3J0IGNvbnN0IFRFU1RPUFNfU0NSRUVOU0hPVF9FTlYgPSAnQlNfVEVTVE9QU19BTExPV19TQ1JFRU5TSE9UUydcblxuLy8gVG8gc3RvcmUgYnVpbGQgaGFzaGVkIGlkXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRCA9ICdCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEJ1xuXG4vLyBUbyBzdG9yZSB0ZXN0IHJ1biB1dWlkXG5leHBvcnQgY29uc3QgVEVTVF9BTkFMWVRJQ1NfSUQgPSAnVEVTVF9BTkFMWVRJQ1NfSUQnXG5cbi8vIFdoZXRoZXIgdG8gY29sbGVjdCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24gb3Igbm90XG5leHBvcnQgY29uc3QgUEVSRl9NRUFTVVJFTUVOVF9FTlYgPSAnQlJPV1NFUlNUQUNLX08xMVlfUEVSRl9NRUFTVVJFTUVOVCdcblxuLy8gV2hldGhlciB0aGUgY3VycmVudCBydW4gaXMgcmVydW4gb3Igbm90XG5leHBvcnQgY29uc3QgUkVSVU5fVEVTVFNfRU5WID0gJ0JST1dTRVJTVEFDS19SRVJVTl9URVNUUydcblxuLy8gVGhlIHRlc3RzIHRoYXQgbmVlZHMgdG8gYmUgcmVydW5cbmV4cG9ydCBjb25zdCBSRVJVTl9FTlYgPSAnQlJPV1NFUlNUQUNLX1JFUlVOJ1xuXG4vLyBUbyBzdG9yZSB3aGV0aGVyIHRoZSBidWlsZCBsYXVuY2ggaGFzIGNvbXBsZXRlZCBvciBub3RcbmV4cG9ydCBjb25zdCBURVNUT1BTX0JVSUxEX0NPTVBMRVRFRF9FTlYgPSAnQlNfVEVTVE9QU19CVUlMRF9DT01QTEVURUQnXG5cbi8vIFdoZXRoZXIgcGVyY3kgaGFzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdFxuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19QRVJDWSA9ICdCUk9XU0VSU1RBQ0tfUEVSQ1knXG5cbi8vIFdoZXRoZXIgc2Vzc2lvbiBpcyBhIGFjY2Vzc2liaWxpdHkgc2Vzc2lvblxuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZID0gJ0JST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZJ1xuXG4vLyBXaGV0aGVyIHNlc3Npb24gaXMgYSB0ZXN0IHJlcG9ydGluZyBzZXNzaW9uXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFkgPSAnQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFknXG5cbi8vIExvYWQgVGVzdGluZyBTZXJ2aWNlIChMVFMpIGVudiB2YXJzOiB0aGUgcG9kLWl0ZXJhdGlvbiBzZXNzaW9uIGlkIChpdHNcbi8vIHByZXNlbmNlIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBcInRoaXMgcnVuIGlzIGFuIExUUyBwb2Rcbi8vIGl0ZXJhdGlvblwiKSBhbmQgYW4gb3B0aW9uYWwgb3B0LWluIGZsYWcgZm9yIGxvY2FsIHJlcHJvIC8gQ0kgcnVucyB0aGF0XG4vLyBkb24ndCBoYXZlIGEgcmVhbCBzZXNzaW9uIGlkLlxuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRCA9ICdCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQnXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0xUUyA9ICdCUk9XU0VSU1RBQ0tfTFRTJ1xuXG4vLyBOZXcgVGVzdCBSZXBvcnRpbmcgYW5kIEFuYWx5dGljcyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVF9SRVBPUlRJTkcgPSAnQlJPV1NFUlNUQUNLX1RFU1RfUkVQT1JUSU5HJ1xuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUX1JFUE9SVElOR19ERUJVRyA9ICdCUk9XU0VSU1RBQ0tfVEVTVF9SRVBPUlRJTkdfREVCVUcnXG5leHBvcnQgY29uc3QgVEVTVF9SRVBPUlRJTkdfQlVJTERfVEFHID0gJ1RFU1RfUkVQT1JUSU5HX0JVSUxEX1RBRydcbmV4cG9ydCBjb25zdCBURVNUX1JFUE9SVElOR19QUk9KRUNUX05BTUUgPSAnVEVTVF9SRVBPUlRJTkdfUFJPSkVDVF9OQU1FJ1xuZXhwb3J0IGNvbnN0IFRFU1RfUkVQT1JUSU5HX0JVSUxEX05BTUUgPSAnVEVTVF9SRVBPUlRJTkdfQlVJTERfTkFNRSdcblxuLy8gTWF4aW11bSBzaXplIG9mIFZDUyBpbmZvIHdoaWNoIGlzIGFsbG93ZWRcbmV4cG9ydCBjb25zdCBNQVhfR0lUX01FVEFfREFUQV9TSVpFX0lOX0JZVEVTID0gNjQgKiAxMDI0XG5cbi8qIFRoZSB2YWx1ZSB0byBiZSBhcHBlbmRlZCBhdCB0aGUgZW5kIGlmIGdpdCBtZXRhZGF0YSBpcyBsYXJnZXIgdGhhbiBNQVhfR0lUX01FVEFfREFUQV9TSVpFX0lOX0JZVEVTXG4qL1xuZXhwb3J0IGNvbnN0IEdJVF9NRVRBX0RBVEFfVFJVTkNBVEVEID0gJy4uLltUUlVOQ0FURURdJ1xuXG4vLyBDTEkgcmVsYXRlZCBjb25zdGFudHNcbmV4cG9ydCBjb25zdCBDTElfU1RPUF9USU1FT1VUID0gNTAwMCAvLyA1IHNlY29uZHNcbmV4cG9ydCBjb25zdCBCSU5BUllfQlVTWV9FUlJPUl9DT0RFUyA9IFsnRVRYVEJTWScsICdFQlVTWSddXG5leHBvcnQgY29uc3QgTUFYX1NQQVdOX1JFVFJJRVMgPSAzXG5leHBvcnQgY29uc3QgU1BBV05fUkVUUllfREVMQVlfTVMgPSAxMDAwXG5leHBvcnQgY29uc3QgV0RJT19OQU1JTkdfUFJFRklYID0gJ1dlYmRyaXZlcklPLSdcbmV4cG9ydCBjb25zdCBQRVJGX01FVFJJQ1NfV0FJVF9USU1FID0gMjAwMFxuXG4vLyBBUEkgRW5kcG9pbnQgY29uc3RhbnRzXG5leHBvcnQgY29uc3QgVVBEQVRFRF9DTElfRU5EUE9JTlQgPSAnc2RrL3YxL3VwZGF0ZV9jbGknXG5cbi8qKlxuICogTW9kdWxlIEhvb2sgRXZlbnRzIC0gUGVyZm9ybWFuY2UgZXZlbnQgbmFtZXMgZm9yIG1vZHVsZSBsaWZlY3ljbGUgdHJhY2tpbmdcbiAqIFVzZWQgYnkgbW9kdWxlLWhvb2stdHJhY2tlci50cyB0byBpbnN0cnVtZW50IG1vZHVsZSBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cFxuICovXG5leHBvcnQgY29uc3QgTU9EVUxFX0hPT0tfRVZFTlRTID0ge1xuICAgIC8vIEluc3RydW1lbnRhdGlvbiBtb2R1bGVcbiAgICBJTlNUUlVNRU5UQVRJT05fT05fU1RBUlQ6ICdNT0RVTEVfSU5TVFJVTUVOVEFUSU9OX09OX1NUQVJUJyxcbiAgICBJTlNUUlVNRU5UQVRJT05fT05fU1RPUDogJ01PRFVMRV9JTlNUUlVNRU5UQVRJT05fT05fU1RPUCcsXG5cbiAgICAvLyBUZXN0SHViIG1vZHVsZVxuICAgIFRFU1RIVUJfT05fU1RBUlQ6ICdNT0RVTEVfVEVTVEhVQl9PTl9TVEFSVCcsXG4gICAgVEVTVEhVQl9PTl9TVE9QOiAnTU9EVUxFX1RFU1RIVUJfT05fU1RPUCcsXG5cbiAgICAvLyBPYnNlcnZhYmlsaXR5IG1vZHVsZVxuICAgIE9CU0VSVkFCSUxJVFlfT05fU1RBUlQ6ICdNT0RVTEVfT0JTRVJWQUJJTElUWV9PTl9TVEFSVCcsXG4gICAgT0JTRVJWQUJJTElUWV9PTl9TVE9QOiAnTU9EVUxFX09CU0VSVkFCSUxJVFlfT05fU1RPUCcsXG5cbiAgICAvLyBQZXJjeSBtb2R1bGVcbiAgICBQRVJDWV9PTl9TVEFSVDogJ01PRFVMRV9QRVJDWV9PTl9TVEFSVCcsXG4gICAgUEVSQ1lfT05fU1RPUDogJ01PRFVMRV9QRVJDWV9PTl9TVE9QJyxcblxuICAgIC8vIEFjY2Vzc2liaWxpdHkgbW9kdWxlXG4gICAgQUNDRVNTSUJJTElUWV9PTl9TVEFSVDogJ01PRFVMRV9BQ0NFU1NJQklMSVRZX09OX1NUQVJUJyxcbiAgICBBQ0NFU1NJQklMSVRZX09OX1NUT1A6ICdNT0RVTEVfQUNDRVNTSUJJTElUWV9PTl9TVE9QJyxcbiAgICBBQ0NFU1NJQklMSVRZX09OX0RSSVZFUl9JTklUOiAnTU9EVUxFX0FDQ0VTU0lCSUxJVFlfT05fRFJJVkVSX0lOSVQnLFxuXG4gICAgLy8gQUkgbW9kdWxlXG4gICAgQUlfT05fU1RBUlQ6ICdNT0RVTEVfQUlfT05fU1RBUlQnLFxuICAgIEFJX09OX1NUT1A6ICdNT0RVTEVfQUlfT05fU1RPUCcsXG4gICAgQUlfQkVGT1JFX1NFU1NJT046ICdNT0RVTEVfQUlfQkVGT1JFX1NFU1NJT04nLFxuICAgIEFJX09OX0RSSVZFUl9JTklUOiAnTU9EVUxFX0FJX09OX0RSSVZFUl9JTklUJyxcblxuICAgIC8vIExvY2FsIHRlc3RpbmcgbW9kdWxlXG4gICAgTE9DQUxfT05fU1RBUlQ6ICdNT0RVTEVfTE9DQUxfT05fU1RBUlQnLFxuICAgIExPQ0FMX09OX1NUT1A6ICdNT0RVTEVfTE9DQUxfT05fU1RPUCcsXG4gICAgTE9DQUxfSU5JVF9TRVNTSU9OOiAnTU9EVUxFX0xPQ0FMX0lOSVRfU0VTU0lPTicsXG4gICAgTE9DQUxfT05fRFJJVkVSX0lOSVQ6ICdNT0RVTEVfTE9DQUxfT05fRFJJVkVSX0lOSVQnLFxuXG4gICAgLy8gQXBwIEF1dG9tYXRlIG1vZHVsZVxuICAgIEFQUEFVVE9NQVRFX09OX1NUQVJUOiAnTU9EVUxFX0FQUEFVVE9NQVRFX09OX1NUQVJUJyxcbiAgICBBUFBBVVRPTUFURV9PTl9EUklWRVJfSU5JVDogJ01PRFVMRV9BUFBBVVRPTUFURV9PTl9EUklWRVJfSU5JVCcsXG59IGFzIGNvbnN0XG4iLCAiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQVBJVXRpbHMge1xuICAgIHN0YXRpYyBGVU5ORUxfSU5TVFJVTUVOVEFUSU9OX1VSTCA9ICdodHRwczovL2FwaS5icm93c2Vyc3RhY2suY29tL3Nkay92MS9ldmVudCdcbiAgICBzdGF0aWMgQlJPV1NFUlNUQUNLX0FVVE9NQVRFX0FQSV9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbSdcbiAgICBzdGF0aWMgQlJPV1NFUlNUQUNLX0FBX0FQSV9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbSdcbiAgICBzdGF0aWMgQlJPV1NFUlNUQUNLX1BFUkNZX0FQSV9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbSdcbiAgICBzdGF0aWMgQlJPV1NFUlNUQUNLX0FVVE9NQVRFX0FQSV9DTE9VRF9VUkwgPSAnaHR0cHM6Ly9hcGktY2xvdWQuYnJvd3NlcnN0YWNrLmNvbSdcbiAgICBzdGF0aWMgQlJPV1NFUlNUQUNLX0FBX0FQSV9DTE9VRF9VUkwgPSAnaHR0cHM6Ly9hcGktY2xvdWQuYnJvd3NlcnN0YWNrLmNvbSdcbiAgICBzdGF0aWMgQVBQX0FMTFlfRU5EUE9JTlQgPSAnaHR0cHM6Ly9hcHAtYWNjZXNzaWJpbGl0eS5icm93c2Vyc3RhY2suY29tL2F1dG9tYXRlJ1xuICAgIHN0YXRpYyBEQVRBX0VORFBPSU5UID0gJ2h0dHBzOi8vY29sbGVjdG9yLW9ic2VydmFiaWxpdHkuYnJvd3NlcnN0YWNrLmNvbSdcbiAgICBzdGF0aWMgVVBMT0FEX0xPR1NfQUREUkVTUyA9ICdodHRwczovL3VwbG9hZC1vYnNlcnZhYmlsaXR5LmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEVEU19VUkwgPSAnaHR0cHM6Ly9lZHMuYnJvd3NlcnN0YWNrLmNvbSdcblxuICAgIHN0YXRpYyB1cGRhdGVVUkxTRm9yR1JSKGFwaXM6IEdSUlVybHMpIHtcbiAgICAgICAgdGhpcy5GVU5ORUxfSU5TVFJVTUVOVEFUSU9OX1VSTCA9IGAke2FwaXMuYXV0b21hdGUuYXBpfS9zZGsvdjEvZXZlbnRgXG4gICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FVVE9NQVRFX0FQSV9VUkwgPSBhcGlzLmF1dG9tYXRlLmFwaVxuICAgICAgICB0aGlzLkJST1dTRVJTVEFDS19BQV9BUElfVVJMID0gYXBpcy5hcHBBdXRvbWF0ZS5hcGlcbiAgICAgICAgdGhpcy5CUk9XU0VSU1RBQ0tfUEVSQ1lfQVBJX1VSTCA9IGFwaXMucGVyY3kuYXBpXG4gICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FVVE9NQVRFX0FQSV9DTE9VRF9VUkwgPSBhcGlzLmF1dG9tYXRlLnVwbG9hZFxuICAgICAgICB0aGlzLkJST1dTRVJTVEFDS19BQV9BUElfQ0xPVURfVVJMID0gYXBpcy5hcHBBdXRvbWF0ZS51cGxvYWRcbiAgICAgICAgdGhpcy5BUFBfQUxMWV9FTkRQT0lOVCA9IGAke2FwaXMuYXBwQWNjZXNzaWJpbGl0eS5hcGl9L2F1dG9tYXRlYFxuICAgICAgICB0aGlzLkRBVEFfRU5EUE9JTlQgPSBhcGlzLm9ic2VydmFiaWxpdHkuYXBpXG4gICAgICAgIHRoaXMuVVBMT0FEX0xPR1NfQUREUkVTUyA9IGFwaXMub2JzZXJ2YWJpbGl0eS51cGxvYWRcbiAgICAgICAgdGhpcy5FRFNfVVJMID0gYXBpcy5lZHNJbnN0cnVtZW50YXRpb24uYXBpXG4gICAgfVxufVxuIiwgImltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHsgcGxhdGZvcm0sIGFyY2gsIGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHV0aWwsIHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2VzcydcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnbm9kZTpzdHJlYW0nXG5pbXBvcnQgdHlwZSB7IFppcEZpbGUsIE9wdGlvbnMgYXMgeWF1emxPcHRpb25zIH0gZnJvbSAneWF1emwnXG5pbXBvcnQgeWF1emwgZnJvbSAneWF1emwnXG5pbXBvcnQgeyB0aHJlYWRJZCB9IGZyb20gJ25vZGU6d29ya2VyX3RocmVhZHMnXG5cbmltcG9ydCB7IF9mZXRjaCBhcyBmZXRjaCB9IGZyb20gJy4uL2ZldGNoV3JhcHBlci5qcydcblxuaW1wb3J0IHtcbiAgICBpc051bGxPckVtcHR5LFxuICAgIG5lc3RlZEtleVZhbHVlLFxuICAgIGNyZWF0ZURpcixcbiAgICBpc1dyaXRhYmxlLFxuICAgIHNldFJlYWRXcml0ZUFjY2VzcyxcbiAgICBpc1RydWUsXG4gICAgZ2V0QnJvd3NlclN0YWNrVXNlcixcbiAgICBnZXRCcm93c2VyU3RhY2tLZXksXG4gICAgaXNGYWxzZSxcbiAgICBpc1R1cmJvU2NhbGUsXG4gICAgc2hvdWxkQWRkU2VydmljZVZlcnNpb24sXG59IGZyb20gJy4uL3V0aWwuanMnXG5pbXBvcnQgUGVyZm9ybWFuY2VUZXN0ZXIgZnJvbSAnLi4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL3BlcmZvcm1hbmNlLXRlc3Rlci5qcydcbmltcG9ydCB7IEVWRU5UUyBhcyBQZXJmb3JtYW5jZUV2ZW50cyB9IGZyb20gJy4uL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgYXMgbG9nZ2VyIH0gZnJvbSAnLi9jbGlMb2dnZXIuanMnXG5pbXBvcnQgeyBVUERBVEVEX0NMSV9FTkRQT0lOVCwgQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTiwgQklOQVJZX0JVU1lfRVJST1JfQ09ERVMgfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMsIENhcGFiaWxpdGllcyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuaW1wb3J0IHR5cGUge1xuICAgIEJyb3dzZXJzdGFja0NvbmZpZyxcbiAgICBCcm93c2Vyc3RhY2tPcHRpb25zLFxuICAgIFRlc3RNYW5hZ2VtZW50T3B0aW9ucyxcbiAgICBUZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMsXG59IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgVGVzdEZyYW1ld29ya0NvbnN0YW50cyB9IGZyb20gJy4vZnJhbWV3b3Jrcy9jb25zdGFudHMvdGVzdEZyYW1ld29ya0NvbnN0YW50cy5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuL2FwaVV0aWxzLmpzJ1xuXG5jb25zdCBDTElfTE9DS19USU1FT1VUX01TID0gNSAqIDYwICogMTAwMFxuY29uc3QgQ0xJX0xPQ0tfUE9MTF9NUyA9IDEwMDBcbmNvbnN0IENMSV9ET1dOTE9BRF9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMFxuY29uc3QgQ0xJX0RPV05MT0FEX1RNUF9QUkVGSVggPSAnZG93bmxvYWRlZF9maWxlXydcbmNvbnN0IENMSV9ET1dOTE9BRF9UTVBfU1VGRklYID0gJy56aXAnXG5cbmV4cG9ydCBjbGFzcyBDTElVdGlscyB7XG4gICAgc3RhdGljIGF1dG9tYXRpb25GcmFtZXdvcmtEZXRhaWwgPSB7fVxuICAgIHN0YXRpYyB0ZXN0RnJhbWV3b3JrRGV0YWlsID0ge31cbiAgICBzdGF0aWMgQ0xJU3VwcG9ydGVkRnJhbWV3b3JrcyA9IFsnbW9jaGEnXVxuXG4gICAgc3RhdGljIGlzRGV2ZWxvcG1lbnRFbnYoKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQ0xJX0VOViA9PT0gJ2RldmVsb3BtZW50J1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRDTElQYXJhbXNGb3JEZXZFbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0NMSV9FTlYgfHwgJycsXG4gICAgICAgICAgICBsaXN0ZW46IGB1bml4Oi90bXAvc2RrLXBsYXRmb3JtLSR7cHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0NMSV9FTlZ9LnNvY2tgLFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGQgY29uZmlnIG9iamVjdCBmb3IgYmluYXJ5IHNlc3Npb24gcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICogQHRocm93cyB7RXJyb3J9XG4gICAgICovXG4gICAgc3RhdGljIGdldEJpbkNvbmZpZyhcbiAgICAgICAgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsXG4gICAgICAgIGNhcGFiaWxpdGllczpcbiAgICAgICAgICAgIHwgQ2FwYWJpbGl0aWVzLlJlcXVlc3RlZFN0YW5kYWxvbmVDYXBhYmlsaXRpZXNcbiAgICAgICAgICAgIHwgQ2FwYWJpbGl0aWVzLlJlcXVlc3RlZFN0YW5kYWxvbmVDYXBhYmlsaXRpZXNbXSxcbiAgICAgICAgb3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgQnJvd3NlcnN0YWNrT3B0aW9ucyxcbiAgICAgICAgYnVpbGRUYWc/OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IG1vZGlmaWVkT3B0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLm9wdGlvbnMgfVxuICAgICAgICBpZiAobW9kaWZpZWRPcHRzLm9wdHMpIHtcbiAgICAgICAgICAgIG1vZGlmaWVkT3B0cy5icm93c2VyU3RhY2tMb2NhbE9wdGlvbnMgPSBtb2RpZmllZE9wdHMub3B0c1xuICAgICAgICAgICAgZGVsZXRlIG1vZGlmaWVkT3B0cy5vcHRzXG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIG1vZGlmaWVkT3B0cy50ZXN0TWFuYWdlbWVudE9wdGlvbnNcblxuICAgICAgICBtb2RpZmllZE9wdHMudGVzdENvbnRleHRPcHRpb25zID0ge1xuICAgICAgICAgICAgc2tpcFNlc3Npb25OYW1lOiBpc0ZhbHNlKG1vZGlmaWVkT3B0cy5zZXRTZXNzaW9uTmFtZSksXG4gICAgICAgICAgICBza2lwU2Vzc2lvblN0YXR1czogaXNGYWxzZShtb2RpZmllZE9wdHMuc2V0U2Vzc2lvblN0YXR1cyksXG4gICAgICAgICAgICBzZXNzaW9uTmFtZU9taXRUZXN0VGl0bGU6IG1vZGlmaWVkT3B0cy5zZXNzaW9uTmFtZU9taXRUZXN0VGl0bGUgfHwgZmFsc2UsXG4gICAgICAgICAgICBzZXNzaW9uTmFtZVByZXBlbmRUb3BMZXZlbFN1aXRlVGl0bGU6XG4gICAgICAgICAgICAgICAgbW9kaWZpZWRPcHRzLnNlc3Npb25OYW1lUHJlcGVuZFRvcExldmVsU3VpdGVUaXRsZSB8fCBmYWxzZSxcbiAgICAgICAgICAgIHNlc3Npb25OYW1lRm9ybWF0OiBtb2RpZmllZE9wdHMuc2Vzc2lvbk5hbWVGb3JtYXQgfHwgJycsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21tb25Cc3RhY2tPcHRpb25zID0gKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMgJiZcbiAgICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheShjYXBhYmlsaXRpZXMpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGNhcGFiaWxpdGllcyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAnYnN0YWNrOm9wdGlvbnMnIGluIChjYXBhYmlsaXRpZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBDYXN0IGFmdGVyIGd1YXJkIHRvIHNhdGlzZnkgVHlwZVNjcmlwdFxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcyBhcyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydic3RhY2s6b3B0aW9ucyddPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIClbJ2JzdGFjazpvcHRpb25zJ10gfHwge31cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfSkoKVxuXG4gICAgICAgIGNvbnN0IGlzTm9uQnN0YWNrQTExeSA9XG4gICAgICAgICAgICBpc1R1cmJvU2NhbGUob3B0aW9ucykgfHxcbiAgICAgICAgICAgICFzaG91bGRBZGRTZXJ2aWNlVmVyc2lvbihcbiAgICAgICAgICAgICAgICBjb25maWcgYXMgT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHksXG4gICAgICAgICAgICApXG4gICAgICAgIGNvbnN0IG9ic2VydmFiaWxpdHlPcHRpb25zOiBUZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgPVxuICAgICAgICAgICAgb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMgfHwge31cbiAgICAgICAgY29uc3QgdGVzdE1hbmFnZW1lbnRPcHRpb25zOiBUZXN0TWFuYWdlbWVudE9wdGlvbnMgPVxuICAgICAgICAgICAgb3B0aW9ucy50ZXN0TWFuYWdlbWVudE9wdGlvbnMgfHwge31cbiAgICAgICAgY29uc3QgdGVzdFBsYW5JZCA9IHR5cGVvZiB0ZXN0TWFuYWdlbWVudE9wdGlvbnMudGVzdFBsYW5JZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gdGVzdE1hbmFnZW1lbnRPcHRpb25zLnRlc3RQbGFuSWQudHJpbSgpXG4gICAgICAgICAgICA6ICcnXG4gICAgICAgIGNvbnN0IGJpbmNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgICAgICB1c2VyTmFtZTogb2JzZXJ2YWJpbGl0eU9wdGlvbnMudXNlciB8fCBjb25maWcudXNlcixcbiAgICAgICAgICAgIGFjY2Vzc0tleTogb2JzZXJ2YWJpbGl0eU9wdGlvbnMua2V5IHx8IGNvbmZpZy5rZXksXG4gICAgICAgICAgICBwbGF0Zm9ybXM6IFtdLFxuICAgICAgICAgICAgaXNOb25Cc3RhY2tBMTF5V0RJTzogaXNOb25Cc3RhY2tBMTF5LFxuICAgICAgICAgICAgLi4ubW9kaWZpZWRPcHRzLFxuICAgICAgICAgICAgLi4uY29tbW9uQnN0YWNrT3B0aW9ucyxcbiAgICAgICAgfVxuXG4gICAgICAgIGJpbmNvbmZpZy5idWlsZE5hbWUgPSBvYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZE5hbWUgfHwgYmluY29uZmlnLmJ1aWxkTmFtZVxuICAgICAgICBiaW5jb25maWcucHJvamVjdE5hbWUgPSBvYnNlcnZhYmlsaXR5T3B0aW9ucy5wcm9qZWN0TmFtZSB8fCBiaW5jb25maWcucHJvamVjdE5hbWVcbiAgICAgICAgYmluY29uZmlnLmJ1aWxkVGFnID0gdGhpcy5nZXRPYnNlcnZhYmlsaXR5QnVpbGRUYWdzKG9ic2VydmFiaWxpdHlPcHRpb25zLCBidWlsZFRhZykgfHwgW11cbiAgICAgICAgaWYgKHRlc3RQbGFuSWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYmluY29uZmlnLnRlc3RNYW5hZ2VtZW50T3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB0ZXN0UGxhbklkLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FwcyA9IEFycmF5LmlzQXJyYXkoY2FwYWJpbGl0aWVzKSA/IGNhcGFiaWxpdGllcyA6IFtjYXBhYmlsaXRpZXNdXG4gICAgICAgIGZvciAoY29uc3QgY2FwIG9mIGNhcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBsYXRmb3JtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICAgICAgICAgICBjb25zdCBjYXBhYmlsaXR5ID0gY2FwIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGNhcGFiaWxpdHkpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdic3RhY2s6b3B0aW9ucycpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybVtrZXldID0gY2FwYWJpbGl0eVtrZXldXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHlbJ2JzdGFjazpvcHRpb25zJ10pIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhcbiAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eVsnYnN0YWNrOm9wdGlvbnMnXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgICAgICApLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybVtrZXldID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eVsnYnN0YWNrOm9wdGlvbnMnXSBhcyBSZWNvcmQ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgKVtrZXldXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChiaW5jb25maWcucGxhdGZvcm1zIGFzIEFycmF5PHVua25vd24+KS5wdXNoKHBsYXRmb3JtKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShiaW5jb25maWcpXG4gICAgfVxuXG4gICAgc3RhdGljIGdldFNka1ZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OXG4gICAgfVxuXG4gICAgc3RhdGljIGdldFNka0xhbmd1YWdlKCkge1xuICAgICAgICByZXR1cm4gJ0VDTUFTY3JpcHQnXG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIHNldHVwQ2xpUGF0aChcbiAgICAgICAgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsXG4gICAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnQ29uZmlndXJpbmcgQ2xpIHBhdGguJylcbiAgICAgICAgY29uc3QgZGV2ZWxvcG1lbnRCaW5hcnlQYXRoID0gcHJvY2Vzcy5lbnYuU0RLX0NMSV9CSU5fUEFUSCB8fCBudWxsXG4gICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShkZXZlbG9wbWVudEJpbmFyeVBhdGgpKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYERldmVsb3BtZW50IENsaSBQYXRoOiAke2RldmVsb3BtZW50QmluYXJ5UGF0aH1gKVxuICAgICAgICAgICAgcmV0dXJuIGRldmVsb3BtZW50QmluYXJ5UGF0aFxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNsaURpciA9IHRoaXMuZ2V0Q2xpRGlyKClcbiAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KGNsaURpcikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHdyaXRhYmxlIGRpcmVjdG9yeSBhdmFpbGFibGUgZm9yIHRoZSBDTEknKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdDbGlQYXRoID0gdGhpcy5nZXRFeGlzdGluZ0NsaVBhdGgoY2xpRGlyKVxuICAgICAgICAgICAgY29uc3QgZmluYWxCaW5hcnlQYXRoID0gYXdhaXQgdGhpcy5jaGVja0FuZFVwZGF0ZUNsaShcbiAgICAgICAgICAgICAgICBleGlzdGluZ0NsaVBhdGgsXG4gICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgUmVzb2x2ZWQgYmluYXJ5IHBhdGg6ICR7ZmluYWxCaW5hcnlQYXRofWApXG4gICAgICAgICAgICByZXR1cm4gZmluYWxCaW5hcnlQYXRoXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBFcnJvciBpbiBzZXR0aW5nIHVwIGNsaSBwYXRoIGRpcmVjdG9yeSwgRXhjZXB0aW9uOiAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBjaGVja0FuZFVwZGF0ZUNsaShcbiAgICAgICAgZXhpc3RpbmdDbGlQYXRoOiBzdHJpbmcsXG4gICAgICAgIGNsaURpcjogc3RyaW5nLFxuICAgICAgICBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAgICAgLy8gU2tpcCBDTEkgdXBkYXRlIGluIHdvcmtlciBwcm9jZXNzZXMgLSBvbmx5IGxhdW5jaGVyIHNob3VsZCB1cGRhdGVcbiAgICAgICAgLy8gV29ya2VycyBhcmUgaWRlbnRpZmllZCBieSBoYXZpbmcgQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUIHNldCAoYnVpbGQgYWxyZWFkeSBzdGFydGVkKVxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgYFdvcmtlciBwcm9jZXNzIGRldGVjdGVkLCBza2lwcGluZyBDTEkgdXBkYXRlLiBVc2luZyBleGlzdGluZzogJHtleGlzdGluZ0NsaVBhdGh9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChleGlzdGluZ0NsaVBhdGggJiYgZnMuZXhpc3RzU3luYyhleGlzdGluZ0NsaVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2xpUGF0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgJ1dvcmtlciBwcm9jZXNzIGhhcyBubyBleGlzdGluZyBDTEkgYmluYXJ5LCBhdHRlbXB0aW5nIGRvd25sb2FkIGFzIGZhbGxiYWNrLicsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChQZXJmb3JtYW5jZUV2ZW50cy5TREtfQ0xJX0NIRUNLX1VQREFURSlcbiAgICAgICAgbG9nZ2VyLmluZm8oYEN1cnJlbnQgQ0xJIFBhdGggRm91bmQ6ICR7ZXhpc3RpbmdDbGlQYXRofWApXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgc2RrX3ZlcnNpb246IENMSVV0aWxzLmdldFNka1ZlcnNpb24oKSxcbiAgICAgICAgICAgIG9zOiBwbGF0Zm9ybSgpLFxuICAgICAgICAgICAgb3NfYXJjaDogYXJjaCgpLFxuICAgICAgICAgICAgY2xpX3ZlcnNpb246ICcwJyxcbiAgICAgICAgICAgIHNka19sYW5ndWFnZTogdGhpcy5nZXRTZGtMYW5ndWFnZSgpLFxuICAgICAgICB9XG4gICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShleGlzdGluZ0NsaVBhdGgpKSB7XG4gICAgICAgICAgICAvLyBJZiBiaW5hcnkgaXMgYnVzeSAoYmVpbmcgZXhlY3V0ZWQgYnkgYW5vdGhlciBwcm9jZXNzKSwgc2tpcCB2ZXJzaW9uIGNoZWNrXG4gICAgICAgICAgICAvLyBhbmQgQVBJIGNhbGwgZW50aXJlbHkgXHUyMDE0IHVzZSBleGlzdGluZyBiaW5hcnkgYXMtaXNcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQmluYXJ5QnVzeShleGlzdGluZ0NsaVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEV4aXN0aW5nIGJpbmFyeSBpcyBjdXJyZW50bHkgaW4gdXNlLCBza2lwcGluZyB1cGRhdGU6ICR7ZXhpc3RpbmdDbGlQYXRofWApXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfQ0hFQ0tfVVBEQVRFKVxuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0NsaVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSBhd2FpdCB0aGlzLnJ1blNoZWxsQ29tbWFuZChcbiAgICAgICAgICAgICAgICBgJHtleGlzdGluZ0NsaVBhdGh9IHZlcnNpb25gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKHZlcnNpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygndGV4dCBmaWxlIGJ1c3knKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBCaW5hcnkgYnVzeSBkdXJpbmcgdmVyc2lvbiBjaGVjaywgc2tpcHBpbmcgdXBkYXRlOiAke2V4aXN0aW5nQ2xpUGF0aH1gKVxuICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChQZXJmb3JtYW5jZUV2ZW50cy5TREtfQ0xJX0NIRUNLX1VQREFURSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdDbGlQYXRoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWVyeVBhcmFtcy5jbGlfdmVyc2lvbiA9IHZlcnNpb25cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdFRvVXBkYXRlQ0xJKHF1ZXJ5UGFyYW1zLCBjb25maWcpXG4gICAgICAgIGlmIChuZXN0ZWRLZXlWYWx1ZShyZXNwb25zZSwgWyd1cGRhdGVkX2NsaV92ZXJzaW9uJ10pKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgYE5lZWQgdG8gdXBkYXRlIGJpbmFyeSwgY3VycmVudCBiaW5hcnkgdmVyc2lvbjogJHtxdWVyeVBhcmFtcy5jbGlfdmVyc2lvbn1gLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBjb25zdCBicm93c2VyU3RhY2tCaW5hcnlVcmwgPVxuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19CSU5BUllfVVJMIHx8IG51bGxcbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eShicm93c2VyU3RhY2tCaW5hcnlVcmwpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICBgVXNpbmcgQlJPV1NFUlNUQUNLX0JJTkFSWV9VUkw6ICR7YnJvd3NlclN0YWNrQmluYXJ5VXJsfWAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLnVybCA9IGJyb3dzZXJTdGFja0JpbmFyeVVybFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaW5hbEJpbmFyeVBhdGggPSBhd2FpdCB0aGlzLmRvd25sb2FkTGF0ZXN0QmluYXJ5KFxuICAgICAgICAgICAgICAgIG5lc3RlZEtleVZhbHVlKHJlc3BvbnNlLCBbJ3VybCddKSxcbiAgICAgICAgICAgICAgICBjbGlEaXIsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgICAgICByZXR1cm4gZmluYWxCaW5hcnlQYXRoXG4gICAgICAgIH1cbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfQ0hFQ0tfVVBEQVRFKVxuICAgICAgICByZXR1cm4gZXhpc3RpbmdDbGlQYXRoXG4gICAgfVxuXG4gICAgc3RhdGljIGdldENsaURpcigpIHtcbiAgICAgICAgY29uc3Qgd3JpdGFibGVEaXIgPSB0aGlzLmdldFdyaXRhYmxlRGlyKClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KHdyaXRhYmxlRGlyKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gd3JpdGFibGUgZGlyZWN0b3J5IGF2YWlsYWJsZSBmb3IgdGhlIENMSScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjbGlEaXJQYXRoID0gcGF0aC5qb2luKHdyaXRhYmxlRGlyISwgJ2NsaScpXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xpRGlyUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVEaXIoY2xpRGlyUGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbGlEaXJQYXRoXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgIGBFcnJvciBpbiBnZXR0aW5nIHdyaXRhYmxlIGRpcmVjdG9yeSwgd3JpdGFibGVEaXI9JHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRXcml0YWJsZURpcigpIHtcbiAgICAgICAgY29uc3Qgd3JpdGFibGVEaXJPcHRpb25zID0gW1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0ZJTEVTX0RJUixcbiAgICAgICAgICAgIHBhdGguam9pbihob21lZGlyKCksICcuYnJvd3NlcnN0YWNrJyksXG4gICAgICAgICAgICBwYXRoLmpvaW4oJ3RtcCcsICcuYnJvd3NlcnN0YWNrJyksXG4gICAgICAgIF1cblxuICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2Ygd3JpdGFibGVEaXJPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShwYXRoKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGghKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZpbGUgJHtwYXRofSBhbHJlYWR5IGV4aXN0YClcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1dyaXRhYmxlKHBhdGghKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBHaXZpbmcgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBzZXRSZWFkV3JpdGVBY2Nlc3MocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVHJ1ZShzdWNjZXNzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHByb3ZpZGUgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZpbGUgZG9lcyBub3QgZXhpc3Q6ICR7cGF0aH1gKVxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVEaXIocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgR2l2aW5nIHdyaXRlIHBlcm1pc3Npb24gdG8gJHtwYXRofWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBzZXRSZWFkV3JpdGVBY2Nlc3MocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNUcnVlKHN1Y2Nlc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHByb3ZpZGUgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aFxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIGdldCB3cml0YWJsZSBkaXJlY3RvcnksIGV4Y2VwdGlvbiAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RXhpc3RpbmdDbGlQYXRoKGNsaURpcjogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGF0aCBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5XG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xpRGlyKSB8fCAhZnMuc3RhdFN5bmMoY2xpRGlyKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIExpc3QgYWxsIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgdGhhdCBzdGFydCB3aXRoIFwiYmluYXJ5LVwiXG4gICAgICAgICAgICBjb25zdCBhbGxCaW5hcmllcyA9IGZzXG4gICAgICAgICAgICAgICAgLnJlYWRkaXJTeW5jKGNsaURpcilcbiAgICAgICAgICAgICAgICAubWFwKChmaWxlOiBzdHJpbmcpID0+IHBhdGguam9pbihjbGlEaXIsIGZpbGUpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChmaWxlUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZnMuc3RhdFN5bmMoZmlsZVBhdGgpLmlzRmlsZSgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKS5zdGFydHNXaXRoKCdiaW5hcnktJyksXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAoYWxsQmluYXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGF0ZXN0IGJpbmFyeSBieSBjb21wYXJpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZVxuICAgICAgICAgICAgICAgIGNvbnN0IGxhdGVzdEJpbmFyeSA9IGFsbEJpbmFyaWVzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGZpbGVQYXRoOiBzdHJpbmcpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG10aW1lOiBmcy5zdGF0U3luYyhmaWxlUGF0aCkubXRpbWUsXG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdDogeyBmaWxlUGF0aDogc3RyaW5nOyBtdGltZTogRGF0ZSB9IHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiB7IGZpbGVQYXRoOiBzdHJpbmc7IG10aW1lOiBEYXRlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhdGVzdCB8fCAhbGF0ZXN0Lm10aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQubXRpbWUgPiBsYXRlc3QubXRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGF0ZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiBsYXRlc3RCaW5hcnkgPyBsYXRlc3RCaW5hcnkuZmlsZVBhdGggOiAnJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gJycgLy8gTm8gYmluYXJ5IHByZXNlbnRcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIHdoaWxlIHJlYWRpbmcgQ0xJIHBhdGg6ICR7dXRpbC5mb3JtYXQoZXJyKX1gKVxuICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgaXNCaW5hcnlCdXN5KGJpbmFyeVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShiaW5hcnlQYXRoKSkge3JldHVybiBmYWxzZX1cbiAgICAgICAgaWYgKHBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7cmV0dXJuIGZhbHNlfVxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYmluYXJ5UGF0aCkpIHtyZXR1cm4gZmFsc2V9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZkID0gZnMub3BlblN5bmMoYmluYXJ5UGF0aCwgJ3IrJylcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgaWYgKEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTLmluY2x1ZGVzKGVyci5jb2RlKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQmluYXJ5IGlzIGJ1c3k6ICR7YmluYXJ5UGF0aH1gKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEVycm9yIGNoZWNraW5nIGlmIGJpbmFyeSBpcyBidXN5OiAke2Vyci5tZXNzYWdlfWApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyByZXF1ZXN0VG9VcGRhdGVDTEkgPSBhc3luYyAoXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgICAgICBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICApID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxdWVyeVBhcmFtcylcbiAgICAgICAgY29uc3QgcmVxdWVzdEluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtnZXRCcm93c2VyU3RhY2tVc2VyKGNvbmZpZyl9OiR7Z2V0QnJvd3NlclN0YWNrS2V5KGNvbmZpZyl9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICBgJHtBUElVdGlscy5CUk9XU0VSU1RBQ0tfQVVUT01BVEVfQVBJX1VSTH0vJHtVUERBVEVEX0NMSV9FTkRQT0lOVH0/JHtwYXJhbXMudG9TdHJpbmcoKX1gLFxuICAgICAgICAgICAgcmVxdWVzdEluaXQsXG4gICAgICAgIClcbiAgICAgICAgY29uc3QganNvblJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcmVzcG9uc2UgJHtKU09OLnN0cmluZ2lmeShqc29uUmVzcG9uc2UpfWApXG4gICAgICAgIHJldHVybiBqc29uUmVzcG9uc2VcbiAgICB9XG5cbiAgICBzdGF0aWMgcnVuU2hlbGxDb21tYW5kKFxuICAgICAgICBjbWRDb21tYW5kOiBzdHJpbmcsXG4gICAgICAgIHdvcmtpbmdEaXIgPSAnJyxcbiAgICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3MgPSBleGVjKFxuICAgICAgICAgICAgICAgIGNtZENvbW1hbmQsXG4gICAgICAgICAgICAgICAgeyBjd2Q6IHdvcmtpbmdEaXIsIHRpbWVvdXQ6IDUwMDAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3I6IEVycm9yLCBzdGRvdXQ6IHN0cmluZywgc3RkZXJyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0ZGVyci50cmltKCkgfHwgJ1NIRUxMX0VYRUNVVEVfRVJST1InKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBwcm9jZXNzIGlzIGtpbGxlZCBpZiBpdCBleGNlZWRzIHRoZSB0aW1lb3V0XG4gICAgICAgICAgICBwcm9jZXNzLm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCdTSEVMTF9FWEVDVVRFX0VSUk9SJylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RhdGljIGRvd25sb2FkTGF0ZXN0QmluYXJ5ID0gYXN5bmMgKFxuICAgICAgICBiaW5Eb3dubG9hZFVybDogc3RyaW5nLFxuICAgICAgICBjbGlEaXI6IHN0cmluZyxcbiAgICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcbiAgICAgICAgY29uc3QgbG9ja1BhdGggPSBwYXRoLmpvaW4oY2xpRGlyLCAnZG93bmxvYWQubG9jaycpXG5cbiAgICAgICAgY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKVxuXG4gICAgICAgIGNvbnN0IHBhcnNlTG9ja0ZpbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMobG9ja1BhdGgsICd1dGY4JykudHJpbSgpXG4gICAgICAgICAgICAgICAgY29uc3QgW3BpZExpbmUsIHRpbWVzdGFtcExpbmVdID0gY29udGVudC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgICAgICBjb25zdCBwaWQgPSBOdW1iZXIucGFyc2VJbnQocGlkTGluZSwgMTApXG4gICAgICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wID0gTnVtYmVyLnBhcnNlSW50KHRpbWVzdGFtcExpbmUsIDEwKVxuICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHBpZCkgfHwgIU51bWJlci5pc0Zpbml0ZSh0aW1lc3RhbXApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHBpZCwgdGltZXN0YW1wIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc1Byb2Nlc3NSdW5uaW5nID0gKHBpZDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3Mua2lsbChwaWQsIDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWNxdWlyZUxvY2sgPSBhc3luYyAoXG4gICAgICAgICAgICB0aW1lb3V0TXMgPSBDTElfTE9DS19USU1FT1VUX01TLFxuICAgICAgICAgICAgcG9sbE1zID0gQ0xJX0xPQ0tfUE9MTF9NUyxcbiAgICAgICAgKTogUHJvbWlzZTwoKCkgPT4gdm9pZCkgfCB7IGFscmVhZHlFeGlzdHM6IHN0cmluZyB9PiA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1jb25kaXRpb24gLS0gaW50ZW50aW9uYWwgcG9sbCBsb29wOyBleGl0cyB2aWEgcmV0dXJuL3Rocm93IGJlbG93XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZkID0gZnMub3BlblN5bmMobG9ja1BhdGgsICd3eCcpXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZkLCBgJHtwcm9jZXNzLnBpZH1cXG4ke0RhdGUubm93KCl9XFxuYClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGlnbm9yZSB3cml0ZSBlcnJvcnM7IHRoZSBvcGVuIGZkIHN0aWxsIGhvbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXhjbHVzaXZlIGxvY2sgYW5kIHdpbGwgYmUgY2xvc2VkIGluIGNsZWFudXBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhsb2NrUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGUgYXMgeyBjb2RlPzogc3RyaW5nIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFRVhJU1QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NrTWV0YSA9IHBhcnNlTG9ja0ZpbGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2tNZXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9ja0FnZSA9IERhdGUubm93KCkgLSBsb2NrTWV0YS50aW1lc3RhbXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBydW5uaW5nID0gaXNQcm9jZXNzUnVubmluZyhsb2NrTWV0YS5waWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFydW5uaW5nIHx8IGxvY2tBZ2UgPiB0aW1lb3V0TXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgU3RhbGUgQ0xJIGRvd25sb2FkIGxvY2sgZGV0ZWN0ZWQgKHBpZD0ke2xvY2tNZXRhLnBpZH0sIGFnZT0ke2xvY2tBZ2V9bXMpLiBSZW1vdmluZyBsb2NrLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLnVubGlua1N5bmMobG9ja1BhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBleGlzdGluZyBiaW5hcnkgYXBwZWFyZWQgd2hpbGUgd2FpdGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdCaW5hcnkgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMSVV0aWxzLmdldEV4aXN0aW5nQ2xpUGF0aChjbGlEaXIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdCaW5hcnkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5leGlzdHNTeW5jKGV4aXN0aW5nQmluYXJ5KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLnN0YXRTeW5jKGV4aXN0aW5nQmluYXJ5KS5zaXplID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQmluYXJ5IGFwcGVhcmVkIHdoaWxlIHdhaXRpbmcgZm9yIGxvY2s6ICR7ZXhpc3RpbmdCaW5hcnl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgYWxyZWFkeUV4aXN0czogZXhpc3RpbmdCaW5hcnkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydCA+IHRpbWVvdXRNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRpbWVvdXQgd2FpdGluZyBmb3IgbG9jazogJHtsb2NrUGF0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHNsZWVwKHBvbGxNcylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsZWFudXBUZW1wb3JhcnlEb3dubG9hZHMgPSAobWF4QWdlTXMgPSBDTElfTE9DS19USU1FT1VUX01TKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAgICAgICAgICAgICAvLyBNYXRjaCBib3RoIGRvd25sb2FkIHppcHMgKGRvd25sb2FkZWRfZmlsZV8qLnppcCkgYW5kIG9ycGhhbiBleHRyYWN0XG4gICAgICAgICAgICAgICAgLy8gdGVtcCBmaWxlcyAoPG5hbWU+LnRtcC48cGlkPikgbGVmdCBieSBjcmFzaGVkIHBlZXIgd29ya2Vycy5cbiAgICAgICAgICAgICAgICBjb25zdCB0bXBFeHRyYWN0UmUgPSAvXFwudG1wXFwuXFxkKyQvXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBmcy5yZWFkZGlyU3luYyhjbGlEaXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRG93bmxvYWRaaXAgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RhcnRzV2l0aChDTElfRE9XTkxPQURfVE1QX1BSRUZJWCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmVuZHNXaXRoKENMSV9ET1dOTE9BRF9UTVBfU1VGRklYKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0V4dHJhY3RUbXAgPSB0bXBFeHRyYWN0UmUudGVzdChlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Rvd25sb2FkWmlwICYmICFpc0V4dHJhY3RUbXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY2xpRGlyLCBlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXRzOiBmcy5TdGF0c1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMgPSBmcy5zdGF0U3luYyhmaWxlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChub3cgLSBzdGF0cy5tdGltZU1zIDwgbWF4QWdlTXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLnVubGlua1N5bmMoZmlsZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gZGVsZXRlIHRlbXAgQ0xJIGZpbGUgJHtmaWxlUGF0aH06ICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIHNjYW4gdGVtcCBDTEkgZmlsZXMgaW4gJHtjbGlEaXJ9OiAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChQZXJmb3JtYW5jZUV2ZW50cy5TREtfQ0xJX0RPV05MT0FEKVxuICAgICAgICBsb2dnZXIuZGVidWcoYERvd25sb2FkaW5nIFNESyBiaW5hcnkgZnJvbTogJHtiaW5Eb3dubG9hZFVybH1gKVxuXG4gICAgICAgIGxldCBkb3dubG9hZEVuZGVkID0gZmFsc2VcbiAgICAgICAgY29uc3QgZW5kRG93bmxvYWQgPSAoc3VjY2VzcyA9IHRydWUsIGVyck1zZz86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKGRvd25sb2FkRW5kZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvd25sb2FkRW5kZWQgPSB0cnVlXG4gICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChQZXJmb3JtYW5jZUV2ZW50cy5TREtfQ0xJX0RPV05MT0FEKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFxuICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfRE9XTkxPQUQsXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgZXJyTXNnLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlbGVhc2VMb2NrOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2tSZXN1bHQgPSBhd2FpdCBhY3F1aXJlTG9jaygpXG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGJpbmFyeSBhbHJlYWR5IGV4aXN0cyAoYW5vdGhlciBwcm9jZXNzIGRvd25sb2FkZWQgaXQpXG4gICAgICAgICAgICBpZiAodHlwZW9mIGxvY2tSZXN1bHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBlbmREb3dubG9hZCgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2tSZXN1bHQuYWxyZWFkeUV4aXN0c1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWxlYXNlTG9jayA9IGxvY2tSZXN1bHRcblxuICAgICAgICAgICAgLy8gUmUtY2hlY2sgYWZ0ZXIgYWNxdWlyaW5nIGxvY2tcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQmluYXJ5ID0gQ0xJVXRpbHMuZ2V0RXhpc3RpbmdDbGlQYXRoKGNsaURpcilcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBleGlzdGluZ0JpbmFyeSAmJlxuICAgICAgICAgICAgICAgIGZzLmV4aXN0c1N5bmMoZXhpc3RpbmdCaW5hcnkpICYmXG4gICAgICAgICAgICAgICAgZnMuc3RhdFN5bmMoZXhpc3RpbmdCaW5hcnkpLnNpemUgPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBCaW5hcnkgYWxyZWFkeSBleGlzdHMgYWZ0ZXIgYWNxdWlyaW5nIGxvY2s6ICR7ZXhpc3RpbmdCaW5hcnl9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgZW5kRG93bmxvYWQoKVxuICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrKClcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdCaW5hcnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xlYW51cFRlbXBvcmFyeURvd25sb2FkcygpXG5cbiAgICAgICAgICAgIGNvbnN0IHppcEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIGNsaURpcixcbiAgICAgICAgICAgICAgICBgJHtDTElfRE9XTkxPQURfVE1QX1BSRUZJWH0ke3Byb2Nlc3MucGlkfV8ke0RhdGUubm93KCl9JHtDTElfRE9XTkxPQURfVE1QX1NVRkZJWH1gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgZG93bmxvYWRlZEZpbGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbSh6aXBGaWxlUGF0aClcblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZyB8IG51bGw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzRG93bmxvYWQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IGFib3J0Q29udHJvbGxlci5hYm9ydCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgQ0xJX0RPV05MT0FEX1RJTUVPVVRfTVMsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChiaW5Eb3dubG9hZFVybCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLmJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVzcG9uc2UgYm9keSByZWNlaXZlZCcpXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBkb3dubG9hZGVkRmlsZVN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyOiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBHb3QgRXJyb3Igd2hpbGUgZG93bmxvYWRpbmcgY2xpIGJpbmFyeSBmaWxlOiAke2Vycn1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kRG93bmxvYWQoZmFsc2UsIHV0aWwuZm9ybWF0KGVycikpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTG9jaz8uKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZVN0cmVhbSA9IFJlYWRhYmxlLmZyb20oW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVTdHJlYW0ucGlwZShkb3dubG9hZGVkRmlsZVN0cmVhbSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHVwIHRoZSBkb3dubG9hZEZpbGVTdHJlYW0gaGFuZGxlciBiZWZvcmUgcGlwZWxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIENMSVV0aWxzLmRvd25sb2FkRmlsZVN0cmVhbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZGVkRmlsZVN0cmVhbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlEaXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3VsdDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZERvd25sb2FkKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycj86IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZERvd25sb2FkKGZhbHNlLCB1dGlsLmZvcm1hdChlcnIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTG9jaz8uKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgR290IEVycm9yIGluIGNsaSBiaW5hcnkgZG93bmxvYWRpbmcgcmVxdWVzdCAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZERvd25sb2FkKGZhbHNlLCB1dGlsLmZvcm1hdChlcnIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0Rvd25sb2FkKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRvd25sb2FkIGJpbmFyeSwgRXhjZXB0aW9uOiAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZG93bmxvYWRGaWxlU3RyZWFtKFxuICAgICAgICBkb3dubG9hZGVkRmlsZVN0cmVhbTogZnMuV3JpdGVTdHJlYW0sXG4gICAgICAgIHppcEZpbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgIGNsaURpcjogc3RyaW5nLFxuICAgICAgICByZXNvbHZlOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkLFxuICAgICAgICByZWplY3Q6IChyZWFzb24/OiBFcnJvcikgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgZG93bmxvYWRlZEZpbGVTdHJlYW0ub24oJ2Nsb3NlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgeWF1emxPcGVuUHJvbWlzZSA9IHByb21pc2lmeSh5YXV6bC5vcGVuKSBhcyAoXG4gICAgICAgICAgICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHlhdXpsT3B0aW9ucyxcbiAgICAgICAgICAgICkgPT4gUHJvbWlzZTxaaXBGaWxlPlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB6aXBmaWxlID0gYXdhaXQgeWF1emxPcGVuUHJvbWlzZSh6aXBGaWxlUGF0aCwge1xuICAgICAgICAgICAgICAgICAgICBsYXp5RW50cmllczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGxldCByZXNvbHZlZEJpbmFyeVBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgICAgICAgemlwZmlsZS5vbignZW50cnknLCBhc3luYyAoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9cXC8kLy50ZXN0KGVudHJ5LmZpbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5yZWFkRW50cnkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBaaXAtc2xpcCBndWFyZDogcmVqZWN0IGVudHJpZXMgd2hvc2UgcmVzb2x2ZWQgcGF0aCBlc2NhcGVzIGNsaURpclxuICAgICAgICAgICAgICAgICAgICAvLyAoQlJPV1NFUlNUQUNLX0JJTkFSWV9VUkwgbGV0cyB1c2VycyBzdXBwbHkgYXJiaXRyYXJ5IHppcHMpLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVQYXRoID0gcGF0aC5qb2luKGNsaURpciwgZW50cnkuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ2FuZGlkYXRlID0gcGF0aC5yZXNvbHZlKGNhbmRpZGF0ZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRGlyID0gcGF0aC5yZXNvbHZlKGNsaURpcikgKyBwYXRoLnNlcFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkQ2FuZGlkYXRlLnN0YXJ0c1dpdGgocmVzb2x2ZWREaXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFppcC1zbGlwIGRldGVjdGVkOiBlbnRyeSBcIiR7ZW50cnkuZmlsZU5hbWV9XCIgcmVzb2x2ZXMgb3V0c2lkZSAke2NsaURpcn1gKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNCaW5hcnlFbnRyeSA9IHBhdGguYmFzZW5hbWUoZW50cnkuZmlsZU5hbWUpLnN0YXJ0c1dpdGgoJ2JpbmFyeS0nKVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNCaW5hcnlFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0U3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0oY2FuZGlkYXRlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdFN0cmVhbS5vbignZXJyb3InLCAod3JpdGVFcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3Qod3JpdGVFcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlblJlYWRTdHJlYW1Qcm9taXNlID0gcHJvbWlzaWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUub3BlblJlYWRTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICAgICApLmJpbmQoemlwZmlsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZFN0cmVhbSA9IGF3YWl0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZShlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdFN0cmVhbS5lbmQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RTdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4gemlwZmlsZS5yZWFkRW50cnkoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ucGlwZShkaXJlY3RTdHJlYW0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh6aXBFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoemlwRXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBCaW5hcnkgZW50cnk6IGV4dHJhY3QgdG8gUElELXNjb3BlZCB0ZW1wIGZpbGUsIGNobW9kLCBhdG9taWMgcmVuYW1lIGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudHMgRVRYVEJTWS9FQlVTWTogdGhlIGZpbGUgYmVpbmcgZXhlY3V0ZWQgaXMgbmV2ZXIgdGhlIGZpbGUgYmVpbmcgd3JpdHRlbi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluYWxQYXRoID0gY2FuZGlkYXRlUGF0aFxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHBhdGguam9pbihjbGlEaXIsIGAke2VudHJ5LmZpbGVOYW1lfS50bXAuJHtwcm9jZXNzLnBpZH1gKVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odGVtcFBhdGgpXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHdyaXRlU3RyZWFtRXJyb3JlZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtLm9uKCdlcnJvcicsICh3cml0ZUVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1FcnJvcmVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgZnNwLnVubGluayh0ZW1wUGF0aCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh3cml0ZUVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgICAvLyAnY2xvc2UnIGZpcmVzIGFmdGVyIHRoZSBmZCBpcyBjbG9zZWQ7IHNhZmUgZm9yIGZzcC5yZW5hbWUgb24gV2luZG93cyAod2hlcmUgJ2ZpbmlzaCcgbWF5IGZpcmUgYmVmb3JlIGZkIHJlbGVhc2UpLlxuICAgICAgICAgICAgICAgICAgICAvLyBhdXRvQ2xvc2U9dHJ1ZSBhbHNvIG1ha2VzICdjbG9zZScgZmlyZSBhZnRlciAnZXJyb3InIFx1MjAxNCBiYWlsIG91dCBpZiB0aGUgZXJyb3IgcGF0aCBhbHJlYWR5IHJlamVjdGVkLlxuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbS5vbignY2xvc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVTdHJlYW1FcnJvcmVkKSB7IHJldHVybiB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC5jaG1vZCh0ZW1wUGF0aCwgJzA3NTUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC5yZW5hbWUodGVtcFBhdGgsIGZpbmFsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHJlbmFtZUVycjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hcnJvdyBmYWxsYmFjayB0byBjcm9zcy1kZXZpY2UgKEVYREVWKSBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW5hbWVFcnIuY29kZSAhPT0gJ0VYREVWJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVuYW1lRXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEF0b21pYyByZW5hbWUgZmFpbGVkIChjcm9zcy1kZXZpY2UpLCBmYWxsaW5nIGJhY2sgdG8gY29weTogJHtyZW5hbWVFcnIubWVzc2FnZX1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AuY29weUZpbGUodGVtcFBhdGgsIGZpbmFsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNwLnVubGluayh0ZW1wUGF0aCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRCaW5hcnlQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkQmluYXJ5UGF0aCA9IGZpbmFsUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZSA9IHByb21pc2lmeShcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUub3BlblJlYWRTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICkuYmluZCh6aXBmaWxlKVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZFN0cmVhbSA9IGF3YWl0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZShlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbS5lbmQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSlcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoemlwRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHppcEVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB6aXBmaWxlLm9uKCdlcnJvcicsICh6aXBFcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHppcEVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgemlwZmlsZS5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZzcC51bmxpbmsoemlwRmlsZVBhdGgpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gZGVsZXRlIHppcCBmaWxlOiAke3ppcEZpbGVQYXRofWApXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZEJpbmFyeVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignTm8gYmluYXJ5LSogZW50cnkgZm91bmQgaW4gemlwOyBjYW5ub3QgY29tcGxldGUgQ0xJIGJpbmFyeSBleHRyYWN0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZEJpbmFyeVBhdGgpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RhdGljIGdldFRlc3RGcmFtZXdvcmtEZXRhaWwoKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVF9GUkFNRVdPUktfREVUQUlMKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVF9GUkFNRVdPUktfREVUQUlMKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RGcmFtZXdvcmtEZXRhaWxcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCgpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BVVRPTUFUSU9OX0ZSQU1FV09SS19ERVRBSUwpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BVVRPTUFUSU9OX0ZSQU1FV09SS19ERVRBSUwsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbFxuICAgIH1cblxuICAgIHN0YXRpYyBzZXRGcmFtZXdvcmtEZXRhaWwoXG4gICAgICAgIHRlc3RGcmFtZXdvcms6IHN0cmluZyxcbiAgICAgICAgYXV0b21hdGlvbkZyYW1ld29yazogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBpZiAoIXRlc3RGcmFtZXdvcmsgfHwgIWF1dG9tYXRpb25GcmFtZXdvcmspIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgVGVzdCBvciBBdXRvbWF0aW9uIGZyYW1ld29yayBub3QgcHJvdmlkZWQgdGVzdEZyYW1ld29yaz0ke3Rlc3RGcmFtZXdvcmt9LCBhdXRvbWF0aW9uRnJhbWV3b3JrPSR7YXV0b21hdGlvbkZyYW1ld29ya31gLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50ZXN0RnJhbWV3b3JrRGV0YWlsID0ge1xuICAgICAgICAgICAgbmFtZTogdGVzdEZyYW1ld29yayxcbiAgICAgICAgICAgIHZlcnNpb246IHsgW3Rlc3RGcmFtZXdvcmtdOiBDTElVdGlscy5nZXRTZGtWZXJzaW9uKCkgfSxcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCA9IHtcbiAgICAgICAgICAgIG5hbWU6IGF1dG9tYXRpb25GcmFtZXdvcmssXG4gICAgICAgICAgICB2ZXJzaW9uOiB7IFthdXRvbWF0aW9uRnJhbWV3b3JrXTogQ0xJVXRpbHMuZ2V0U2RrVmVyc2lvbigpIH0sXG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQVVUT01BVElPTl9GUkFNRVdPUktfREVUQUlMID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB0aGlzLmF1dG9tYXRpb25GcmFtZXdvcmtEZXRhaWwsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RfRlJBTUVXT1JLX0RFVEFJTCA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgdGhpcy50ZXN0RnJhbWV3b3JrRGV0YWlsLFxuICAgICAgICApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGluc3RhbmNlIG5hbWUgdXNpbmcgdGhyZWFkIGlkIGFuZCBwcm9jZXNzSWRcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDdXJyZW50SW5zdGFuY2VOYW1lKCkge1xuICAgICAgICByZXR1cm4gYCR7cHJvY2Vzcy5waWR9OiR7dGhyZWFkSWR9YFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGEgdW5pcXVlIGNsaWVudCB3b3JrZXIgaWRlbnRpZmllciBjb21iaW5pbmcgdGhyZWFkIElEIGFuZCBwcm9jZXNzIElELlxuICAgICAqIFRoaXMgaWRlbnRpZmllciBpcyB1c2VkIHRvIHRyYWNrIHdvcmtlci1zcGVjaWZpYyBldmVudHMgYW5kIHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICAgKiBhY3Jvc3MgZGlzdHJpYnV0ZWQgdGVzdCBleGVjdXRpb24uIEZvcm1hdCBtYXRjaGVzIHRoZSBQeXRob24gU0RLIGltcGxlbWVudGF0aW9uXG4gICAgICogZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBTREtzLlxuICAgICAqXG4gICAgICogRm9ybWF0OiBcInRocmVhZElkLXByb2Nlc3NJZFwiXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udGV4dCAtIE9wdGlvbmFsIGV4ZWN1dGlvbiBjb250ZXh0IHdpdGggdGhyZWFkSWQgYW5kIHByb2Nlc3NJZFxuICAgICAqIEByZXR1cm5zIFdvcmtlciBJRCBzdHJpbmcgaW4gZm9ybWF0IFwidGhyZWFkSWQtcHJvY2Vzc0lkXCJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHdvcmtlcklkID0gQ0xJVXRpbHMuZ2V0Q2xpZW50V29ya2VySWQoKSAvLyBSZXR1cm5zIFwiMS0xMjM0NVwiXG4gICAgICogY29uc3Qgd29ya2VySWQgPSBDTElVdGlscy5nZXRDbGllbnRXb3JrZXJJZCh7IHRocmVhZElkOiAxMjMsIHByb2Nlc3NJZDogNDU2IH0pIC8vIFJldHVybnMgXCIxMjMtNDU2XCJcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0Q2xpZW50V29ya2VySWQoY29udGV4dD86IHsgdGhyZWFkSWQ/OiBzdHJpbmcgfCBudW1iZXI7IHByb2Nlc3NJZD86IHN0cmluZyB8IG51bWJlciB9KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgd29ya2VyVGhyZWFkSWQgPSBjb250ZXh0Py50aHJlYWRJZD8udG9TdHJpbmcoKSB8fCB0aHJlYWRJZC50b1N0cmluZygpXG4gICAgICAgIGNvbnN0IHdvcmtlclByb2Nlc3NJZCA9IGNvbnRleHQ/LnByb2Nlc3NJZD8udG9TdHJpbmcoKSB8fCBwcm9jZXNzLnBpZC50b1N0cmluZygpXG4gICAgICAgIHJldHVybiBgJHt3b3JrZXJUaHJlYWRJZH0tJHt3b3JrZXJQcm9jZXNzSWR9YFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUZXN0RnJhbWV3b3JrU3RhdGUgfCBBdXRvbWF0aW9uRnJhbWV3b3JrU3RhdGV9IGZyYW1ld29ya1N0YXRlXG4gICAgICogQHBhcmFtIHtIb29rU3RhdGV9IGhvb2tTdGF0ZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldEhvb2tSZWdpc3RyeUtleShmcmFtZXdvcmtTdGF0ZTogU3RhdGUsIGhvb2tTdGF0ZTogU3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGAke2ZyYW1ld29ya1N0YXRlfToke2hvb2tTdGF0ZX1gXG4gICAgfVxuXG4gICAgc3RhdGljIG1hdGNoSG9va1JlZ2V4KGhvb2tTdGF0ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKFRlc3RGcmFtZXdvcmtDb25zdGFudHMuSE9PS19SRUdFWClcblxuICAgICAgICByZXR1cm4gcGF0dGVybi50ZXN0KGhvb2tTdGF0ZSlcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhcbiAgICAgICAgb2JzZXJ2YWJpbGl0eU9wdGlvbnM6IFRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyxcbiAgICAgICAgYnN0YWNrQnVpbGRUYWc/OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX1RBRy5zcGxpdCgnLCcpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkVGFnKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGRUYWdcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnN0YWNrQnVpbGRUYWcpIHtcbiAgICAgICAgICAgIHJldHVybiBbYnN0YWNrQnVpbGRUYWddXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgc3RhdGljIGNoZWNrQ0xJU3VwcG9ydGVkRnJhbWV3b3JrcyhmcmFtZXdvcms6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZnJhbWV3b3JrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLkNMSVN1cHBvcnRlZEZyYW1ld29ya3MuaW5jbHVkZXMoZnJhbWV3b3JrKVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBmZXRjaCBhcyB1bmRpY2lGZXRjaCwgdHlwZSBSZXF1ZXN0SW5pdCBhcyBVbmRpY2lSZXF1ZXN0SW5pdCwgUHJveHlBZ2VudCB9IGZyb20gJ3VuZGljaSdcblxuZXhwb3J0IGNsYXNzIFJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgcHVibGljIHJlc3BvbnNlOiBSZXNwb25zZVxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcmVzOiBSZXNwb25zZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKVxuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBmZXRjaFdyYXAoaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBfZmV0Y2goaW5wdXQsIGluaXQpXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlRXJyb3IoYEVycm9yIHJlc3BvbnNlIGZyb20gc2VydmVyICR7cmVzLnN0YXR1c306ICAke2F3YWl0IHJlcy50ZXh0KCl9YCwgcmVzKVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZmV0Y2goaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICBjb25zdCBwcm94eVVybCA9IHByb2Nlc3MuZW52LkhUVFBfUFJPWFkgfHwgcHJvY2Vzcy5lbnYuSFRUUFNfUFJPWFlcbiAgICBpZiAocHJveHlVcmwpIHtcbiAgICAgICAgY29uc3Qgbm9Qcm94eSA9IHByb2Nlc3MuZW52Lk5PX1BST1hZICYmIHByb2Nlc3MuZW52Lk5PX1BST1hZLnRyaW0oKVxuICAgICAgICAgICAgPyBwcm9jZXNzLmVudi5OT19QUk9YWS50cmltKCkuc3BsaXQoL1tcXHMsO10rLylcbiAgICAgICAgICAgIDogW11cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0KVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgICAgICBpZiAoIW5vUHJveHkuc29tZSgoc3RyKSA9PiB1cmwuaG9zdG5hbWUuZW5kc1dpdGgoc3RyKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRpY2lGZXRjaChcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgICAgICB7IC4uLihpbml0IGFzIFVuZGljaVJlcXVlc3RJbml0KSwgZGlzcGF0Y2hlcjogbmV3IFByb3h5QWdlbnQocHJveHlVcmwpIH0sXG4gICAgICAgICAgICApIGFzIHVua25vd24gYXMgUHJvbWlzZTxSZXNwb25zZT5cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpXG59XG4iLCAiZXhwb3J0IGNvbnN0IEVWRU5UUyA9IHtcbiAgICBTREtfU0VUVVA6ICdzZGs6c2V0dXAnLFxuICAgIFNES19DTEVBTlVQOiAnc2RrOmNsZWFudXAnLFxuICAgIFNES19QUkVfVEVTVDogJ3NkazpwcmUtdGVzdCcsXG4gICAgU0RLX1RFU1Q6ICdzZGs6dGVzdCcsXG4gICAgU0RLX1BPU1RfVEVTVDogJ3Nkazpwb3N0LXRlc3QnLFxuICAgIFNES19IT09LOiAnc2RrOmhvb2snLFxuICAgIFNES19EUklWRVI6ICdzZGs6ZHJpdmVyJyxcbiAgICBTREtfQTExWTogJ3NkazphMTF5JyxcbiAgICBTREtfTzExWTogJ3NkazpvMTF5JyxcbiAgICBTREtfQVVUT19DQVBUVVJFOiAnc2RrOmF1dG8tY2FwdHVyZScsXG4gICAgU0RLX1BST1hZX1NFVFVQOiAnc2RrOnByb3h5LXNldHVwJyxcbiAgICBTREtfVEVTVEhVQjogJ3Nkazp0ZXN0aHViJyxcbiAgICBTREtfQVVUT01BVEU6ICdzZGs6YXV0b21hdGUnLFxuICAgIFNES19BUFBfQVVUT01BVEU6ICdzZGs6YXBwLWF1dG9tYXRlJyxcbiAgICBTREtfVFVSQk9TQ0FMRTogJ3Nkazp0dXJib3NjYWxlJyxcbiAgICBTREtfUEVSQ1k6ICdzZGs6cGVyY3knLFxuICAgIFNES19QUkVfSU5JVElBTElaRTogJ3Nkazpkcml2ZXI6cHJlLWluaXRpYWxpemF0aW9uJyxcbiAgICBTREtfUE9TVF9JTklUSUFMSVpFOiAnc2RrOmRyaXZlcjpwb3N0LWluaXRpYWxpemF0aW9uJyxcbiAgICBTREtfQ0xJX0NIRUNLX1VQREFURTogJ3NkazpjbGk6Y2hlY2stdXBkYXRlJyxcbiAgICBTREtfQ0xJX0RPV05MT0FEOiAnc2RrOmNsaTpkb3dubG9hZCcsXG4gICAgU0RLX0NMSV9PTl9CT09UU1RSQVA6ICdzZGs6Y2xpOm9uLWJvb3RzdHJhcCcsXG4gICAgU0RLX0NMSV9PTl9DT05ORUNUOiAnc2RrOmNsaTpvbi1jb25uZWN0JyxcbiAgICBTREtfQ0xJX1NUQVJUOiAnc2RrOmNsaTpzdGFydCcsXG4gICAgU0RLX0NMSV9PTl9TVE9QOiAnc2RrOmNsaTpvbi1zdG9wJyxcbiAgICBTREtfQ09OTkVDVF9CSU5fU0VTU0lPTjogJ3Nkazpjb25uZWN0QmluU2Vzc2lvbicsXG4gICAgU0RLX1NUQVJUX0JJTl9TRVNTSU9OOiAnc2RrOnN0YXJ0QmluU2Vzc2lvbicsXG4gICAgLy8gTmV3IGV2ZW50cyBmcm9tIFB5dGhvbiBTREtcbiAgICBTREtfRFJJVkVSX0lOSVQ6ICdzZGs6ZHJpdmVySW5pdCcsXG4gICAgU0RLX0ZJTkRfTkVBUkVTVF9IVUI6ICdzZGs6ZmluZE5lYXJlc3RIdWInLFxuICAgIFNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19JTklUOiAnc2RrOmF1dG9tYXRpb25GcmFtZXdvcmtJbml0JyxcbiAgICBTREtfQVVUT01BVElPTl9GUkFNRVdPUktfU1RBUlQ6ICdzZGs6YXV0b21hdGlvbkZyYW1ld29ya1N0YXJ0JyxcbiAgICBTREtfQVVUT01BVElPTl9GUkFNRVdPUktfU1RPUDogJ3NkazphdXRvbWF0aW9uRnJhbWV3b3JrU3RvcCcsXG4gICAgU0RLX0FDQ0VTU0lCSUxJVFlfQ09ORklHOiAnc2RrOmFjY2Vzc2liaWxpdHlDb25maWcnLFxuICAgIFNES19PQlNFUlZBQklMSVRZX0NPTkZJRzogJ3NkazpvYnNlcnZhYmlsaXR5Q29uZmlnJyxcbiAgICBTREtfQUlfU0VMRl9IRUFMX1NURVA6ICdzZGs6YWlTZWxmSGVhbFN0ZXAnLFxuICAgIFNES19BSV9TRUxGX0hFQUxfR0VUX1JFU1VMVDogJ3NkazphaVNlbGZIZWFsR2V0UmVzdWx0JyxcbiAgICBTREtfVEVTVF9GUkFNRVdPUktfRVZFTlQ6ICdzZGs6dGVzdEZyYW1ld29ya0V2ZW50JyxcbiAgICBTREtfVEVTVF9TRVNTSU9OX0VWRU5UOiAnc2RrOnRlc3RTZXNzaW9uRXZlbnQnLFxuICAgIFNES19DTElfTE9HX0NSRUFURURfRVZFTlQ6ICdzZGs6Y2xpOmxvZ0NyZWF0ZWRFdmVudCcsXG4gICAgU0RLX0NMSV9FTlFVRVVFX1RFU1RfRVZFTlQ6ICdzZGs6Y2xpOmVucXVldWVUZXN0RXZlbnQnLFxuICAgIFNES19PTl9TVE9QOiAnc2RrOm9uU3RvcCcsXG4gICAgU0RLX1NFTkRfTE9HUzogJ3NkazpzZW5kbG9ncycsXG4gICAgLy8gRnVubmVsIEV2ZW50c1xuICAgIFNES19GVU5ORUxfVEVTVF9BVFRFTVBURUQ6ICdzZGs6ZnVubmVsOnRlc3QtYXR0ZW1wdGVkJyxcbiAgICBTREtfRlVOTkVMX1RFU1RfU1VDQ0VTU0ZVTDogJ3NkazpmdW5uZWw6dGVzdC1zdWNjZXNzZnVsJyxcbiAgICAvLyBMb2cgVXBsb2FkIEV2ZW50c1xuICAgIFNES19VUExPQURfTE9HUzogJ3Nkazp1cGxvYWQtbG9ncycsXG4gICAgLy8gS2V5IE1ldHJpY3MgRXZlbnRzXG4gICAgU0RLX1NFTkRfS0VZX01FVFJJQ1M6ICdzZGs6c2VuZC1rZXktbWV0cmljcycsXG4gICAgU0RLX0tFWV9NRVRSSUNTX1BSRVBBUkFUSU9OOiAnc2RrOmtleS1tZXRyaWNzOnByZXBhcmF0aW9uJyxcbiAgICBTREtfS0VZX01FVFJJQ1NfVVBMT0FEOiAnc2RrOmtleS1tZXRyaWNzOnVwbG9hZCcsXG4gICAgLy8gQ0xJIEJpbmFyeSBFdmVudHNcbiAgICBTREtfQ0xJX0RPV05MT0FEX0JJTkFSWTogJ3NkazpjbGk6ZG93bmxvYWQtYmluYXJ5JyxcbiAgICBTREtfQ0xJX0JJTkFSWV9WRVJJRklDQVRJT046ICdzZGs6Y2xpOmJpbmFyeS12ZXJpZmljYXRpb24nLFxuICAgIC8vIENsZWFudXAgJiBTaHV0ZG93biBFdmVudHMgKHRyYWNraW5nIGdhcCBiZXR3ZWVuIGRyaXZlcjpxdWl0IGFuZCBmdW5uZWw6dGVzdC1zdWNjZXNzZnVsKVxuICAgIFNES19MSVNURU5FUl9XT1JLRVJfRU5EOiAnc2RrOmxpc3RlbmVyOndvcmtlci1lbmQnLFxuICAgIFNES19QRVJDWV9URUFSRE9XTjogJ3NkazpwZXJjeTp0ZWFyZG93bicsXG4gICAgU0RLX1dPUktFUl9TQVZFX0RBVEE6ICdzZGs6d29ya2VyOnNhdmUtZGF0YScsXG4gICAgU0RLX1BFUkZPUk1BTkNFX1JFUE9SVF9HRU46ICdzZGs6cGVyZm9ybWFuY2U6cmVwb3J0LWdlbmVyYXRpb24nLFxuICAgIFNES19QRVJGT1JNQU5DRV9KU09OX1dSSVRFOiAnc2RrOnBlcmZvcm1hbmNlOmpzb24td3JpdGUnLFxuICAgIFNES19QRVJGT1JNQU5DRV9IVE1MX0dFTjogJ3NkazpwZXJmb3JtYW5jZTpodG1sLWdlbmVyYXRpb24nLFxuICAgIC8vIERldmljZSBBbGxvY2F0aW9uIEV2ZW50ICh0cmFja2luZyBnYXAgYmV0d2VlbiBiZWZvcmVTZXNzaW9uIGFuZCBiZWZvcmUgaG9va3MpXG4gICAgU0RLX0RFVklDRV9BTExPQ0FUSU9OOiAnc2RrOmRldmljZS1hbGxvY2F0aW9uJ1xufVxuXG5leHBvcnQgY29uc3QgVEVTVEhVQl9FVkVOVFMgPSB7XG4gICAgU1RBUlQ6IGAke0VWRU5UUy5TREtfVEVTVEhVQn06c3RhcnRgLFxuICAgIFNUT1A6IGAke0VWRU5UUy5TREtfVEVTVEhVQn06c3RvcGBcbn1cblxuZXhwb3J0IGNvbnN0IEFVVE9NQVRFX0VWRU5UUyA9IHtcbiAgICBLRUVQX0FMSVZFOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTprZWVwLWFsaXZlYCxcbiAgICBIVUJfTUFOQUdFTUVOVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06aHViLW1hbmFnZW1lbnRgLFxuICAgIExPQ0FMX1NUQVJUOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpsb2NhbC1zdGFydGAsXG4gICAgTE9DQUxfU1RPUDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06bG9jYWwtc3RvcGAsXG4gICAgRFJJVkVSX01BTkFHRTogYCR7RVZFTlRTLlNES19BVVRPTUFURX06ZHJpdmVyLW1hbmFnZWAsXG4gICAgU0VTU0lPTl9OQU1FOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLW5hbWVgLFxuICAgIFNFU1NJT05fU1RBVFVTOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLXN0YXR1c2AsXG4gICAgU0VTU0lPTl9BTk5PVEFUSU9OOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLWFubm90YXRpb25gLFxuICAgIElETEVfVElNRU9VVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06aWRsZS10aW1lb3V0YCxcbiAgICBHRU5FUkFURV9DSV9BUlRJRkFDVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06Y2ktYXJ0aWZhY3RzYCxcbiAgICBQUklOVF9CVUlMRExJTks6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OnByaW50LWJ1aWxkbGlua2Bcbn1cblxuZXhwb3J0IGNvbnN0IEExMVlfRVZFTlRTID0ge1xuICAgIFBFUkZPUk1fU0NBTjogYCR7RVZFTlRTLlNES19BMTFZfTpkcml2ZXItcGVyZm9ybXNjYW5gLFxuICAgIFNBVkVfUkVTVUxUUzogYCR7RVZFTlRTLlNES19BMTFZfTpzYXZlLXJlc3VsdHNgLFxuICAgIEdFVF9SRVNVTFRTOiBgJHtFVkVOVFMuU0RLX0ExMVl9OmdldC1hY2Nlc3NpYmlsaXR5LXJlc3VsdHNgLFxuICAgIEdFVF9SRVNVTFRTX1NVTU1BUlk6IGAke0VWRU5UUy5TREtfQTExWX06Z2V0LWFjY2Vzc2liaWxpdHktcmVzdWx0cy1zdW1tYXJ5YFxufVxuXG5leHBvcnQgY29uc3QgUEVSQ1lfRVZFTlRTID0ge1xuICAgIERPV05MT0FEOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpkb3dubG9hZGAsXG4gICAgU0NSRUVOU0hPVDogYCR7RVZFTlRTLlNES19QRVJDWX06c2NyZWVuc2hvdGAsXG4gICAgU1RBUlQ6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnN0YXJ0YCxcbiAgICBTVE9QOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpzdG9wYCxcbiAgICBBVVRPX0NBUFRVUkU6IGAke0VWRU5UUy5TREtfUEVSQ1l9OmF1dG8tY2FwdHVyZWAsXG4gICAgU05BUFNIT1Q6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnNuYXBzaG90YCxcbiAgICBTQ1JFRU5TSE9UX0FQUDogYCR7RVZFTlRTLlNES19QRVJDWX06c2NyZWVuc2hvdC1hcHBgXG59XG5cbmV4cG9ydCBjb25zdCBPMTFZX0VWRU5UUyA9IHtcbiAgICBTWU5DOiBgJHtFVkVOVFMuU0RLX08xMVl9OnN5bmNgLFxuICAgIFRBS0VfU0NSRUVOU0hPVDogYCR7RVZFTlRTLlNES19PMTFZfTpkcml2ZXItdGFrZVNjcmVlblNob3RgLFxuICAgIFBSSU5UX0JVSUxETElOSzogYCR7RVZFTlRTLlNES19PMTFZfTpwcmludC1idWlsZGxpbmtgXG59XG5cbmV4cG9ydCBjb25zdCBIT09LX0VWRU5UUyA9IHtcbiAgICBCRUZPUkVfRUFDSDogYCR7RVZFTlRTLlNES19IT09LfTpiZWZvcmUtZWFjaGAsXG4gICAgQUZURVJfRUFDSDogYCR7RVZFTlRTLlNES19IT09LfTphZnRlci1lYWNoYCxcbiAgICBBRlRFUl9BTEw6IGAke0VWRU5UUy5TREtfSE9PS306YWZ0ZXItYWxsYCxcbiAgICBCRUZPUkVfQUxMOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmJlZm9yZS1hbGxgLFxuICAgIEJFRk9SRTogYCR7RVZFTlRTLlNES19IT09LfTpiZWZvcmVgLFxuICAgIEFGVEVSOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmFmdGVyYFxufVxuXG5leHBvcnQgY29uc3QgVFVSQk9TQ0FMRV9FVkVOVFMgPSB7XG4gICAgSFVCX01BTkFHRU1FTlQ6IGAke0VWRU5UUy5TREtfVFVSQk9TQ0FMRX06aHViLW1hbmFnZW1lbnRgLFxuICAgIFBSSU5UX0JVSUxETElOSzogYCR7RVZFTlRTLlNES19UVVJCT1NDQUxFfTpwcmludC1idWlsZGxpbmtgXG59XG5cbmV4cG9ydCBjb25zdCBBUFBfQVVUT01BVEVfRVZFTlRTID0ge1xuICAgIEFQUF9VUExPQUQ6IGAke0VWRU5UUy5TREtfQVBQX0FVVE9NQVRFfTphcHAtdXBsb2FkYFxufVxuXG5leHBvcnQgY29uc3QgRFJJVkVSX0VWRU5UID0ge1xuICAgIFFVSVQ6IGAke0VWRU5UUy5TREtfRFJJVkVSfTpxdWl0YCxcbiAgICBHRVQ6IGAke0VWRU5UUy5TREtfRFJJVkVSfTpnZXRgLFxuICAgIFBSRV9FWEVDVVRFOiBgJHtFVkVOVFMuU0RLX0RSSVZFUn06cHJlLWV4ZWN1dGVgLFxuICAgIFBPU1RfRVhFQ1VURTogYCR7RVZFTlRTLlNES19EUklWRVJ9OnBvc3QtZXhlY3V0ZWAsXG4gICAgSU5JVDogRVZFTlRTLlNES19EUklWRVJfSU5JVCxcbiAgICBQUkVfSU5JVElBTElaRTogRVZFTlRTLlNES19QUkVfSU5JVElBTElaRSxcbiAgICBQT1NUX0lOSVRJQUxJWkU6IEVWRU5UUy5TREtfUE9TVF9JTklUSUFMSVpFXG59XG5cbi8qKlxuICogRnJhbWV3b3JrIGxpZmVjeWNsZSBldmVudHMgZm9yIGF1dG9tYXRpb24gZnJhbWV3b3JrIHRyYWNraW5nXG4gKi9cbmV4cG9ydCBjb25zdCBGUkFNRVdPUktfRVZFTlRTID0ge1xuICAgIElOSVQ6IEVWRU5UUy5TREtfQVVUT01BVElPTl9GUkFNRVdPUktfSU5JVCxcbiAgICBTVEFSVDogRVZFTlRTLlNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19TVEFSVCxcbiAgICBTVE9QOiBFVkVOVFMuU0RLX0FVVE9NQVRJT05fRlJBTUVXT1JLX1NUT1Bcbn1cblxuLyoqXG4gKiBNb2R1bGUgY29uZmlndXJhdGlvbiBldmVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IENPTkZJR19FVkVOVFMgPSB7XG4gICAgQUNDRVNTSUJJTElUWTogRVZFTlRTLlNES19BQ0NFU1NJQklMSVRZX0NPTkZJRyxcbiAgICBPQlNFUlZBQklMSVRZOiBFVkVOVFMuU0RLX09CU0VSVkFCSUxJVFlfQ09ORklHXG59XG5cbi8qKlxuICogQUkgc2VsZi1oZWFsaW5nIGV2ZW50c1xuICovXG5leHBvcnQgY29uc3QgQUlfRVZFTlRTID0ge1xuICAgIFNFTEZfSEVBTF9TVEVQOiBFVkVOVFMuU0RLX0FJX1NFTEZfSEVBTF9TVEVQLFxuICAgIFNFTEZfSEVBTF9HRVRfUkVTVUxUOiBFVkVOVFMuU0RLX0FJX1NFTEZfSEVBTF9HRVRfUkVTVUxUXG59XG5cbi8qKlxuICogRXZlbnQgZGlzcGF0Y2hlciBldmVudHMgZm9yIHRlc3QgZnJhbWV3b3JrIGFuZCBzZXNzaW9uIHRyYWNraW5nXG4gKi9cbmV4cG9ydCBjb25zdCBESVNQQVRDSEVSX0VWRU5UUyA9IHtcbiAgICBURVNUX0ZSQU1FV09SSzogRVZFTlRTLlNES19URVNUX0ZSQU1FV09SS19FVkVOVCxcbiAgICBURVNUX1NFU1NJT046IEVWRU5UUy5TREtfVEVTVF9TRVNTSU9OX0VWRU5ULFxuICAgIExPR19DUkVBVEVEOiBFVkVOVFMuU0RLX0NMSV9MT0dfQ1JFQVRFRF9FVkVOVCxcbiAgICBFTlFVRVVFX1RFU1Q6IEVWRU5UUy5TREtfQ0xJX0VOUVVFVUVfVEVTVF9FVkVOVFxufVxuXG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5cbmltcG9ydCBsb2dnZXIgZnJvbSAnQHdkaW8vbG9nZ2VyJ1xuXG5pbXBvcnQgeyBMT0dTX0ZJTEUgfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tICcuLi91dGlsLmpzJ1xuXG5jb25zdCBsb2cgPSBsb2dnZXIoJ0B3ZGlvL2Jyb3dzZXJzdGFjay1zZXJ2aWNlL2NsaScpXG5cbmV4cG9ydCBjbGFzcyBCU3RhY2tMb2dnZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgbG9nRmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgTE9HU19GSUxFKVxuICAgIHB1YmxpYyBzdGF0aWMgbG9nRm9sZGVyUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycpXG4gICAgcHJpdmF0ZSBzdGF0aWMgbG9nRmlsZVN0cmVhbTogZnMuV3JpdGVTdHJlYW0gfCBudWxsXG5cbiAgICBzdGF0aWMgbG9nVG9GaWxlKGxvZ01lc3NhZ2U6IHN0cmluZywgbG9nTGV2ZWw6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuc3VyZUxvZ3NGb2xkZXIoKVxuICAgICAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRoaXMubG9nRmlsZVBhdGgsIHsgZmxhZ3M6ICdhJyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubG9nRmlsZVN0cmVhbSAmJiB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGUodGhpcy5mb3JtYXRMb2cobG9nTWVzc2FnZSwgbG9nTGV2ZWwpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nLmRlYnVnKGBGYWlsZWQgdG8gbG9nIHRvIGZpbGUuIEVycm9yICR7ZXJyb3J9YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGZvcm1hdExvZyhsb2dNZXNzYWdlOiBzdHJpbmcsIGxldmVsOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGAke2NoYWxrLmdyYXkobmV3IERhdGUoKS50b0lTT1N0cmluZygpKX0gJHtjaGFsa1tDT0xPUlNbbGV2ZWxdXShsZXZlbC50b1VwcGVyQ2FzZSgpKX0gJHtjaGFsay53aGl0ZUJyaWdodCgnQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2UnKX0gJHtsb2dNZXNzYWdlfVxcbmBcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGluZm8obWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9nVG9GaWxlKG1lc3NhZ2UsICdpbmZvJylcbiAgICAgICAgbG9nLmluZm8obWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAnZXJyb3InKVxuICAgICAgICBsb2cuZXJyb3IobWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgcGFyYW0/OiB1bmtub3duKSB7XG4gICAgICAgIHRoaXMubG9nVG9GaWxlKG1lc3NhZ2UsICdkZWJ1ZycpXG4gICAgICAgIGlmIChwYXJhbSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UsIHBhcmFtKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHdhcm4obWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubG9nVG9GaWxlKG1lc3NhZ2UsICd3YXJuJylcbiAgICAgICAgbG9nLndhcm4obWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRyYWNlKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAndHJhY2UnKVxuICAgICAgICBsb2cudHJhY2UobWVzc2FnZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyTG9nZ2VyKCkge1xuICAgICAgICBpZiAodGhpcy5sb2dGaWxlU3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0uZW5kKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0gPSBudWxsXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckxvZ0ZpbGUoKSB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMubG9nRmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBmcy50cnVuY2F0ZVN5bmModGhpcy5sb2dGaWxlUGF0aClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW5zdXJlTG9nc0ZvbGRlcigpIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMubG9nRm9sZGVyUGF0aCkpe1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMubG9nRm9sZGVyUGF0aClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgVGVzdEZyYW1ld29ya0NvbnN0YW50cyA9IHtcbiAgICBLRVlfVEVTVF9VVUlEOiAndGVzdF91dWlkJyxcbiAgICBLRVlfVEVTVF9JRCA6ICd0ZXN0X2lkJyxcbiAgICBLRVlfVEVTVF9OQU1FIDogJ3Rlc3RfbmFtZScsXG4gICAgS0VZX1RFU1RfRklMRV9QQVRIIDogJ3Rlc3RfZmlsZV9wYXRoJyxcbiAgICBLRVlfVEVTVF9UQUdTIDogJ3Rlc3RfdGFncycsXG4gICAgS0VZX1RFU1RfUkVTVUxUIDogJ3Rlc3RfcmVzdWx0JyxcbiAgICBLRVlfVEVTVF9SRVNVTFRfQVQgOiAndGVzdF9yZXN1bHRfYXQnLFxuICAgIEtFWV9URVNUX1NUQVJURURfQVQgOiAndGVzdF9zdGFydGVkX2F0JyxcbiAgICBLRVlfVEVTVF9FTkRFRF9BVCA6ICd0ZXN0X2VuZGVkX2F0JyxcbiAgICBLRVlfVEVTVF9MT0NBVElPTiA6ICd0ZXN0X2xvY2F0aW9uJyxcbiAgICBLRVlfVEVTVF9TQ09QRSA6ICd0ZXN0X3Njb3BlJyxcbiAgICBLRVlfVEVTVF9TQ09QRVMgOiAndGVzdF9zY29wZXMnLFxuICAgIEtFWV9URVNUX0ZSQU1FV09SS19OQU1FIDogJ3Rlc3RfZnJhbWV3b3JrX25hbWUnLFxuICAgIEtFWV9URVNUX0ZSQU1FV09SS19WRVJTSU9OIDogJ3Rlc3RfZnJhbWV3b3JrX3ZlcnNpb24nLFxuICAgIEtFWV9URVNUX0NPREUgOiAndGVzdF9jb2RlJyxcbiAgICBLRVlfVEVTVF9SRVJVTl9OQU1FIDogJ3Rlc3RfcmVydW5fbmFtZScsXG4gICAgS0VZX1BMQVRGT1JNX0lOREVYIDogJ3BsYXRmb3JtX2luZGV4JyxcbiAgICBLRVlfVEVTVF9GQUlMVVJFIDogJ3Rlc3RfZmFpbHVyZScsXG4gICAgS0VZX1RFU1RfRkFJTFVSRV9UWVBFIDogJ3Rlc3RfZmFpbHVyZV90eXBlJyxcbiAgICBLRVlfVEVTVF9GQUlMVVJFX1JFQVNPTiA6ICd0ZXN0X2ZhaWx1cmVfcmVhc29uJyxcbiAgICBLRVlfVEVTVF9MT0dTIDogJ3Rlc3RfbG9ncycsXG4gICAgS0VZX1RFU1RfTUVUQSA6ICd0ZXN0X21ldGEnLFxuICAgIEtFWV9DVVNUT01fVEFHUyA6ICdjdXN0b21fbWV0YWRhdGEnLFxuICAgIEtFWV9URVNUX0RFRkVSUkVEIDogJ3Rlc3RfZGVmZXJyZWQnLFxuICAgIEtFWV9TRVNTSU9OX05BTUUgOiAndGVzdF9zZXNzaW9uX25hbWUnLFxuICAgIEtFWV9BVVRPTUFURV9TRVNTSU9OX05BTUUgOiAnYXV0b21hdGVfc2Vzc2lvbl9uYW1lJyxcbiAgICBLRVlfQVVUT01BVEVfU0VTU0lPTl9TVEFUVVM6ICdhdXRvbWF0ZV9zZXNzaW9uX3N0YXR1cycsXG4gICAgS0VZX0FVVE9NQVRFX1NFU1NJT05fUkVBU09OOiAnYXV0b21hdGVfc2Vzc2lvbl9yZWFzb24nLFxuICAgIEtFWV9FVkVOVF9TVEFSVEVEX0FUIDogJ2V2ZW50X3N0YXJ0ZWRfYXQnLFxuICAgIEtFWV9FVkVOVF9FTkRFRF9BVCA6ICdldmVudF9lbmRlZF9hdCcsXG4gICAgS0VZX0hPT0tfSUQgOiAnaG9va19pZCcsXG4gICAgS0VZX0hPT0tfUkVTVUxUIDogJ2hvb2tfcmVzdWx0JyxcbiAgICBLRVlfSE9PS19MT0dTIDogJ2hvb2tfbG9ncycsXG4gICAgS0VZX0hPT0tfTkFNRSA6ICdob29rX25hbWUnLFxuICAgIEtFWV9IT09LU19TVEFSVEVEOiAndGVzdF9ob29rc19zdGFydGVkJyxcbiAgICBLRVlfSE9PS1NfRklOSVNIRUQ6ICd0ZXN0X2hvb2tzX2ZpbmlzaGVkJyxcbiAgICBERUZBVUxUX1RFU1RfUkVTVUxUIDogJ3BlbmRpbmcnLFxuICAgIERFRkFVTFRfSE9PS19SRVNVTFQgOiAncGVuZGluZycsXG4gICAgS0lORF9TQ1JFRU5TSE9UIDogJ1RFU1RfU0NSRUVOU0hPVCcsXG4gICAgS0lORF9MT0cgOiAnVEVTVF9MT0cnLFxuICAgIEhPT0tfUkVHRVggOiAnXihCRUZPUkVffEFGVEVSXyknLFxufVxuIiwgIlxuaW1wb3J0IHsgQlJPV1NFUlNUQUNLX1BFUkNZLCBCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSwgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFkgfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi4vY29uZmlnLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHsgaXNUcnVlLCBpc0xvYWRUZXN0aW5nU2Vzc2lvbiB9IGZyb20gJy4uL3V0aWwuanMnXG5cbmludGVyZmFjZSBFcnJvclR5cGUge1xuICAgIGtleTogc3RyaW5nXG4gICAgbWVzc2FnZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JzIHtcbiAgICBlcnJvcnM6IEVycm9yVHlwZVtdXG59XG5cbmV4cG9ydCBjb25zdCBnZXRQcm9kdWN0TWFwID0gKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPT4ge1xuICAgIC8vIExUUyBnYXRpbmc6IHVuZGVyIExUUywgYXV0b21hdGUgaXMgZm9yY2VkIGZhbHNlIChMVFMgYnVpbGRzIHJvdXRlIHRvXG4gICAgLy8gdGhlIExUUyBpbnRlcm5hbCBodWI7IGtlZXBpbmcgYXV0b21hdGU9dHJ1ZSB0YWdzIFRlc3RIdWIgc291cmNlIGFzXG4gICAgLy8gVE8sQVVULExUUyBpbnN0ZWFkIG9mIFRPLExUUyBcdTIwMTQgc2VlIHB5LXNkayBlYTUzZDkxNCkuIFRoZSBgbHRzYCBrZXlcbiAgICAvLyBpdHNlbGYgaXMgb25seSBlbWl0dGVkIHVuZGVyIExUUyBzbyBub24tTFRTIHBheWxvYWRzIHN0YXkgYnl0ZS1cbiAgICAvLyBpZGVudGljYWwgdG8gdGhlIHByZS1MVFMtUFIgc2hhcGUgKGF2b2lkcyBzdXJwcmlzaW5nIGFueSBiYWNrZW5kIHdpdGhcbiAgICAvLyBzdHJpY3QgdW5rbm93bi1rZXkgdmFsaWRhdGlvbikuXG4gICAgY29uc3QgbHRzID0gaXNMb2FkVGVzdGluZ1Nlc3Npb24oKVxuICAgIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIGJvb2xlYW4gfCB1bmRlZmluZWRdW10gPSBbXG4gICAgICAgIFsnb2JzZXJ2YWJpbGl0eScsIGNvbmZpZy50ZXN0T2JzZXJ2YWJpbGl0eS5lbmFibGVkXSxcbiAgICAgICAgWydhY2Nlc3NpYmlsaXR5JywgISFjb25maWcuYWNjZXNzaWJpbGl0eV0sXG4gICAgICAgIFsncGVyY3knLCBjb25maWcucGVyY3ldLFxuICAgICAgICBbJ2F1dG9tYXRlJywgbHRzID8gZmFsc2UgOiBjb25maWcuYXV0b21hdGVdLFxuICAgICAgICBbJ2FwcF9hdXRvbWF0ZScsIGNvbmZpZy5hcHBBdXRvbWF0ZV0sXG4gICAgXVxuICAgIGlmIChsdHMpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKFsnbHRzJywgdHJ1ZV0pXG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcy5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSBudWxsKSkgYXMgeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFByb2Nlc3NFdmVudEZvclRlc3RodWIgPSAoZXZlbnRUeXBlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAvLyBMVFMgc2hvcnQtY2lyY3VpdDogd2hlbiBydW5uaW5nIGFzIGFuIExUUyBsb2FkIHRlc3QgKEJST1dTRVJTVEFDS19MVFM9dHJ1ZVxuICAgIC8vIGZvciBsb2NhbCByZXBybywgb3IgQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEIHNldCBieSB0aGUgcG9kKSwgVGVzdEh1YlxuICAgIC8vIGV2ZW50IGVtaXNzaW9uIG11c3QgYWx3YXlzIGZsb3cgcmVnYXJkbGVzcyBvZiB0aGUgb2JzZXJ2YWJpbGl0eSAvXG4gICAgLy8gYWNjZXNzaWJpbGl0eSAvIHBlcmN5IGVudiBmbGFncy4gUG9kIHJ1bnMgZG8gZXhwb3J0XG4gICAgLy8gQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksIGJ1dCB0aGUgbG9jYWwtcmVwcm8gZmxhZyBwYXRoIGRvZXNuJ3RcbiAgICAvLyBndWFyYW50ZWUgaXQgXHUyMDE0IHdpdGhvdXQgdGhpcyBzaG9ydC1jaXJjdWl0LCBnZXRQcm9kdWN0TWFwIGNvcnJlY3RseVxuICAgIC8vIGVtaXRzIGx0czogdHJ1ZSB3aGlsZSBldmVyeSBvblRlc3RTdGFydCAvIG9uVGVzdEVuZCAvIG9uSG9va1N0YXJ0XG4gICAgLy8gc2lsZW50bHkgbm8tb3BzLiBNaXJyb3Igb2YgdGhlIHVuY29uZGl0aW9uYWwgTFRTIGV2ZW50IGZsb3cgaW4gcHktc2RrJ3NcbiAgICAvLyBzaG91bGRfc2VuZF9ldmVudF9mb3JfdGVzdGh1YigpIChQUiAjOTkzKS5cbiAgICBpZiAoaXNMb2FkVGVzdGluZ1Nlc3Npb24oKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAoaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWV0pKSB7XG4gICAgICAgIHJldHVybiAhKFsnSG9va1J1blN0YXJ0ZWQnLCAnSG9va1J1bkZpbmlzaGVkJywgJ0xvZ0NyZWF0ZWQnXS5pbmNsdWRlcyhldmVudFR5cGUpKVxuICAgIH1cbiAgICBpZiAoaXNUcnVlKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19QRVJDWV0pICYmIGV2ZW50VHlwZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIEJvb2xlYW4ocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFldIHx8IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSB8fCBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfUEVSQ1ldKSFcbn1cblxuZXhwb3J0IGNvbnN0IGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eSA9IChlcnJvcjogRXJyb3JzIHwgbnVsbCk6IHZvaWQgPT4ge1xuICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSA9ICdmYWxzZSdcbiAgICBsb2dCdWlsZEVycm9yKGVycm9yLCAnVGVzdCBSZXBvcnRpbmcgYW5kIEFuYWx5dGljcycpXG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVFcnJvckZvckFjY2Vzc2liaWxpdHkgPSAoZXJyb3I6IEVycm9ycyB8IG51bGwpOiB2b2lkID0+IHtcbiAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWV0gPSAnZmFsc2UnXG4gICAgbG9nQnVpbGRFcnJvcihlcnJvciwgJ2FjY2Vzc2liaWxpdHknKVxufVxuXG5leHBvcnQgY29uc3QgbG9nQnVpbGRFcnJvciA9IChlcnJvcjogRXJyb3JzIHwgbnVsbCwgcHJvZHVjdDogc3RyaW5nID0gJycpOiB2b2lkID0+IHtcbiAgICBpZiAoIWVycm9yIHx8ICFlcnJvci5lcnJvcnMpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGAke3Byb2R1Y3QudG9VcHBlckNhc2UoKX0gQnVpbGQgY3JlYXRpb24gZmFpbGVkICR7ZXJyb3IhfWApXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZXJyb3JKc29uIG9mIGVycm9yLmVycm9ycykge1xuICAgICAgICBjb25zdCBlcnJvclR5cGUgPSBlcnJvckpzb24ua2V5XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9ySnNvbi5tZXNzYWdlXG4gICAgICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICdFUlJPUl9JTlZBTElEX0NSRURFTlRJQUxTJzpcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlICdFUlJPUl9BQ0NFU1NfREVOSUVEJzpcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhlcnJvck1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ0VSUk9SX1NES19ERVBSRUNBVEVEJzpcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwgPSAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uPzogYm9vbGVhbiB8IG51bGwpOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9PiB7XG4gICAgLy8gTFRTIGdhdGluZzogdW5kZXIgTFRTLCBhdXRvbWF0ZSBpcyBmb3JjZWQgZmFsc2UgKExUUyBidWlsZHMgcm91dGUgdG9cbiAgICAvLyB0aGUgTFRTIGludGVybmFsIGh1Yjsga2VlcGluZyBhdXRvbWF0ZT10cnVlIHRhZ3MgVGVzdEh1YiBzb3VyY2UgYXNcbiAgICAvLyBUTyxBVVQsTFRTIGluc3RlYWQgb2YgVE8sTFRTIFx1MjAxNCBzZWUgcHktc2RrIGVhNTNkOTE0KS4gVGhlIGBsdHNgIGtleVxuICAgIC8vIGl0c2VsZiBpcyBvbmx5IGVtaXR0ZWQgdW5kZXIgTFRTIHRvIGtlZXAgbm9uLUxUUyBwYXlsb2FkcyBieXRlLVxuICAgIC8vIGlkZW50aWNhbCB0byB0aGUgcHJlLUxUUy1QUiBzaGFwZS5cbiAgICBjb25zdCBsdHMgPSBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpXG4gICAgY29uc3QgZW50cmllczogW3N0cmluZywgYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGxdW10gPSBbXG4gICAgICAgIFsnb2JzZXJ2YWJpbGl0eScsIGNvbmZpZy50ZXN0T2JzZXJ2YWJpbGl0eS5lbmFibGVkXSxcbiAgICAgICAgWydhY2Nlc3NpYmlsaXR5JywgYWNjZXNzaWJpbGl0eUF1dG9tYXRpb25dLFxuICAgICAgICBbJ3BlcmN5JywgY29uZmlnLnBlcmN5XSxcbiAgICAgICAgWydhdXRvbWF0ZScsIGx0cyA/IGZhbHNlIDogY29uZmlnLmF1dG9tYXRlXSxcbiAgICAgICAgWydhcHBfYXV0b21hdGUnLCBjb25maWcuYXBwQXV0b21hdGVdLFxuICAgIF1cbiAgICBpZiAobHRzKSB7XG4gICAgICAgIGVudHJpZXMucHVzaChbJ2x0cycsIHRydWVdKVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMuZmlsdGVyKChbLCB2XSkgPT4gdiAhPT0gbnVsbCkpIGFzIHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5cbmltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgeyBpc1ZhbGlkRW5hYmxlZFZhbHVlIH0gZnJvbSAnLi4vdXRpbC5qcydcbmltcG9ydCB7IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNULCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9PTkxZIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuXG5jb25zdCBSVU5fU01BUlRfU0VMRUNUSU9OID0gJ3J1blNtYXJ0U2VsZWN0aW9uJ1xuXG5jb25zdCBBTExPV0VEX09SQ0hFU1RSQVRJT05fS0VZUyA9IFtcbiAgICBSVU5fU01BUlRfU0VMRUNUSU9OXG5dXG5cbnR5cGUgU21hcnRTZWxlY3Rpb25SZXBvSW5mbyA9IHtcbiAgICB1cmw/OiBzdHJpbmdcbiAgICBmZWF0dXJlQnJhbmNoPzogc3RyaW5nXG4gICAgYmFzZUJyYW5jaD86IHN0cmluZ1xuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbnR5cGUgU21hcnRTZWxlY3Rpb25Tb3VyY2UgPSBzdHJpbmdbXSB8IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXSB8IG51bGxcblxudHlwZSBSdW5TbWFydFNlbGVjdGlvbkNvbmZpZyA9IHtcbiAgICBlbmFibGVkPzogYm9vbGVhbiB8IHN0cmluZ1xuICAgIG1vZGU/OiBzdHJpbmdcbiAgICBzb3VyY2U/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXSB8IG51bGxcbn1cblxuY29uc3QgaXNQbGFpbk9iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuKVxuXG5jb25zdCBhc1N0cmluZyA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBDbGFzcyB0byBoYW5kbGUgdGVzdCBvcmRlcmluZyBmdW5jdGlvbmFsaXR5XG4gKi9cbmNsYXNzIFRlc3RPcmRlcmluZyB7XG4gICAgcHJpdmF0ZSBlbmFibGVkOiBib29sZWFuXG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmcgfCBudWxsXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcbiAgICAgICAgdGhpcy5uYW1lID0gbnVsbFxuICAgIH1cblxuICAgIGVuYWJsZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgfVxuXG4gICAgZGlzYWJsZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcbiAgICAgICAgdGhpcy5uYW1lID0gbnVsbFxuICAgIH1cblxuICAgIGdldEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZWRcbiAgICB9XG5cbiAgICBnZXROYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lXG4gICAgfVxufVxuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZm9yIHRlc3Qgb3JjaGVzdHJhdGlvblxuICovXG50eXBlIE9yY2hlc3RyYXRpb25Db25maWcgPSBPcHRpb25zLlRlc3RydW5uZXIgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG5leHBvcnQgY2xhc3MgT3JjaGVzdHJhdGlvblV0aWxzIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IE9yY2hlc3RyYXRpb25VdGlscyB8IG51bGwgPSBudWxsXG4gICAgcHJpdmF0ZSBydW5TbWFydFNlbGVjdGlvbjogYm9vbGVhblxuICAgIHByaXZhdGUgc21hcnRTZWxlY3Rpb25Nb2RlOiBzdHJpbmdcbiAgICBwcml2YXRlIHRlc3RPcmRlcmluZzogVGVzdE9yZGVyaW5nXG4gICAgcHJpdmF0ZSBzbWFydFNlbGVjdGlvblNvdXJjZTogU21hcnRTZWxlY3Rpb25Tb3VyY2VcbiAgICBwcml2YXRlIHByb2plY3ROYW1lPzogc3RyaW5nXG4gICAgcHJpdmF0ZSBidWlsZE5hbWU/OiBzdHJpbmdcbiAgICBwcml2YXRlIGJ1aWxkSWRlbnRpZmllcj86IHN0cmluZ1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT3JjaGVzdHJhdGlvbkNvbmZpZykge1xuICAgICAgICB0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uID0gZmFsc2VcbiAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvbk1vZGUgPSBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVFxuICAgICAgICB0aGlzLnRlc3RPcmRlcmluZyA9IG5ldyBUZXN0T3JkZXJpbmcoKVxuICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlID0gbnVsbCAvLyBTdG9yZSBzb3VyY2UgcGF0aHMgaWYgcHJvdmlkZWRcblxuICAgICAgICAvLyBDaGVjayBib3RoIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gcGF0aHM6IGRpcmVjdCBvciBuZXN0ZWQgaW4gc2VydmljZXNcbiAgICAgICAgY29uc3QgY29uZmlnUmVjb3JkID0gaXNQbGFpbk9iamVjdChjb25maWcpID8gY29uZmlnIDoge31cbiAgICAgICAgbGV0IHRlc3RPcmNoT3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBpc1BsYWluT2JqZWN0KGNvbmZpZ1JlY29yZC50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnMpXG4gICAgICAgICAgICA/IGNvbmZpZ1JlY29yZC50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnNcbiAgICAgICAgICAgIDoge31cblxuICAgICAgICAvLyBJZiBub3QgZm91bmQgYXQgdG9wIGxldmVsLCBjaGVjayBpZiBpdCdzIGluIHRoZSBicm93c2Vyc3RhY2sgc2VydmljZSBjb25maWdcbiAgICAgICAgY29uc3Qgc2VydmljZXMgPSBBcnJheS5pc0FycmF5KGNvbmZpZ1JlY29yZC5zZXJ2aWNlcykgPyBjb25maWdSZWNvcmQuc2VydmljZXMgOiB1bmRlZmluZWRcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRlc3RPcmNoT3B0aW9ucykubGVuZ3RoID09PSAwICYmIEFycmF5LmlzQXJyYXkoc2VydmljZXMpKSB7XG4gICAgICAgICAgICAvLyBMb29rIGZvciBicm93c2Vyc3RhY2sgc2VydmljZSBjb25maWd1cmF0aW9uXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlcnZpY2Ugb2Ygc2VydmljZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoc2VydmljZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZVswXSA9PT0gJ2Jyb3dzZXJzdGFjaycgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNQbGFpbk9iamVjdChzZXJ2aWNlWzFdKSAmJlxuICAgICAgICAgICAgICAgICAgICBpc1BsYWluT2JqZWN0KHNlcnZpY2VbMV0udGVzdE9yY2hlc3RyYXRpb25PcHRpb25zKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0T3JjaE9wdGlvbnMgPSBzZXJ2aWNlWzFdLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1tjb25zdHJ1Y3Rvcl0gRm91bmQgdGVzdE9yY2hlc3RyYXRpb25PcHRpb25zIGluIGJyb3dzZXJzdGFjayBzZXJ2aWNlIGNvbmZpZycpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IHRvIGdldCBydW5TbWFydFNlbGVjdGlvbiBvcHRpb25zXG4gICAgICAgIGNvbnN0IHJ1blNtYXJ0U2VsZWN0aW9uT3B0czogUnVuU21hcnRTZWxlY3Rpb25Db25maWcgPSBpc1BsYWluT2JqZWN0KHRlc3RPcmNoT3B0aW9uc1tSVU5fU01BUlRfU0VMRUNUSU9OXSlcbiAgICAgICAgICAgID8gdGVzdE9yY2hPcHRpb25zW1JVTl9TTUFSVF9TRUxFQ1RJT05dIGFzIFJ1blNtYXJ0U2VsZWN0aW9uQ29uZmlnXG4gICAgICAgICAgICA6IHt9XG5cbiAgICAgICAgdGhpcy5fc2V0UnVuU21hcnRTZWxlY3Rpb24oXG4gICAgICAgICAgICBydW5TbWFydFNlbGVjdGlvbk9wdHMuZW5hYmxlZCA/PyBmYWxzZSxcbiAgICAgICAgICAgIHJ1blNtYXJ0U2VsZWN0aW9uT3B0cy5tb2RlIHx8IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNULFxuICAgICAgICAgICAgcnVuU21hcnRTZWxlY3Rpb25PcHRzLnNvdXJjZSA/PyBudWxsXG4gICAgICAgIClcbiAgICAgICAgLy8gRXh0cmFjdCBidWlsZCBkZXRhaWxzIGZyb20gY2FwYWJpbGl0aWVzXG4gICAgICAgIHRoaXMuX2V4dHJhY3RCdWlsZERldGFpbHMoY29uZmlnKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3QgYnVpbGQgZGV0YWlscyBmcm9tIGNhcGFiaWxpdGllc1xuICAgICAqL1xuICAgIHByaXZhdGUgX2V4dHJhY3RCdWlsZERldGFpbHMoY29uZmlnOiBPcmNoZXN0cmF0aW9uQ29uZmlnKTogdm9pZCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWdSZWNvcmQgPSBpc1BsYWluT2JqZWN0KGNvbmZpZykgPyBjb25maWcgOiB7fVxuICAgICAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gKGNvbmZpZ1JlY29yZCBhcyB7IGNhcGFiaWxpdGllcz86IHVua25vd24gfSkuY2FwYWJpbGl0aWVzXG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykpIHtcbiAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMuZm9yRWFjaChjYXBhYmlsaXR5ID0+IHRoaXMuX3BhcnNlQ2FwYWJpbGl0eShjYXBhYmlsaXR5KSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChjYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIG11bHRpcmVtb3RlIGNhcGFiaWxpdGllc1xuICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoY2FwYWJpbGl0aWVzKS5mb3JFYWNoKChjYXBzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1BsYWluT2JqZWN0KGNhcHMpICYmICdjYXBhYmlsaXRpZXMnIGluIGNhcHMgJiYgaXNQbGFpbk9iamVjdChjYXBzLmNhcGFiaWxpdGllcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlQ2FwYWJpbGl0eShjYXBzLmNhcGFiaWxpdGllcylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW19leHRyYWN0QnVpbGREZXRhaWxzXSBFeHRyYWN0ZWQgLSBwcm9qZWN0TmFtZTogJHt0aGlzLnByb2plY3ROYW1lfSwgYnVpbGROYW1lOiAke3RoaXMuYnVpbGROYW1lfSwgYnVpbGRJZGVudGlmaWVyOiAke3RoaXMuYnVpbGRJZGVudGlmaWVyfWApXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFtfZXh0cmFjdEJ1aWxkRGV0YWlsc10gJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VDYXBhYmlsaXR5KGNhcGFiaWxpdHk6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGNhcGFiaWxpdHkpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJzdGFja09wdGlvbnNSYXcgPSBjYXBhYmlsaXR5Wydic3RhY2s6b3B0aW9ucyddXG5cbiAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QoYnN0YWNrT3B0aW9uc1JhdykpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkTmFtZSA9IGFzU3RyaW5nKGJzdGFja09wdGlvbnNSYXcuYnVpbGROYW1lKVxuICAgICAgICAgICAgY29uc3QgcHJvamVjdE5hbWUgPSBhc1N0cmluZyhic3RhY2tPcHRpb25zUmF3LnByb2plY3ROYW1lKVxuICAgICAgICAgICAgY29uc3QgYnVpbGRJZGVudGlmaWVyID0gYXNTdHJpbmcoYnN0YWNrT3B0aW9uc1Jhdy5idWlsZElkZW50aWZpZXIpXG5cbiAgICAgICAgICAgIGlmIChidWlsZE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkTmFtZSA9IGJ1aWxkTmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb2plY3ROYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYnVpbGRJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZElkZW50aWZpZXIgPSBidWlsZElkZW50aWZpZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZ2FjeUJ1aWxkSWRlbnRpZmllciA9IGFzU3RyaW5nKGNhcGFiaWxpdHlbJ2Jyb3dzZXJzdGFjay5idWlsZElkZW50aWZpZXInXSlcbiAgICAgICAgICAgIGNvbnN0IGxlZ2FjeUJ1aWxkTmFtZSA9IGFzU3RyaW5nKGNhcGFiaWxpdHkuYnVpbGQpXG5cbiAgICAgICAgICAgIGlmIChsZWdhY3lCdWlsZElkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkSWRlbnRpZmllciA9IGxlZ2FjeUJ1aWxkSWRlbnRpZmllclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxlZ2FjeUJ1aWxkTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGROYW1lID0gbGVnYWN5QnVpbGROYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgb3IgY3JlYXRlIGFuIGluc3RhbmNlIG9mIE9yY2hlc3RyYXRpb25VdGlsc1xuICAgICAqL1xuICAgIHN0YXRpYyBnZXRJbnN0YW5jZShjb25maWc/OiBPcmNoZXN0cmF0aW9uQ29uZmlnKTogT3JjaGVzdHJhdGlvblV0aWxzIHwgbnVsbCB7XG4gICAgICAgIGlmICghT3JjaGVzdHJhdGlvblV0aWxzLl9pbnN0YW5jZSAmJiBjb25maWcpIHtcbiAgICAgICAgICAgIE9yY2hlc3RyYXRpb25VdGlscy5faW5zdGFuY2UgPSBuZXcgT3JjaGVzdHJhdGlvblV0aWxzKGNvbmZpZylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT3JjaGVzdHJhdGlvblV0aWxzLl9pbnN0YW5jZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBvcmNoZXN0cmF0aW9uIGRhdGEgZnJvbSBjb25maWdcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0T3JjaGVzdHJhdGlvbkRhdGEoY29uZmlnOiBPcmNoZXN0cmF0aW9uQ29uZmlnKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgICAgICBjb25zdCBjb25maWdSZWNvcmQgPSBpc1BsYWluT2JqZWN0KGNvbmZpZykgPyBjb25maWcgOiB7fVxuICAgICAgICBjb25zdCBvcmNoZXN0cmF0aW9uRGF0YSA9IGlzUGxhaW5PYmplY3QoY29uZmlnUmVjb3JkLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9ucylcbiAgICAgICAgICAgID8gY29uZmlnUmVjb3JkLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9uc1xuICAgICAgICAgICAgOiB7fVxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cblxuICAgICAgICBPYmplY3QuZW50cmllcyhvcmNoZXN0cmF0aW9uRGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBpZiAoQUxMT1dFRF9PUkNIRVNUUkFUSU9OX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHJ1biBzbWFydCBzZWxlY3Rpb24gc2V0dGluZ1xuICAgICAqL1xuICAgIGdldFJ1blNtYXJ0U2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW5TbWFydFNlbGVjdGlvblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzbWFydCBzZWxlY3Rpb24gbW9kZVxuICAgICAqL1xuICAgIGdldFNtYXJ0U2VsZWN0aW9uTW9kZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zbWFydFNlbGVjdGlvbk1vZGVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc21hcnQgc2VsZWN0aW9uIHNvdXJjZVxuICAgICAqL1xuICAgIGdldFNtYXJ0U2VsZWN0aW9uU291cmNlKCk6IFNtYXJ0U2VsZWN0aW9uU291cmNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2VcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcHJvamVjdCBuYW1lXG4gICAgICovXG4gICAgZ2V0UHJvamVjdE5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdE5hbWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYnVpbGQgbmFtZVxuICAgICAqL1xuICAgIGdldEJ1aWxkTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZE5hbWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYnVpbGQgaWRlbnRpZmllclxuICAgICAqL1xuICAgIGdldEJ1aWxkSWRlbnRpZmllcigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZElkZW50aWZpZXJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYnVpbGQgZGV0YWlsc1xuICAgICAqL1xuICAgIHNldEJ1aWxkRGV0YWlscyhwcm9qZWN0TmFtZT86IHN0cmluZywgYnVpbGROYW1lPzogc3RyaW5nLCBidWlsZElkZW50aWZpZXI/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lXG4gICAgICAgIHRoaXMuYnVpbGROYW1lID0gYnVpbGROYW1lXG4gICAgICAgIHRoaXMuYnVpbGRJZGVudGlmaWVyID0gYnVpbGRJZGVudGlmaWVyXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW3NldEJ1aWxkRGV0YWlsc10gU2V0IC0gcHJvamVjdE5hbWU6ICR7dGhpcy5wcm9qZWN0TmFtZX0sIGJ1aWxkTmFtZTogJHt0aGlzLmJ1aWxkTmFtZX0sIGJ1aWxkSWRlbnRpZmllcjogJHt0aGlzLmJ1aWxkSWRlbnRpZmllcn1gKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBydW4gc21hcnQgc2VsZWN0aW9uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0UnVuU21hcnRTZWxlY3Rpb24oZW5hYmxlZDogYm9vbGVhbiB8IHN0cmluZywgbW9kZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZ1tdIHwgU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdIHwgc3RyaW5nIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFByb3Blcmx5IHZhbGlkYXRlIGVuYWJsZWQgdmFsdWUgLSBvbmx5IGFjY2VwdCB0cnVlIGJvb2xlYW4gb3Igc3RyaW5nIFwidHJ1ZVwiXG4gICAgICAgICAgICB0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uID0gaXNWYWxpZEVuYWJsZWRWYWx1ZShlbmFibGVkKVxuICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvbk1vZGUgPSBtb2RlXG4gICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlID0gW11cblxuICAgICAgICAgICAgLy8gTG9nIHRoZSBjb25maWd1cmF0aW9uIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgU2V0dGluZyBydW5TbWFydFNlbGVjdGlvbjogZW5hYmxlZD0ke3RoaXMucnVuU21hcnRTZWxlY3Rpb259LCBtb2RlPSR7dGhpcy5zbWFydFNlbGVjdGlvbk1vZGV9YClcbiAgICAgICAgICAgIGlmICh0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gTW9kZSB2YWxpZGF0aW9uIC0gb25seSB3aGVuIHNtYXJ0IHNlbGVjdGlvbiBpcyBlbmFibGVkXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRNb2RlcyA9IFtTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCwgU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfT05MWV1cbiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkTW9kZXMuaW5jbHVkZXModGhpcy5zbWFydFNlbGVjdGlvbk1vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBJbnZhbGlkIHNtYXJ0IHNlbGVjdGlvbiBtb2RlICcke3RoaXMuc21hcnRTZWxlY3Rpb25Nb2RlfScgcHJvdmlkZWQuIERlZmF1bHRpbmcgdG8gJyR7U01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1R9Jy5gKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZSA9IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNUXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdObyBzb3VyY2UgcHJvdmlkZWQgZm9yIHNtYXJ0IHNlbGVjdGlvbjsgZGVmYXVsdGluZyB0byBudWxsLicpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFNtYXJ0IHNlbGVjdGlvbiBzb3VyY2Ugc2V0IHRvIGFycmF5OiAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSl9YClcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnICYmIHNvdXJjZS5lbmRzV2l0aCgnLmpzb24nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlID0gdGhpcy5fbG9hZFNvdXJjZUZyb21GaWxlKHNvdXJjZSkgfHwgW11cbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTbWFydCBzZWxlY3Rpb24gc291cmNlIGxvYWRlZCBmcm9tIGZpbGU6ICR7c291cmNlfWApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3NldFRlc3RPcmRlcmluZygpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgW19zZXRSdW5TbWFydFNlbGVjdGlvbl0gJHtlfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBKU09OIHNvdXJjZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIGZvcm1hdCBpdCBmb3Igc21hcnQgc2VsZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIC0gUGF0aCB0byB0aGUgSlNPTiBjb25maWd1cmF0aW9uIGZpbGVcbiAgICAgKiBAcmV0dXJucyBGb3JtYXR0ZWQgbGlzdCBvZiByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb25zXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbG9hZFNvdXJjZUZyb21GaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10ge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFNvdXJjZSBmaWxlICcke2ZpbGVQYXRofScgZG9lcyBub3QgZXhpc3QuYClcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRhdGE6IHVua25vd24gPSBudWxsXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKVxuICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZmlsZUNvbnRlbnQpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIHBhcnNpbmcgSlNPTiBmcm9tIHNvdXJjZSBmaWxlICcke2ZpbGVQYXRofSc6ICR7bWVzc2FnZX1gKVxuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSBmZWF0dXJlIGJyYW5jaCBtYXBwaW5ncyBmcm9tIGVudiB0byBhdm9pZCByZXBlYXRlZCBwYXJzaW5nXG4gICAgICAgIGxldCBmZWF0dXJlQnJhbmNoRW52TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCA9IG51bGxcblxuICAgICAgICBjb25zdCBsb2FkRmVhdHVyZUJyYW5jaE1hcHMgPSAoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnZWYXIgPSBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfT1JDSEVTVFJBVElPTl9TTUFSVF9TRUxFQ1RJT05fRkVBVFVSRV9CUkFOQ0hFUyB8fCAnJ1xuICAgICAgICAgICAgbGV0IGVudk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZW52TWFwID0gZW52VmFyLnN0YXJ0c1dpdGgoJ3snKSAmJiBlbnZWYXIuZW5kc1dpdGgoJ30nKVxuICAgICAgICAgICAgICAgICAgICA/IEpTT04ucGFyc2UoZW52VmFyKVxuICAgICAgICAgICAgICAgICAgICA6IGVudlZhci5zcGxpdCgnLCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pbmNsdWRlcygnOicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBpdGVtOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBpdGVtLnNwbGl0KCc6JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICYmIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY1trZXkudHJpbSgpXSA9IHZhbHVlLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBwYXJzaW5nIGZlYXR1cmUgYnJhbmNoIG1hcHBpbmdzOiAke2Vycm9yfWApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmVhdHVyZSBicmFuY2ggbWFwcGluZ3MgZnJvbSBlbnY6ICR7SlNPTi5zdHJpbmdpZnkoZW52TWFwKX1gKVxuICAgICAgICAgICAgcmV0dXJuIGVudk1hcFxuICAgICAgICB9XG5cbiAgICAgICAgZmVhdHVyZUJyYW5jaEVudk1hcCA9IGxvYWRGZWF0dXJlQnJhbmNoTWFwcygpXG5cbiAgICAgICAgY29uc3QgZ2V0RmVhdHVyZUJyYW5jaCA9IChuYW1lOiBzdHJpbmcsIHJlcG9JbmZvOiBTbWFydFNlbGVjdGlvblJlcG9JbmZvKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gICAgICAgICAgICAvLyAxLiBDaGVjayBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYXBcbiAgICAgICAgICAgIGlmIChmZWF0dXJlQnJhbmNoRW52TWFwICYmIGZlYXR1cmVCcmFuY2hFbnZNYXBbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZUJyYW5jaEVudk1hcFtuYW1lXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMi4gQ2hlY2sgaW4gcmVwb19pbmZvXG4gICAgICAgICAgICBpZiAocmVwb0luZm8uZmVhdHVyZUJyYW5jaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXBvSW5mby5mZWF0dXJlQnJhbmNoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiBkYXRhICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRhOiBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10gPSBbXVxuICAgICAgICAgICAgY29uc3QgbmFtZVBhdHRlcm4gPSAvXltBLVowLTlfXSskL1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCByZXBvSW5mb10gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzUGxhaW5PYmplY3QocmVwb0luZm8pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRSZXBvSW5mbyA9IHJlcG9JbmZvIGFzIFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdXJsIGlzIGEgc3RyaW5nIGFuZCBpcyBwcmVzZW50XG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlZFJlcG9JbmZvLnVybCB8fCB0eXBlb2YgdHlwZWRSZXBvSW5mby51cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBSZXBvc2l0b3J5IFVSTCBpcyBtaXNzaW5nIG9yIGludmFsaWQgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCBiYXNlQnJhbmNoLCBpZiBwcm92aWRlZCwgaXMgYSBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAodHlwZWRSZXBvSW5mby5iYXNlQnJhbmNoICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGVkUmVwb0luZm8uYmFzZUJyYW5jaCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEJhc2UgYnJhbmNoIG11c3QgYmUgYSBzdHJpbmcgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCBmZWF0dXJlQnJhbmNoLCBpZiBwcm92aWRlZCwgaXMgYSBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAodHlwZWRSZXBvSW5mby5mZWF0dXJlQnJhbmNoICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGVkUmVwb0luZm8uZmVhdHVyZUJyYW5jaCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEZlYXR1cmUgYnJhbmNoIG11c3QgYmUgYSBzdHJpbmcgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgbmFtZVxuICAgICAgICAgICAgICAgIGlmICghbmFtZVBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgSW52YWxpZCBzb3VyY2UgaWRlbnRpZmllciBmb3JtYXQgZm9yICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBsZW5ndGhcbiAgICAgICAgICAgICAgICBpZiAobmFtZS5sZW5ndGggPiAzMCB8fCBuYW1lLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYFNvdXJjZSBpZGVudGlmaWVyICcke25hbWV9JyBtdXN0IGhhdmUgYSBsZW5ndGggYmV0d2VlbiAxIGFuZCAzMCBjaGFyYWN0ZXJzLmApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciB1cmwsIGJhc2VCcmFuY2gsIGFuZCBmZWF0dXJlQnJhbmNoIC0gaWdub3JlIGFsbCBvdGhlciBrZXlzXG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZUJyYW5jaCA9IGdldEZlYXR1cmVCcmFuY2gobmFtZSwgdHlwZWRSZXBvSW5mbylcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUmVwb0luZm86IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm8gPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHVybDogdHlwZWRSZXBvSW5mby51cmwsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVCcmFuY2g6IGZlYXR1cmVCcmFuY2ggPz8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gT25seSBhZGQgYmFzZUJyYW5jaCBpZiBpdCdzIHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVkUmVwb0luZm8uYmFzZUJyYW5jaCkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFJlcG9JbmZvLmJhc2VCcmFuY2ggPSB0eXBlZFJlcG9JbmZvLmJhc2VCcmFuY2hcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRlcmVkUmVwb0luZm8uZmVhdHVyZUJyYW5jaCB8fCBmaWx0ZXJlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2ggPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBGZWF0dXJlIGJyYW5jaCBub3Qgc3BlY2lmaWVkIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJlZFJlcG9JbmZvLmJhc2VCcmFuY2ggJiYgZmlsdGVyZWRSZXBvSW5mby5iYXNlQnJhbmNoID09PSBmaWx0ZXJlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEZlYXR1cmUgYnJhbmNoIGFuZCBiYXNlIGJyYW5jaCBjYW5ub3QgYmUgdGhlIHNhbWUgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkRGF0YS5wdXNoKGZpbHRlcmVkUmVwb0luZm8pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZWREYXRhXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEuZmlsdGVyKGlzUGxhaW5PYmplY3QpIGFzIFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRlc3Qgb3JkZXJpbmcgYmFzZWQgb24gcHJpb3JpdGllc1xuICAgICAqL1xuICAgIHByaXZhdGUgX3NldFRlc3RPcmRlcmluZygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucnVuU21hcnRTZWxlY3Rpb24pIHsgLy8gSGlnaGVzdCBwcmlvcml0eVxuICAgICAgICAgICAgdGhpcy50ZXN0T3JkZXJpbmcuZW5hYmxlKFJVTl9TTUFSVF9TRUxFQ1RJT04pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRlc3RPcmRlcmluZy5kaXNhYmxlKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRlc3Qgb3JkZXJpbmcgaXMgZW5hYmxlZFxuICAgICAqL1xuICAgIHRlc3RPcmRlcmluZ0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RPcmRlcmluZy5nZXRFbmFibGVkKClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGVzdCBvcmRlcmluZyBuYW1lXG4gICAgICovXG4gICAgZ2V0VGVzdE9yZGVyaW5nTmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMudGVzdE9yZGVyaW5nLmdldEVuYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVzdE9yZGVyaW5nLmdldE5hbWUoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRlc3Qgb3JjaGVzdHJhdGlvbiBtZXRhZGF0YVxuICAgICAqL1xuICAgIGdldFRlc3RPcmNoZXN0cmF0aW9uTWV0YWRhdGEoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgJ3J1bl9zbWFydF9zZWxlY3Rpb24nOiB7XG4gICAgICAgICAgICAgICAgJ2VuYWJsZWQnOiB0aGlzLmdldFJ1blNtYXJ0U2VsZWN0aW9uKCksXG4gICAgICAgICAgICAgICAgJ21vZGUnOiB0aGlzLmdldFNtYXJ0U2VsZWN0aW9uTW9kZSgpLFxuICAgICAgICAgICAgICAgICdzb3VyY2UnOiB0aGlzLmdldFNtYXJ0U2VsZWN0aW9uU291cmNlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBidWlsZCBzdGFydCBkYXRhXG4gICAgICovXG4gICAgZ2V0QnVpbGRTdGFydERhdGEoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcnVuX3NtYXJ0X3NlbGVjdGlvbjoge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuZ2V0UnVuU21hcnRTZWxlY3Rpb24oKSxcbiAgICAgICAgICAgICAgICBtb2RlOiB0aGlzLmdldFNtYXJ0U2VsZWN0aW9uTW9kZSgpXG4gICAgICAgICAgICAgICAgLy8gTm90IHNlbmRpbmcgXCJzb3VyY2VcIiB0byBUSCBidWlsZHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgT3JjaGVzdHJhdGlvblV0aWxzXG4iLCAiaW1wb3J0IHR5cGUgeyBDYXBhYmlsaXRpZXMsIE9wdGlvbnMgfSBmcm9tICdAd2Rpby90eXBlcydcblxuaW1wb3J0IHsgQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTiwgQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRCwgV0RJT19OQU1JTkdfUFJFRklYIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgdHlwZSB7IEJyb3dzZXJzdGFja0NvbmZpZywgQ3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZCwgVXNlckNvbmZpZ2ZvclJlcG9ydGluZyB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgeyBERUZBVUxUX1JFUVVFU1RfQ09ORklHLCBnZXRPYnNlcnZhYmlsaXR5S2V5LCBnZXRPYnNlcnZhYmlsaXR5VXNlciB9IGZyb20gJy4vdXRpbC5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IEFQSVV0aWxzIGZyb20gJy4vY2xpL2FwaVV0aWxzLmpzJ1xuXG5pbXBvcnQgeyBfZmV0Y2ggYXMgZmV0Y2ggfSBmcm9tICcuL2ZldGNoV3JhcHBlci5qcydcblxudHlwZSBEaWN0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3Jhc2hSZXBvcnRlciB7XG4gICAgLyogVXNlciB0ZXN0IGNvbmZpZyBmb3IgYnVpbGQgcnVuIG1pbnVzIFBJSSAqL1xuICAgIHB1YmxpYyBzdGF0aWMgdXNlckNvbmZpZ0ZvclJlcG9ydGluZzogVXNlckNvbmZpZ2ZvclJlcG9ydGluZyA9IHt9XG4gICAgLyogVXNlciBjcmVkZW50aWFscyB1c2VkIGZvciByZXBvcnRpbmcgY3Jhc2hlcyBpbiBicm93c2Vyc3RhY2sgc2VydmljZSAqL1xuICAgIHByaXZhdGUgc3RhdGljIGNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQ6IENyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQgPSB7fVxuXG4gICAgc3RhdGljIHNldENyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgICAgICB0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQgPSB7XG4gICAgICAgICAgICB1c2VybmFtZTogZ2V0T2JzZXJ2YWJpbGl0eVVzZXIob3B0aW9ucywgY29uZmlnKSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnMsIGNvbmZpZylcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzLmVudi5DUkVERU5USUFMU19GT1JfQ1JBU0hfUkVQT1JUSU5HID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkKVxuICAgIH1cblxuICAgIHN0YXRpYyBzZXRDb25maWdEZXRhaWxzKHVzZXJDb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lciwgY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXRpZXMuVGVzdHJ1bm5lckNhcGFiaWxpdGllcywgb3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1dpdGhvdXRQSUkgPSB0aGlzLmZpbHRlclBJSSh1c2VyQ29uZmlnKVxuICAgICAgICBjb25zdCBmaWx0ZXJlZENhcGFiaWxpdGllcyA9IHRoaXMuZmlsdGVyQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcylcbiAgICAgICAgdGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nID0ge1xuICAgICAgICAgICAgZnJhbWV3b3JrOiB1c2VyQ29uZmlnLmZyYW1ld29yayxcbiAgICAgICAgICAgIHNlcnZpY2VzOiBjb25maWdXaXRob3V0UElJLnNlcnZpY2VzLFxuICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiBmaWx0ZXJlZENhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgICdCUk9XU0VSU1RBQ0tfQlVJTEQnOiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQlVJTEQsXG4gICAgICAgICAgICAgICAgJ0JST1dTRVJTVEFDS19CVUlMRF9OQU1FJzogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0JVSUxEX05BTUUsXG4gICAgICAgICAgICAgICAgJ0JVSUxEX1RBRyc6IHByb2Nlc3MuZW52LkJVSUxEX1RBR1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MuZW52LlVTRVJfQ09ORklHX0ZPUl9SRVBPUlRJTkcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcpXG4gICAgICAgIHRoaXMuc2V0Q3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZChvcHRpb25zLCB1c2VyQ29uZmlnKVxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyB1cGxvYWRDcmFzaFJlcG9ydChleGNlcHRpb246IHN0cmluZywgc3RhY2tUcmFjZTogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC51c2VybmFtZSB8fCAhdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkID0gcHJvY2Vzcy5lbnYuQ1JFREVOVElBTFNfRk9SX0NSQVNIX1JFUE9SVElORyAhPT0gdW5kZWZpbmVkID8gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5DUkVERU5USUFMU19GT1JfQ1JBU0hfUkVQT1JUSU5HKSA6IHRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIEJTdGFja0xvZ2dlci5lcnJvcihgW0NyYXNoX1JlcG9ydF9VcGxvYWRdIEZhaWxlZCB0byBwYXJzZSB1c2VyIGNyZWRlbnRpYWxzIHdoaWxlIHJlcG9ydGluZyBjcmFzaCBkdWUgdG8gJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnVzZXJuYW1lIHx8ICF0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQucGFzc3dvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiBCU3RhY2tMb2dnZXIuZXJyb3IoJ1tDcmFzaF9SZXBvcnRfVXBsb2FkXSBGYWlsZWQgdG8gcGFyc2UgdXNlciBjcmVkZW50aWFscyB3aGlsZSByZXBvcnRpbmcgY3Jhc2gnKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZyA9IHByb2Nlc3MuZW52LlVTRVJfQ09ORklHX0ZPUl9SRVBPUlRJTkcgIT09IHVuZGVmaW5lZCA/IEpTT04ucGFyc2UocHJvY2Vzcy5lbnYuVVNFUl9DT05GSUdfRk9SX1JFUE9SVElORykgOiB7fVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIHRvIHBhcnNlIHVzZXIgY29uZmlnIHdoaWxlIHJlcG9ydGluZyBjcmFzaCBkdWUgdG8gJHtlcnJvcn1gKVxuICAgICAgICAgICAgdGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nID0ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICBoYXNoZWRfaWQ6IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX1VVSURdLFxuICAgICAgICAgICAgb2JzZXJ2YWJpbGl0eV92ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgZnJhbWV3b3JrTmFtZTogV0RJT19OQU1JTkdfUFJFRklYICsgKHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZy5mcmFtZXdvcmsgfHwgJ251bGwnKSxcbiAgICAgICAgICAgICAgICBzZGtWZXJzaW9uOiBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGV4Y2VwdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHN0YWNrVHJhY2U6IHN0YWNrVHJhY2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb25maWc6IHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZ1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSVV0aWxzLkRBVEFfRU5EUE9JTlR9L2FwaS92MS9hbmFseXRpY3NgXG5cbiAgICAgICAgY29uc3QgZW5jb2RlZEF1dGggPSBCdWZmZXIuZnJvbShgJHt0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQudXNlcm5hbWV9OiR7dGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnBhc3N3b3JkfWAsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICAuLi5ERUZBVUxUX1JFUVVFU1RfQ09ORklHLmhlYWRlcnMsXG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBsZXQgYm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZShib2R5KSlcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIFJlc3BvbnNlIGlzIG5vdCBKU09OLCB1c2UgdGV4dCBhcy1pc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gU3VjY2VzcyByZXNwb25zZTogJHtib2R5fWApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFtDcmFzaF9SZXBvcnRfVXBsb2FkXSBGYWlsZWQgZHVlIHRvICR7cmVzcG9uc2UuYm9keX1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3Qob2JqOiBEaWN0IHwgQXJyYXk8RGljdD4sIGtleXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBvYmoubWFwKGVsZSA9PiB0aGlzLnJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3QoZWxlLCBrZXlzKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5pbmNsdWRlcyhwcm9wLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ialtwcm9wXSA9ICdbUkVEQUNURURdJ1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtwcm9wXSA9PT0gJ29iamVjdCcgJiYgb2JqW3Byb3BdICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdXJzaXZlbHlSZWRhY3RLZXlzRnJvbU9iamVjdChvYmpbcHJvcF0gYXMgRGljdCB8IEFycmF5PERpY3Q+LCBrZXlzKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtwcm9wXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uob2JqW3Byb3BdIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2VkID09PSAnb2JqZWN0JyAmJiBwYXJzZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3QocGFyc2VkIGFzIERpY3QgfCBBcnJheTxEaWN0Piwga2V5cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpbcHJvcF0gPSBKU09OLnN0cmluZ2lmeShwYXJzZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IHZhbGlkIEpTT04sIGxlYXZlIGFzLWlzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZGVsZXRlUElJS2V5c0Zyb21PYmplY3Qob2JqOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkge1xuICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgWyd1c2VyJywgJ3VzZXJuYW1lJywgJ2tleScsICdhY2Nlc3NLZXknXS5mb3JFYWNoKGtleSA9PiBkZWxldGUgb2JqW2tleV0pXG4gICAgfVxuXG4gICAgc3RhdGljIGZpbHRlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXM6IENhcGFiaWxpdGllcy5UZXN0cnVubmVyQ2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIGNvbnN0IGNhcHNDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjYXBhYmlsaXRpZXMpKVxuICAgICAgICB0aGlzLnJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3QoY2Fwc0NvcHksIFsnZXh0ZW5zaW9ucyddKVxuICAgICAgICByZXR1cm4gY2Fwc0NvcHlcbiAgICB9XG5cbiAgICBzdGF0aWMgZmlsdGVyUElJKHVzZXJDb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgICAgICBjb25zdCBjb25maWdXaXRob3V0UElJID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh1c2VyQ29uZmlnKSlcbiAgICAgICAgdGhpcy5kZWxldGVQSUlLZXlzRnJvbU9iamVjdChjb25maWdXaXRob3V0UElJKVxuICAgICAgICBjb25zdCBmaW5hbFNlcnZpY2VzID0gW11cbiAgICAgICAgY29uc3QgaW5pdGlhbFNlcnZpY2VzID0gY29uZmlnV2l0aG91dFBJSS5zZXJ2aWNlc1xuICAgICAgICBkZWxldGUgY29uZmlnV2l0aG91dFBJSS5zZXJ2aWNlc1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlQXJyYXkgb2YgaW5pdGlhbFNlcnZpY2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VydmljZUFycmF5KSAmJiBzZXJ2aWNlQXJyYXkubGVuZ3RoID49IDIgJiYgc2VydmljZUFycmF5WzBdID09PSAnYnJvd3NlcnN0YWNrJykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpZHggPSAxOyBpZHggPCBzZXJ2aWNlQXJyYXkubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVQSUlLZXlzRnJvbU9iamVjdChzZXJ2aWNlQXJyYXlbaWR4XSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlQXJyYXlbaWR4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBib3RoIG5ldyB0ZXN0UmVwb3J0aW5nT3B0aW9ucyBhbmQgbGVnYWN5IHRlc3RPYnNlcnZhYmlsaXR5T3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlUElJS2V5c0Zyb21PYmplY3Qoc2VydmljZUFycmF5W2lkeF0udGVzdFJlcG9ydGluZ09wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVQSUlLZXlzRnJvbU9iamVjdChzZXJ2aWNlQXJyYXlbaWR4XS50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxTZXJ2aWNlcy5wdXNoKHNlcnZpY2VBcnJheSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLyogV3JvbmcgY29uZmlndXJhdGlvbiBsaWtlIHN0cmluZ3MgaW5zdGVhZCBvZiBqc29uIG9iamVjdHMgY291bGQgYnJlYWsgdGhpcyBtZXRob2QsIG5lZWRzIG5vIGFjdGlvbiAqL1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwYXJzaW5nIHVzZXIgY29uZmlnIFBJSSB3aXRoIGVycm9yICR7ZXJyID8gKChlcnIgYXMgRXJyb3IpLnN0YWNrIHx8IGVycikgOiBlcnJ9YClcbiAgICAgICAgICAgIHJldHVybiBjb25maWdXaXRob3V0UElJXG4gICAgICAgIH1cbiAgICAgICAgY29uZmlnV2l0aG91dFBJSS5zZXJ2aWNlcyA9IGZpbmFsU2VydmljZXNcbiAgICAgICAgcmV0dXJuIGNvbmZpZ1dpdGhvdXRQSUlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlU3RhdHNPdmVydmlldyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgaXNPYmplY3RFbXB0eSB9IGZyb20gJy4uL3V0aWwuanMnXG5cbmludGVyZmFjZSBGZWF0dXJlU3RhdHNNYXAge1xuICAgIFtncm91cElkOiBzdHJpbmddOiBGZWF0dXJlU3RhdHM7XG59XG5cbmludGVyZmFjZSBKU09OQ29udmVyc2lvblNldHRpbmdzIHtcbiAgICBvbWl0R3JvdXBzPzogYm9vbGVhblxuICAgIG9ubHlHcm91cHM/OiBib29sZWFuXG4gICAgbmVzdGVkR3JvdXBzPzogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmUge1xuICAgIHRyaWdnZXJlZENvdW50OiBudW1iZXJcbiAgICBzZW50Q291bnQ6IG51bWJlclxuICAgIGZhaWxlZENvdW50OiBudW1iZXJcbiAgICBncm91cHM6IEZlYXR1cmVbXVxufVxuXG5jbGFzcyBGZWF0dXJlU3RhdHMge1xuICAgIHByaXZhdGUgdHJpZ2dlcmVkQ291bnQ6IG51bWJlciA9IDBcbiAgICBwcml2YXRlIHNlbnRDb3VudDogbnVtYmVyID0gMFxuICAgIHByaXZhdGUgZmFpbGVkQ291bnQ6IG51bWJlciA9IDBcbiAgICBwcml2YXRlIGdyb3VwczogRmVhdHVyZVN0YXRzTWFwID0ge31cblxuICAgIHB1YmxpYyBtYXJrKHN0YXR1czogc3RyaW5nLCBncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgY2FzZSAndHJpZ2dlcmVkJzpcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcmVkKGdyb3VwSWQpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgY2FzZSAnc2VudCc6XG4gICAgICAgICAgICB0aGlzLnNlbnQoZ3JvdXBJZClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2ZhaWxlZCc6XG4gICAgICAgICAgICB0aGlzLmZhaWxlZChncm91cElkKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnUmVxdWVzdCB0byBtYXJrIHVzYWdlIGZvciB1bmtub3duIHN0YXR1cyAtICcgKyBzdGF0dXMpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRyaWdnZXJlZChncm91cElkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMudHJpZ2dlcmVkQ291bnQgKz0gMVxuICAgICAgICBpZiAoZ3JvdXBJZCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVHcm91cChncm91cElkKS50cmlnZ2VyZWQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNlbnQoZ3JvdXBJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbnRDb3VudCArPSAxXG4gICAgICAgIGlmIChncm91cElkKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUdyb3VwKGdyb3VwSWQpLnNlbnQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGZhaWxlZChncm91cElkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmFpbGVkQ291bnQgKz0gMVxuICAgICAgICBpZiAoZ3JvdXBJZCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVHcm91cChncm91cElkKS5mYWlsZWQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN1Y2Nlc3MoZ3JvdXBJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbnQoZ3JvdXBJZClcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlR3JvdXAoZ3JvdXBJZDogc3RyaW5nKTogRmVhdHVyZVN0YXRzIHtcbiAgICAgICAgaWYgKCF0aGlzLmdyb3Vwc1tncm91cElkXSkge1xuICAgICAgICAgICAgdGhpcy5ncm91cHNbZ3JvdXBJZF0gPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNbZ3JvdXBJZF1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJpZ2dlcmVkQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcmVkQ291bnRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2VudENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbnRDb3VudFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGYWlsZWRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5mYWlsZWRDb3VudFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVc2FnZUZvckdyb3VwKGdyb3VwSWQ6IHN0cmluZyk6IEZlYXR1cmVTdGF0cyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwc1tncm91cElkXSB8fCBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T3ZlcnZpZXcoKTogRmVhdHVyZVN0YXRzT3ZlcnZpZXcge1xuICAgICAgICByZXR1cm4geyB0cmlnZ2VyZWRDb3VudDogdGhpcy50cmlnZ2VyZWRDb3VudCwgc2VudENvdW50OiB0aGlzLnNlbnRDb3VudCwgZmFpbGVkQ291bnQ6IHRoaXMuZmFpbGVkQ291bnQgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHcm91cHMoKTogRmVhdHVyZVN0YXRzTWFwIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZChmZWF0dXJlU3RhdHM6IEZlYXR1cmVTdGF0cyk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyaWdnZXJlZENvdW50ICs9IGZlYXR1cmVTdGF0cy5nZXRUcmlnZ2VyZWRDb3VudCgpXG4gICAgICAgIHRoaXMuc2VudENvdW50ICs9IGZlYXR1cmVTdGF0cy5nZXRTZW50Q291bnQoKVxuICAgICAgICB0aGlzLmZhaWxlZENvdW50ICs9IGZlYXR1cmVTdGF0cy5nZXRGYWlsZWRDb3VudCgpXG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZmVhdHVyZVN0YXRzLmdldEdyb3VwcygpKS5mb3JFYWNoKChbZ3JvdXBJZCwgZ3JvdXBdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUdyb3VwKGdyb3VwSWQpLmFkZChncm91cClcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBvbWl0R3JvdXBzOiB0cnVlL2ZhbHNlIC0+IEluY2x1ZGUgZ3JvdXBzIG9yIG5vdFxuICAgIC8vIG9ubHlHcm91cHM6IHRydWUvZmFsc2UgLT4gZGF0YSBpbmNsdWRlcyBvbmx5IGdyb3Vwc1xuICAgIC8vIG5lc3RlZEdyb3VwczogdHJ1ZS9mYWxzZSAtPiBncm91cHMgd2lsbCBiZSBuZXN0ZWQgaW4gZ3JvdXBzIGlmIHRydWVcbiAgICBwdWJsaWMgdG9KU09OKGNvbmZpZzogSlNPTkNvbnZlcnNpb25TZXR0aW5ncyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG92ZXJ2aWV3RGF0YTogRmVhdHVyZVN0YXRzT3ZlcnZpZXd8UmVjb3JkPHN0cmluZywgbmV2ZXI+ID0gIWNvbmZpZy5vbmx5R3JvdXBzID8ge1xuICAgICAgICAgICAgdHJpZ2dlcmVkQ291bnQ6IHRoaXMudHJpZ2dlcmVkQ291bnQsXG4gICAgICAgICAgICBzZW50Q291bnQ6IHRoaXMuc2VudENvdW50LFxuICAgICAgICAgICAgZmFpbGVkQ291bnQ6IHRoaXMuZmFpbGVkQ291bnRcbiAgICAgICAgfSA6IHt9XG5cbiAgICAgICAgY29uc3QgZ3JvdXBzRGF0YTogUmVjb3JkPHN0cmluZywgRmVhdHVyZVN0YXRzT3ZlcnZpZXc+ID0ge31cbiAgICAgICAgaWYgKCFjb25maWcub21pdEdyb3Vwcykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5ncm91cHMpLmZvckVhY2goKFtncm91cElkLCBncm91cF0pID0+IHtcbiAgICAgICAgICAgICAgICBncm91cHNEYXRhW2dyb3VwSWRdID0gKGdyb3VwLnRvSlNPTigpIGFzIEZlYXR1cmVTdGF0c092ZXJ2aWV3KSAvLyBDdXJyZW50bHkgTmVzdGVkIGdyb3VwcyBhcmUgb25seSBvdmVydmlld3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ3JvdXAgPSBjb25maWcubmVzdGVkR3JvdXBzID8geyBncm91cHM6IGdyb3Vwc0RhdGEgfSA6IGdyb3Vwc0RhdGFcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ub3ZlcnZpZXdEYXRhLFxuICAgICAgICAgICAgLi4uZ3JvdXBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUpTT04oanNvbjogRmVhdHVyZSk6IEZlYXR1cmVTdGF0cyB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG5cbiAgICAgICAgaWYgKCFqc29uIHx8IGlzT2JqZWN0RW1wdHkoanNvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0c1xuICAgICAgICB9XG4gICAgICAgIHN0YXRzLnRyaWdnZXJlZENvdW50ID0ganNvbi50cmlnZ2VyZWRDb3VudFxuICAgICAgICBzdGF0cy5zZW50Q291bnQgPSBqc29uLnNlbnRDb3VudFxuICAgICAgICBzdGF0cy5mYWlsZWRDb3VudCA9IGpzb24uZmFpbGVkQ291bnRcblxuICAgICAgICBpZiAoIWpzb24uZ3JvdXBzKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHNcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZW50cmllcyhqc29uLmdyb3VwcykuZm9yRWFjaCgoW2dyb3VwSWQsIGdyb3VwXSkgPT4ge1xuICAgICAgICAgICAgc3RhdHMuZ3JvdXBzW2dyb3VwSWRdID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGdyb3VwKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gc3RhdHNcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZlYXR1cmVTdGF0c1xuIiwgImltcG9ydCB7IGdldEVycm9yU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC5qcydcblxuY2xhc3MgRmVhdHVyZVVzYWdlIHtcbiAgICBwcml2YXRlIGlzVHJpZ2dlcmVkPzogYm9vbGVhblxuICAgIHByaXZhdGUgc3RhdHVzPzogc3RyaW5nXG4gICAgcHJpdmF0ZSBlcnJvcj86IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoaXNUcmlnZ2VyZWQ/OiBib29sZWFuKSB7XG4gICAgICAgIGlmIChpc1RyaWdnZXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmlzVHJpZ2dlcmVkID0gaXNUcmlnZ2VyZWRcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUcmlnZ2VyZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVHJpZ2dlcmVkXG4gICAgfVxuXG4gICAgcHVibGljIHNldFRyaWdnZXJlZCh0cmlnZ2VyZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1RyaWdnZXJlZCA9IHRyaWdnZXJlZFxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTdGF0dXMoc3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RXJyb3IoZXJyb3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlcmVkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzVHJpZ2dlcmVkID0gdHJ1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBmYWlsZWQoZTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgIHRoaXMuZXJyb3IgPSBnZXRFcnJvclN0cmluZyhlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdWNjZXNzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXR1cyA9ICdzdWNjZXNzJ1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTdGF0dXMoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzXG4gICAgfVxuXG4gICAgcHVibGljIGdldEVycm9yKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzVHJpZ2dlcmVkOiB0aGlzLmlzVHJpZ2dlcmVkLFxuICAgICAgICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgICAgICAgIGVycm9yOiB0aGlzLmVycm9yXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZlYXR1cmVVc2FnZVxuIiwgImNsYXNzIFRlc3RPcHNDb25maWcge1xuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogVGVzdE9wc0NvbmZpZ1xuICAgIHB1YmxpYyBidWlsZFN0b3BwZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBidWlsZEhhc2hlZElkPzogc3RyaW5nXG5cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGFzc2luZyBhcmdzIHRvIGNvbnN0cnVjdG9yXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBUZXN0T3BzQ29uZmlnKC4uLmFyZ3MpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gdHJ1ZSxcbiAgICAgICAgcHVibGljIG1hbnVhbGx5U2V0OiBib29sZWFuID0gZmFsc2UsXG4gICAgKXtcbiAgICAgICAgVGVzdE9wc0NvbmZpZy5faW5zdGFuY2UgPSB0aGlzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUZXN0T3BzQ29uZmlnXG4iLCAiaW1wb3J0IEZlYXR1cmVTdGF0cywgeyB0eXBlIEZlYXR1cmUgfSBmcm9tICcuL2ZlYXR1cmVTdGF0cy5qcydcbmltcG9ydCBGZWF0dXJlVXNhZ2UgZnJvbSAnLi9mZWF0dXJlVXNhZ2UuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgVGVzdE9wc0NvbmZpZyBmcm9tICcuL3Rlc3RPcHNDb25maWcuanMnXG5pbXBvcnQgdHlwZSB7IFRPVXNhZ2VTdGF0cyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzYWdlU3RhdCB7XG4gICAgdGVzdEV2ZW50czoge1xuICAgICAgICBzdGFydGVkOiBGZWF0dXJlXG4gICAgICAgIGZpbmlzaGVkOiBGZWF0dXJlXG4gICAgfVxuICAgIGhvb2tFdmVudHM6IHtcbiAgICAgICAgc3RhcnRlZDogRmVhdHVyZVxuICAgICAgICBmaW5pc2hlZDogRmVhdHVyZVxuICAgIH1cbiAgICBsb2dFdmVudHM6IEZlYXR1cmVcbiAgICBjYnRTZXNzaW9uRXZlbnRzOiBGZWF0dXJlXG4gICAgY2J0U2Vzc2lvblN0YXRzOiBGZWF0dXJlXG59XG5cbmNsYXNzIFVzYWdlU3RhdHMge1xuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2U6IFVzYWdlU3RhdHNcbiAgICBwdWJsaWMgdGVzdFN0YXJ0ZWRTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIHRlc3RGaW5pc2hlZFN0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgaG9va1N0YXJ0ZWRTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGhvb2tGaW5pc2hlZFN0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgY2J0U2Vzc2lvblN0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgbG9nU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyBsYXVuY2hCdWlsZFVzYWdlOiBGZWF0dXJlVXNhZ2VcbiAgICBwdWJsaWMgc3RvcEJ1aWxkVXNhZ2U6IEZlYXR1cmVVc2FnZVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBVc2FnZVN0YXRzIHtcbiAgICAgICAgaWYgKCFVc2FnZVN0YXRzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBVc2FnZVN0YXRzLmluc3RhbmNlID0gbmV3IFVzYWdlU3RhdHMoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVc2FnZVN0YXRzLmluc3RhbmNlXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudGVzdFN0YXJ0ZWRTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLnRlc3RGaW5pc2hlZFN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMuaG9va1N0YXJ0ZWRTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmhvb2tGaW5pc2hlZFN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMuY2J0U2Vzc2lvblN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMubG9nU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy5sYXVuY2hCdWlsZFVzYWdlID0gbmV3IEZlYXR1cmVVc2FnZSgpXG4gICAgICAgIHRoaXMuc3RvcEJ1aWxkVXNhZ2UgPSBuZXcgRmVhdHVyZVVzYWdlKClcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKHVzYWdlU3RhdHM6IFVzYWdlU3RhdHMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50ZXN0U3RhcnRlZFN0YXRzLmFkZCh1c2FnZVN0YXRzLnRlc3RTdGFydGVkU3RhdHMpXG4gICAgICAgIHRoaXMudGVzdEZpbmlzaGVkU3RhdHMuYWRkKHVzYWdlU3RhdHMudGVzdEZpbmlzaGVkU3RhdHMpXG4gICAgICAgIHRoaXMuaG9va1N0YXJ0ZWRTdGF0cy5hZGQodXNhZ2VTdGF0cy5ob29rU3RhcnRlZFN0YXRzKVxuICAgICAgICB0aGlzLmhvb2tGaW5pc2hlZFN0YXRzLmFkZCh1c2FnZVN0YXRzLmhvb2tGaW5pc2hlZFN0YXRzKVxuICAgICAgICB0aGlzLmNidFNlc3Npb25TdGF0cy5hZGQodXNhZ2VTdGF0cy5jYnRTZXNzaW9uU3RhdHMpXG4gICAgICAgIHRoaXMubG9nU3RhdHMuYWRkKHVzYWdlU3RhdHMubG9nU3RhdHMpXG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZERhdGEod29ya2Vyc0RhdGE6IHsgdXNhZ2VTdGF0czogVXNhZ2VTdGF0IH1bXSkge1xuICAgICAgICB0aGlzLmFkZERhdGFGcm9tV29ya2Vycyh3b3JrZXJzRGF0YSlcbiAgICAgICAgY29uc3QgdGVzdE9wc0NvbmZpZyA9IFRlc3RPcHNDb25maWcuZ2V0SW5zdGFuY2UoKVxuICAgICAgICBjb25zdCB1c2FnZTogVE9Vc2FnZVN0YXRzID0ge1xuICAgICAgICAgICAgZW5hYmxlZDogdGVzdE9wc0NvbmZpZy5lbmFibGVkLFxuICAgICAgICAgICAgbWFudWFsbHlTZXQ6IHRlc3RPcHNDb25maWcubWFudWFsbHlTZXQsXG4gICAgICAgICAgICBidWlsZEhhc2hlZElkOiB0ZXN0T3BzQ29uZmlnLmJ1aWxkSGFzaGVkSWRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdXNhZ2UuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVzYWdlXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdXNhZ2UuZXZlbnRzID0gdGhpcy5nZXRFdmVudHNEYXRhKClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdleGNlcHRpb24gaW4gZ2V0Rm9ybWF0dGVkRGF0YTogJyArIGUpXG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXNhZ2VcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRGF0YUZyb21Xb3JrZXJzKHdvcmtlcnNEYXRhOiB7IHVzYWdlU3RhdHM6IFVzYWdlU3RhdCB9W10pIHtcbiAgICAgICAgd29ya2Vyc0RhdGEubWFwKHdvcmtlckRhdGEgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2FnZVN0YXRzRm9yV29ya2VyID0gVXNhZ2VTdGF0cy5mcm9tSlNPTih3b3JrZXJEYXRhLnVzYWdlU3RhdHMpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGQodXNhZ2VTdGF0c0ZvcldvcmtlcilcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0V4Y2VwdGlvbiBpbiBhZGRpbmcgd29ya2VyRGF0YTogJyArIGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGdldEV2ZW50c0RhdGEoKXtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJ1aWxkRXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy5sYXVuY2hCdWlsZFVzYWdlLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLnN0b3BCdWlsZFVzYWdlLnRvSlNPTigpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVzdEV2ZW50czoge1xuICAgICAgICAgICAgICAgIHN0YXJ0ZWQ6IHRoaXMudGVzdFN0YXJ0ZWRTdGF0cy50b0pTT04oKSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogdGhpcy50ZXN0RmluaXNoZWRTdGF0cy50b0pTT04oeyBvbWl0R3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMudGVzdEZpbmlzaGVkU3RhdHMudG9KU09OKHsgb25seUdyb3VwczogdHJ1ZSB9KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhvb2tFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLmhvb2tTdGFydGVkU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMuaG9va0ZpbmlzaGVkU3RhdHMudG9KU09OKHsgb21pdEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICAuLi50aGlzLmhvb2tGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG9ubHlHcm91cHM6IHRydWUgfSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2dFdmVudHM6IHRoaXMubG9nU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICBjYnRTZXNzaW9uRXZlbnRzOiB0aGlzLmNidFNlc3Npb25TdGF0cy50b0pTT04oKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldERhdGFUb1NhdmUoKXtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRlc3RFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLnRlc3RTdGFydGVkU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMudGVzdEZpbmlzaGVkU3RhdHMudG9KU09OKHsgbmVzdGVkR3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhvb2tFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLmhvb2tTdGFydGVkU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMuaG9va0ZpbmlzaGVkU3RhdHMudG9KU09OKHsgbmVzdGVkR3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvZ0V2ZW50czogdGhpcy5sb2dTdGF0cy50b0pTT04oeyBuZXN0ZWRHcm91cHM6IHRydWUgfSksXG4gICAgICAgICAgICBjYnRTZXNzaW9uRXZlbnRzOiB0aGlzLmNidFNlc3Npb25TdGF0cy50b0pTT04oKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSlNPTihkYXRhOiBVc2FnZVN0YXQpIHtcbiAgICAgICAgY29uc3QgdXNhZ2VTdGF0cyA9IG5ldyBVc2FnZVN0YXRzKClcbiAgICAgICAgdXNhZ2VTdGF0cy50ZXN0U3RhcnRlZFN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEudGVzdEV2ZW50cy5zdGFydGVkKVxuICAgICAgICB1c2FnZVN0YXRzLnRlc3RGaW5pc2hlZFN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEudGVzdEV2ZW50cy5maW5pc2hlZClcbiAgICAgICAgdXNhZ2VTdGF0cy5ob29rU3RhcnRlZFN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEuaG9va0V2ZW50cy5zdGFydGVkKVxuICAgICAgICB1c2FnZVN0YXRzLmhvb2tGaW5pc2hlZFN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEuaG9va0V2ZW50cy5maW5pc2hlZClcbiAgICAgICAgdXNhZ2VTdGF0cy5sb2dTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLmxvZ0V2ZW50cylcbiAgICAgICAgdXNhZ2VTdGF0cy5jYnRTZXNzaW9uU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS5jYnRTZXNzaW9uU3RhdHMpXG4gICAgICAgIHJldHVybiB1c2FnZVN0YXRzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVc2FnZVN0YXRzXG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcydcblxuaW50ZXJmYWNlIFNjcmlwdHMge1xuICAgIHNjYW46IHN0cmluZ1xuICAgIGdldFJlc3VsdHM6IHN0cmluZ1xuICAgIGdldFJlc3VsdHNTdW1tYXJ5OiBzdHJpbmdcbiAgICBzYXZlUmVzdWx0czogc3RyaW5nXG59XG5cbmludGVyZmFjZSBDb21tYW5kIHtcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBjbGFzczogc3RyaW5nXG59XG5cbmNsYXNzIEFjY2Vzc2liaWxpdHlTY3JpcHRzIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQWNjZXNzaWJpbGl0eVNjcmlwdHMgfCBudWxsID0gbnVsbFxuXG4gICAgcHVibGljIHBlcmZvcm1TY2FuOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBnZXRSZXN1bHRzOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBnZXRSZXN1bHRzU3VtbWFyeTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgc2F2ZVRlc3RSZXN1bHRzOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBjb21tYW5kc1RvV3JhcDogQXJyYXk8Q29tbWFuZD4gfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBDaHJvbWVFeHRlbnNpb246IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge31cblxuICAgIHB1YmxpYyBicm93c2Vyc3RhY2tGb2xkZXJQYXRoID0gJydcbiAgICBwdWJsaWMgY29tbWFuZHNQYXRoID0gJydcblxuICAgIC8vIGRvbid0IGFsbG93IHRvIGNyZWF0ZSBpbnN0YW5jZXMgZnJvbSBpdCBvdGhlciB0aGFuIHRocm91Z2ggYGNoZWNrQW5kR2V0SW5zdGFuY2VgXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5icm93c2Vyc3RhY2tGb2xkZXJQYXRoID0gdGhpcy5nZXRXcml0YWJsZURpcigpXG4gICAgICAgIHRoaXMuY29tbWFuZHNQYXRoID0gcGF0aC5qb2luKHRoaXMuYnJvd3NlcnN0YWNrRm9sZGVyUGF0aCwgJ2NvbW1hbmRzLmpzb24nKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tBbmRHZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFBY2Nlc3NpYmlsaXR5U2NyaXB0cy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNjcmlwdHMuaW5zdGFuY2UgPSBuZXcgQWNjZXNzaWJpbGl0eVNjcmlwdHMoKVxuICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNjcmlwdHMuaW5zdGFuY2UucmVhZEZyb21FeGlzdGluZ0ZpbGUoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5pbnN0YW5jZVxuICAgIH1cblxuICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuICAgIHB1YmxpYyBnZXRXcml0YWJsZURpcigpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBvcmRlcmVkUGF0aHMgPSBbXG4gICAgICAgICAgICBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmJyb3dzZXJzdGFjaycpLFxuICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgIG9zLnRtcGRpcigpXG4gICAgICAgIF1cbiAgICAgICAgZm9yIChjb25zdCBvcmRlcmVkUGF0aCBvZiBvcmRlcmVkUGF0aHMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMob3JkZXJlZFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZzLmFjY2Vzc1N5bmMob3JkZXJlZFBhdGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmRlcmVkUGF0aFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyhvcmRlcmVkUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JkZXJlZFBhdGhcblxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvKiBuby1lbXB0eSAqL1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRnJvbUV4aXN0aW5nRmlsZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMuY29tbWFuZHNQYXRoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBmcy5yZWFkRmlsZVN5bmModGhpcy5jb21tYW5kc1BhdGgsICd1dGY4JylcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZShKU09OLnBhcnNlKGRhdGEpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBEbyBub3RoaW5nICovXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlKGRhdGE6IHsgY29tbWFuZHM6IFtdLCBzY3JpcHRzOiBTY3JpcHRzLCBub25CU3RhY2tJbmZyYUExMXlDaHJvbWVPcHRpb25zOiB7fSB9KSB7XG4gICAgICAgIGlmIChkYXRhLnNjcmlwdHMpIHtcbiAgICAgICAgICAgIHRoaXMucGVyZm9ybVNjYW4gPSBkYXRhLnNjcmlwdHMuc2NhblxuICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzID0gZGF0YS5zY3JpcHRzLmdldFJlc3VsdHNcbiAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0c1N1bW1hcnkgPSBkYXRhLnNjcmlwdHMuZ2V0UmVzdWx0c1N1bW1hcnlcbiAgICAgICAgICAgIHRoaXMuc2F2ZVRlc3RSZXN1bHRzID0gZGF0YS5zY3JpcHRzLnNhdmVSZXN1bHRzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuY29tbWFuZHMgJiYgZGF0YS5jb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY29tbWFuZHNUb1dyYXAgPSBkYXRhLmNvbW1hbmRzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEubm9uQlN0YWNrSW5mcmFBMTF5Q2hyb21lT3B0aW9ucyl7XG4gICAgICAgICAgICB0aGlzLkNocm9tZUV4dGVuc2lvbiA9IGRhdGEubm9uQlN0YWNrSW5mcmFBMTF5Q2hyb21lT3B0aW9uc1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcmUoKSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmJyb3dzZXJzdGFja0ZvbGRlclBhdGgpKXtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyh0aGlzLmJyb3dzZXJzdGFja0ZvbGRlclBhdGgpXG4gICAgICAgIH1cblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuY29tbWFuZHNQYXRoLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBjb21tYW5kczogdGhpcy5jb21tYW5kc1RvV3JhcCxcbiAgICAgICAgICAgIHNjcmlwdHM6IHtcbiAgICAgICAgICAgICAgICBzY2FuOiB0aGlzLnBlcmZvcm1TY2FuLFxuICAgICAgICAgICAgICAgIGdldFJlc3VsdHM6IHRoaXMuZ2V0UmVzdWx0cyxcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzU3VtbWFyeTogdGhpcy5nZXRSZXN1bHRzU3VtbWFyeSxcbiAgICAgICAgICAgICAgICBzYXZlUmVzdWx0czogdGhpcy5zYXZlVGVzdFJlc3VsdHMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm9uQlN0YWNrSW5mcmFBMTF5Q2hyb21lT3B0aW9uczogdGhpcy5DaHJvbWVFeHRlbnNpb24sXG4gICAgICAgIH0pKVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQWNjZXNzaWJpbGl0eVNjcmlwdHMuY2hlY2tBbmRHZXRJbnN0YW5jZSgpXG5leHBvcnQgeyBDb21tYW5kIH1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcblxuaW1wb3J0IHR5cGUgeyBUZXN0RGF0YSwgVXBsb2FkVHlwZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgYmF0Y2hBbmRQb3N0RXZlbnRzIH0gZnJvbSAnLi4vdXRpbC5qcydcbmltcG9ydCB7IERBVEFfQkFUQ0hfRU5EUE9JTlQgfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5cbi8qKlxuICogQ3Jhc2gtcmVzaWxpZW50IGpvdXJuYWwgb2YgdGVzdCBydW5zIHRoYXQgaGF2ZSBzZW50IFRlc3RSdW5TdGFydGVkIGJ1dCBub3QgeWV0XG4gKiBUZXN0UnVuRmluaXNoZWQuIEVhY2ggb3BlbiBydW4gaXMgcGVyc2lzdGVkIGFzIGEgc21hbGwgZmlsZSBzbyB0aGF0IGlmIHRoZSB3b3JrZXJcbiAqIChvciB0aGUgd2hvbGUgd2RpbyBwcm9jZXNzIHRyZWUpIGlzIGtpbGxlZCBtaWQtdGVzdCwgdGhlIGxhdW5jaGVyJ3Mgc2h1dGRvd24gcGF0aFxuICogb3IgdGhlIGRldGFjaGVkIGV4aXQgY2xlYW51cCBjYW4gc3RpbGwgc2VuZCBhIHN5bnRoZXRpYyBUZXN0UnVuRmluaXNoZWQgXHUyMDE0IG90aGVyd2lzZVxuICogdGhlIHRlc3QgY2FzZSBzdGF5cyBcImluIHByb2dyZXNzXCIgb24gdGhlIFRlc3QgUmVwb3J0aW5nICYgQW5hbHl0aWNzIGRhc2hib2FyZCBmb3JldmVyLlxuICovXG5cbmNvbnN0IE9QRU5fUlVOU19ESVIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnLCAnYnN0YWNrX29wZW5fcnVucycpXG5cbmV4cG9ydCBjb25zdCBPUlBIQU5fRkFJTFVSRV9SRUFTT04gPSAnVGVzdCBydW4gZGlkIG5vdCBjb21wbGV0ZTogdGhlIHByb2Nlc3Mgd2FzIGludGVycnVwdGVkIG9yIHRlcm1pbmF0ZWQgYmVmb3JlIHRoZSB0ZXN0IGZpbmlzaGVkIChmaW5hbGl6ZWQgYnkgQnJvd3NlclN0YWNrIFNESyBleGl0IGNsZWFudXApJ1xuXG5mdW5jdGlvbiBvcGVuUnVuRmlsZVBhdGgodXVpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbihPUEVOX1JVTlNfRElSLCBgb3Blbi1ydW4tJHt1dWlkfS5qc29uYClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZE9wZW5SdW4odGVzdERhdGE6IFRlc3REYXRhKSB7XG4gICAgaWYgKCF0ZXN0RGF0YSB8fCAhdGVzdERhdGEudXVpZCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgZnMubWtkaXJTeW5jKE9QRU5fUlVOU19ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMob3BlblJ1bkZpbGVQYXRoKHRlc3REYXRhLnV1aWQpLCBKU09OLnN0cmluZ2lmeSh0ZXN0RGF0YSkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ29wZW5SdW5zSm91cm5hbDogZmFpbGVkIHRvIHJlY29yZCBvcGVuIHJ1bjogJyArIGUpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJPcGVuUnVuKHV1aWQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoIXV1aWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGZzLnJtU3luYyhvcGVuUnVuRmlsZVBhdGgodXVpZCksIHsgZm9yY2U6IHRydWUgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zygnb3BlblJ1bnNKb3VybmFsOiBmYWlsZWQgdG8gY2xlYXIgb3BlbiBydW46ICcgKyBlKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RPcnBoYW5lZFJ1bnMoKTogVGVzdERhdGFbXSB7XG4gICAgY29uc3Qgb3JwaGFuczogVGVzdERhdGFbXSA9IFtdXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKE9QRU5fUlVOU19ESVIpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3JwaGFuc1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyhPUEVOX1JVTlNfRElSKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBvcnBoYW5zLnB1c2goSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKE9QRU5fUlVOU19ESVIsIGZpbGUpLCAndXRmOCcpKSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYG9wZW5SdW5zSm91cm5hbDogc2tpcHBpbmcgdW5yZWFkYWJsZSBqb3VybmFsIGZpbGUgJHtmaWxlfTogJHtlfWApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnMucm1TeW5jKE9QRU5fUlVOU19ESVIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdvcGVuUnVuc0pvdXJuYWw6IGZhaWxlZCB0byBjb2xsZWN0IG9ycGhhbmVkIHJ1bnM6ICcgKyBlKVxuICAgIH1cbiAgICByZXR1cm4gb3JwaGFuc1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluYWxpemVPcnBoYW5lZFJ1bnMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBvcnBoYW5zID0gY29sbGVjdE9ycGhhbmVkUnVucygpXG4gICAgICAgIGlmICghb3JwaGFucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgICAgICBjb25zdCBldmVudHM6IFVwbG9hZFR5cGVbXSA9IG9ycGhhbnMubWFwKCh0ZXN0RGF0YSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRlZEF0TXMgPSB0ZXN0RGF0YS5zdGFydGVkX2F0ID8gbmV3IERhdGUodGVzdERhdGEuc3RhcnRlZF9hdCkuZ2V0VGltZSgpIDogTmFOXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdUZXN0UnVuRmluaXNoZWQnLFxuICAgICAgICAgICAgICAgIHRlc3RfcnVuOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRlc3REYXRhLFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZF9hdDogZmluaXNoZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25faW5fbXM6IE51bWJlci5pc05hTihzdGFydGVkQXRNcykgPyB1bmRlZmluZWQgOiBNYXRoLm1heCgwLCBEYXRlLm5vdygpIC0gc3RhcnRlZEF0TXMpLFxuICAgICAgICAgICAgICAgICAgICBmYWlsdXJlOiBbeyBiYWNrdHJhY2U6IFtPUlBIQU5fRkFJTFVSRV9SRUFTT05dIH1dLFxuICAgICAgICAgICAgICAgICAgICBmYWlsdXJlX3JlYXNvbjogT1JQSEFOX0ZBSUxVUkVfUkVBU09OLFxuICAgICAgICAgICAgICAgICAgICBmYWlsdXJlX3R5cGU6ICdVbmhhbmRsZWRFcnJvcidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGF3YWl0IGJhdGNoQW5kUG9zdEV2ZW50cyhEQVRBX0JBVENIX0VORFBPSU5ULCAnT1JQSEFORURfVEVTVF9SVU5fRklOQUxJWkFUSU9OJywgZXZlbnRzKVxuICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgRmluYWxpemVkICR7ZXZlbnRzLmxlbmd0aH0gb3JwaGFuZWQgdGVzdCBydW4ocykgbGVmdCBiZWhpbmQgYnkgYW4gaW50ZXJydXB0ZWQgcnVuYClcbiAgICAgICAgcmV0dXJuIGV2ZW50cy5sZW5ndGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zygnb3BlblJ1bnNKb3VybmFsOiBmYWlsZWQgdG8gZmluYWxpemUgb3JwaGFuZWQgcnVuczogJyArIGUpXG4gICAgICAgIHJldHVybiAwXG4gICAgfVxufVxuIiwgImltcG9ydCB7IGdldEVycm9yU3RyaW5nLCBzdG9wQnVpbGRVcHN0cmVhbSB9IGZyb20gJy4vdXRpbC5qcydcbmltcG9ydCB7IGZpbmFsaXplT3JwaGFuZWRSdW5zIH0gZnJvbSAnLi90ZXN0T3BzL29wZW5SdW5zSm91cm5hbC5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgdXRpbCBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBmaXJlRnVubmVsUmVxdWVzdCB9IGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL2Z1bm5lbEluc3RydW1lbnRhdGlvbi5qcydcbmltcG9ydCB7IEJST1dTRVJTVEFDS19URVNUSFVCX1VVSUQsIEJST1dTRVJTVEFDS19URVNUSFVCX0pXVCwgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFkgfSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCB0eXBlIHsgRnVubmVsRGF0YSB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgUGVyZm9ybWFuY2VUZXN0ZXIgZnJvbSAnLi9pbnN0cnVtZW50YXRpb24vcGVyZm9ybWFuY2UvcGVyZm9ybWFuY2UtdGVzdGVyLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCU3RhY2tDbGVhbnVwIHtcbiAgICBzdGF0aWMgYXN5bmMgc3RhcnRDbGVhbnVwKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gR2V0IGZ1bm5lbCBkYXRhIG9iamVjdCBmcm9tIHNhdmVkIGZpbGVcbiAgICAgICAgICAgIGNvbnN0IGZ1bm5lbERhdGFDbGVhbnVwID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWZ1bm5lbERhdGEnKVxuICAgICAgICAgICAgbGV0IGZ1bm5lbERhdGE6IEZ1bm5lbERhdGEgfCBudWxsID0gbnVsbFxuICAgICAgICAgICAgaWYgKGZ1bm5lbERhdGFDbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwcm9jZXNzLmFyZ3YuaW5kZXhPZignLS1mdW5uZWxEYXRhJylcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHByb2Nlc3MuYXJndltpbmRleCArIDFdXG4gICAgICAgICAgICAgICAgZnVubmVsRGF0YSA9IEJTdGFja0NsZWFudXAuZ2V0RnVubmVsRGF0YUZyb21GaWxlKGZpbGVQYXRoKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLW9ic2VydmFiaWxpdHknKSAmJiBmdW5uZWxEYXRhKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlT2JzZXJ2YWJpbGl0eUNsZWFudXAoZnVubmVsRGF0YSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZ1bm5lbERhdGFDbGVhbnVwICYmIGZ1bm5lbERhdGEpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRGdW5uZWxEYXRhKGZ1bm5lbERhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIgYXMgc3RyaW5nXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1wZXJmb3JtYW5jZURhdGEnKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFBlcmZvcm1hbmNlVGVzdGVyLnVwbG9hZEV2ZW50c0RhdGEoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBpbiBzZW5kaW5nIGV2ZW50cyBkYXRhICR7dXRpbC5mb3JtYXQoZXIpfWApXG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGV4ZWN1dGVPYnNlcnZhYmlsaXR5Q2xlYW51cChmdW5uZWxEYXRhOiBGdW5uZWxEYXRhKSB7XG4gICAgICAgIGlmICghcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmcgVGVzdCBSZXBvcnRpbmcgYW5kIEFuYWx5dGljcyBjbGVhbnVwJylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFNESy00NjcxOiBmaW5hbGl6ZSBhbnkgdGVzdCBydW5zIG9ycGhhbmVkIGJ5IHRoZSBpbnRlcnJ1cHRlZCBwcm9jZXNzXG4gICAgICAgICAgICAvLyBiZWZvcmUgdGhlIGJ1aWxkIGl0c2VsZiBpcyBzdG9wcGVkLlxuICAgICAgICAgICAgYXdhaXQgZmluYWxpemVPcnBoYW5lZFJ1bnMoKVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcEJ1aWxkVXBzdHJlYW0oKVxuICAgICAgICAgICAgaWYgKChwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0pICYmIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX1VVSURdKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmluZm8oYFxcblZpc2l0IGh0dHBzOi8vYXV0b21hdGlvbi5icm93c2Vyc3RhY2suY29tL2J1aWxkcy8ke3Byb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX1VVSURdfSB0byB2aWV3IGJ1aWxkIHJlcG9ydCwgaW5zaWdodHMsIGFuZCBtYW55IG1vcmUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFsbCBhdCBvbmUgcGxhY2UhXFxuYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IChyZXN1bHQgJiYgcmVzdWx0LnN0YXR1cykgfHwgJ2ZhaWxlZCdcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAocmVzdWx0ICYmIHJlc3VsdC5tZXNzYWdlKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVPMTF5U3RvcERhdGEoZnVubmVsRGF0YSwgc3RhdHVzLCBzdGF0dXMgPT09ICdmYWlsZWQnID8gbWVzc2FnZSA6IHVuZGVmaW5lZClcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdFcnJvciBpbiBzdG9wcGluZyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGJ1aWxkOiAnICsgZSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTzExeVN0b3BEYXRhKGZ1bm5lbERhdGEsICdmYWlsZWQnLCBlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHVwZGF0ZU8xMXlTdG9wRGF0YShmdW5uZWxEYXRhOiBGdW5uZWxEYXRhLCBzdGF0dXM6IHN0cmluZywgZXJyb3I6IHVua25vd24gPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdG9EYXRhID0gZnVubmVsRGF0YT8uZXZlbnRfcHJvcGVydGllcz8ucHJvZHVjdFVzYWdlPy50ZXN0T2JzZXJ2YWJpbGl0eVxuICAgICAgICAvLyBSZXR1cm4gaWYgbm8gVGVzdCBSZXBvcnRpbmcgYW5kIEFuYWx5dGljcyBkYXRhIGluIGZ1bm5lbCBkYXRhXG4gICAgICAgIGlmICghdG9EYXRhKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBsZXQgZXhpc3RpbmdTdG9wRGF0YSA9IHRvRGF0YS5ldmVudHMuYnVpbGRFdmVudHMuZmluaXNoZWRcbiAgICAgICAgZXhpc3RpbmdTdG9wRGF0YSA9IGV4aXN0aW5nU3RvcERhdGEgfHwge31cblxuICAgICAgICBleGlzdGluZ1N0b3BEYXRhID0ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdTdG9wRGF0YSxcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIGVycm9yOiBnZXRFcnJvclN0cmluZyhlcnJvciksXG4gICAgICAgICAgICBzdG9wcGVkRnJvbTogJ2V4aXRIb29rJ1xuICAgICAgICB9XG4gICAgICAgIHRvRGF0YS5ldmVudHMuYnVpbGRFdmVudHMuZmluaXNoZWQgPSBleGlzdGluZ1N0b3BEYXRhXG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIHNlbmRGdW5uZWxEYXRhKGZ1bm5lbERhdGE6IEZ1bm5lbERhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZpcmVGdW5uZWxSZXF1ZXN0KGZ1bm5lbERhdGEpXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0Z1bm5lbCBkYXRhIHNlbnQgc3VjY2Vzc2Z1bGx5IGZyb20gY2xlYW51cCcpXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignRXJyb3IgaW4gc2VuZGluZyBmdW5uZWwgZGF0YTogJyArIGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RnVubmVsRGF0YUZyb21GaWxlKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JylcblxuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShjb250ZW50KVxuICAgICAgICB0aGlzLnJlbW92ZUZ1bm5lbERhdGFGaWxlKGZpbGVQYXRoKVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHN0YXRpYyByZW1vdmVGdW5uZWxEYXRhRmlsZShmaWxlUGF0aD86IHN0cmluZykge1xuICAgICAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBmcy5ybVN5bmMoZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSlcbiAgICB9XG59XG5cbnZvaWQgQlN0YWNrQ2xlYW51cC5zdGFydENsZWFudXAoKVxuIiwgImltcG9ydCBvcyBmcm9tICdub2RlOm9zJ1xuaW1wb3J0IHV0aWwsIHsgZm9ybWF0IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgVXNhZ2VTdGF0cywgeyB0eXBlIFVzYWdlU3RhdCB9IGZyb20gJy4uL3Rlc3RPcHMvdXNhZ2VTdGF0cy5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB0eXBlIEJyb3dzZXJTdGFja0NvbmZpZyBmcm9tICcuLi9jb25maWcuanMnXG5pbXBvcnQgeyBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OLCBXRElPX05BTUlOR19QUkVGSVggfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBnZXREYXRhRnJvbVdvcmtlcnMgfSBmcm9tICcuLi9kYXRhLXN0b3JlLmpzJ1xuaW1wb3J0IHsgZ2V0UHJvZHVjdE1hcCB9IGZyb20gJy4uL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgZmV0Y2hXcmFwIGZyb20gJy4uL2ZldGNoV3JhcHBlci5qcydcbmltcG9ydCB0eXBlIHsgQnJvd3NlcnN0YWNrSGVhbGluZyB9IGZyb20gJ0Bicm93c2Vyc3RhY2svYWktc2RrLW5vZGUnXG5pbXBvcnQgdHlwZSB7IEZ1bm5lbERhdGEsIEV2ZW50UHJvcGVydGllcyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IFRlc3RPcHNDb25maWcgZnJvbSAnLi4vdGVzdE9wcy90ZXN0T3BzQ29uZmlnLmpzJ1xuaW1wb3J0IEFQSVV0aWxzIGZyb20gJy4uL2NsaS9hcGlVdGlscy5qcydcbmltcG9ydCBQZXJmb3JtYW5jZVRlc3RlciBmcm9tICcuL3BlcmZvcm1hbmNlL3BlcmZvcm1hbmNlLXRlc3Rlci5qcydcbmltcG9ydCB7IEVWRU5UUyB9IGZyb20gJy4vcGVyZm9ybWFuY2UvY29uc3RhbnRzLmpzJ1xuXG5hc3luYyBmdW5jdGlvbiBmaXJlRnVubmVsVGVzdEV2ZW50KGV2ZW50VHlwZTogc3RyaW5nLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNDTElFbmFibGVkID0gZmFsc2UpIHtcbiAgICBpZiAoIWNvbmZpZy51c2VyTmFtZSB8fCAhY29uZmlnLmFjY2Vzc0tleSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ3VzZXJuYW1lL2FjY2Vzc2tleSBub3QgcGFzc2VkJylcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGJ1aWxkRXZlbnREYXRhKGV2ZW50VHlwZSwgY29uZmlnLCBpc0NMSUVuYWJsZWQpXG4gICAgICAgIGF3YWl0IGZpcmVGdW5uZWxSZXF1ZXN0KGRhdGEpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRnVubmVsIGV2ZW50IHN1Y2Nlc3MnKVxuICAgICAgICBjb25maWcuc2VudEZ1bm5lbERhdGEoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXhjZXB0aW9uIGluIHNlbmRpbmcgZnVubmVsIGRhdGE6ICR7Zm9ybWF0KGVycm9yKX1gKVxuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRTdGFydChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZykge1xuXG4gICAgLy8gVHJhY2sgZnVubmVsIHRlc3QgYXR0ZW1wdGVkIGV2ZW50XG4gICAgUGVyZm9ybWFuY2VUZXN0ZXIuc3RhcnQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9BVFRFTVBURUQpXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZmlyZUZ1bm5lbFRlc3RFdmVudCgnU0RLVGVzdEF0dGVtcHRlZCcsIGNvbmZpZylcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfQVRURU1QVEVELCB0cnVlKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX0FUVEVNUFRFRCwgZmFsc2UsIGVycm9yKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRGaW5pc2goY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzQ0xJRW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgLy8gVHJhY2sgZnVubmVsIHRlc3Qgc3VjY2Vzc2Z1bCBldmVudFxuICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfU1VDQ0VTU0ZVTClcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0U3VjY2Vzc2Z1bCcsIGNvbmZpZywgaXNDTElFbmFibGVkKVxuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9TVUNDRVNTRlVMLCB0cnVlKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX1NVQ0NFU1NGVUwsIGZhbHNlLCBlcnJvcilcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYXZlRnVubmVsRGF0YShldmVudFR5cGU6IHN0cmluZywgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzQ0xJRW5hYmxlZCA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhID0gYnVpbGRFdmVudERhdGEoZXZlbnRUeXBlLCBjb25maWcsIGlzQ0xJRW5hYmxlZClcblxuICAgIEJTdGFja0xvZ2dlci5lbnN1cmVMb2dzRm9sZGVyKClcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihCU3RhY2tMb2dnZXIubG9nRm9sZGVyUGF0aCwgJ2Z1bm5lbERhdGEuanNvbicpXG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpXG4gICAgcmV0dXJuIGZpbGVQYXRoXG59XG5cbmZ1bmN0aW9uIHJlZGFjdENyZWRlbnRpYWxzRnJvbUZ1bm5lbERhdGEoZGF0YTogRnVubmVsRGF0YSkge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLnVzZXJOYW1lKSB7XG4gICAgICAgICAgICBkYXRhLnVzZXJOYW1lID0gJ1tSRURBQ1RFRF0nXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuYWNjZXNzS2V5KSB7XG4gICAgICAgICAgICBkYXRhLmFjY2Vzc0tleSA9ICdbUkVEQUNURURdJ1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG59XG5cbi8vIENhbGxlZCBmcm9tIHR3byBkaWZmZXJlbnQgcHJvY2Vzc1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpcmVGdW5uZWxSZXF1ZXN0KGRhdGE6IEZ1bm5lbERhdGEpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHVzZXJOYW1lLCBhY2Nlc3NLZXkgfSA9IGRhdGFcbiAgICByZWRhY3RDcmVkZW50aWFsc0Zyb21GdW5uZWxEYXRhKGRhdGEpXG5cbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1NlbmRpbmcgU0RLIGV2ZW50IHdpdGggZGF0YSAnICsgdXRpbC5pbnNwZWN0KGRhdGEsIHsgZGVwdGg6IDYgfSkpXG5cbiAgICBjb25zdCBlbmNvZGVkQXV0aCA9IEJ1ZmZlci5mcm9tKGAke3VzZXJOYW1lfToke2FjY2Vzc0tleX1gLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXcmFwKEFQSVV0aWxzLkZVTk5FTF9JTlNUUlVNRU5UQVRJT05fVVJMLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7ZW5jb2RlZEF1dGh9YCxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICB9KVxuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRnVubmVsIEV2ZW50IFJlc3BvbnNlOiAnICsgSlNPTi5zdHJpbmdpZnkoYXdhaXQgcmVzcG9uc2UudGV4dCgpKSlcbn1cblxuZnVuY3Rpb24gZ2V0UHJvZHVjdExpc3QoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpIHtcbiAgICBjb25zdCBwcm9kdWN0czogc3RyaW5nW10gPSBbXVxuICAgIGlmIChjb25maWcudGVzdE9ic2VydmFiaWxpdHkuZW5hYmxlZCkge1xuICAgICAgICBwcm9kdWN0cy5wdXNoKCdvYnNlcnZhYmlsaXR5JylcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmFjY2Vzc2liaWxpdHkpIHtcbiAgICAgICAgcHJvZHVjdHMucHVzaCgnYWNjZXNzaWJpbGl0eScpXG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5wZXJjeSkge1xuICAgICAgICBwcm9kdWN0cy5wdXNoKCdwZXJjeScpXG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5hdXRvbWF0ZSkge1xuICAgICAgICBwcm9kdWN0cy5wdXNoKCdhdXRvbWF0ZScpXG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5hcHBBdXRvbWF0ZSkge1xuICAgICAgICBwcm9kdWN0cy5wdXNoKCdhcHAtYXV0b21hdGUnKVxuICAgIH1cbiAgICByZXR1cm4gcHJvZHVjdHNcbn1cblxuZnVuY3Rpb24gYnVpbGRFdmVudERhdGEoZXZlbnRUeXBlOiBzdHJpbmcsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc0NMSUVuYWJsZWQgPSBmYWxzZSkge1xuICAgIGNvbnN0IGV2ZW50UHJvcGVydGllczogRXZlbnRQcm9wZXJ0aWVzID0ge1xuICAgICAgICAvLyBGcmFtZXdvcmsgRGV0YWlsc1xuICAgICAgICBzZGtSdW5JZDogY29uZmlnPy5zZGtSdW5JRCxcbiAgICAgICAgdGVzdGh1Yl91dWlkOiBUZXN0T3BzQ29uZmlnLmdldEluc3RhbmNlKCkuYnVpbGRIYXNoZWRJZCxcbiAgICAgICAgbGFuZ3VhZ2VfZnJhbWV3b3JrOiBnZXRMYW5ndWFnZUZyYW1ld29yayhjb25maWcuZnJhbWV3b3JrKSxcbiAgICAgICAgcmVmZXJyZXI6IGdldFJlZmVycmVyKGNvbmZpZy5mcmFtZXdvcmspLFxuICAgICAgICBsYW5ndWFnZTogJ1dlYmRyaXZlcklPJyxcbiAgICAgICAgbGFuZ3VhZ2VWZXJzaW9uOiBwcm9jZXNzLnZlcnNpb24sXG5cbiAgICAgICAgLy8gQnVpbGQgRGV0YWlsc1xuICAgICAgICBidWlsZE5hbWU6IGNvbmZpZy5idWlsZE5hbWUgfHwgJ3VuZGVmaW5lZCcsXG4gICAgICAgIGJ1aWxkSWRlbnRpZmllcjogU3RyaW5nKGNvbmZpZy5idWlsZElkZW50aWZpZXIpLFxuXG4gICAgICAgIC8vIEhvc3QgZGV0YWlsc1xuICAgICAgICBvczogb3MudHlwZSgpIHx8ICd1bmtub3duJyxcbiAgICAgICAgaG9zdG5hbWU6IG9zLmhvc3RuYW1lKCkgfHwgJ3Vua25vd24nLFxuXG4gICAgICAgIC8vIFByb2R1Y3QgRGV0YWlsc1xuICAgICAgICBwcm9kdWN0TWFwOiBnZXRQcm9kdWN0TWFwKGNvbmZpZyksXG4gICAgICAgIHByb2R1Y3Q6IGdldFByb2R1Y3RMaXN0KGNvbmZpZyksXG5cbiAgICAgICAgLy8gZnJhbWV3b3JrIGRldGFpbHNcbiAgICAgICAgZnJhbWV3b3JrOiBjb25maWcuZnJhbWV3b3JrLFxuXG4gICAgICAgIC8vIENMSSBEZXRhaWxzXG4gICAgICAgIGlzQ0xJRW5hYmxlZDogaXNDTElFbmFibGVkXG4gICAgfVxuXG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gJ1NES1Rlc3RTdWNjZXNzZnVsJykge1xuICAgICAgICBjb25zdCB3b3JrZXJEYXRhID0gZ2V0RGF0YUZyb21Xb3JrZXJzKClcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBldmVudFByb3BlcnRpZXMucHJvZHVjdFVzYWdlID0gZ2V0UHJvZHVjdFVzYWdlKHdvcmtlckRhdGEpXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9QT0xMSU5HX1RJTUVPVVQpIHtcbiAgICAgICAgICAgIGV2ZW50UHJvcGVydGllcy5wb2xsaW5nVGltZW91dCA9IHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCBhcyBzdHJpbmdcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBhbnkgd29ya2VyIGNhbGxlZCBicm93c2VyLnJlbG9hZFNlc3Npb24oKSwgbWFyayB0aGUgYnVpbGQgc28gdGhlXG4gICAgICAgIC8vIHNlc3Npb24tbGlua2luZyBkYXNoYm9hcmQgY2FuIGV4Y2x1ZGUgaXRzIChleHBlY3RlZCkgcmVsb2FkLW9ycGhhbmVkIHNlc3Npb25zLlxuICAgICAgICB0eXBlIFdvcmtlclJlY29yZCA9IHsgcmVsb2FkSGFwcGVuZWQ/OiBib29sZWFuOyB1c2FnZVN0YXRzPzogdW5rbm93biB9XG4gICAgICAgIGNvbnN0IHJlbG9hZEhhcHBlbmVkID0gd29ya2VyRGF0YS5zb21lKCh3b3JrZXIpID0+ICh3b3JrZXIgYXMgV29ya2VyUmVjb3JkKS5yZWxvYWRIYXBwZW5lZCA9PT0gdHJ1ZSlcbiAgICAgICAgaWYgKHJlbG9hZEhhcHBlbmVkKSB7XG4gICAgICAgICAgICBldmVudFByb3BlcnRpZXMuZmluaXNoZWRNZXRhZGF0YSA9IHsgcmVhc29uOiAnc2Vzc2lvbl9yZWxvYWRlZCcgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXNlck5hbWU6IGNvbmZpZy51c2VyTmFtZSxcbiAgICAgICAgYWNjZXNzS2V5OiBjb25maWcuYWNjZXNzS2V5LFxuICAgICAgICBldmVudF90eXBlOiBldmVudFR5cGUsXG4gICAgICAgIGRldGVjdGVkRnJhbWV3b3JrOiBXRElPX05BTUlOR19QUkVGSVggKyBjb25maWcuZnJhbWV3b3JrLFxuICAgICAgICBldmVudF9wcm9wZXJ0aWVzOiBldmVudFByb3BlcnRpZXNcbiAgICB9IGFzIHVua25vd24gYXMgRnVubmVsRGF0YVxuXG59XG5cbmZ1bmN0aW9uIGdldFByb2R1Y3RVc2FnZSh3b3JrZXJzRGF0YTogeyB1c2FnZVN0YXRzOiBVc2FnZVN0YXQgfVtdKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGVzdE9ic2VydmFiaWxpdHk6IFVzYWdlU3RhdHMuZ2V0SW5zdGFuY2UoKS5nZXRGb3JtYXR0ZWREYXRhKHdvcmtlcnNEYXRhKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0TGFuZ3VhZ2VGcmFtZXdvcmsoZnJhbWV3b3JrPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuICdXZWJkcml2ZXJJT18nICsgZnJhbWV3b3JrXG59XG5cbmZ1bmN0aW9uIGdldFJlZmVycmVyKGZyYW1ld29yaz86IHN0cmluZykge1xuICAgIGNvbnN0IGZ1bGxOYW1lID0gZnJhbWV3b3JrID8gV0RJT19OQU1JTkdfUFJFRklYICsgZnJhbWV3b3JrIDogJ1dlYmRyaXZlcklPJ1xuICAgIHJldHVybiBgJHtmdWxsTmFtZX0vJHtCU1RBQ0tfU0VSVklDRV9WRVJTSU9OfWBcbn1cblxuY29uc3Qgc2VuZEV2ZW50ID0ge1xuICAgIHRjZ0Rvd246IChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZykgPT4gZmlyZUZ1bm5lbFRlc3RFdmVudCgnU0RLVGVzdFRjZ0Rvd25SZXNwb25zZScsIGNvbmZpZyksXG4gICAgaW52YWxpZFRjZ0F1dGg6IChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZykgPT4gZmlyZUZ1bm5lbFRlc3RFdmVudCgnU0RLVGVzdEludmFsaWRUY2dBdXRoUmVzcG9uc2VXaXRoVXNlckltcGFjdCcsIGNvbmZpZyksXG4gICAgdGNnQXV0aEZhaWx1cmU6IChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZykgPT4gZmlyZUZ1bm5lbFRlc3RFdmVudCgnU0RLVGVzdFRjZ0F1dGhGYWlsdXJlJywgY29uZmlnKSxcbiAgICB0Y2d0SW5pdFN1Y2Nlc3NmdWw6IChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZykgPT4gZmlyZUZ1bm5lbFRlc3RFdmVudCgnU0RLVGVzdFRjZ3RJbml0U3VjY2Vzc2Z1bCcsIGNvbmZpZyksXG4gICAgaW5pdEZhaWxlZDogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0SW5pdEZhaWxlZFJlc3BvbnNlJywgY29uZmlnKSxcbiAgICB0Y2dQcm94eUZhaWx1cmU6IChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZykgPT4gZmlyZUZ1bm5lbFRlc3RFdmVudCgnU0RLVGVzdFRjZ1Byb3h5RmFpbHVyZScsIGNvbmZpZyksXG59XG5cbmZ1bmN0aW9uIGlzUHJveHlFcnJvcihhdXRoUmVzdWx0OiB7IHN0YXR1cz86IG51bWJlciB9KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChhdXRoUmVzdWx0IGFzIEJyb3dzZXJzdGFja0hlYWxpbmcuSW5pdEVycm9yUmVzcG9uc2UpPy5zdGF0dXMgPT09IDUwMlxufVxuXG5mdW5jdGlvbiBoYW5kbGVQcm94eUVycm9yKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHNlbmRFdmVudC50Y2dQcm94eUZhaWx1cmUoY29uZmlnKVxuICAgIGlmIChpc1NlbGZIZWFsRW5hYmxlZCkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignUHJveHkgRXJyb3IuIERpc2FibGluZyBIZWFsaW5nIGZvciB0aGlzIHNlc3Npb24uJylcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVVwZ3JhZGVSZXF1aXJlZChpc1NlbGZIZWFsRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChpc1NlbGZIZWFsRW5hYmxlZCkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignUGxlYXNlIHVwZ3JhZGUgQnJvd3NlcnN0YWNrIFNlcnZpY2UgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIHRvIHVzZSB0aGUgc2VsZi1oZWFsaW5nIGZlYXR1cmUuJylcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUF1dGhlbnRpY2F0aW9uRmFpbHVyZShzdGF0dXM6IG51bWJlciwgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHN0YXR1cyA+PSA1MDApIHtcbiAgICAgICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignU29tZXRoaW5nIHdlbnQgd3JvbmcuIERpc2FibGluZyBoZWFsaW5nIGZvciB0aGlzIHNlc3Npb24uIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJylcbiAgICAgICAgfVxuICAgICAgICBzZW5kRXZlbnQudGNnRG93bihjb25maWcpXG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQXV0aGVudGljYXRpb24gRmFpbGVkLiBEaXNhYmxpbmcgSGVhbGluZyBmb3IgdGhpcyBzZXNzaW9uLicpXG4gICAgICAgIH1cbiAgICAgICAgc2VuZEV2ZW50LnRjZ0F1dGhGYWlsdXJlKGNvbmZpZylcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUF1dGhlbnRpY2F0aW9uU3VjY2VzcyhcbiAgICBpc0hlYWxpbmdFbmFibGVkRm9yVXNlcjogYm9vbGVhbixcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZyxcbiAgICBpc1NlbGZIZWFsRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZFxuKSB7XG4gICAgaWYgKCFpc0hlYWxpbmdFbmFibGVkRm9yVXNlciAmJiBpc1NlbGZIZWFsRW5hYmxlZCkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignSGVhbGluZyBpcyBub3QgZW5hYmxlZCBmb3IgeW91ciBncm91cCwgcGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluJylcbiAgICB9IGVsc2UgaWYgKHVzZXJJZCAmJiBpc0hlYWxpbmdFbmFibGVkRm9yVXNlcikge1xuICAgICAgICBzZW5kRXZlbnQudGNndEluaXRTdWNjZXNzZnVsKGNvbmZpZylcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUluaXRpYWxpemF0aW9uRmFpbHVyZShzdGF0dXM6IG51bWJlciwgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgc2VuZEV2ZW50LmluaXRGYWlsZWQoY29uZmlnKVxuICAgIH0gZWxzZSBpZiAoIXN0YXR1cyAmJiBpc1NlbGZIZWFsRW5hYmxlZCkge1xuICAgICAgICBzZW5kRXZlbnQuaW52YWxpZFRjZ0F1dGgoY29uZmlnKVxuICAgIH1cblxuICAgIGlmIChpc1NlbGZIZWFsRW5hYmxlZCkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQXV0aGVudGljYXRpb24gRmFpbGVkLiBIZWFsaW5nIHdpbGwgYmUgZGlzYWJsZWQgZm9yIHRoaXMgc2Vzc2lvbi4nKVxuICAgIH1cbn1cblxuaW50ZXJmYWNlIEF1dGhSZXN1bHQge1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xuICAgIGlzQXV0aGVudGljYXRlZDogYm9vbGVhblxuICAgIHN0YXR1czogbnVtYmVyXG4gICAgdXNlcklkOiBzdHJpbmdcbiAgICBncm91cElkOiBzdHJpbmdcbiAgICBpc0hlYWxpbmdFbmFibGVkOiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVIZWFsaW5nSW5zdHJ1bWVudGF0aW9uKFxuICAgIGF1dGhSZXN1bHQ6IEF1dGhSZXN1bHQsXG4gICAgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsXG4gICAgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4pIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAoaXNQcm94eUVycm9yKGF1dGhSZXN1bHQpKSB7XG4gICAgICAgICAgICBoYW5kbGVQcm94eUVycm9yKGNvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgaXNBdXRoZW50aWNhdGVkLCBzdGF0dXMsIHVzZXJJZCwgZ3JvdXBJZCwgaXNIZWFsaW5nRW5hYmxlZDogaXNIZWFsaW5nRW5hYmxlZEZvclVzZXIgfSA9IGF1dGhSZXN1bHRcblxuICAgICAgICBpZiAobWVzc2FnZSA9PT0gJ1VwZ3JhZGUgcmVxdWlyZWQnKSB7XG4gICAgICAgICAgICBoYW5kbGVVcGdyYWRlUmVxdWlyZWQoaXNTZWxmSGVhbEVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgICBoYW5kbGVBdXRoZW50aWNhdGlvbkZhaWx1cmUoc3RhdHVzLCBjb25maWcsIGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBdXRoZW50aWNhdGVkICYmIHVzZXJJZCAmJiBncm91cElkKSB7XG4gICAgICAgICAgICBoYW5kbGVBdXRoZW50aWNhdGlvblN1Y2Nlc3MoaXNIZWFsaW5nRW5hYmxlZEZvclVzZXIsIHVzZXJJZCwgY29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXR1cyA+PSA0MDAgfHwgIXN0YXR1cykge1xuICAgICAgICAgICAgaGFuZGxlSW5pdGlhbGl6YXRpb25GYWlsdXJlKHN0YXR1cywgY29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdFcnJvciBpbiBoYW5kbGluZyBoZWFsaW5nIGluc3RydW1lbnRhdGlvbjogJyArIGVycilcbiAgICB9XG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5cbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4vYnN0YWNrTG9nZ2VyLmpzJ1xuXG5jb25zdCB3b3JrZXJzRGF0YURpclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnLCAnd29ya2VyX2RhdGEnKVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YUZyb21Xb3JrZXJzKCl7XG4gICAgY29uc3Qgd29ya2Vyc0RhdGE6IFJlY29yZDxzdHJpbmcsIG9iamVjdD5bXSA9IFtdXG5cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMod29ya2Vyc0RhdGFEaXJQYXRoKSkge1xuICAgICAgICByZXR1cm4gd29ya2Vyc0RhdGFcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHdvcmtlcnNEYXRhRGlyUGF0aClcbiAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnUmVhZGluZyB3b3JrZXIgZmlsZSAnICsgZmlsZSlcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Vyc0RhdGFEaXJQYXRoLCBmaWxlKVxuICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKVxuICAgICAgICBjb25zdCB3b3JrZXJEYXRhID0gSlNPTi5wYXJzZShmaWxlQ29udGVudClcbiAgICAgICAgd29ya2Vyc0RhdGEucHVzaCh3b3JrZXJEYXRhKVxuICAgIH0pXG5cbiAgICAvLyBSZW1vdmUgd29ya2VyIGRhdGEgYWZ0ZXIgYWxsIHJlYWRpbmdcbiAgICByZW1vdmVXb3JrZXJzRGF0YURpcigpXG5cbiAgICByZXR1cm4gd29ya2Vyc0RhdGFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVXb3JrZXJEYXRhKGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Vyc0RhdGFEaXJQYXRoLCAnd29ya2VyLWRhdGEtJyArIHByb2Nlc3MucGlkICsgJy5qc29uJylcblxuICAgIHRyeSB7XG4gICAgICAgIGNyZWF0ZVdvcmtlcnNEYXRhRGlyKClcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0V4Y2VwdGlvbiBpbiBzYXZpbmcgd29ya2VyIGRhdGE6ICcgKyBlKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlV29ya2Vyc0RhdGFEaXIoKTogYm9vbGVhbiB7XG4gICAgZnMucm1TeW5jKHdvcmtlcnNEYXRhRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gY3JlYXRlV29ya2Vyc0RhdGFEaXIoKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHdvcmtlcnNEYXRhRGlyUGF0aCkpIHtcbiAgICAgICAgZnMubWtkaXJTeW5jKHdvcmtlcnNEYXRhRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLFlBQUFBLFdBQVUsWUFBQUMsV0FBVSxRQUFBQyxP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QUFBQSxFQUN2QztBQUNKO0FBRUEsS0FBSyxjQUFjLGFBQWE7IiwKICAibmFtZXMiOiBbImhvc3RuYW1lIiwgInBsYXRmb3JtIiwgInR5cGUiLCAidmVyc2lvbiIsICJhcmNoIiwgImZzIiwgInByb21pc2lmeSIsICJwYXRoIiwgInV0aWwiLCAicGVyZm9ybWFuY2UiLCAiZnMiLCAidXRpbCIsICJwYXRoIiwgImFyY2giLCAicGxhdGZvcm0iLCAiZnMiLCAicGF0aCIsICJwYXRoIiwgImZzIiwgImNoYWxrIiwgImxvZ2dlciIsICJsb2ciLCAibG9nZ2VyIiwgIkJTdGFja0xvZ2dlciIsICJwYXRoIiwgImZzIiwgImNoYWxrIiwgInBsYXRmb3JtIiwgIkJTdGFja0xvZ2dlciIsICJmcyIsICJ2ZXJzaW9uIiwgInBhdGgiLCAicHJvY2VzcyIsICJvcGVuUmVhZFN0cmVhbVByb21pc2UiLCAicGF0aCIsICJmcyIsICJ1dGlsIiwgInR5cGUiLCAicGxhdGZvcm0iLCAiYXJjaCIsICJmcyIsICJmcyIsICJncm91cCIsICJwYXRoIiwgImZzIiwgInByb21pc2lmeSIsICJ1dGlsIiwgInBlcmZvcm1hbmNlIiwgImxhdW5jaFRlc3RTZXNzaW9uIiwgImhvc3RuYW1lIiwgInBsYXRmb3JtIiwgInR5cGUiLCAidmVyc2lvbiIsICJhcmNoIiwgInV0aWwiLCAic3RvcEJ1aWxkVXBzdHJlYW0iLCAicGF0aCIsICJnZXRQbGF0Zm9ybVZlcnNpb24iLCAiZ2V0UmVzb2x2ZWREZXZpY2VOYW1lIiwgInBhdGgiLCAiaGFzaCIsICJmcyIsICJwYXRoIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInV0aWwiLCAib3MiLCAidXRpbCIsICJmb3JtYXQiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAidXRpbCIsICJ1dGlsIiwgImZzIl0KfQo=
|