nextlove 2.18.0 → 2.19.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.
@@ -1366,7 +1366,7 @@ var zodToTsNode = (zod, identifier, store, options) => {
1366
1366
  import prettier from "prettier";
1367
1367
  import { z as z3 } from "zod";
1368
1368
  var generateRouteTypes = async (opts) => {
1369
- var _a, _b;
1369
+ var _a, _b, _c;
1370
1370
  const filepathToRoute = await parseRoutesInPackage(opts);
1371
1371
  const sortedRoutes = Array.from(filepathToRoute.entries()).sort(
1372
1372
  (a, b) => a[1].route.localeCompare(b[1].route)
@@ -1376,7 +1376,8 @@ var generateRouteTypes = async (opts) => {
1376
1376
  );
1377
1377
  const routeDefs = [];
1378
1378
  for (const [_2, { route, routeSpec, setupParams }] of filteredRoutes) {
1379
- const queryKeys = Object.keys((_b = (_a = routeSpec.queryParams) == null ? void 0 : _a.shape) != null ? _b : {});
1379
+ const maxDuration = (_a = routeSpec.maxDuration) != null ? _a : setupParams.maxDuration;
1380
+ const queryKeys = Object.keys((_c = (_b = routeSpec.queryParams) == null ? void 0 : _b.shape) != null ? _c : {});
1380
1381
  const pathParameters = queryKeys.filter((key) => route.includes(`[${key}]`));
1381
1382
  let queryParams = routeSpec.queryParams;
1382
1383
  while (queryParams && ("sourceType" in queryParams || "unwrap" in queryParams)) {
@@ -1404,7 +1405,8 @@ var generateRouteTypes = async (opts) => {
1404
1405
  zodToTs(
1405
1406
  setupParams.addOkStatus && routeSpec.jsonResponse instanceof z3.ZodObject ? routeSpec.jsonResponse.extend({ ok: z3.boolean() }) : routeSpec.jsonResponse
1406
1407
  ).node
1407
- ) : "{}"}
1408
+ ) : "{}"},
1409
+ maxDuration: ${maxDuration != null ? maxDuration : "undefined"}
1408
1410
  }`.trim()
1409
1411
  );
1410
1412
  }
@@ -1563,4 +1565,4 @@ export {
1563
1565
  generateOpenAPI,
1564
1566
  generateRouteTypes
1565
1567
  };
1566
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2dlbmVyYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9pbmRleC50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2UudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi96b2Qtb3BlbmFwaS50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvZnJvbnQtbWF0dGVyLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL3V0aWxzL3ByZWZpeC1vYmplY3Qta2V5cy13aXRoLXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvdXRpbHMvZGFzaGlmeS1vYmplY3Qta2V5cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1vcGVuYXBpL2VtYmVkLXNjaGVtYS1yZWZlcmVuY2VzLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvZmVybi1zZGstdXRpbHMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtcm91dGUtdHlwZXMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL3pvZC10by10cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdGUtb3BlbmFwaVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1yb3V0ZS10eXBlc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hc1wiXG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7XG4gIE9wZW5BcGlCdWlsZGVyLFxuICBPcGVyYXRpb25PYmplY3QsXG4gIFBhcmFtZXRlck9iamVjdCxcbn0gZnJvbSBcIm9wZW5hcGkzLXRzL29hczMxXCJcbmltcG9ydCB7IFNldHVwUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlUm91dGVzSW5QYWNrYWdlIH0gZnJvbSBcIi4uL2xpYi9wYXJzZS1yb3V0ZXMtaW4tcGFja2FnZVwiXG5pbXBvcnQgeyBnZW5lcmF0ZVNjaGVtYSB9IGZyb20gXCIuLi9saWIvem9kLW9wZW5hcGlcIlxuaW1wb3J0IHsgZW1iZWRTY2hlbWFSZWZlcmVuY2VzIH0gZnJvbSBcIi4vZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXNcIlxuaW1wb3J0IHsgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhIH0gZnJvbSBcIi4vZmVybi1zZGstdXRpbHNcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4uL2xpYi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcbmltcG9ydCB7IHByZWZpeE9iamVjdEtleXNXaXRoWCB9IGZyb20gXCIuLi91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14XCJcbmltcG9ydCB7IGRhc2hpZnlPYmplY3RLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXNcIlxuXG5mdW5jdGlvbiByZXBsYWNlRmlyc3RDaGFyVG9Mb3dlcmNhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBjb25zdCBmaXJzdENoYXIgPSBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIGZpcnN0Q2hhciArIHN0ci5zbGljZSgxKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9PcGVyYXRpb25JZChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAucmVwbGFjZSgvLS9nLCBcIl9cIilcbiAgICAuc3BsaXQoXCIvXCIpXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgdHJhbnNmb3JtZWRQYXJ0cyA9IHBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gQnlQYXJhbVxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwYXJ0LnNsaWNlKDEsIC0xKVxuICAgICAgY29uc3Qgd29yZHMgPSBzZXJ2aWNlTmFtZS5zcGxpdChcIl9cIilcbiAgICAgIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGBCeSR7Y2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpfWBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCBhcGlfcGF0aCB0byBBcGlQYXRoXG4gICAgICBjb25zdCB3b3JkcyA9IHBhcnQuc3BsaXQoXCJfXCIpXG4gICAgICBjb25zdCBjYXBpdGFsaXplZFdvcmRzID0gd29yZHMubWFwKFxuICAgICAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSlcbiAgICAgIClcbiAgICAgIHJldHVybiBjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIilcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHJlcGxhY2VGaXJzdENoYXJUb0xvd2VyY2FzZSh0cmFuc2Zvcm1lZFBhcnRzLmpvaW4oXCJcIikpXG59XG5cbmZ1bmN0aW9uIHBhc2NhbENhc2UoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQuc3BsaXQoXCIgXCIpXG4gIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKClcbiAgKVxuICBjb25zdCBwYXNjYWxDYXNlU3RyaW5nID0gY2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpXG4gIHJldHVybiBwYXNjYWxDYXNlU3RyaW5nXG59XG5cbmludGVyZmFjZSBUYWdPcHRpb24ge1xuICBuYW1lOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkb2VzUm91dGVIYXZlVGFnPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlT3BlbkFQSU9wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICB0YWdzPzogQXJyYXk8VGFnT3B0aW9uPlxuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYW4gT3BlbkFQSSBzcGVjIGZyb20gdGhlIE5leHQuanMgQVBJIHJvdXRlcy5cbiAqXG4gKiBZb3Ugbm9ybWFsbHkgaW52b2tlIHRoaXMgd2l0aCBgbmV4dGFwaSBnZW5lcmF0ZS1vcGVuYXBpYCBpbiBhXG4gKiBcImJ1aWxkOm9wZW5hcGlcIiBwYWNrYWdlLmpzb24gc2NyaXB0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQVBJKG9wdHM6IEdlbmVyYXRlT3BlbkFQSU9wdHMpIHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgeyBvdXRwdXRGaWxlLCB0YWdzID0gW10gfSA9IG9wdHNcblxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgLy8gVE9ETyBkZXRlY3QgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNldHVwcyBhbmQgb3V0cHV0IGRpZmZlcmVudCBBUElzXG4gIGNvbnN0IHsgc2V0dXBQYXJhbXM6IGdsb2JhbFNldHVwUGFyYW1zIH0gPSBmaWxlcGF0aFRvUm91dGVGbi52YWx1ZXMoKS5uZXh0KClcbiAgICAudmFsdWUgYXMgeyBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXMgfVxuXG4gIGNvbnN0IHNlY3VyaXR5U2NoZW1lcyA9IGdsb2JhbFNldHVwUGFyYW1zLnNlY3VyaXR5U2NoZW1hcyA/PyB7fVxuICBjb25zdCBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZSA9IHt9XG4gIGZvciAoY29uc3QgYXV0aE5hbWUgb2YgT2JqZWN0LmtleXMoZ2xvYmFsU2V0dXBQYXJhbXMuYXV0aE1pZGRsZXdhcmVNYXApKSB7XG4gICAgY29uc3QgbXcgPSBnbG9iYWxTZXR1cFBhcmFtcy5hdXRoTWlkZGxld2FyZU1hcFthdXRoTmFtZV1cbiAgICBpZiAobXcuc2VjdXJpdHlTY2hlbWEpIHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lc1thdXRoTmFtZV0gPSAobXcgYXMgYW55KS5zZWN1cml0eVNjaGVtYVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgQXV0aGVudGljYXRpb24gbWlkZGxld2FyZSBcIiR7YXV0aE5hbWV9XCIgaGFzIG5vIHNlY3VyaXR5U2NoZW1hLiBZb3UgY2FuIGRlZmluZSB0aGlzIG9uIHRoZSBmdW5jdGlvbiAoZS5nLiBhZnRlciB0aGUgZXhwb3J0IGRvLi4uIFxcblxcbm15TWlkZGxld2FyZS5zZWN1cml0eVNjaGVtYSA9IHtcXG4gIHR5cGU6IFwiaHR0cFwiXFxuICBzY2hlbWU6IFwiYmVhcmVyXCJcXG4gIGJlYXJlckZvcm1hdDogXCJKV1RcIlxcbiAvLyBvciBBUEkgVG9rZW4gZXRjLlxcbn1cXG5cXG5Zb3UgY2FuIGFsc28gZGVmaW5lIFwic2VjdXJpdHlPYmplY3RzXCIgdGhpcyB3YXksIGlmIHlvdSB3YW50IHRvIG1ha2UgdGhlIGVuZHBvaW50IHN1cHBvcnQgbXVsdGlwbGUgbW9kZXMgb2YgYXV0aGVudGljYXRpb24uXFxuXFxuYFxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aE5hbWVdID0gKG13IGFzIGFueSkuc2VjdXJpdHlPYmplY3RzIHx8IFtcbiAgICAgIHtcbiAgICAgICAgW2F1dGhOYW1lXTogW10sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGdsb2JhbFNjaGVtYXMgPSB7fVxuICBmb3IgKGNvbnN0IFtzY2hlbWFOYW1lLCB6b2RTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIGdsb2JhbFNldHVwUGFyYW1zLmdsb2JhbFNjaGVtYXMgPz8ge31cbiAgKSkge1xuICAgIGdsb2JhbFNjaGVtYXNbc2NoZW1hTmFtZV0gPSBnZW5lcmF0ZVNjaGVtYSh6b2RTY2hlbWEpXG4gIH1cblxuICAvLyBCdWlsZCBPcGVuQVBJIHNwZWNcbiAgY29uc3QgYnVpbGRlciA9IE9wZW5BcGlCdWlsZGVyLmNyZWF0ZSh7XG4gICAgb3BlbmFwaTogXCIzLjAuMFwiLFxuICAgIGluZm86IHtcbiAgICAgIHRpdGxlOiBnbG9iYWxTZXR1cFBhcmFtcy5hcGlOYW1lLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgIH0sXG4gICAgc2VydmVyczogW1xuICAgICAge1xuICAgICAgICB1cmw6IGdsb2JhbFNldHVwUGFyYW1zLnByb2R1Y3Rpb25TZXJ2ZXJVcmwgfHwgXCJodHRwczovL2V4YW1wbGUuY29tXCIsXG4gICAgICB9LFxuICAgIF0sXG4gICAgdGFnczogdGFncy5tYXAoKHRhZykgPT4gKHsgbmFtZTogdGFnLm5hbWUsIGRlc2NyaXB0aW9uOiB0YWcuZGVzY3JpcHRpb24gfSkpLFxuICAgIHBhdGhzOiB7fSxcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICBzZWN1cml0eVNjaGVtZXMsXG4gICAgICBzY2hlbWFzOiBnbG9iYWxTY2hlbWFzLFxuICAgIH0sXG4gIH0pXG5cbiAgZm9yIChjb25zdCBbXG4gICAgZmlsZV9wYXRoLFxuICAgIHsgc2V0dXBQYXJhbXMsIHJvdXRlU3BlYywgcm91dGU6IHJvdXRlUGF0aCB9LFxuICBdIG9mIGZpbGVwYXRoVG9Sb3V0ZUZuKSB7XG4gICAgY29uc3QgbWV0aG9kcyA9IHJvdXRlU3BlYy5tZXRob2RzXG4gICAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgcm91dGUgJHtyb3V0ZVBhdGh9IGJlY2F1c2UgaXQgaGFzIG5vIG1ldGhvZHMuYClcbiAgICAgIClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgbGV0IGRlc2NyaXB0aW9uID0gcm91dGVTcGVjLmRlc2NyaXB0aW9uXG4gICAgbGV0IGRlc2NyaXB0aW9uTWV0YWRhdGE6IHtcbiAgICAgIHJlc3BvbnNlX2tleT86IHN0cmluZ1xuICAgICAgW2tleTogc3RyaW5nXTogYW55XG4gICAgfSA9IHt9XG5cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IHRyaW1tZWREZXNjcmlwdGlvbiA9IGRlZGVudChkZXNjcmlwdGlvbikudHJpbSgpXG5cbiAgICAgIGlmICh0ZXN0RnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKSkge1xuICAgICAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIGJvZHkgfSA9IHBhcnNlRnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKVxuICAgICAgICBkZXNjcmlwdGlvbk1ldGFkYXRhID0gYXR0cmlidXRlc1xuICAgICAgICBkZXNjcmlwdGlvbiA9IGJvZHkudHJpbSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXNjcmlwdGlvbiA9IHRyaW1tZWREZXNjcmlwdGlvblxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdHRlZERlc2NyaXB0aW9uTWV0YWRhdGEgPSBwcmVmaXhPYmplY3RLZXlzV2l0aFgoXG4gICAgICBkYXNoaWZ5T2JqZWN0S2V5cyhkZXNjcmlwdGlvbk1ldGFkYXRhKVxuICAgIClcblxuICAgIGNvbnN0IG1ldGhvZFJvdXRlczogUmVjb3JkPHN0cmluZywgT3BlcmF0aW9uT2JqZWN0PiA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICBjb25zdCBpc1Bvc3RPclB1dE9yUGF0Y2ggPSBbXCJQT1NUXCIsIFwiUFVUXCIsIFwiUEFUQ0hcIl0uaW5jbHVkZXMobWV0aG9kKVxuXG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IG11bHRpcGFydC9mb3JtLWRhdGFcbiAgICAgIGxldCBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYVxuICAgICAgaWYgKGlzUG9zdE9yUHV0T3JQYXRjaCkge1xuICAgICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keSA/PyByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG5cbiAgICAgICAgaWYgKHJvdXRlU3BlYy5qc29uQm9keSAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgICAgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMuanNvbkJvZHkubWVyZ2UoXG4gICAgICAgICAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keVxuICAgICAgfVxuXG4gICAgICBsZXQgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hXG4gICAgICBpZiAoaXNQb3N0T3JQdXRPclBhdGNoKSB7XG4gICAgICAgIHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID1cbiAgICAgICAgICByb3V0ZVNwZWMucXVlcnlQYXJhbXMgPz8gcm91dGVTcGVjLmNvbW1vblBhcmFtc1xuXG4gICAgICAgIGlmIChyb3V0ZVNwZWMucXVlcnlQYXJhbXMgJiYgcm91dGVTcGVjLmNvbW1vblBhcmFtcykge1xuICAgICAgICAgIHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtcy5tZXJnZShcbiAgICAgICAgICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm91dGU6IE9wZXJhdGlvbk9iamVjdCA9IHtcbiAgICAgICAgLi4ucm91dGVTcGVjLm9wZW5BcGlNZXRhZGF0YSxcbiAgICAgICAgLi4uZm9ybWF0dGVkRGVzY3JpcHRpb25NZXRhZGF0YSxcbiAgICAgICAgc3VtbWFyeTogcm91dGVQYXRoLFxuICAgICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgb3BlcmF0aW9uSWQ6IGAke3RyYW5zZm9ybVBhdGhUb09wZXJhdGlvbklkKHJvdXRlUGF0aCl9JHtwYXNjYWxDYXNlKFxuICAgICAgICAgIG1ldGhvZFxuICAgICAgICApfWAsXG4gICAgICAgIHJlc3BvbnNlczoge1xuICAgICAgICAgIDIwMDoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT0tcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIDQwMDoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQmFkIFJlcXVlc3RcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIDQwMToge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVW5hdXRob3JpemVkXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjdXJpdHk6IEFycmF5LmlzQXJyYXkocm91dGVTcGVjLmF1dGgpXG4gICAgICAgICAgPyByb3V0ZVNwZWMuYXV0aFxuICAgICAgICAgICAgICAubWFwKChhdXRoVHlwZSkgPT4gc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aFR5cGVdKVxuICAgICAgICAgICAgICAuZmxhdCgpXG4gICAgICAgICAgOiBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZVtyb3V0ZVNwZWMuYXV0aF0sXG4gICAgICB9XG5cbiAgICAgIGlmIChib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgICByb3V0ZS5yZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICBcImFwcGxpY2F0aW9uL2pzb25cIjoge1xuICAgICAgICAgICAgICBzY2hlbWE6IGdlbmVyYXRlU2NoZW1hKGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hIGFzIGFueSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSBnZW5lcmF0ZVNjaGVtYShxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgYXMgYW55KVxuICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJPYmplY3RbXSA9IE9iamVjdC5rZXlzKFxuICAgICAgICAgICAgc2NoZW1hLnByb3BlcnRpZXMgYXMgYW55XG4gICAgICAgICAgKS5tYXAoKG5hbWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGluOiBcInF1ZXJ5XCIsXG4gICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLnByb3BlcnRpZXMhW25hbWVdLFxuICAgICAgICAgICAgICByZXF1aXJlZDogc2NoZW1hLnJlcXVpcmVkPy5pbmNsdWRlcyhuYW1lKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcm91dGUucGFyYW1ldGVycyA9IHBhcmFtZXRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGpzb25SZXNwb25zZSB9ID0gcm91dGVTcGVjXG4gICAgICBjb25zdCB7IGFkZE9rU3RhdHVzID0gdHJ1ZSB9ID0gc2V0dXBQYXJhbXNcblxuICAgICAgaWYgKGpzb25SZXNwb25zZSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWpzb25SZXNwb25zZS5fZGVmIHx8XG4gICAgICAgICAgIWpzb25SZXNwb25zZS5fZGVmLnR5cGVOYW1lIHx8XG4gICAgICAgICAganNvblJlc3BvbnNlLl9kZWYudHlwZU5hbWUgIT09IFwiWm9kT2JqZWN0XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgU2tpcHBpbmcgcm91dGUgJHtyb3V0ZVBhdGh9IGJlY2F1c2UgdGhlIHJlc3BvbnNlIGlzIG5vdCBhIFpvZE9iamVjdC5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZVNjaGVtYSA9IGdlbmVyYXRlU2NoZW1hKFxuICAgICAgICAgIGFkZE9rU3RhdHVzICYmIGpzb25SZXNwb25zZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0XG4gICAgICAgICAgICA/IGpzb25SZXNwb25zZS5leHRlbmQoeyBvazogei5ib29sZWFuKCkgfSlcbiAgICAgICAgICAgIDoganNvblJlc3BvbnNlXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBzY2hlbWFXaXRoUmVmZXJlbmNlcyA9IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyhcbiAgICAgICAgICByZXNwb25zZVNjaGVtYSxcbiAgICAgICAgICBnbG9iYWxTY2hlbWFzXG4gICAgICAgIClcblxuICAgICAgICBpZiAocm91dGUucmVzcG9uc2VzICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiB3ZSBzaG91bGQgbm90IGhhcmRjb2RlIDIwMCBoZXJlXG4gICAgICAgICAgcm91dGUucmVzcG9uc2VzWzIwMF0uY29udGVudCA9IHtcbiAgICAgICAgICAgIFwiYXBwbGljYXRpb24vanNvblwiOiB7XG4gICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hV2l0aFJlZmVyZW5jZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByb3V0ZS50YWdzID0gW11cbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgICAgaWYgKHRhZy5kb2VzUm91dGVIYXZlVGFnICYmIHRhZy5kb2VzUm91dGVIYXZlVGFnKHJvdXRlLnN1bW1hcnkgfHwgXCJcIikpIHtcbiAgICAgICAgICByb3V0ZS50YWdzLnB1c2godGFnLm5hbWUpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0aG9kc01hcHBlZFRvRmVyblNka01ldGFkYXRhID0gYXdhaXQgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhKHtcbiAgICAgICAgbWV0aG9kczogW21ldGhvZF0sIC8vIE9ubHkgcGFzcyB0aGlzIHNwZWNpZmljIG1ldGhvZFxuICAgICAgICBwYXRoOiByb3V0ZVBhdGgsXG4gICAgICAgIHNka1JldHVyblZhbHVlOlxuICAgICAgICAgIGRlc2NyaXB0aW9uTWV0YWRhdGE/LnJlc3BvbnNlX2tleSA/PyByb3V0ZVNwZWMuc2RrUmV0dXJuVmFsdWUsXG4gICAgICB9KVxuXG4gICAgICBPYmplY3QuYXNzaWduKHJvdXRlLCBtZXRob2RzTWFwcGVkVG9GZXJuU2RrTWV0YWRhdGFbbWV0aG9kXSlcbiAgICAgIG1ldGhvZFJvdXRlc1ttZXRob2QudG9Mb3dlckNhc2UoKV0gPSByb3V0ZVxuICAgIH1cblxuICAgIGJ1aWxkZXIuYWRkUGF0aChyb3V0ZVBhdGgsIG1ldGhvZFJvdXRlcylcbiAgfVxuXG4gIGlmIChvdXRwdXRGaWxlKSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKG91dHB1dEZpbGUsIGJ1aWxkZXIuZ2V0U3BlY0FzSnNvbih1bmRlZmluZWQsIDIpKVxuICB9XG5cbiAgcmV0dXJuIGJ1aWxkZXIuZ2V0U3BlY0FzSnNvbih1bmRlZmluZWQsIDIpXG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBSb3V0ZVNwZWMsIFNldHVwUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlIH0gZnJvbSBcIi4vZGVmYXVsdC1tYXAtZmlsZS1wYXRoLXRvLWh0dHAtcm91dGVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlSW5mbyB7XG4gIHNldHVwUGFyYW1zOiBTZXR1cFBhcmFtc1xuICByb3V0ZVNwZWM6IFJvdXRlU3BlY1xuICByb3V0ZUZuOiBGdW5jdGlvblxuICByb3V0ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZVJvdXRlc0luUGFja2FnZSA9IGFzeW5jIChvcHRzOiB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG59KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBSb3V0ZUluZm8+PiA9PiB7XG4gIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0XG4gIGNvbnN0IGdsb2JieSA9IChhd2FpdCBpbXBvcnQoXCJnbG9iYnlcIikpLmdsb2JieVxuICBjb25zdCB7XG4gICAgcGFja2FnZURpcixcbiAgICBwYXRoR2xvYiA9IFwiL3BhZ2VzL2FwaS8qKi8qLnRzXCIsXG4gICAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSA9IGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlKG9wdHMuYXBpUHJlZml4KSxcbiAgfSA9IG9wdHNcbiAgLy8gTG9hZCBhbGwgcm91dGUgc3BlY3NcbiAgY29uc3QgZnVsbFBhdGhHbG9iID0gcGF0aC5wb3NpeC5qb2luKHBhY2thZ2VEaXIsIHBhdGhHbG9iKVxuICBjb25zb2xlLmxvZyhgc2VhcmNoaW5nIFwiJHtmdWxsUGF0aEdsb2J9XCIuLi5gKVxuICBjb25zdCBmaWxlcGF0aHMgPSBhd2FpdCBnbG9iYnkoYCR7ZnVsbFBhdGhHbG9ifWApXG4gIGNvbnNvbGUubG9nKGBmb3VuZCAke2ZpbGVwYXRocy5sZW5ndGh9IGZpbGVzYClcbiAgaWYgKGZpbGVwYXRocy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGZpbGVzIGZvdW5kIGF0IFwiJHtmdWxsUGF0aEdsb2J9XCJgKVxuICB9XG4gIGNvbnN0IGZpbGVwYXRoVG9Sb3V0ZUZuID0gbmV3IE1hcDxzdHJpbmcsIFJvdXRlSW5mbz4oKVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVwYXRocy5tYXAoYXN5bmMgKHApID0+IHtcbiAgICAgIGNvbnN0IHsgZGVmYXVsdDogcm91dGVGbiB9ID0gYXdhaXQgcmVxdWlyZShwYXRoLnJlc29sdmUocCkpXG5cbiAgICAgIGlmIChyb3V0ZUZuKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByb3V0ZUZuLl9yb3V0ZVNwZWM/LmV4Y2x1ZGVGcm9tT3BlbkFwaSAmJlxuICAgICAgICAgICFvcHRzLmluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICBgSWdub3JpbmcgXCIke3B9IGJlY2F1c2UgaXQgd2FzIGV4Y2x1ZGVkIGZyb20gT3BlbkFQSSBnZW5lcmF0aW9uXCJgXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghcm91dGVGbi5fc2V0dXBQYXJhbXMpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBJZ25vcmluZyBcIiR7cH1cIiBiZWNhdXNlIGl0IHdhc24ndCBjcmVhdGVkIHdpdGggd2l0aFJvdXRlU3BlY2BcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZmlsZXBhdGhUb1JvdXRlRm4uc2V0KHAsIHtcbiAgICAgICAgICBzZXR1cFBhcmFtczogcm91dGVGbi5fc2V0dXBQYXJhbXMsXG4gICAgICAgICAgcm91dGVTcGVjOiByb3V0ZUZuLl9yb3V0ZVNwZWMsXG4gICAgICAgICAgcm91dGU6IG1hcEZpbGVQYXRoVG9IVFRQUm91dGUocCksXG4gICAgICAgICAgcm91dGVGbixcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihjaGFsay55ZWxsb3coYENvdWxkbid0IGZpbmQgcm91dGUgJHtwfWApKVxuICAgICAgfVxuICAgIH0pXG4gIClcblxuICByZXR1cm4gZmlsZXBhdGhUb1JvdXRlRm5cbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSA9XG4gIChhcGlfcHJlZml4OiBzdHJpbmcgPSBcIi9hcGlcIikgPT5cbiAgKGZpbGVfcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgcm91dGUgPSBmaWxlX3BhdGhcbiAgICAgIC8vIHJlcGxhY2UgLi8gaWYgaXQgc3RhcnRzIHdpdGggLi9cbiAgICAgIC5yZXBsYWNlKC9eXFwuXFwvLywgXCIvXCIpXG4gICAgICAvLyByZXBsYWNlIHN0YXJ0aW5nIC9cbiAgICAgIC5yZXBsYWNlKC9eXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL3NyYyBpZiBpdCBzdGFydHMgd2l0aCAvc3JjXG4gICAgICAucmVwbGFjZSgvXnNyY1xcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9wYWdlcyBpZiBpdCBzdGFydHMgd2l0aCAvcGFnZXNcbiAgICAgIC5yZXBsYWNlKC9ecGFnZXNcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvYXBpIGlmIGl0IHN0YXJ0cyB3aXRoIC9hcGlcbiAgICAgIC5yZXBsYWNlKC9eYXBpXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgLnRzIGlmIGl0IGVuZHMgd2l0aCAudHNcbiAgICAgIC5yZXBsYWNlKC9cXC50cyQvLCBcIlwiKVxuICAgICAgLy8gcmVtb3ZlIHB1YmxpYyByZWZlcmVuY2VcbiAgICAgIC5yZXBsYWNlKFwicHVibGljXCIsIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIGluZGV4IGlmIGl0IGVuZHMgd2l0aCBpbmRleFxuICAgICAgLnJlcGxhY2UoL1xcL1xcaW5kZXgoPyEuKS8sIFwiXCIpXG5cbiAgICByZXR1cm4gcGF0aC5qb2luKGFwaV9wcmVmaXgsIHJvdXRlKVxuICB9XG4iLCAiLyoqXG4gKiBab2QgT3BlbkFQSSBHZW5lcmF0b3IuXG4gKlxuICogVmVuZG9yZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYW5hdGluZS96b2QtcGx1Z2luc1xuICpcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIEJyaWFuIE1jQnJpZGVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU2NoZW1hT2JqZWN0LCBTY2hlbWFPYmplY3RUeXBlIH0gZnJvbSBcIm9wZW5hcGkzLXRzL29hczMxXCJcbmltcG9ydCBtZXJnZSBmcm9tIFwidHMtZGVlcG1lcmdlXCJcbmltcG9ydCB7IEFueVpvZE9iamVjdCwgeiwgWm9kVHlwZUFueSB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4vZnJvbnQtbWF0dGVyXCJcbmltcG9ydCBkZWRlbnQgZnJvbSBcImRlZGVudFwiXG5pbXBvcnQgeyBwcmVmaXhPYmplY3RLZXlzV2l0aFggfSBmcm9tIFwiLi4vdXRpbHMvcHJlZml4LW9iamVjdC1rZXlzLXdpdGgteFwiXG5pbXBvcnQgeyBkYXNoaWZ5T2JqZWN0S2V5cyB9IGZyb20gXCIuLi91dGlscy9kYXNoaWZ5LW9iamVjdC1rZXlzXCJcblxudHlwZSBBbmF0aW5lU2NoZW1hT2JqZWN0ID0gU2NoZW1hT2JqZWN0ICYgeyBoaWRlRGVmaW5pdGlvbnM/OiBzdHJpbmdbXSB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFwaVpvZEFueSBleHRlbmRzIFpvZFR5cGVBbnkge1xuICBtZXRhT3BlbkFwaT86IEFuYXRpbmVTY2hlbWFPYmplY3QgfCBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbn1cblxuaW50ZXJmYWNlIE9wZW5BcGlab2RBbnlPYmplY3QgZXh0ZW5kcyBBbnlab2RPYmplY3Qge1xuICBtZXRhT3BlbkFwaT86IEFuYXRpbmVTY2hlbWFPYmplY3QgfCBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbn1cblxuaW50ZXJmYWNlIFBhcnNpbmdBcmdzPFQ+IHtcbiAgem9kUmVmOiBUXG4gIHNjaGVtYXM6IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxuICB1c2VPdXRwdXQ/OiBib29sZWFuXG4gIGhpZGVEZWZpbml0aW9ucz86IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRBcGk8VCBleHRlbmRzIE9wZW5BcGlab2RBbnk+KFxuICBzY2hlbWE6IFQsXG4gIHNjaGVtYU9iamVjdDogQW5hdGluZVNjaGVtYU9iamVjdCA9IHt9XG4pOiBUIHtcbiAgc2NoZW1hLm1ldGFPcGVuQXBpID0gT2JqZWN0LmFzc2lnbihzY2hlbWEubWV0YU9wZW5BcGkgfHwge30sIHNjaGVtYU9iamVjdClcbiAgcmV0dXJuIHNjaGVtYVxufVxuXG5mdW5jdGlvbiBpdGVyYXRlWm9kT2JqZWN0KHtcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG4gIGhpZGVEZWZpbml0aW9ucyxcbn06IFBhcnNpbmdBcmdzPE9wZW5BcGlab2RBbnlPYmplY3Q+KSB7XG4gIGNvbnN0IHJlZHVjZWQgPSBPYmplY3Qua2V5cyh6b2RSZWYuc2hhcGUpXG4gICAgLmZpbHRlcigoa2V5KSA9PiBoaWRlRGVmaW5pdGlvbnM/LmluY2x1ZGVzKGtleSkgPT09IGZhbHNlKVxuICAgIC5yZWR1Y2UoXG4gICAgICAoY2FycnksIGtleSkgPT4gKHtcbiAgICAgICAgLi4uY2FycnksXG4gICAgICAgIFtrZXldOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuc2hhcGVba2V5XSwgdXNlT3V0cHV0KSxcbiAgICAgIH0pLFxuICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgU2NoZW1hT2JqZWN0PlxuICAgIClcblxuICByZXR1cm4gcmVkdWNlZFxufVxuXG5mdW5jdGlvbiBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZjogT3BlbkFwaVpvZEFueSk6IFNjaGVtYU9iamVjdCB7XG4gIGlmICghem9kUmVmLmRlc2NyaXB0aW9uKSByZXR1cm4ge31cbiAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KHpvZFJlZi5kZXNjcmlwdGlvbilcbiAgaWYgKCF0ZXN0RnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKSlcbiAgICByZXR1cm4geyBkZXNjcmlwdGlvbjogem9kUmVmLmRlc2NyaXB0aW9uIH1cbiAgY29uc3QgeyBhdHRyaWJ1dGVzLCBib2R5IH0gPSBwYXJzZUZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbilcbiAgY29uc3Qgb3V0cHV0OiBTY2hlbWFPYmplY3QgPSB7fVxuICBpZiAoYm9keS50cmltKCkpIG91dHB1dC5kZXNjcmlwdGlvbiA9IGJvZHkudHJpbSgpXG4gIGlmICh0eXBlb2YgYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIiAmJiBhdHRyaWJ1dGVzICE9PSBudWxsKSB7XG4gICAgaWYgKFwiZGVwcmVjYXRlZFwiIGluIGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5kZXByZWNhdGVkKSB7XG4gICAgICBvdXRwdXQuZGVwcmVjYXRlZCA9IHRydWVcbiAgICB9XG5cbiAgICBPYmplY3QuZW50cmllcyhcbiAgICAgIHByZWZpeE9iamVjdEtleXNXaXRoWChkYXNoaWZ5T2JqZWN0S2V5cyhhdHRyaWJ1dGVzKSlcbiAgICApLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgb3V0cHV0W2tleV0gPSB2YWx1ZVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gb3V0cHV0XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHJhbnNmb3JtYXRpb24oe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kVHJhbnNmb3JtZXI8bmV2ZXI+IHwgei5ab2RFZmZlY3RzPG5ldmVyPj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBpbnB1dCA9IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLnNjaGVtYSwgdXNlT3V0cHV0KVxuXG4gIGxldCBvdXRwdXQgPSBcInVuZGVmaW5lZFwiXG4gIGlmICh1c2VPdXRwdXQgJiYgem9kUmVmLl9kZWYuZWZmZWN0KSB7XG4gICAgY29uc3QgZWZmZWN0ID1cbiAgICAgIHpvZFJlZi5fZGVmLmVmZmVjdC50eXBlID09PSBcInRyYW5zZm9ybVwiID8gem9kUmVmLl9kZWYuZWZmZWN0IDogbnVsbFxuICAgIGlmIChlZmZlY3QgJiYgXCJ0cmFuc2Zvcm1cIiBpbiBlZmZlY3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG91dHB1dCA9IHR5cGVvZiBlZmZlY3QudHJhbnNmb3JtKFxuICAgICAgICAgIFtcImludGVnZXJcIiwgXCJudW1iZXJcIl0uaW5jbHVkZXMoYCR7aW5wdXQudHlwZX1gKVxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IFwic3RyaW5nXCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgOiBcImJvb2xlYW5cIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgOiBcIm9iamVjdFwiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICA6IFwibnVsbFwiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogXCJhcnJheVwiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB7IGFkZElzc3VlOiAoKSA9PiB1bmRlZmluZWQsIHBhdGg6IFtdIH0gLy8gVE9ETzogRGlzY292ZXIgaWYgY29udGV4dCBpcyBuZWNlc3NhcnkgaGVyZVxuICAgICAgICApXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qKi9cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIC4uLih6b2RSZWYuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiB6b2RSZWYuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIC4uLmlucHV0LFxuICAgICAgLi4uKFtcIm51bWJlclwiLCBcInN0cmluZ1wiLCBcImJvb2xlYW5cIiwgXCJudWxsXCJdLmluY2x1ZGVzKG91dHB1dClcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0eXBlOiBvdXRwdXQgYXMgXCJudW1iZXJcIiB8IFwic3RyaW5nXCIgfCBcImJvb2xlYW5cIiB8IFwibnVsbFwiLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VTdHJpbmcoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZFN0cmluZz4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBiYXNlU2NoZW1hOiBTY2hlbWFPYmplY3QgPSB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgfVxuICBjb25zdCB7IGNoZWNrcyA9IFtdIH0gPSB6b2RSZWYuX2RlZlxuICBjaGVja3MuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIHN3aXRjaCAoaXRlbS5raW5kKSB7XG4gICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImVtYWlsXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1dWlkXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJjdWlkXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJjdWlkXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcInVyaVwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImRhdGUtdGltZVwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibGVuZ3RoXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWluTGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBiYXNlU2NoZW1hLm1heExlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5tYXhMZW5ndGggPSBpdGVtLnZhbHVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWluXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWluTGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcInJlZ2V4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEucGF0dGVybiA9IGl0ZW0ucmVnZXguc291cmNlXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9KVxuICByZXR1cm4gbWVyZ2UoYmFzZVNjaGVtYSwgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bWJlcih7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kTnVtYmVyPik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGJhc2VTY2hlbWE6IFNjaGVtYU9iamVjdCA9IHtcbiAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgIGZvcm1hdDogXCJmbG9hdFwiLFxuICB9XG4gIGNvbnN0IHsgY2hlY2tzID0gW10gfSA9IHpvZFJlZi5fZGVmXG4gIGNoZWNrcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgc3dpdGNoIChpdGVtLmtpbmQpIHtcbiAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5tYXhpbXVtID0gaXRlbS52YWx1ZVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFVQU1RSRUFNOiBUaGUgb3BlbmFwaTMtdHMgdHlwZXMgYXJlIHdyb25nOiBleGNsdXNpdmVNYXhpbXVtIGlzIGEgYm9vbGVhbiBpbiB0aGlzIHZlcnNpb24uXG4gICAgICAgIC8vIGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vdjNfMC9kYXRhLW1vZGVscy9kYXRhLXR5cGVzL1xuICAgICAgICBpZiAoIWl0ZW0uaW5jbHVzaXZlKSBiYXNlU2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWluXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWluaW11bSA9IGl0ZW0udmFsdWVcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBVUFNUUkVBTTogVGhlIG9wZW5hcGkzLXRzIHR5cGVzIGFyZSB3cm9uZzogZXhjbHVzaXZlTWluaW11bSBpcyBhIGJvb2xlYW4gaW4gdGhpcyB2ZXJzaW9uLlxuICAgICAgICAvLyBodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL3YzXzAvZGF0YS1tb2RlbHMvZGF0YS10eXBlcy9cbiAgICAgICAgaWYgKCFpdGVtLmluY2x1c2l2ZSkgYmFzZVNjaGVtYS5leGNsdXNpdmVNaW5pbXVtID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImludFwiOlxuICAgICAgICBiYXNlU2NoZW1hLnR5cGUgPSBcImludGVnZXJcIlxuICAgICAgICBkZWxldGUgYmFzZVNjaGVtYS5mb3JtYXRcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtdWx0aXBsZU9mXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubXVsdGlwbGVPZiA9IGl0ZW0udmFsdWVcbiAgICB9XG4gIH0pXG4gIHJldHVybiBtZXJnZShiYXNlU2NoZW1hLCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIGdldEV4Y2x1ZGVkRGVmaW5pdGlvbnNGcm9tU2NoZW1hKFxuICBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXhjbHVkZWREZWZpbml0aW9uczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHNjaGVtYSBvZiBzY2hlbWFzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmhpZGVEZWZpbml0aW9ucykpIHtcbiAgICAgIGV4Y2x1ZGVkRGVmaW5pdGlvbnMucHVzaCguLi5zY2hlbWEuaGlkZURlZmluaXRpb25zKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGNsdWRlZERlZmluaXRpb25zXG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0KHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG4gIGhpZGVEZWZpbml0aW9ucyxcbn06IFBhcnNpbmdBcmdzPFxuICB6LlpvZE9iamVjdDxuZXZlciwgXCJwYXNzdGhyb3VnaFwiIHwgXCJzdHJpY3RcIiB8IFwic3RyaXBcIj5cbj4pOiBTY2hlbWFPYmplY3Qge1xuICBsZXQgYWRkaXRpb25hbFByb3BlcnRpZXM6IFNjaGVtYU9iamVjdFtcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCJdXG5cbiAgLy8gYGNhdGNoYWxsYCBvYnZpYXRlcyBgc3RyaWN0YCwgYHN0cmlwYCwgYW5kIGBwYXNzdGhyb3VnaGBcbiAgaWYgKFxuICAgICEoXG4gICAgICB6b2RSZWYuX2RlZi5jYXRjaGFsbCBpbnN0YW5jZW9mIHouWm9kTmV2ZXIgfHxcbiAgICAgIHpvZFJlZi5fZGVmLmNhdGNoYWxsPy5fZGVmLnR5cGVOYW1lID09PSBcIlpvZE5ldmVyXCJcbiAgICApXG4gIClcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllcyA9IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmNhdGNoYWxsLCB1c2VPdXRwdXQpXG4gIGVsc2UgaWYgKHpvZFJlZi5fZGVmLnVua25vd25LZXlzID09PSBcInBhc3N0aHJvdWdoXCIpXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgPSB0cnVlXG4gIGVsc2UgaWYgKHpvZFJlZi5fZGVmLnVua25vd25LZXlzID09PSBcInN0cmljdFwiKSBhZGRpdGlvbmFsUHJvcGVydGllcyA9IGZhbHNlXG5cbiAgLy8gU28gdGhhdCBgdW5kZWZpbmVkYCB2YWx1ZXMgZG9uJ3QgZW5kIHVwIGluIHRoZSBzY2hlbWEgYW5kIGJlIHdlaXJkXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID1cbiAgICBhZGRpdGlvbmFsUHJvcGVydGllcyAhPSBudWxsID8geyBhZGRpdGlvbmFsUHJvcGVydGllcyB9IDoge31cblxuICBjb25zdCByZXF1aXJlZFByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhcbiAgICAoem9kUmVmIGFzIHouQW55Wm9kT2JqZWN0KS5zaGFwZVxuICApLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgY29uc3QgaXRlbSA9ICh6b2RSZWYgYXMgei5Bbnlab2RPYmplY3QpLnNoYXBlW2tleV1cbiAgICByZXR1cm4gKFxuICAgICAgIShcbiAgICAgICAgaXRlbS5pc09wdGlvbmFsKCkgfHxcbiAgICAgICAgaXRlbSBpbnN0YW5jZW9mIHouWm9kRGVmYXVsdCB8fFxuICAgICAgICBpdGVtLl9kZWYudHlwZU5hbWUgPT09IFwiWm9kRGVmYXVsdFwiXG4gICAgICApICYmICEoaXRlbSBpbnN0YW5jZW9mIHouWm9kTmV2ZXIgfHwgaXRlbS5fZGVmLnR5cGVOYW1lID09PSBcIlpvZERlZmF1bHRcIilcbiAgICApXG4gIH0pXG5cbiAgY29uc3QgcmVxdWlyZWQgPVxuICAgIHJlcXVpcmVkUHJvcGVydGllcy5sZW5ndGggPiAwID8geyByZXF1aXJlZDogcmVxdWlyZWRQcm9wZXJ0aWVzIH0gOiB7fVxuXG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiIGFzIFNjaGVtYU9iamVjdFR5cGUsXG4gICAgICBwcm9wZXJ0aWVzOiBpdGVyYXRlWm9kT2JqZWN0KHtcbiAgICAgICAgem9kUmVmOiB6b2RSZWYgYXMgT3BlbkFwaVpvZEFueU9iamVjdCxcbiAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgdXNlT3V0cHV0LFxuICAgICAgICBoaWRlRGVmaW5pdGlvbnM6IGdldEV4Y2x1ZGVkRGVmaW5pdGlvbnNGcm9tU2NoZW1hKHNjaGVtYXMpLFxuICAgICAgfSksXG4gICAgICAuLi5yZXF1aXJlZCxcbiAgICAgIC4uLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLFxuICAgICAgLi4uaGlkZURlZmluaXRpb25zLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZVJlY29yZCh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RSZWNvcmQ+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOlxuICAgICAgICB6b2RSZWYuX2RlZi52YWx1ZVR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd25cbiAgICAgICAgICA/IHt9XG4gICAgICAgICAgOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi52YWx1ZVR5cGUsIHVzZU91dHB1dCksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQmlnSW50KHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RCaWdJbnQ+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHsgdHlwZTogXCJpbnRlZ2VyXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSwgZm9ybWF0OiBcImludDY0XCIgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQm9vbGVhbih7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kQm9vbGVhbj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgeyB0eXBlOiBcImJvb2xlYW5cIiBhcyBTY2hlbWFPYmplY3RUeXBlIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURhdGUoeyB6b2RSZWYsIHNjaGVtYXMgfTogUGFyc2luZ0FyZ3M8ei5ab2REYXRlPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7IHR5cGU6IFwic3RyaW5nXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSwgZm9ybWF0OiBcImRhdGUtdGltZVwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bGwoeyB6b2RSZWYsIHNjaGVtYXMgfTogUGFyc2luZ0FyZ3M8ei5ab2ROdWxsPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VPcHRpb25hbCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RPcHRpb25hbDxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgZ2VuZXJhdGVTY2hlbWEoem9kUmVmLnVud3JhcCgpLCB1c2VPdXRwdXQpLFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VOdWxsYWJsZSh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROdWxsYWJsZTxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBzY2hlbWEgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYudW53cmFwKCksIHVzZU91dHB1dClcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHsgLi4uc2NoZW1hLCB0eXBlOiBzY2hlbWEudHlwZSwgbnVsbGFibGU6IHRydWUgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVmYXVsdCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2REZWZhdWx0PE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBkZWZhdWx0OiB6b2RSZWYuX2RlZi5kZWZhdWx0VmFsdWUoKSxcbiAgICAgIC4uLmdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmlubmVyVHlwZSwgdXNlT3V0cHV0KSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VBcnJheSh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RBcnJheTxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBjb25zdHJhaW50czogU2NoZW1hT2JqZWN0ID0ge31cbiAgaWYgKHpvZFJlZi5fZGVmLmV4YWN0TGVuZ3RoICE9IG51bGwpIHtcbiAgICBjb25zdHJhaW50cy5taW5JdGVtcyA9IHpvZFJlZi5fZGVmLmV4YWN0TGVuZ3RoLnZhbHVlXG4gICAgY29uc3RyYWludHMubWF4SXRlbXMgPSB6b2RSZWYuX2RlZi5leGFjdExlbmd0aC52YWx1ZVxuICB9XG5cbiAgaWYgKHpvZFJlZi5fZGVmLm1pbkxlbmd0aCAhPSBudWxsKVxuICAgIGNvbnN0cmFpbnRzLm1pbkl0ZW1zID0gem9kUmVmLl9kZWYubWluTGVuZ3RoLnZhbHVlXG4gIGlmICh6b2RSZWYuX2RlZi5tYXhMZW5ndGggIT0gbnVsbClcbiAgICBjb25zdHJhaW50cy5tYXhJdGVtcyA9IHpvZFJlZi5fZGVmLm1heExlbmd0aC52YWx1ZVxuXG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiBcImFycmF5XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGl0ZW1zOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuZWxlbWVudCwgdXNlT3V0cHV0KSxcbiAgICAgIC4uLmNvbnN0cmFpbnRzLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUxpdGVyYWwoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG59OiBQYXJzaW5nQXJnczx6LlpvZExpdGVyYWw8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IHR5cGVvZiB6b2RSZWYuX2RlZi52YWx1ZSBhcyBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiLFxuICAgICAgZW51bTogW3pvZFJlZi5fZGVmLnZhbHVlXSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VFbnVtKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RFbnVtPG5ldmVyPiB8IHouWm9kTmF0aXZlRW51bTxuZXZlcj4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IHR5cGVvZiBPYmplY3QudmFsdWVzKHpvZFJlZi5fZGVmLnZhbHVlcylbMF0gYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIsXG4gICAgICBlbnVtOiBPYmplY3QudmFsdWVzKHpvZFJlZi5fZGVmLnZhbHVlcyksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlSW50ZXJzZWN0aW9uKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZEludGVyc2VjdGlvbjx6LlpvZFR5cGVBbnksIHouWm9kVHlwZUFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIGFsbE9mOiBbXG4gICAgICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmxlZnQsIHVzZU91dHB1dCksXG4gICAgICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLnJpZ2h0LCB1c2VPdXRwdXQpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VVbmlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RVbmlvbjxbei5ab2RUeXBlQW55LCAuLi56LlpvZFR5cGVBbnlbXV0+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGNvbnRlbnRzID0gem9kUmVmLl9kZWYub3B0aW9uc1xuICBpZiAoXG4gICAgY29udGVudHMucmVkdWNlKFxuICAgICAgKHByZXYsIGNvbnRlbnQpID0+IHByZXYgJiYgY29udGVudC5fZGVmLnR5cGVOYW1lID09PSBcIlpvZExpdGVyYWxcIixcbiAgICAgIHRydWVcbiAgICApXG4gICkge1xuICAgIC8vIHNwZWNpYWwgY2FzZSB0byB0cmFuc2Zvcm0gdW5pb25zIG9mIGxpdGVyYWxzIGludG8gZW51bXNcbiAgICBjb25zdCBsaXRlcmFscyA9IGNvbnRlbnRzIGFzIHVua25vd24gYXMgei5ab2RMaXRlcmFsPE9wZW5BcGlab2RBbnk+W11cbiAgICBjb25zdCB0eXBlID0gbGl0ZXJhbHMucmVkdWNlKFxuICAgICAgKHByZXYsIGNvbnRlbnQpID0+XG4gICAgICAgICFwcmV2IHx8IHByZXYgPT09IHR5cGVvZiBjb250ZW50Ll9kZWYudmFsdWVcbiAgICAgICAgICA/IHR5cGVvZiBjb250ZW50Ll9kZWYudmFsdWVcbiAgICAgICAgICA6IG51bGwsXG4gICAgICBudWxsIGFzIG51bGwgfCBzdHJpbmdcbiAgICApXG5cbiAgICBpZiAodHlwZSkge1xuICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogdHlwZSBhcyBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGVudW06IGxpdGVyYWxzLm1hcCgobGl0ZXJhbCkgPT4gbGl0ZXJhbC5fZGVmLnZhbHVlKSxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgICAgICAuLi5zY2hlbWFzXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNOdWxsYWJsZSA9IGNvbnRlbnRzLnNvbWUoXG4gICAgKGNvbnRlbnQpID0+IGNvbnRlbnQuX2RlZi50eXBlTmFtZSA9PT0gXCJab2ROdWxsXCJcbiAgKVxuICBjb25zdCBub25OdWxsQ29udGVudHMgPSBjb250ZW50cy5maWx0ZXIoXG4gICAgKGNvbnRlbnQpID0+IGNvbnRlbnQuX2RlZi50eXBlTmFtZSAhPT0gXCJab2ROdWxsXCJcbiAgKVxuXG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBvbmVPZjogbm9uTnVsbENvbnRlbnRzLm1hcCgoc2NoZW1hKSA9PiBnZW5lcmF0ZVNjaGVtYShzY2hlbWEsIHVzZU91dHB1dCkpLFxuICAgICAgLi4uKGlzTnVsbGFibGUgPyB7IG51bGxhYmxlOiB0cnVlIH0gOiB7fSksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGlzY3JpbWluYXRlZFVuaW9uKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczxcbiAgei5ab2REaXNjcmltaW5hdGVkVW5pb248c3RyaW5nLCB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbk9wdGlvbjxzdHJpbmc+W10+XG4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIGRpc2NyaW1pbmF0b3I6IHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiAoXG4gICAgICAgICAgem9kUmVmIGFzIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uPFxuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgei5ab2REaXNjcmltaW5hdGVkVW5pb25PcHRpb248c3RyaW5nPltdXG4gICAgICAgICAgPlxuICAgICAgICApLl9kZWYuZGlzY3JpbWluYXRvcixcbiAgICAgIH0sXG4gICAgICBvbmVPZjogQXJyYXkuZnJvbShcbiAgICAgICAgKFxuICAgICAgICAgIHpvZFJlZiBhcyB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbjxcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uT3B0aW9uPHN0cmluZz5bXVxuICAgICAgICAgID5cbiAgICAgICAgKS5fZGVmLm9wdGlvbnMudmFsdWVzKClcbiAgICAgICkubWFwKChzY2hlbWEpID0+IGdlbmVyYXRlU2NoZW1hKHNjaGVtYSwgdXNlT3V0cHV0KSksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlTmV2ZXIoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZE5ldmVyPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZSh7IHJlYWRPbmx5OiB0cnVlIH0sIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gcGFyc2VCcmFuZGVkKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RCcmFuZGVkPHouWm9kQW55LCBzdHJpbmc+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi50eXBlKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gY2F0Y2hBbGxQYXJzZXIoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczxab2RUeXBlQW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIHBhcnNlUGlwZWxpbmUoe1xuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kUGlwZWxpbmU8bmV2ZXIsIG5ldmVyPj4pOiBTY2hlbWFPYmplY3Qge1xuICBpZiAodXNlT3V0cHV0KSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLm91dCwgdXNlT3V0cHV0KVxuICB9XG4gIHJldHVybiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5pbiwgdXNlT3V0cHV0KVxufVxuXG5mdW5jdGlvbiBwYXJzZVJlYWRvbmx5KHtcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZFJlYWRvbmx5PHouWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYuaW5uZXJUeXBlLCB1c2VPdXRwdXQpLFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuY29uc3Qgd29ya2VyTWFwID0ge1xuICBab2RPYmplY3Q6IHBhcnNlT2JqZWN0LFxuICBab2RSZWNvcmQ6IHBhcnNlUmVjb3JkLFxuICBab2RTdHJpbmc6IHBhcnNlU3RyaW5nLFxuICBab2ROdW1iZXI6IHBhcnNlTnVtYmVyLFxuICBab2RCaWdJbnQ6IHBhcnNlQmlnSW50LFxuICBab2RCb29sZWFuOiBwYXJzZUJvb2xlYW4sXG4gIFpvZERhdGU6IHBhcnNlRGF0ZSxcbiAgWm9kTnVsbDogcGFyc2VOdWxsLFxuICBab2RPcHRpb25hbDogcGFyc2VPcHRpb25hbCxcbiAgWm9kTnVsbGFibGU6IHBhcnNlTnVsbGFibGUsXG4gIFpvZERlZmF1bHQ6IHBhcnNlRGVmYXVsdCxcbiAgWm9kQXJyYXk6IHBhcnNlQXJyYXksXG4gIFpvZExpdGVyYWw6IHBhcnNlTGl0ZXJhbCxcbiAgWm9kRW51bTogcGFyc2VFbnVtLFxuICBab2ROYXRpdmVFbnVtOiBwYXJzZUVudW0sXG4gIFpvZFRyYW5zZm9ybWVyOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RFZmZlY3RzOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RJbnRlcnNlY3Rpb246IHBhcnNlSW50ZXJzZWN0aW9uLFxuICBab2RVbmlvbjogcGFyc2VVbmlvbixcbiAgWm9kRGlzY3JpbWluYXRlZFVuaW9uOiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbixcbiAgWm9kTmV2ZXI6IHBhcnNlTmV2ZXIsXG4gIFpvZEJyYW5kZWQ6IHBhcnNlQnJhbmRlZCxcbiAgLy8gVE9ETyBUcmFuc2Zvcm0gdGhlIHJlc3QgdG8gc2NoZW1hc1xuICBab2RVbmRlZmluZWQ6IGNhdGNoQWxsUGFyc2VyLFxuICAvLyBUT0RPOiBgcHJlZml4SXRlbXNgIGlzIGFsbG93ZWQgaW4gT3BlbkFQSSAzLjEgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHR1cGxlc1xuICBab2RUdXBsZTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZE1hcDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZEZ1bmN0aW9uOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kTGF6eTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFByb21pc2U6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RBbnk6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RVbmtub3duOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kVm9pZDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFBpcGVsaW5lOiBwYXJzZVBpcGVsaW5lLFxuICBab2RSZWFkb25seTogcGFyc2VSZWFkb25seSxcbn1cbnR5cGUgV29ya2VyS2V5cyA9IGtleW9mIHR5cGVvZiB3b3JrZXJNYXBcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NoZW1hKFxuICB6b2RSZWY6IE9wZW5BcGlab2RBbnksXG4gIHVzZU91dHB1dD86IGJvb2xlYW5cbik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHsgbWV0YU9wZW5BcGkgPSB7fSB9ID0gem9kUmVmXG4gIGNvbnN0IHNjaGVtYXM6IEFuYXRpbmVTY2hlbWFPYmplY3RbXSA9IFtcbiAgICAuLi4oQXJyYXkuaXNBcnJheShtZXRhT3BlbkFwaSkgPyBtZXRhT3BlbkFwaSA6IFttZXRhT3BlbkFwaV0pLFxuICBdXG4gIHRyeSB7XG4gICAgY29uc3QgdHlwZU5hbWUgPSB6b2RSZWYuX2RlZi50eXBlTmFtZSBhcyBXb3JrZXJLZXlzXG4gICAgaWYgKHR5cGVOYW1lIGluIHdvcmtlck1hcCkge1xuICAgICAgcmV0dXJuIHdvcmtlck1hcFt0eXBlTmFtZV0oe1xuICAgICAgICB6b2RSZWY6IHpvZFJlZiBhcyBuZXZlcixcbiAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgdXNlT3V0cHV0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gY2F0Y2hBbGxQYXJzZXIoeyB6b2RSZWYsIHNjaGVtYXMgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgcmV0dXJuIGNhdGNoQWxsUGFyc2VyKHsgem9kUmVmLCBzY2hlbWFzIH0pXG4gIH1cbn1cbiIsICIvKipcbiAqIEZyb250LU1hdHRlclxuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2p4c29uL2Zyb250LW1hdHRlclxuICpcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSBKYXNvbiBDYW1wYmVsbCAoXCJBdXRob3JcIilcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7IGxvYWQgfSBmcm9tIFwianMteWFtbFwiXG5jb25zdCBvcHRpb25hbEJ5dGVPcmRlck1hcmsgPSBcIlxcXFx1ZmVmZj9cIlxuY29uc3QgcGxhdGZvcm0gPSB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiA/IHByb2Nlc3MucGxhdGZvcm0gOiBcIlwiXG5jb25zdCBwYXR0ZXJuID1cbiAgXCJeKFwiICtcbiAgb3B0aW9uYWxCeXRlT3JkZXJNYXJrICtcbiAgXCIoPSB5YW1sID18LS0tKVwiICtcbiAgXCIkKFtcXFxcc1xcXFxTXSo/KVwiICtcbiAgXCJeKD86XFxcXDJ8XFxcXC5cXFxcLlxcXFwuKVxcXFxzKlwiICtcbiAgXCIkXCIgK1xuICAocGxhdGZvcm0gPT09IFwid2luMzJcIiA/IFwiXFxcXHI/XCIgOiBcIlwiKSArXG4gIFwiKD86XFxcXG4pPylcIlxuLy8gTk9URTogSWYgdGhpcyBwYXR0ZXJuIHVzZXMgdGhlICdnJyBmbGFnIHRoZSBgcmVnZXhgIHZhcmlhYmxlIGRlZmluaXRpb24gd2lsbFxuLy8gbmVlZCB0byBiZSBtb3ZlZCBkb3duIGludG8gdGhlIGZ1bmN0aW9ucyB0aGF0IHVzZSBpdC5cbmNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcIm1cIilcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRnJvbnRNYXR0ZXIoXG4gIHN0cmluZzogc3RyaW5nLFxuICBvcHRpb25zID0ge31cbik6IHsgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGJvZHk6IHN0cmluZzsgYm9keUJlZ2luOiBudW1iZXIgfSB7XG4gIHN0cmluZyA9IHN0cmluZyB8fCBcIlwiXG4gIHZhciBkZWZhdWx0T3B0aW9ucyA9IHsgYWxsb3dVbnNhZmU6IGZhbHNlIH1cbiAgb3B0aW9ucyA9XG4gICAgb3B0aW9ucyBpbnN0YW5jZW9mIE9iamVjdFxuICAgICAgPyB7IC4uLmRlZmF1bHRPcHRpb25zLCAuLi5vcHRpb25zIH1cbiAgICAgIDogZGVmYXVsdE9wdGlvbnNcbiAgdmFyIGxpbmVzID0gc3RyaW5nLnNwbGl0KC8oXFxyP1xcbikvKVxuICBpZiAobGluZXNbMF0gJiYgLz0geWFtbCA9fC0tLS8udGVzdChsaW5lc1swXSkpIHtcbiAgICByZXR1cm4gcGFyc2Uoc3RyaW5nKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGJvZHk6IHN0cmluZyxcbiAgICAgIGJvZHlCZWdpbjogMSxcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZUxvY2F0aW9uKG1hdGNoOiBSZWdFeHBFeGVjQXJyYXksIGJvZHk6IHN0cmluZykge1xuICB2YXIgbGluZSA9IDFcbiAgdmFyIHBvcyA9IGJvZHkuaW5kZXhPZihcIlxcblwiKVxuICB2YXIgb2Zmc2V0ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGhcblxuICB3aGlsZSAocG9zICE9PSAtMSkge1xuICAgIGlmIChwb3MgPj0gb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gbGluZVxuICAgIH1cbiAgICBsaW5lKytcbiAgICBwb3MgPSBib2R5LmluZGV4T2YoXCJcXG5cIiwgcG9zICsgMSlcbiAgfVxuXG4gIHJldHVybiBsaW5lXG59XG5cbmZ1bmN0aW9uIHBhcnNlKHN0cmluZzogc3RyaW5nKToge1xuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBib2R5OiBzdHJpbmdcbiAgYm9keUJlZ2luOiBudW1iZXJcbn0ge1xuICB2YXIgbWF0Y2ggPSByZWdleC5leGVjKHN0cmluZylcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGJvZHk6IHN0cmluZyxcbiAgICAgIGJvZHlCZWdpbjogMSxcbiAgICB9XG4gIH1cblxuICB2YXIgeWFtbCA9IG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdLnJlcGxhY2UoL15cXHMrfFxccyskL2csIFwiXCIpXG4gIHZhciBhdHRyaWJ1dGVzID0gKGxvYWQoeWFtbCkgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHZhciBib2R5ID0gc3RyaW5nLnJlcGxhY2UobWF0Y2hbMF0sIFwiXCIpXG4gIHZhciBsaW5lID0gY29tcHV0ZUxvY2F0aW9uKG1hdGNoLCBzdHJpbmcpXG5cbiAgcmV0dXJuIHtcbiAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxuICAgIGJvZHk6IGJvZHksXG4gICAgYm9keUJlZ2luOiBsaW5lLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0RnJvbnRNYXR0ZXIoc3RyaW5nOiBzdHJpbmcpIHtcbiAgc3RyaW5nID0gc3RyaW5nIHx8IFwiXCJcblxuICByZXR1cm4gcmVnZXgudGVzdChzdHJpbmcpXG59XG4iLCAidHlwZSBQcmVmaXhlZE9iamVjdDxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCBhcyBgeC0ke3N0cmluZyAmIEt9YF06IFRbS11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWZpeE9iamVjdEtleXNXaXRoWDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgb2JqOiBUXG4pOiBQcmVmaXhlZE9iamVjdDxUPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2B4LSR7a2V5fWAsIHZhbHVlXSlcbiAgKSBhcyBQcmVmaXhlZE9iamVjdDxUPlxufVxuIiwgInR5cGUgU25ha2VUb0Rhc2g8VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgYXMgSyBleHRlbmRzIHN0cmluZyA/IFNuYWtlVG9EYXNoU3RyaW5nPEs+IDogS106IFRbS11cbn1cblxudHlwZSBTbmFrZVRvRGFzaFN0cmluZzxTIGV4dGVuZHMgc3RyaW5nPiA9IFMgZXh0ZW5kcyBgJHtpbmZlciBUfV8ke2luZmVyIFV9YFxuICA/IGAke1R9LSR7U25ha2VUb0Rhc2hTdHJpbmc8VT59YFxuICA6IFNcblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hpZnlPYmplY3RLZXlzPFQgZXh0ZW5kcyBvYmplY3Q+KG9iajogVCk6IFNuYWtlVG9EYXNoPFQ+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LnJlcGxhY2UoL18vZywgXCItXCIpLCB2YWx1ZV0pXG4gICkgYXMgU25ha2VUb0Rhc2g8VD5cbn1cbiIsICJpbXBvcnQgXyBmcm9tIFwibG9kYXNoXCJcblxuZnVuY3Rpb24gZmluZEtleUluT2JqKG9iajogYW55LCB2YWx1ZTogYW55KTogc3RyaW5nIHwgbnVsbCB7XG4gIGxldCByZXN1bHRLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIF8uZm9yT3duKG9iaiwgKHYsIGspID0+IHtcbiAgICBpZiAoXy5pc09iamVjdCh2KSAmJiBfLmlzTWF0Y2godiwgdmFsdWUpKSB7XG4gICAgICByZXN1bHRLZXkgPSBrXG4gICAgICAvLyBTdG9wIHRoZSBpdGVyYXRpb25cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIHJlc3VsdEtleVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1iZWRTY2hlbWFSZWZlcmVuY2VzKG9iajE6IGFueSwgb2JqMjogYW55KTogYW55IHtcbiAgcmV0dXJuIF8udHJhbnNmb3JtKG9iajEsIChyZXN1bHQsIHZhbHVlLCBrZXkpID0+IHtcbiAgICBpZiAoXy5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nS2V5ID0gZmluZEtleUluT2JqKG9iajIsIHZhbHVlKVxuICAgICAgaWYgKG1hdGNoaW5nS2V5KSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0ge1xuICAgICAgICAgICRyZWY6IGAjL2NvbXBvbmVudHMvc2NoZW1hcy8ke21hdGNoaW5nS2V5fWAsXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZW1iZWRTY2hlbWFSZWZlcmVuY2VzKHZhbHVlLCBvYmoyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9KVxufVxuIiwgImltcG9ydCB7IFJvdXRlU3BlYyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtNZXRob2ROYW1lKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXVxuICBpZiAobGFzdFBhcnQuc3RhcnRzV2l0aChcIltcIikgJiYgbGFzdFBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgLy8gQ29udmVydCBbcGFyYW1dIHRvIGJ5X3BhcmFtXG4gICAgY29uc3QgcGFyYW0gPSBsYXN0UGFydC5zbGljZSgxLCAtMSlcbiAgICByZXR1cm4gYGJ5XyR7cGFyYW19YFxuICB9XG5cbiAgcmV0dXJuIGxhc3RQYXJ0XG59XG5cbi8vIGZlcm4gZG9jczogaHR0cHM6Ly9idWlsZHdpdGhmZXJuLmNvbS9kb2NzL3NwZWMvZXh0ZW5zaW9uc1xuZnVuY3Rpb24gdHJhbnNmb3JtUGF0aFRvRmVyblNka0dyb3VwTmFtZShwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpXG4gIHJldHVybiBwYXJ0cy5zbGljZSgwLCBwYXJ0cy5sZW5ndGggLSAxKVxufVxuXG5mdW5jdGlvbiBnZXRGZXJuU2RrTWV0YWRhdGEoXG4gIHBhdGg6IHN0cmluZyxcbiAgc2RrUmV0dXJuVmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXVxuKTpcbiAgfCB7XG4gICAgICBcIngtZmVybi1pZ25vcmVcIjogdHJ1ZVxuICAgIH1cbiAgfCB7XG4gICAgICBcIngtZmVybi1zZGstZ3JvdXAtbmFtZVwiOiBzdHJpbmdbXVxuICAgICAgXCJ4LWZlcm4tc2RrLW1ldGhvZC1uYW1lXCI6IHN0cmluZ1xuICAgIH0ge1xuICBpZiAocGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKS5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWUsXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBcIngtZmVybi1zZGstZ3JvdXAtbmFtZVwiOiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrR3JvdXBOYW1lKHBhdGgpLFxuICAgIFwieC1mZXJuLXNkay1tZXRob2QtbmFtZVwiOiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrTWV0aG9kTmFtZShwYXRoKSxcbiAgICAuLi4oc2RrUmV0dXJuVmFsdWVcbiAgICAgID8ge1xuICAgICAgICAgIFwieC1mZXJuLXNkay1yZXR1cm4tdmFsdWVcIjogc2RrUmV0dXJuVmFsdWUsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEoe1xuICBtZXRob2RzLFxuICBwYXRoLFxuICBzZGtSZXR1cm5WYWx1ZSxcbn06IHtcbiAgbWV0aG9kczogUm91dGVTcGVjW1wibWV0aG9kc1wiXVxuICBwYXRoOiBzdHJpbmdcbiAgc2RrUmV0dXJuVmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXVxufSkge1xuICBjb25zdCBmZXJuU2RrTWV0YWRhdGEgPSBnZXRGZXJuU2RrTWV0YWRhdGEocGF0aCwgc2RrUmV0dXJuVmFsdWUpXG4gIGlmIChtZXRob2RzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB7XG4gICAgICBbbWV0aG9kc1swXV06IGZlcm5TZGtNZXRhZGF0YSxcbiAgICB9XG4gIH1cblxuICBjb25zdCBtYXBwZWRNZXRob2RzID0ge31cblxuICBtZXRob2RzLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiKSB7XG4gICAgICBtYXBwZWRNZXRob2RzW21ldGhvZF0gPSBmZXJuU2RrTWV0YWRhdGFcbiAgICB9IGVsc2Uge1xuICAgICAgbWFwcGVkTWV0aG9kc1ttZXRob2RdID0ge1xuICAgICAgICBcIngtZmVybi1pZ25vcmVcIjogdHJ1ZSxcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIG1hcHBlZE1ldGhvZHNcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgeyBwYXJzZVJvdXRlc0luUGFja2FnZSB9IGZyb20gXCIuLi9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2VcIlxuaW1wb3J0IHsgem9kVG9UcywgcHJpbnROb2RlIH0gZnJvbSBcIi4uL2xpYi96b2QtdG8tdHNcIlxuaW1wb3J0IHByZXR0aWVyIGZyb20gXCJwcmV0dGllclwiXG5pbXBvcnQgeyB6LCBab2RFZmZlY3RzLCBab2RPcHRpb25hbCB9IGZyb20gXCJ6b2RcIlxuXG5pbnRlcmZhY2UgR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBvbmx5IHJvdXRlcyB0aGF0IHJldHVybiB0cnVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICovXG4gIGZpbHRlclJvdXRlcz86IChyb3V0ZTogc3RyaW5nKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCByb3V0ZXMgdGhhdCBoYXZlIGBleGNsdWRlRnJvbU9wZW5BcGlgIHNldCB0byB0cnVlIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIHRvIGluY2x1ZGUgdGhlbS5cbiAgICovXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJvdXRlVHlwZXMgPSBhc3luYyAob3B0czogR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cykgPT4ge1xuICBjb25zdCBmaWxlcGF0aFRvUm91dGUgPSBhd2FpdCBwYXJzZVJvdXRlc0luUGFja2FnZShvcHRzKVxuXG4gIGNvbnN0IHNvcnRlZFJvdXRlcyA9IEFycmF5LmZyb20oZmlsZXBhdGhUb1JvdXRlLmVudHJpZXMoKSkuc29ydCgoYSwgYikgPT5cbiAgICBhWzFdLnJvdXRlLmxvY2FsZUNvbXBhcmUoYlsxXS5yb3V0ZSlcbiAgKVxuICBjb25zdCBmaWx0ZXJlZFJvdXRlcyA9IHNvcnRlZFJvdXRlcy5maWx0ZXIoXG4gICAgKFtfLCB7IHJvdXRlIH1dKSA9PiAhb3B0cy5maWx0ZXJSb3V0ZXMgfHwgb3B0cy5maWx0ZXJSb3V0ZXMocm91dGUpXG4gIClcblxuICAvLyBUT0RPIHdoZW4gbGVzcyBsYXp5LCB1c2UgdHMtbW9ycGggZm9yIGJldHRlciBnZW5lcmF0aW9uXG4gIGNvbnN0IHJvdXRlRGVmczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IFtfLCB7IHJvdXRlLCByb3V0ZVNwZWMsIHNldHVwUGFyYW1zIH1dIG9mIGZpbHRlcmVkUm91dGVzKSB7XG4gICAgY29uc3QgcXVlcnlLZXlzID0gT2JqZWN0LmtleXMocm91dGVTcGVjLnF1ZXJ5UGFyYW1zPy5zaGFwZSA/PyB7fSlcbiAgICBjb25zdCBwYXRoUGFyYW1ldGVycyA9IHF1ZXJ5S2V5cy5maWx0ZXIoKGtleSkgPT4gcm91dGUuaW5jbHVkZXMoYFske2tleX1dYCkpXG5cbiAgICAvLyBxdWVyeVBhcmFtcyBtaWdodCBiZSBhIFpvZEVmZmVjdHMgb3IgWm9kT3B0aW9uYWwgaW4gc29tZSBjYXNlc1xuICAgIGxldCBxdWVyeVBhcmFtcyA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtc1xuICAgIHdoaWxlIChcbiAgICAgIHF1ZXJ5UGFyYW1zICYmXG4gICAgICAoXCJzb3VyY2VUeXBlXCIgaW4gcXVlcnlQYXJhbXMgfHwgXCJ1bndyYXBcIiBpbiBxdWVyeVBhcmFtcylcbiAgICApIHtcbiAgICAgIGlmIChcInNvdXJjZVR5cGVcIiBpbiBxdWVyeVBhcmFtcykge1xuICAgICAgICBxdWVyeVBhcmFtcyA9IChxdWVyeVBhcmFtcyBhcyB1bmtub3duIGFzIFpvZEVmZmVjdHM8YW55Pikuc291cmNlVHlwZSgpXG4gICAgICB9IGVsc2UgaWYgKFwidW53cmFwXCIgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgICAgcXVlcnlQYXJhbXMgPSAocXVlcnlQYXJhbXMgYXMgdW5rbm93biBhcyBab2RPcHRpb25hbDxhbnk+KS51bndyYXAoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChxdWVyeVBhcmFtcyAmJiBcIm9taXRcIiBpbiBxdWVyeVBhcmFtcykge1xuICAgICAgcXVlcnlQYXJhbXMgPSBxdWVyeVBhcmFtcy5vbWl0KFxuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMocGF0aFBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4gW3BhcmFtLCB0cnVlXSkpXG4gICAgICApXG4gICAgfVxuXG4gICAgcm91dGVEZWZzLnB1c2goXG4gICAgICBgXG5cIiR7cm91dGV9XCI6IHtcbiAgcm91dGU6IFwiJHtyb3V0ZX1cIixcbiAgbWV0aG9kOiAke3JvdXRlU3BlYy5tZXRob2RzLm1hcCgobSkgPT4gYFwiJHttfVwiYCkuam9pbihcIiB8IFwiKX0sXG4gIHF1ZXJ5UGFyYW1zOiAke3F1ZXJ5UGFyYW1zID8gcHJpbnROb2RlKHpvZFRvVHMocXVlcnlQYXJhbXMpLm5vZGUpIDogXCJ7fVwifSxcbiAganNvbkJvZHk6ICR7XG4gICAgcm91dGVTcGVjLmpzb25Cb2R5ID8gcHJpbnROb2RlKHpvZFRvVHMocm91dGVTcGVjLmpzb25Cb2R5KS5ub2RlKSA6IFwie31cIlxuICB9LFxuICBjb21tb25QYXJhbXM6ICR7XG4gICAgcm91dGVTcGVjLmNvbW1vblBhcmFtc1xuICAgICAgPyBwcmludE5vZGUoem9kVG9Ucyhyb3V0ZVNwZWMuY29tbW9uUGFyYW1zKS5ub2RlKVxuICAgICAgOiBcInt9XCJcbiAgfSxcbiAgZm9ybURhdGE6ICR7XG4gICAgcm91dGVTcGVjLmZvcm1EYXRhID8gcHJpbnROb2RlKHpvZFRvVHMocm91dGVTcGVjLmZvcm1EYXRhKS5ub2RlKSA6IFwie31cIlxuICB9LFxuICBqc29uUmVzcG9uc2U6ICR7XG4gICAgcm91dGVTcGVjLmpzb25SZXNwb25zZVxuICAgICAgPyBwcmludE5vZGUoXG4gICAgICAgICAgem9kVG9UcyhcbiAgICAgICAgICAgIHNldHVwUGFyYW1zLmFkZE9rU3RhdHVzICYmXG4gICAgICAgICAgICAgIHJvdXRlU3BlYy5qc29uUmVzcG9uc2UgaW5zdGFuY2VvZiB6LlpvZE9iamVjdFxuICAgICAgICAgICAgICA/IHJvdXRlU3BlYy5qc29uUmVzcG9uc2UuZXh0ZW5kKHsgb2s6IHouYm9vbGVhbigpIH0pXG4gICAgICAgICAgICAgIDogcm91dGVTcGVjLmpzb25SZXNwb25zZVxuICAgICAgICAgICkubm9kZVxuICAgICAgICApXG4gICAgICA6IFwie31cIlxuICB9XG59YC50cmltKClcbiAgICApXG4gIH1cbiAgY29uc3Qgcm91dGVEZWZTdHIgPSByb3V0ZURlZnMuam9pbihcIixcXG5cIilcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcHJldHRpZXIuZm9ybWF0KFxuICAgIGBleHBvcnQgdHlwZSBSb3V0ZXMgPSB7XG4ke3JvdXRlRGVmU3RyfVxufVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlc3BvbnNlPFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wianNvblJlc3BvbnNlXCJdXG5cbmV4cG9ydCB0eXBlIFJvdXRlUmVxdWVzdEJvZHk8UGF0aCBleHRlbmRzIGtleW9mIFJvdXRlcz4gPVxuICBSb3V0ZXNbUGF0aF1bXCJqc29uQm9keVwiXSAmIFJvdXRlc1tQYXRoXVtcImNvbW1vblBhcmFtc1wiXVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlcXVlc3RQYXJhbXM8UGF0aCBleHRlbmRzIGtleW9mIFJvdXRlcz4gPVxuICBSb3V0ZXNbUGF0aF1bXCJxdWVyeVBhcmFtc1wiXSAmIFJvdXRlc1tQYXRoXVtcImNvbW1vblBhcmFtc1wiXVxuYC50cmltKCksXG4gICAgeyBzZW1pOiBmYWxzZSwgcGFyc2VyOiBcInR5cGVzY3JpcHRcIiB9XG4gIClcblxuICBpZiAob3B0cy5vdXRwdXRGaWxlKSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKG9wdHMub3V0cHV0RmlsZSwgb3V0cHV0KVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dFxufVxuIiwgIi8qKlxuICogWm9kIFRvIFRTXG4gKlxuICogVmVuZG9yZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2FjaGlucmFqYS96b2QtdG8tdHNcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMSBTYWNoaW4gUmFqYVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcbmltcG9ydCB7IFpvZFR5cGUsIFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXIsIHRlc3RGcm9udE1hdHRlciB9IGZyb20gXCIuL2Zyb250LW1hdHRlclwiXG5pbXBvcnQgZGVkZW50IGZyb20gXCJkZWRlbnRcIlxuXG5jb25zdCB7IGZhY3Rvcnk6IGYsIFN5bnRheEtpbmQsIFNjcmlwdEtpbmQsIFNjcmlwdFRhcmdldCwgRW1pdEhpbnQgfSA9IHRzXG5cbmNvbnN0IG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSA9IChcbiAgaWRlbnRpZmllcjogdHMuSWRlbnRpZmllciB8IHRzLlR5cGVOb2RlXG4pID0+IHtcbiAgaWYgKHRzLmlzSWRlbnRpZmllcihpZGVudGlmaWVyKSkge1xuICAgIHJldHVybiBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGlkZW50aWZpZXIpXG4gIH1cblxuICByZXR1cm4gaWRlbnRpZmllclxufVxuXG5jb25zdCBjcmVhdGVUeXBlUmVmZXJlbmNlRnJvbVN0cmluZyA9IChpZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gIGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKGlkZW50aWZpZXIpKVxuXG5jb25zdCBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUgPSAoKSA9PlxuICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVua25vd25LZXl3b3JkKVxuXG5leHBvcnQgY29uc3QgcHJpbnROb2RlID0gKFxuICBub2RlOiB0cy5Ob2RlLFxuICBwcmludGVyT3B0aW9ucz86IHRzLlByaW50ZXJPcHRpb25zXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBcInByaW50LnRzXCIsXG4gICAgXCJcIixcbiAgICBTY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgIGZhbHNlLFxuICAgIFNjcmlwdEtpbmQuVFNcbiAgKVxuICBjb25zdCBwcmludGVyID0gdHMuY3JlYXRlUHJpbnRlcihwcmludGVyT3B0aW9ucylcbiAgcmV0dXJuIHByaW50ZXIucHJpbnROb2RlKEVtaXRIaW50LlVuc3BlY2lmaWVkLCBub2RlLCBzb3VyY2VGaWxlKVxufVxuXG5jb25zdCBpZGVudGlmaWVyUkUgPSAvXlskQS1aX2Etel1bXFx3JF0qJC9cblxuY29uc3QgZ2V0SWRlbnRpZmllck9yU3RyaW5nTGl0ZXJhbCA9IChzdHJpbmdfOiBzdHJpbmcpID0+IHtcbiAgaWYgKGlkZW50aWZpZXJSRS50ZXN0KHN0cmluZ18pKSB7XG4gICAgcmV0dXJuIGYuY3JlYXRlSWRlbnRpZmllcihzdHJpbmdfKVxuICB9XG5cbiAgcmV0dXJuIGYuY3JlYXRlU3RyaW5nTGl0ZXJhbChzdHJpbmdfKVxufVxuXG5jb25zdCBhZGRKc0RvY0NvbW1lbnQgPSAobm9kZTogdHMuTm9kZSwgdGV4dDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHsgZGVzY3JpcHRpb24sIGRlcHJlY2F0ZWQgfSA9IHBhcnNlRGVzY3JpcHRpb24odGV4dClcblxuICBsZXQgY29tbWVudCA9IGAqICR7ZGVzY3JpcHRpb259YFxuICBpZiAoZGVwcmVjYXRlZCkge1xuICAgIGNvbW1lbnQgKz0gYFxcbiAqIEBkZXByZWNhdGVkICR7XG4gICAgICB0eXBlb2YgZGVwcmVjYXRlZCA9PT0gXCJzdHJpbmdcIiA/IGRlcHJlY2F0ZWQgOiBcIlwiXG4gICAgfWBcbiAgfSBlbHNlIHtcbiAgICBjb21tZW50ICs9IGAgYFxuICB9XG5cbiAgdHMuYWRkU3ludGhldGljTGVhZGluZ0NvbW1lbnQoXG4gICAgbm9kZSxcbiAgICBTeW50YXhLaW5kLk11bHRpTGluZUNvbW1lbnRUcml2aWEsXG4gICAgY29tbWVudCxcbiAgICB0cnVlXG4gIClcbn1cblxudHlwZSBQYXJzZWREZXNjcmlwdGlvbiA9IHtcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkZXByZWNhdGVkPzogYm9vbGVhbiB8IHN0cmluZ1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IFBhcnNlZERlc2NyaXB0aW9uIHtcbiAgaWYgKCFkZXNjcmlwdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRpb246IFwiXCIsXG4gICAgfVxuICBjb25zdCB0cmltbWVkRGVzY3JpcHRpb24gPSBkZWRlbnQoZGVzY3JpcHRpb24pXG4gIGlmICghdGVzdEZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbikpIHJldHVybiB7IGRlc2NyaXB0aW9uIH1cbiAgY29uc3QgeyBhdHRyaWJ1dGVzLCBib2R5IH0gPSBwYXJzZUZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbilcbiAgY29uc3Qgb3V0cHV0OiBQYXJzZWREZXNjcmlwdGlvbiA9IHtcbiAgICBkZXNjcmlwdGlvbjogYm9keS50cmltKCksXG4gIH1cbiAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiICYmIGF0dHJpYnV0ZXMgIT09IG51bGwpIHtcbiAgICBpZiAoXCJkZXByZWNhdGVkXCIgaW4gYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlcy5kZXByZWNhdGVkID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBvdXRwdXQuZGVwcmVjYXRlZCA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBvdXRwdXQuZGVwcmVjYXRlZCA9XG4gICAgICAgICAgYXR0cmlidXRlcy5kZXByZWNhdGVkLmxlbmd0aCA+IDAgPyBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQgOiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImRlc2NyaXB0aW9uXCIgfHwga2V5ID09PSBcImRlcHJlY2F0ZWRcIikgY29udGludWVcbiAgICAgIG91dHB1dFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dHB1dFxufVxuXG50eXBlIExpdGVyYWxUeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxuXG50eXBlIFpvZFRvVHNPcHRpb25zID0ge1xuICAvKiogQGRlcHJlY2F0ZWQgdXNlIGBuYXRpdmVFbnVtc2AgaW5zdGVhZCAqL1xuICByZXNvbHZlTmF0aXZlRW51bXM/OiBib29sZWFuXG4gIG5hdGl2ZUVudW1zPzogXCJpZGVudGlmaWVyXCIgfCBcInJlc29sdmVcIiB8IFwidW5pb25cIlxufVxuXG5jb25zdCByZXNvbHZlT3B0aW9ucyA9IChyYXc/OiBab2RUb1RzT3B0aW9ucykgPT4ge1xuICBjb25zdCByZXNvbHZlZCA9IHtcbiAgICBuYXRpdmVFbnVtczogcmF3Py5yZXNvbHZlTmF0aXZlRW51bXMgPyBcInJlc29sdmVcIiA6IFwiaWRlbnRpZmllclwiLFxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb2x2ZWQsIC4uLnJhdyB9XG59XG5cbnR5cGUgUmVzb2x2ZWRab2RUb1RzT3B0aW9ucyA9IFJldHVyblR5cGU8dHlwZW9mIHJlc29sdmVPcHRpb25zPlxuXG50eXBlIFpvZFRvVHNTdG9yZSA9IHtcbiAgbmF0aXZlRW51bXM6IHRzLkVudW1EZWNsYXJhdGlvbltdXG59XG5cbnR5cGUgWm9kVG9Uc1JldHVybiA9IHtcbiAgbm9kZTogdHMuVHlwZU5vZGVcbiAgc3RvcmU6IFpvZFRvVHNTdG9yZVxufVxuXG50eXBlIEdldFR5cGVGdW5jdGlvbiA9IChcbiAgdHlwZXNjcmlwdDogdHlwZW9mIHRzLFxuICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlc29sdmVkWm9kVG9Uc09wdGlvbnNcbikgPT4gdHMuSWRlbnRpZmllciB8IHRzLlR5cGVOb2RlXG5cbnR5cGUgR2V0VHlwZSA9IHsgX2RlZjogeyBnZXRUeXBlPzogR2V0VHlwZUZ1bmN0aW9uIH0gfVxuXG5jb25zdCBjYWxsR2V0VHlwZSA9IChcbiAgem9kOiBab2RUeXBlQW55LFxuICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlc29sdmVkWm9kVG9Uc09wdGlvbnNcbikgPT4ge1xuICBsZXQgdHlwZTogUmV0dXJuVHlwZTxHZXRUeXBlRnVuY3Rpb24+IHwgdW5kZWZpbmVkXG5cbiAgY29uc3QgZ2V0VHlwZVNjaGVtYSA9IHpvZCBhcyBHZXRUeXBlXG4gIC8vIHRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFjY2Vzc2luZyAndHlwZSdcbiAgaWYgKGdldFR5cGVTY2hlbWEuX2RlZi5nZXRUeXBlKVxuICAgIHR5cGUgPSBnZXRUeXBlU2NoZW1hLl9kZWYuZ2V0VHlwZSh0cywgaWRlbnRpZmllciwgb3B0aW9ucylcbiAgcmV0dXJuIHR5cGVcbn1cblxuZXhwb3J0IGNvbnN0IHpvZFRvVHMgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcj86IHN0cmluZyxcbiAgb3B0aW9ucz86IFpvZFRvVHNPcHRpb25zXG4pOiBab2RUb1RzUmV0dXJuID0+IHtcbiAgaWYgKCEoem9kIGluc3RhbmNlb2YgWm9kVHlwZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZTogY3JlYXRlVW5rbm93bktleXdvcmROb2RlKCksXG4gICAgICBzdG9yZTogeyBuYXRpdmVFbnVtczogW10gfSxcbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzb2x2ZWRJZGVudGlmaWVyID0gaWRlbnRpZmllciA/PyBcIklkZW50aWZpZXJcIlxuXG4gIGNvbnN0IHJlc29sdmVkT3B0aW9ucyA9IHJlc29sdmVPcHRpb25zKG9wdGlvbnMpXG5cbiAgY29uc3Qgc3RvcmU6IFpvZFRvVHNTdG9yZSA9IHsgbmF0aXZlRW51bXM6IFtdIH1cblxuICBjb25zdCBub2RlID0gem9kVG9Uc05vZGUoem9kLCByZXNvbHZlZElkZW50aWZpZXIsIHN0b3JlLCByZXNvbHZlZE9wdGlvbnMpXG5cbiAgcmV0dXJuIHsgbm9kZSwgc3RvcmUgfVxufVxuXG5jb25zdCB6b2RUb1RzTm9kZSA9IChcbiAgem9kOiBab2RUeXBlQW55LFxuICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gIHN0b3JlOiBab2RUb1RzU3RvcmUsXG4gIG9wdGlvbnM6IFJlc29sdmVkWm9kVG9Uc09wdGlvbnNcbikgPT4ge1xuICBjb25zdCB0eXBlTmFtZSA9IHpvZC5fZGVmLnR5cGVOYW1lXG5cbiAgY29uc3QgZ2V0VHlwZVR5cGUgPSBjYWxsR2V0VHlwZSh6b2QsIGlkZW50aWZpZXIsIG9wdGlvbnMpXG4gIC8vIHNwZWNpYWwgY2FzZSBuYXRpdmUgZW51bSwgd2hpY2ggbmVlZHMgYW4gaWRlbnRpZmllciBub2RlXG4gIGlmIChnZXRUeXBlVHlwZSAmJiB0eXBlTmFtZSAhPT0gXCJab2ROYXRpdmVFbnVtXCIpIHtcbiAgICByZXR1cm4gbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlKGdldFR5cGVUeXBlKVxuICB9XG5cbiAgY29uc3Qgb3RoZXJBcmd1bWVudHMgPSBbaWRlbnRpZmllciwgc3RvcmUsIG9wdGlvbnNdIGFzIGNvbnN0XG5cbiAgc3dpdGNoICh0eXBlTmFtZSkge1xuICAgIGNhc2UgXCJab2RTdHJpbmdcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE51bWJlclwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kQmlnSW50XCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkJpZ0ludEtleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RCb29sZWFuXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkJvb2xlYW5LZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kRGF0ZVwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJEYXRlXCIpKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kVW5kZWZpbmVkXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROdWxsXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZU51bGwoKSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZFZvaWRcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVm9pZEtleXdvcmQpLFxuICAgICAgICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpLFxuICAgICAgXSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZEFueVwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5BbnlLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kVW5rbm93blwiOiB7XG4gICAgICByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE5ldmVyXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLk5ldmVyS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZExhenlcIjoge1xuICAgICAgLy8gaXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hhdCB0aGUgbGF6eSB2YWx1ZSBpcyByZWZlcnJpbmcgdG9cbiAgICAgIC8vIHNvIHdlIGZvcmNlIHRoZSB1c2VyIHRvIGRlY2xhcmUgaXRcbiAgICAgIGlmICghZ2V0VHlwZVR5cGUpIHJldHVybiBjcmVhdGVUeXBlUmVmZXJlbmNlRnJvbVN0cmluZyhpZGVudGlmaWVyKVxuICAgICAgYnJlYWtcbiAgICB9XG4gICAgY2FzZSBcIlpvZExpdGVyYWxcIjoge1xuICAgICAgLy8gei5saXRlcmFsKCdoaScpIC0+ICdoaSdcbiAgICAgIGxldCBsaXRlcmFsOiB0cy5MaXRlcmFsRXhwcmVzc2lvbiB8IHRzLkJvb2xlYW5MaXRlcmFsXG5cbiAgICAgIGNvbnN0IGxpdGVyYWxWYWx1ZSA9IHpvZC5fZGVmLnZhbHVlIGFzIExpdGVyYWxUeXBlXG4gICAgICBzd2l0Y2ggKHR5cGVvZiBsaXRlcmFsVmFsdWUpIHtcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOiB7XG4gICAgICAgICAgbGl0ZXJhbCA9IGYuY3JlYXRlTnVtZXJpY0xpdGVyYWwobGl0ZXJhbFZhbHVlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjoge1xuICAgICAgICAgIGxpdGVyYWwgPSBsaXRlcmFsVmFsdWUgPT09IHRydWUgPyBmLmNyZWF0ZVRydWUoKSA6IGYuY3JlYXRlRmFsc2UoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGxpdGVyYWwgPSBmLmNyZWF0ZVN0cmluZ0xpdGVyYWwobGl0ZXJhbFZhbHVlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGxpdGVyYWwpXG4gICAgfVxuICAgIGNhc2UgXCJab2RPYmplY3RcIjoge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5lbnRyaWVzKHpvZC5fZGVmLnNoYXBlKCkpXG5cbiAgICAgIGNvbnN0IG1lbWJlcnM6IHRzLlR5cGVFbGVtZW50W10gPSBwcm9wZXJ0aWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRab2ROb2RlID0gdmFsdWUgYXMgWm9kVHlwZUFueVxuICAgICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUobmV4dFpvZE5vZGUsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICAgIGNvbnN0IHsgdHlwZU5hbWU6IG5leHRab2ROb2RlVHlwZU5hbWUgfSA9IG5leHRab2ROb2RlLl9kZWZcbiAgICAgICAgY29uc3QgaXNPcHRpb25hbCA9XG4gICAgICAgICAgbmV4dFpvZE5vZGVUeXBlTmFtZSA9PT0gXCJab2RPcHRpb25hbFwiIHx8IG5leHRab2ROb2RlLmlzT3B0aW9uYWwoKVxuXG4gICAgICAgIGNvbnN0IHByb3BlcnR5U2lnbmF0dXJlID0gZi5jcmVhdGVQcm9wZXJ0eVNpZ25hdHVyZShcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgZ2V0SWRlbnRpZmllck9yU3RyaW5nTGl0ZXJhbChrZXkpLFxuICAgICAgICAgIGlzT3B0aW9uYWwgPyBmLmNyZWF0ZVRva2VuKFN5bnRheEtpbmQuUXVlc3Rpb25Ub2tlbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgdHlwZVxuICAgICAgICApXG5cbiAgICAgICAgaWYgKG5leHRab2ROb2RlLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgYWRkSnNEb2NDb21tZW50KHByb3BlcnR5U2lnbmF0dXJlLCBuZXh0Wm9kTm9kZS5kZXNjcmlwdGlvbilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9wZXJ0eVNpZ25hdHVyZVxuICAgICAgfSlcbiAgICAgIHJldHVybiBmLmNyZWF0ZVR5cGVMaXRlcmFsTm9kZShtZW1iZXJzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RBcnJheVwiOiB7XG4gICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVBcnJheVR5cGVOb2RlKHR5cGUpXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RFbnVtXCI6IHtcbiAgICAgIC8vIHouZW51bVsnYScsICdiJywgJ2MnXSAtPiAnYScgfCAnYicgfCAnY1xuICAgICAgY29uc3QgdHlwZXMgPSB6b2QuX2RlZi52YWx1ZXMubWFwKCh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgICBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZVN0cmluZ0xpdGVyYWwodmFsdWUpKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kVW5pb25cIjoge1xuICAgICAgLy8gei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pIC0+IHN0cmluZyB8IG51bWJlclxuICAgICAgY29uc3Qgb3B0aW9uczogWm9kVHlwZUFueVtdID0gem9kLl9kZWYub3B0aW9uc1xuICAgICAgY29uc3QgdHlwZXM6IHRzLlR5cGVOb2RlW10gPSBvcHRpb25zLm1hcCgob3B0aW9uKSA9PlxuICAgICAgICB6b2RUb1RzTm9kZShvcHRpb24sIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRGlzY3JpbWluYXRlZFVuaW9uXCI6IHtcbiAgICAgIC8vIHouZGlzY3JpbWluYXRlZFVuaW9uKCdraW5kJywgW3oub2JqZWN0KHsga2luZDogei5saXRlcmFsKCdhJyksIGE6IHouc3RyaW5nKCkgfSksIHoub2JqZWN0KHsga2luZDogei5saXRlcmFsKCdiJyksIGI6IHoubnVtYmVyKCkgfSldKSAtPiB7IGtpbmQ6ICdhJywgYTogc3RyaW5nIH0gfCB7IGtpbmQ6ICdiJywgYjogbnVtYmVyIH1cbiAgICAgIGNvbnN0IG9wdGlvbnM6IFpvZFR5cGVBbnlbXSA9IFsuLi56b2QuX2RlZi5vcHRpb25zLnZhbHVlcygpXVxuICAgICAgY29uc3QgdHlwZXM6IHRzLlR5cGVOb2RlW10gPSBvcHRpb25zLm1hcCgob3B0aW9uKSA9PlxuICAgICAgICB6b2RUb1RzTm9kZShvcHRpb24sIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRWZmZWN0c1wiOiB7XG4gICAgICAvLyBpZ25vcmUgYW55IGVmZmVjdHMsIHRoZXkgd29uJ3QgZmFjdG9yIGludG8gdGhlIHR5cGVzXG4gICAgICBjb25zdCBub2RlID0gem9kVG9Uc05vZGUoXG4gICAgICAgIHpvZC5fZGVmLnNjaGVtYSxcbiAgICAgICAgLi4ub3RoZXJBcmd1bWVudHNcbiAgICAgICkgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE5hdGl2ZUVudW1cIjoge1xuICAgICAgY29uc3QgdHlwZSA9IGdldFR5cGVUeXBlXG5cbiAgICAgIGlmIChvcHRpb25zLm5hdGl2ZUVudW1zID09PSBcInVuaW9uXCIpIHtcbiAgICAgICAgLy8gYWxsb3cgb3ZlcnJpZGluZyB3aXRoIHRoaXMgb3B0aW9uXG4gICAgICAgIGlmICh0eXBlKSByZXR1cm4gbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlKHR5cGUpXG5cbiAgICAgICAgY29uc3QgdHlwZXMgPSBPYmplY3QudmFsdWVzKHpvZC5fZGVmLnZhbHVlcykubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZU51bWVyaWNMaXRlcmFsKHZhbHVlKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGYuY3JlYXRlU3RyaW5nTGl0ZXJhbCh2YWx1ZSBhcyBzdHJpbmcpKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKHR5cGVzKVxuICAgICAgfVxuXG4gICAgICAvLyB6Lm5hdGl2ZUVudW0oRnJ1aXRzKSAtPiBGcnVpdHNcbiAgICAgIC8vIGNhbiByZXNvbHZlIEZydWl0cyBpbnRvIHN0b3JlIGFuZCB1c2VyIGNhbiBoYW5kbGUgZW51bXNcbiAgICAgIGlmICghdHlwZSkgcmV0dXJuIGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG5cbiAgICAgIGlmIChvcHRpb25zLm5hdGl2ZUVudW1zID09PSBcInJlc29sdmVcIikge1xuICAgICAgICBjb25zdCBlbnVtTWVtYmVycyA9IE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgIHpvZC5fZGVmLnZhbHVlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+XG4gICAgICAgICkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBjb25zdCBsaXRlcmFsID1cbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgICA/IGYuY3JlYXRlTnVtZXJpY0xpdGVyYWwodmFsdWUpXG4gICAgICAgICAgICAgIDogZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlKVxuXG4gICAgICAgICAgcmV0dXJuIGYuY3JlYXRlRW51bU1lbWJlcihnZXRJZGVudGlmaWVyT3JTdHJpbmdMaXRlcmFsKGtleSksIGxpdGVyYWwpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcih0eXBlKSkge1xuICAgICAgICAgIHN0b3JlLm5hdGl2ZUVudW1zLnB1c2goXG4gICAgICAgICAgICBmLmNyZWF0ZUVudW1EZWNsYXJhdGlvbih1bmRlZmluZWQsIHR5cGUsIGVudW1NZW1iZXJzKVxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnZ2V0VHlwZSBvbiBuYXRpdmVFbnVtIG11c3QgcmV0dXJuIGFuIGlkZW50aWZpZXIgd2hlbiBuYXRpdmVFbnVtcyBpcyBcInJlc29sdmVcIidcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSh0eXBlKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RPcHRpb25hbFwiOiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuaW5uZXJUeXBlLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKSxcbiAgICAgIF0pXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE51bGxhYmxlXCI6IHtcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFRvVHNOb2RlKFxuICAgICAgICB6b2QuX2RlZi5pbm5lclR5cGUsXG4gICAgICAgIC4uLm90aGVyQXJndW1lbnRzXG4gICAgICApIGFzIHRzLlR5cGVOb2RlXG4gICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKFtcbiAgICAgICAgaW5uZXJUeXBlLFxuICAgICAgICBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZU51bGwoKSksXG4gICAgICBdKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RUdXBsZVwiOiB7XG4gICAgICAvLyB6LnR1cGxlKFt6LnN0cmluZygpLCB6Lm51bWJlcigpXSkgLT4gW3N0cmluZywgbnVtYmVyXVxuICAgICAgY29uc3QgdHlwZXMgPSB6b2QuX2RlZi5pdGVtcy5tYXAoKG9wdGlvbjogWm9kVHlwZUFueSkgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVR1cGxlVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFJlY29yZFwiOiB7XG4gICAgICAvLyB6LnJlY29yZCh6Lm51bWJlcigpKSAtPiB7IFt4OiBzdHJpbmddOiBudW1iZXIgfVxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZUxpdGVyYWxOb2RlKFtcbiAgICAgICAgZi5jcmVhdGVJbmRleFNpZ25hdHVyZShcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgZi5jcmVhdGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihcInhcIiksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHZhbHVlVHlwZVxuICAgICAgICApLFxuICAgICAgXSlcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kTWFwXCI6IHtcbiAgICAgIC8vIHoubWFwKHouc3RyaW5nKCkpIC0+IE1hcDxzdHJpbmc+XG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi52YWx1ZVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3Qga2V5VHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLmtleVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJNYXBcIiksIFtcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgXSlcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kU2V0XCI6IHtcbiAgICAgIC8vIHouc2V0KHouc3RyaW5nKCkpIC0+IFNldDxzdHJpbmc+XG4gICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiU2V0XCIpLCBbdHlwZV0pXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RJbnRlcnNlY3Rpb25cIjoge1xuICAgICAgLy8gei5udW1iZXIoKS5hbmQoei5zdHJpbmcoKSkgLT4gbnVtYmVyICYgc3RyaW5nXG4gICAgICBjb25zdCBsZWZ0ID0gem9kVG9Uc05vZGUoem9kLl9kZWYubGVmdCwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICBjb25zdCByaWdodCA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnJpZ2h0LCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZUludGVyc2VjdGlvblR5cGVOb2RlKFtsZWZ0LCByaWdodF0pXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RQcm9taXNlXCI6IHtcbiAgICAgIC8vIHoucHJvbWlzZSh6LnN0cmluZygpKSAtPiBQcm9taXNlPHN0cmluZz5cbiAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi50eXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiUHJvbWlzZVwiKSwgW1xuICAgICAgICB0eXBlLFxuICAgICAgXSlcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRnVuY3Rpb25cIjoge1xuICAgICAgLy8gei5mdW5jdGlvbigpLmFyZ3Moei5zdHJpbmcoKSkucmV0dXJucyh6Lm51bWJlcigpKSAtPiAoYXJnc18wOiBzdHJpbmcpID0+IG51bWJlclxuICAgICAgY29uc3QgYXJndW1lbnRUeXBlcyA9IHpvZC5fZGVmLmFyZ3MuX2RlZi5pdGVtcy5tYXAoXG4gICAgICAgIChhcmd1bWVudDogWm9kVHlwZUFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGFyZ3VtZW50VHlwZSA9IHpvZFRvVHNOb2RlKGFyZ3VtZW50LCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgZi5jcmVhdGVJZGVudGlmaWVyKGBhcmdzXyR7aW5kZXh9YCksXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmd1bWVudFR5cGVcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICkgYXMgdHMuUGFyYW1ldGVyRGVjbGFyYXRpb25bXVxuXG4gICAgICBhcmd1bWVudFR5cGVzLnB1c2goXG4gICAgICAgIGYuY3JlYXRlUGFyYW1ldGVyRGVjbGFyYXRpb24oXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGYuY3JlYXRlVG9rZW4oU3ludGF4S2luZC5Eb3REb3REb3RUb2tlbiksXG4gICAgICAgICAgZi5jcmVhdGVJZGVudGlmaWVyKGBhcmdzXyR7YXJndW1lbnRUeXBlcy5sZW5ndGh9YCksXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGYuY3JlYXRlQXJyYXlUeXBlTm9kZShjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKSlcbiAgICAgICAgKVxuICAgICAgKVxuXG4gICAgICBjb25zdCByZXR1cm5UeXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYucmV0dXJucywgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZUZ1bmN0aW9uVHlwZU5vZGUoXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYXJndW1lbnRUeXBlcyxcbiAgICAgICAgcmV0dXJuVHlwZVxuICAgICAgKVxuXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2REZWZhdWx0XCI6IHtcbiAgICAgIC8vIHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZWZhdWx0KCdoaScpIC0+IHN0cmluZ1xuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKFxuICAgICAgICB6b2QuX2RlZi5pbm5lclR5cGUsXG4gICAgICAgIC4uLm90aGVyQXJndW1lbnRzXG4gICAgICApIGFzIHRzLlR5cGVOb2RlXG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkTm9kZXM6IHRzLk5vZGVbXSA9IFtdXG5cbiAgICAgIHR5cGUuZm9yRWFjaENoaWxkKChub2RlKSA9PiB7XG4gICAgICAgIGlmICghW1N5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZF0uaW5jbHVkZXMobm9kZS5raW5kKSkge1xuICAgICAgICAgIGZpbHRlcmVkTm9kZXMucHVzaChub2RlKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5lZWRlZCB0byBzZXQgY2hpbGRyZW5cbiAgICAgIHR5cGUudHlwZXMgPSBmaWx0ZXJlZE5vZGVzXG5cbiAgICAgIHJldHVybiB0eXBlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuQW55S2V5d29yZClcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IFByb2plY3QsIFN5bnRheEtpbmQgfSBmcm9tIFwidHMtbW9ycGhcIlxuaW1wb3J0ICogYXMgZXNidWlsZCBmcm9tIFwiZXNidWlsZFwiXG5pbXBvcnQgeyBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSB9IGZyb20gXCIuL2xpYi9kZWZhdWx0LW1hcC1maWxlLXBhdGgtdG8taHR0cC1yb3V0ZVwiXG5cbmludGVyZmFjZSBHZW5lcmF0ZVJvdXRlVHlwZXNPcHRzIHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIGFsbG93ZWRJbXBvcnRQYXR0ZXJucz86IHN0cmluZ1tdXG4gIG91dHB1dEZpbGU/OiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIG9ubHkgcm91dGVzIHRoYXQgcmV0dXJuIHRydWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKi9cbiAgZmlsdGVyUm91dGVzPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIHJvdXRlcyB0aGF0IGhhdmUgYGV4Y2x1ZGVGcm9tT3BlbkFwaWAgc2V0IHRvIHRydWUgd2lsbCBiZSBleGNsdWRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgdHlwZXMuXG4gICAqIFNldCB0aGlzIHRvIHRydWUgdG8gaW5jbHVkZSB0aGVtLlxuICAgKi9cbiAgaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlcz86IGJvb2xlYW5cbiAgZXNidWlsZE9wdGlvbnM/OiBlc2J1aWxkLkJ1aWxkT3B0aW9uc1xufVxuXG5leHBvcnQgY29uc3QgZXh0cmFjdFJvdXRlU3BlY3MgPSBhc3luYyAob3B0czogR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cykgPT4ge1xuICBjb25zdCB7IHBhY2thZ2VEaXIsIHBhdGhHbG9iID0gXCIvcGFnZXMvYXBpLyoqLyoudHNcIiB9ID0gb3B0c1xuICBjb25zdCBmdWxsUGF0aEdsb2IgPSBwYXRoLnBvc2l4LmpvaW4ocGFja2FnZURpciwgcGF0aEdsb2IpXG5cbiAgY29uc3QgcHJvamVjdCA9IG5ldyBQcm9qZWN0KHsgY29tcGlsZXJPcHRpb25zOiB7IGRlY2xhcmF0aW9uOiB0cnVlIH0gfSlcblxuICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvamVjdC5hZGRTb3VyY2VGaWxlc0F0UGF0aHMoZnVsbFBhdGhHbG9iKSkge1xuICAgIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBzb3VyY2VGaWxlLmdldEV4cG9ydEFzc2lnbm1lbnQoXG4gICAgICAoZCkgPT4gIWQuaXNFeHBvcnRFcXVhbHMoKVxuICAgIClcbiAgICBpZiAoIWRlZmF1bHRFeHBvcnQpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgY3VycmllZFdpdGhSb3V0ZVNwZWNDYWxsID0gZGVmYXVsdEV4cG9ydFxuICAgICAgLmdldEV4cHJlc3Npb24oKVxuICAgICAgLmFzS2luZChTeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uKVxuICAgIGlmICghY3VycmllZFdpdGhSb3V0ZVNwZWNDYWxsKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB3aXRoUm91dGVTcGVjQ2FsbCA9IGN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbFxuICAgICAgLmdldEV4cHJlc3Npb24oKVxuICAgICAgLmFzS2luZChTeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uKVxuICAgIGlmICghd2l0aFJvdXRlU3BlY0NhbGwpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgW3JvdXRlU3BlY10gPSB3aXRoUm91dGVTcGVjQ2FsbC5nZXRBcmd1bWVudHMoKVxuICAgIGlmICghcm91dGVTcGVjKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHNvdXJjZUZpbGUuYWRkU3RhdGVtZW50cyhcbiAgICAgIGBleHBvcnQgY29uc3QgZXh0cmFjdGVkUm91dGVTcGVjID0gJHtyb3V0ZVNwZWMuZ2V0VGV4dCgpfWBcbiAgICApXG5cbiAgICBkZWZhdWx0RXhwb3J0LnJlbW92ZSgpXG5cbiAgICAvLyBSZW1vdmUgYWxsIHVudXNlZCBpbXBvcnRzIHNvIGZpbGUgY2FuIGJlIHRyZWUgc2hha2VuXG4gICAgLy8gKEFzc3VtZXMgYWxsIGltcG9ydHMgYXJlIGZyZWUgb2Ygc2lkZS1lZmZlY3RzKVxuICAgIGxldCBsYXN0V2lkdGg6IG51bWJlclxuICAgIGRvIHtcbiAgICAgIGxhc3RXaWR0aCA9IHNvdXJjZUZpbGUuZ2V0RnVsbFdpZHRoKClcbiAgICAgIC8vIE1heSBuZWVkIHRvIGNhbGwgdGhpcyBtdWx0aXBsZSB0aW1lc1xuICAgICAgc291cmNlRmlsZS5maXhVbnVzZWRJZGVudGlmaWVycygpXG4gICAgfSB3aGlsZSAobGFzdFdpZHRoICE9PSBzb3VyY2VGaWxlLmdldEZ1bGxXaWR0aCgpKVxuXG4gICAgY29uc3QgYWJzb2x1dGVQYWNrYWdlRGlyID0gcGF0aC5yZXNvbHZlKHBhY2thZ2VEaXIpXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShcbiAgICAgIGFic29sdXRlUGFja2FnZURpcixcbiAgICAgIHNvdXJjZUZpbGUuZ2V0RmlsZVBhdGgoKVxuICAgIClcbiAgICBwYXRocy5wdXNoKHJlbGF0aXZlUGF0aClcbiAgfVxuXG4gIGNvbnN0IHBhdGhUb0lkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgLy8gYWRkIHByZWZpeCB0byBhdm9pZCBzdGFydGluZyB3aXRoIGEgbnVtYmVyXG4gICAgcGF0aFRvSWRbcGF0aF0gPVxuICAgICAgXCJoYXNoXCIgKyBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUocGF0aCkuZGlnZXN0KFwiaGV4XCIpXG4gIH1cblxuICBjb25zdCBlbnRyeVBvaW50Q29udGVudCA9IGBcbiAgJHtwYXRoc1xuICAgIC5tYXAoKHApID0+IGBpbXBvcnQge2V4dHJhY3RlZFJvdXRlU3BlYyBhcyAke3BhdGhUb0lkW3BdfX0gZnJvbSBcIi4vJHtwfVwiYClcbiAgICAuam9pbihcIlxcblwiKX1cblxuICBleHBvcnQgY29uc3Qgcm91dGVzID0ge1xuICAgICR7cGF0aHNcbiAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgaHR0cFJvdXRlID0gKFxuICAgICAgICAgIG9wdHMubWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSA/P1xuICAgICAgICAgIGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlKG9wdHMuYXBpUHJlZml4KVxuICAgICAgICApKHApXG5cbiAgICAgICAgcmV0dXJuIGBcIiR7aHR0cFJvdXRlfVwiOiAke3BhdGhUb0lkW3BdfWBcbiAgICAgIH0pXG4gICAgICAuam9pbihcIixcXG5cIil9XG4gIH1cbiAgYFxuXG4gIC8vIENvcHkgYWxsb3dlZCBpbXBvcnQgZ2xvYnMgaW50byBwcm9qZWN0XG4gIGlmIChvcHRzLmFsbG93ZWRJbXBvcnRQYXR0ZXJucykge1xuICAgIHByb2plY3QuYWRkU291cmNlRmlsZXNBdFBhdGhzKG9wdHMuYWxsb3dlZEltcG9ydFBhdHRlcm5zKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgdHlwZXMgKC5kLnRzKVxuICBjb25zdCBlbnRyeVBvaW50ID0gcHJvamVjdC5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIFwiZXh0cmFjdGVkLXJvdXRlLXNwZWNzLnRzXCIsXG4gICAgZW50cnlQb2ludENvbnRlbnRcbiAgKVxuICBjb25zdCBlbWl0UmVzdWx0ID0gZW50cnlQb2ludC5nZXRFbWl0T3V0cHV0KHsgZW1pdE9ubHlEdHNGaWxlczogdHJ1ZSB9KVxuICBpZiAob3B0cy5vdXRwdXRGaWxlKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb25GaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIHBhdGguZGlybmFtZShvcHRzLm91dHB1dEZpbGUpLFxuICAgICAgcGF0aC5iYXNlbmFtZShvcHRzLm91dHB1dEZpbGUpLnJlcGxhY2UoXCIubWpzXCIsIFwiXCIpLnJlcGxhY2UoXCIuanNcIiwgXCJcIikgK1xuICAgICAgICBcIi5kLnRzXCJcbiAgICApXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgICAgZGVjbGFyYXRpb25GaWxlUGF0aCxcbiAgICAgIGVtaXRSZXN1bHQuZ2V0T3V0cHV0RmlsZXMoKVswXS5nZXRUZXh0KClcbiAgICApXG4gIH1cblxuICAvLyBHZW5lcmF0ZSB2YWx1ZXMgKC5qcylcbiAgY29uc3QgcGtnUmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgcGF0aC5qb2luKHBhY2thZ2VEaXIsIFwicGFja2FnZS5qc29uXCIpLFxuICAgIFwidXRmLThcIlxuICApXG4gIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UocGtnUmF3KVxuXG4gIGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgIC4uLm9wdHMuZXNidWlsZE9wdGlvbnMsXG4gICAgc3RkaW46IHtcbiAgICAgIGNvbnRlbnRzOiBlbnRyeVBvaW50Q29udGVudCxcbiAgICAgIHJlc29sdmVEaXI6IHBhdGgucmVzb2x2ZShwYWNrYWdlRGlyKSxcbiAgICB9LFxuICAgIG91dGZpbGU6IG9wdHMub3V0cHV0RmlsZSxcbiAgICBidW5kbGU6IHRydWUsXG4gICAgcGxhdGZvcm06IFwibm9kZVwiLFxuICAgIGZvcm1hdDogXCJlc21cIixcbiAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICBleHRlcm5hbDogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocGtnLmRlcGVuZGVuY2llcyksXG4gICAgICAuLi5PYmplY3Qua2V5cyhwa2cuZGV2RGVwZW5kZW5jaWVzKSxcbiAgICAgIC4uLihvcHRzLmVzYnVpbGRPcHRpb25zPy5leHRlcm5hbCA/PyBbXSksXG4gICAgXSxcbiAgICBwbHVnaW5zOiBbXG4gICAgICAvLyBXaXRoIHRoaXMgcGx1Z2luLCBlc2J1aWxkIHdpbGwgbmV2ZXIgdG91Y2ggdGhlIGFjdHVhbCBmaWxlc3lzdGVtIGFuZCB0aHVzIGNhbm5vdCBpbnRlcmFjdCB3aXRoIGltcG9ydHMgdGhhdCBkb24ndCBtYXRjaCBhbGxvd2VkSW1wb3J0UGF0dGVybnNbXS5cbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJyZXNvbHZlLXZpcnR1YWwtZnNcIixcbiAgICAgICAgc2V0dXAoYnVpbGQpIHtcbiAgICAgICAgICBidWlsZC5vbkxvYWQoeyBmaWx0ZXI6IC8uKi8gfSwgKGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gcHJvamVjdC5nZXRTb3VyY2VGaWxlKGFyZ3MucGF0aCk/LmdldEZ1bGxUZXh0KClcbiAgICAgICAgICAgIGlmICghY29udGVudHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogXCJleHBvcnQgZGVmYXVsdCB7fVwiLFxuICAgICAgICAgICAgICAgIGxvYWRlcjogXCJ0c1wiLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnRzLFxuICAgICAgICAgICAgICBsb2FkZXI6IFwidHNcIixcbiAgICAgICAgICAgICAgcmVzb2x2ZURpcjogcGF0aC5kaXJuYW1lKGFyZ3MucGF0aCksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi4ob3B0cy5lc2J1aWxkT3B0aW9ucz8ucGx1Z2lucyA/PyBbXSksXG4gICAgXSxcbiAgfSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFBQTs7O0FDQUE7QUFBQSxPQUFPLFFBQVE7QUFDZjtBQUFBLEVBQ0U7QUFBQSxPQUdLO0FBRVAsU0FBUyxLQUFBQSxVQUFTOzs7QUNQbEI7QUFBQSxPQUFPQyxXQUFVOzs7QUNBakI7QUFBQSxPQUFPLFVBQVU7QUFFVixJQUFNLGdDQUNYLENBQUMsYUFBcUIsV0FDdEIsQ0FBQyxjQUFzQjtBQUNyQixRQUFNLFFBQVEsVUFFWCxRQUFRLFNBQVMsR0FBRyxFQUVwQixRQUFRLE9BQU8sRUFBRSxFQUVqQixRQUFRLFVBQVUsRUFBRSxFQUVwQixRQUFRLFlBQVksRUFBRSxFQUV0QixRQUFRLFVBQVUsRUFBRSxFQUVwQixRQUFRLFNBQVMsRUFBRSxFQUVuQixRQUFRLFVBQVUsRUFBRSxFQUVwQixRQUFRLGlCQUFpQixFQUFFO0FBRTlCLFNBQU8sS0FBSyxLQUFLLFlBQVksS0FBSztBQUNwQzs7O0FEYkssSUFBTSx1QkFBdUIsT0FBTyxTQU1KO0FBQ3JDLFFBQU0sU0FBUyxNQUFNLCtDQUFPLDZCQUFVO0FBQ3RDLFFBQU0sVUFBVSxNQUFNLCtDQUFPLDZCQUFXO0FBQ3hDLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQSxXQUFXO0FBQUEsSUFDWCx5QkFBeUIsOEJBQThCLEtBQUssU0FBUztBQUFBLEVBQ3ZFLElBQUk7QUFFSixRQUFNLGVBQWVDLE1BQUssTUFBTSxLQUFLLFlBQVksUUFBUTtBQUN6RCxVQUFR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UUFBUSxPQUFPLEVBQUUsSUFDbEU7QUFBQSxJQUNKO0FBQ0EsVUFBUztBQUFBLE1BQ1A7QUFBQSxNQUNBLFdBQVcsZUFBZSxFQUFFLEdBQUcsUUFBUTtBQUFBLElBQ3pDO0FBQUEsRUFDRjtBQUdBLFFBQU0sU0FBUyxNQUFTO0FBQUEsSUFDdEJBLE1BQUssS0FBSyxZQUFZLGNBQWM7QUFBQSxJQUNwQztBQUFBLEVBQ0Y7QUFDQSxRQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU07QUFFN0IsUUFBYyxjQUFNO0FBQUEsSUFDbEIsR0FBRyxLQUFLO0FBQUEsSUFDUixPQUFPO0FBQUEsTUFDTCxVQUFVO0FBQUEsTUFDVixZQUFZQSxNQUFLLFFBQVEsVUFBVTtBQUFBLElBQ3JDO0FBQUEsSUFDQSxTQUFTLEtBQUs7QUFBQSxJQUNkLFFBQVE7QUFBQSxJQUNSLFVBQVU7QUFBQSxJQUNWLFFBQVE7QUFBQSxJQUNSLGFBQWE7QUFBQSxJQUNiLFVBQVU7QUFBQSxNQUNSLEdBQUcsT0FBTyxLQUFLLElBQUksWUFBWTtBQUFBLE1BQy9CLEdBQUcsT0FBTyxLQUFLLElBQUksZUFBZTtBQUFBLE1BQ2xDLElBQUksZ0JBQUssbUJBQUwsbUJBQXFCLGFBQXJCLFlBQWlDLENBQUM7QUFBQSxJQUN4QztBQUFBLElBQ0EsU0FBUztBQUFBLE1BRVA7QUFBQSxRQUNFLE1BQU07QUFBQSxRQUNOLE1BQU1HLFFBQU87QUFDWCxVQUFBQSxPQUFNLE9BQU8sRUFBRSxRQUFRLEtBQUssR0FBRyxDQUFDLFNBQVM7QUEvSm5ELGdCQUFBRDtBQWdLWSxrQkFBTSxZQUFXQSxNQUFBLFFBQVEsY0FBYyxLQUFLLElBQUksTUFBL0IsZ0JBQUFBLElBQWtDO0FBQ25ELGdCQUFJLENBQUMsVUFBVTtBQUNiLHFCQUFPO0FBQUEsZ0JBQ0wsVUFBVTtBQUFBLGdCQUNWLFFBQVE7QUFBQSxjQUNWO0FBQUEsWUFDRjtBQUVBLG1CQUFPO0FBQUEsY0FDTDtBQUFBLGNBQ0EsUUFBUTtBQUFBLGNBQ1IsWUFBWUYsTUFBSyxRQUFRLEtBQUssSUFBSTtBQUFBLFlBQ3BDO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLElBQUksZ0JBQUssbUJBQUwsbUJBQXFCLFlBQXJCLFlBQWdDLENBQUM7QUFBQSxJQUN2QztBQUFBLEVBQ0YsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogWyJ6IiwgInBhdGgiLCAicGF0aCIsICJwYXRoIiwgImRlZGVudCIsICJwYXRoIiwgImRlZGVudCIsICJfYSIsICJ6IiwgImZzIiwgImRlZGVudCIsICJwYXJzZURlc2NyaXB0aW9uIiwgIm9wdGlvbnMiLCAieiIsICJfIiwgImZzIiwgInBhdGgiLCAiU3ludGF4S2luZCIsICJwYXRoIiwgIlN5bnRheEtpbmQiLCAiX2EiLCAiYnVpbGQiXQp9Cg==
1568
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2dlbmVyYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtb3BlbmFwaS9pbmRleC50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2UudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL2RlZmF1bHQtbWFwLWZpbGUtcGF0aC10by1odHRwLXJvdXRlLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2xpYi96b2Qtb3BlbmFwaS50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9saWIvZnJvbnQtbWF0dGVyLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL3V0aWxzL3ByZWZpeC1vYmplY3Qta2V5cy13aXRoLXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvdXRpbHMvZGFzaGlmeS1vYmplY3Qta2V5cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9nZW5lcmF0ZS1vcGVuYXBpL2VtYmVkLXNjaGVtYS1yZWZlcmVuY2VzLnRzIiwgIi4uLy4uL3NyYy9nZW5lcmF0b3JzL2dlbmVyYXRlLW9wZW5hcGkvZmVybi1zZGstdXRpbHMudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvZ2VuZXJhdGUtcm91dGUtdHlwZXMvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2dlbmVyYXRvcnMvbGliL3pvZC10by10cy50cyIsICIuLi8uLi9zcmMvZ2VuZXJhdG9ycy9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vZ2VuZXJhdGUtb3BlbmFwaVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZW5lcmF0ZS1yb3V0ZS10eXBlc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9leHRyYWN0LXJvdXRlLXNwZWMtc2NoZW1hc1wiXG4iLCAiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7XG4gIE9wZW5BcGlCdWlsZGVyLFxuICBPcGVyYXRpb25PYmplY3QsXG4gIFBhcmFtZXRlck9iamVjdCxcbn0gZnJvbSBcIm9wZW5hcGkzLXRzL29hczMxXCJcbmltcG9ydCB7IFNldHVwUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlUm91dGVzSW5QYWNrYWdlIH0gZnJvbSBcIi4uL2xpYi9wYXJzZS1yb3V0ZXMtaW4tcGFja2FnZVwiXG5pbXBvcnQgeyBnZW5lcmF0ZVNjaGVtYSB9IGZyb20gXCIuLi9saWIvem9kLW9wZW5hcGlcIlxuaW1wb3J0IHsgZW1iZWRTY2hlbWFSZWZlcmVuY2VzIH0gZnJvbSBcIi4vZW1iZWQtc2NoZW1hLXJlZmVyZW5jZXNcIlxuaW1wb3J0IHsgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhIH0gZnJvbSBcIi4vZmVybi1zZGstdXRpbHNcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4uL2xpYi9mcm9udC1tYXR0ZXJcIlxuaW1wb3J0IGRlZGVudCBmcm9tIFwiZGVkZW50XCJcbmltcG9ydCB7IHByZWZpeE9iamVjdEtleXNXaXRoWCB9IGZyb20gXCIuLi91dGlscy9wcmVmaXgtb2JqZWN0LWtleXMtd2l0aC14XCJcbmltcG9ydCB7IGRhc2hpZnlPYmplY3RLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2Rhc2hpZnktb2JqZWN0LWtleXNcIlxuXG5mdW5jdGlvbiByZXBsYWNlRmlyc3RDaGFyVG9Mb3dlcmNhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBjb25zdCBmaXJzdENoYXIgPSBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIGZpcnN0Q2hhciArIHN0ci5zbGljZSgxKVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1QYXRoVG9PcGVyYXRpb25JZChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAucmVwbGFjZSgvLS9nLCBcIl9cIilcbiAgICAuc3BsaXQoXCIvXCIpXG4gICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgdHJhbnNmb3JtZWRQYXJ0cyA9IHBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gQnlQYXJhbVxuICAgICAgY29uc3Qgc2VydmljZU5hbWUgPSBwYXJ0LnNsaWNlKDEsIC0xKVxuICAgICAgY29uc3Qgd29yZHMgPSBzZXJ2aWNlTmFtZS5zcGxpdChcIl9cIilcbiAgICAgIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgICAgICh3b3JkKSA9PiB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGBCeSR7Y2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpfWBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCBhcGlfcGF0aCB0byBBcGlQYXRoXG4gICAgICBjb25zdCB3b3JkcyA9IHBhcnQuc3BsaXQoXCJfXCIpXG4gICAgICBjb25zdCBjYXBpdGFsaXplZFdvcmRzID0gd29yZHMubWFwKFxuICAgICAgICAod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSlcbiAgICAgIClcbiAgICAgIHJldHVybiBjYXBpdGFsaXplZFdvcmRzLmpvaW4oXCJcIilcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHJlcGxhY2VGaXJzdENoYXJUb0xvd2VyY2FzZSh0cmFuc2Zvcm1lZFBhcnRzLmpvaW4oXCJcIikpXG59XG5cbmZ1bmN0aW9uIHBhc2NhbENhc2UoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQuc3BsaXQoXCIgXCIpXG4gIGNvbnN0IGNhcGl0YWxpemVkV29yZHMgPSB3b3Jkcy5tYXAoXG4gICAgKHdvcmQpID0+IHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKClcbiAgKVxuICBjb25zdCBwYXNjYWxDYXNlU3RyaW5nID0gY2FwaXRhbGl6ZWRXb3Jkcy5qb2luKFwiXCIpXG4gIHJldHVybiBwYXNjYWxDYXNlU3RyaW5nXG59XG5cbmludGVyZmFjZSBUYWdPcHRpb24ge1xuICBuYW1lOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkb2VzUm91dGVIYXZlVGFnPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlT3BlbkFQSU9wdHMge1xuICBwYWNrYWdlRGlyOiBzdHJpbmdcbiAgb3V0cHV0RmlsZT86IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICB0YWdzPzogQXJyYXk8VGFnT3B0aW9uPlxuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYW4gT3BlbkFQSSBzcGVjIGZyb20gdGhlIE5leHQuanMgQVBJIHJvdXRlcy5cbiAqXG4gKiBZb3Ugbm9ybWFsbHkgaW52b2tlIHRoaXMgd2l0aCBgbmV4dGFwaSBnZW5lcmF0ZS1vcGVuYXBpYCBpbiBhXG4gKiBcImJ1aWxkOm9wZW5hcGlcIiBwYWNrYWdlLmpzb24gc2NyaXB0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQVBJKG9wdHM6IEdlbmVyYXRlT3BlbkFQSU9wdHMpIHtcbiAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHRcbiAgY29uc3QgeyBvdXRwdXRGaWxlLCB0YWdzID0gW10gfSA9IG9wdHNcblxuICBjb25zdCBmaWxlcGF0aFRvUm91dGVGbiA9IGF3YWl0IHBhcnNlUm91dGVzSW5QYWNrYWdlKG9wdHMpXG5cbiAgLy8gVE9ETyBkZXRlY3QgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNldHVwcyBhbmQgb3V0cHV0IGRpZmZlcmVudCBBUElzXG4gIGNvbnN0IHsgc2V0dXBQYXJhbXM6IGdsb2JhbFNldHVwUGFyYW1zIH0gPSBmaWxlcGF0aFRvUm91dGVGbi52YWx1ZXMoKS5uZXh0KClcbiAgICAudmFsdWUgYXMgeyBzZXR1cFBhcmFtczogU2V0dXBQYXJhbXMgfVxuXG4gIGNvbnN0IHNlY3VyaXR5U2NoZW1lcyA9IGdsb2JhbFNldHVwUGFyYW1zLnNlY3VyaXR5U2NoZW1hcyA/PyB7fVxuICBjb25zdCBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZSA9IHt9XG4gIGZvciAoY29uc3QgYXV0aE5hbWUgb2YgT2JqZWN0LmtleXMoZ2xvYmFsU2V0dXBQYXJhbXMuYXV0aE1pZGRsZXdhcmVNYXApKSB7XG4gICAgY29uc3QgbXcgPSBnbG9iYWxTZXR1cFBhcmFtcy5hdXRoTWlkZGxld2FyZU1hcFthdXRoTmFtZV1cbiAgICBpZiAobXcuc2VjdXJpdHlTY2hlbWEpIHtcbiAgICAgIHNlY3VyaXR5U2NoZW1lc1thdXRoTmFtZV0gPSAobXcgYXMgYW55KS5zZWN1cml0eVNjaGVtYVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgQXV0aGVudGljYXRpb24gbWlkZGxld2FyZSBcIiR7YXV0aE5hbWV9XCIgaGFzIG5vIHNlY3VyaXR5U2NoZW1hLiBZb3UgY2FuIGRlZmluZSB0aGlzIG9uIHRoZSBmdW5jdGlvbiAoZS5nLiBhZnRlciB0aGUgZXhwb3J0IGRvLi4uIFxcblxcbm15TWlkZGxld2FyZS5zZWN1cml0eVNjaGVtYSA9IHtcXG4gIHR5cGU6IFwiaHR0cFwiXFxuICBzY2hlbWU6IFwiYmVhcmVyXCJcXG4gIGJlYXJlckZvcm1hdDogXCJKV1RcIlxcbiAvLyBvciBBUEkgVG9rZW4gZXRjLlxcbn1cXG5cXG5Zb3UgY2FuIGFsc28gZGVmaW5lIFwic2VjdXJpdHlPYmplY3RzXCIgdGhpcyB3YXksIGlmIHlvdSB3YW50IHRvIG1ha2UgdGhlIGVuZHBvaW50IHN1cHBvcnQgbXVsdGlwbGUgbW9kZXMgb2YgYXV0aGVudGljYXRpb24uXFxuXFxuYFxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aE5hbWVdID0gKG13IGFzIGFueSkuc2VjdXJpdHlPYmplY3RzIHx8IFtcbiAgICAgIHtcbiAgICAgICAgW2F1dGhOYW1lXTogW10sXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGdsb2JhbFNjaGVtYXMgPSB7fVxuICBmb3IgKGNvbnN0IFtzY2hlbWFOYW1lLCB6b2RTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgIGdsb2JhbFNldHVwUGFyYW1zLmdsb2JhbFNjaGVtYXMgPz8ge31cbiAgKSkge1xuICAgIGdsb2JhbFNjaGVtYXNbc2NoZW1hTmFtZV0gPSBnZW5lcmF0ZVNjaGVtYSh6b2RTY2hlbWEpXG4gIH1cblxuICAvLyBCdWlsZCBPcGVuQVBJIHNwZWNcbiAgY29uc3QgYnVpbGRlciA9IE9wZW5BcGlCdWlsZGVyLmNyZWF0ZSh7XG4gICAgb3BlbmFwaTogXCIzLjAuMFwiLFxuICAgIGluZm86IHtcbiAgICAgIHRpdGxlOiBnbG9iYWxTZXR1cFBhcmFtcy5hcGlOYW1lLFxuICAgICAgdmVyc2lvbjogXCIxLjAuMFwiLFxuICAgIH0sXG4gICAgc2VydmVyczogW1xuICAgICAge1xuICAgICAgICB1cmw6IGdsb2JhbFNldHVwUGFyYW1zLnByb2R1Y3Rpb25TZXJ2ZXJVcmwgfHwgXCJodHRwczovL2V4YW1wbGUuY29tXCIsXG4gICAgICB9LFxuICAgIF0sXG4gICAgdGFnczogdGFncy5tYXAoKHRhZykgPT4gKHsgbmFtZTogdGFnLm5hbWUsIGRlc2NyaXB0aW9uOiB0YWcuZGVzY3JpcHRpb24gfSkpLFxuICAgIHBhdGhzOiB7fSxcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICBzZWN1cml0eVNjaGVtZXMsXG4gICAgICBzY2hlbWFzOiBnbG9iYWxTY2hlbWFzLFxuICAgIH0sXG4gIH0pXG5cbiAgZm9yIChjb25zdCBbXG4gICAgZmlsZV9wYXRoLFxuICAgIHsgc2V0dXBQYXJhbXMsIHJvdXRlU3BlYywgcm91dGU6IHJvdXRlUGF0aCB9LFxuICBdIG9mIGZpbGVwYXRoVG9Sb3V0ZUZuKSB7XG4gICAgY29uc3QgbWV0aG9kcyA9IHJvdXRlU3BlYy5tZXRob2RzXG4gICAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhgU2tpcHBpbmcgcm91dGUgJHtyb3V0ZVBhdGh9IGJlY2F1c2UgaXQgaGFzIG5vIG1ldGhvZHMuYClcbiAgICAgIClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgbGV0IGRlc2NyaXB0aW9uID0gcm91dGVTcGVjLmRlc2NyaXB0aW9uXG4gICAgbGV0IGRlc2NyaXB0aW9uTWV0YWRhdGE6IHtcbiAgICAgIHJlc3BvbnNlX2tleT86IHN0cmluZ1xuICAgICAgW2tleTogc3RyaW5nXTogYW55XG4gICAgfSA9IHt9XG5cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IHRyaW1tZWREZXNjcmlwdGlvbiA9IGRlZGVudChkZXNjcmlwdGlvbikudHJpbSgpXG5cbiAgICAgIGlmICh0ZXN0RnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKSkge1xuICAgICAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIGJvZHkgfSA9IHBhcnNlRnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKVxuICAgICAgICBkZXNjcmlwdGlvbk1ldGFkYXRhID0gYXR0cmlidXRlc1xuICAgICAgICBkZXNjcmlwdGlvbiA9IGJvZHkudHJpbSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXNjcmlwdGlvbiA9IHRyaW1tZWREZXNjcmlwdGlvblxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdHRlZERlc2NyaXB0aW9uTWV0YWRhdGEgPSBwcmVmaXhPYmplY3RLZXlzV2l0aFgoXG4gICAgICBkYXNoaWZ5T2JqZWN0S2V5cyhkZXNjcmlwdGlvbk1ldGFkYXRhKVxuICAgIClcblxuICAgIGNvbnN0IG1ldGhvZFJvdXRlczogUmVjb3JkPHN0cmluZywgT3BlcmF0aW9uT2JqZWN0PiA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICBjb25zdCBpc1Bvc3RPclB1dE9yUGF0Y2ggPSBbXCJQT1NUXCIsIFwiUFVUXCIsIFwiUEFUQ0hcIl0uaW5jbHVkZXMobWV0aG9kKVxuXG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IG11bHRpcGFydC9mb3JtLWRhdGFcbiAgICAgIGxldCBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYVxuICAgICAgaWYgKGlzUG9zdE9yUHV0T3JQYXRjaCkge1xuICAgICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keSA/PyByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG5cbiAgICAgICAgaWYgKHJvdXRlU3BlYy5qc29uQm9keSAmJiByb3V0ZVNwZWMuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgICAgYm9keV90b19nZW5lcmF0ZV9zY2hlbWEgPSByb3V0ZVNwZWMuanNvbkJvZHkubWVyZ2UoXG4gICAgICAgICAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5qc29uQm9keVxuICAgICAgfVxuXG4gICAgICBsZXQgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hXG4gICAgICBpZiAoaXNQb3N0T3JQdXRPclBhdGNoKSB7XG4gICAgICAgIHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnlfdG9fZ2VuZXJhdGVfc2NoZW1hID1cbiAgICAgICAgICByb3V0ZVNwZWMucXVlcnlQYXJhbXMgPz8gcm91dGVTcGVjLmNvbW1vblBhcmFtc1xuXG4gICAgICAgIGlmIChyb3V0ZVNwZWMucXVlcnlQYXJhbXMgJiYgcm91dGVTcGVjLmNvbW1vblBhcmFtcykge1xuICAgICAgICAgIHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSA9IHJvdXRlU3BlYy5xdWVyeVBhcmFtcy5tZXJnZShcbiAgICAgICAgICAgIHJvdXRlU3BlYy5jb21tb25QYXJhbXNcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm91dGU6IE9wZXJhdGlvbk9iamVjdCA9IHtcbiAgICAgICAgLi4ucm91dGVTcGVjLm9wZW5BcGlNZXRhZGF0YSxcbiAgICAgICAgLi4uZm9ybWF0dGVkRGVzY3JpcHRpb25NZXRhZGF0YSxcbiAgICAgICAgc3VtbWFyeTogcm91dGVQYXRoLFxuICAgICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgb3BlcmF0aW9uSWQ6IGAke3RyYW5zZm9ybVBhdGhUb09wZXJhdGlvbklkKHJvdXRlUGF0aCl9JHtwYXNjYWxDYXNlKFxuICAgICAgICAgIG1ldGhvZFxuICAgICAgICApfWAsXG4gICAgICAgIHJlc3BvbnNlczoge1xuICAgICAgICAgIDIwMDoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT0tcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIDQwMDoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQmFkIFJlcXVlc3RcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIDQwMToge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVW5hdXRob3JpemVkXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjdXJpdHk6IEFycmF5LmlzQXJyYXkocm91dGVTcGVjLmF1dGgpXG4gICAgICAgICAgPyByb3V0ZVNwZWMuYXV0aFxuICAgICAgICAgICAgICAubWFwKChhdXRoVHlwZSkgPT4gc2VjdXJpdHlPYmplY3RzRm9yQXV0aFR5cGVbYXV0aFR5cGVdKVxuICAgICAgICAgICAgICAuZmxhdCgpXG4gICAgICAgICAgOiBzZWN1cml0eU9iamVjdHNGb3JBdXRoVHlwZVtyb3V0ZVNwZWMuYXV0aF0sXG4gICAgICB9XG5cbiAgICAgIGlmIChib2R5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgICByb3V0ZS5yZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICBcImFwcGxpY2F0aW9uL2pzb25cIjoge1xuICAgICAgICAgICAgICBzY2hlbWE6IGdlbmVyYXRlU2NoZW1hKGJvZHlfdG9fZ2VuZXJhdGVfc2NoZW1hIGFzIGFueSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHF1ZXJ5X3RvX2dlbmVyYXRlX3NjaGVtYSkge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSBnZW5lcmF0ZVNjaGVtYShxdWVyeV90b19nZW5lcmF0ZV9zY2hlbWEgYXMgYW55KVxuICAgICAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJPYmplY3RbXSA9IE9iamVjdC5rZXlzKFxuICAgICAgICAgICAgc2NoZW1hLnByb3BlcnRpZXMgYXMgYW55XG4gICAgICAgICAgKS5tYXAoKG5hbWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGluOiBcInF1ZXJ5XCIsXG4gICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hLnByb3BlcnRpZXMhW25hbWVdLFxuICAgICAgICAgICAgICByZXF1aXJlZDogc2NoZW1hLnJlcXVpcmVkPy5pbmNsdWRlcyhuYW1lKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcm91dGUucGFyYW1ldGVycyA9IHBhcmFtZXRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGpzb25SZXNwb25zZSB9ID0gcm91dGVTcGVjXG4gICAgICBjb25zdCB7IGFkZE9rU3RhdHVzID0gdHJ1ZSB9ID0gc2V0dXBQYXJhbXNcblxuICAgICAgaWYgKGpzb25SZXNwb25zZSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWpzb25SZXNwb25zZS5fZGVmIHx8XG4gICAgICAgICAgIWpzb25SZXNwb25zZS5fZGVmLnR5cGVOYW1lIHx8XG4gICAgICAgICAganNvblJlc3BvbnNlLl9kZWYudHlwZU5hbWUgIT09IFwiWm9kT2JqZWN0XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgU2tpcHBpbmcgcm91dGUgJHtyb3V0ZVBhdGh9IGJlY2F1c2UgdGhlIHJlc3BvbnNlIGlzIG5vdCBhIFpvZE9iamVjdC5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZVNjaGVtYSA9IGdlbmVyYXRlU2NoZW1hKFxuICAgICAgICAgIGFkZE9rU3RhdHVzICYmIGpzb25SZXNwb25zZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0XG4gICAgICAgICAgICA/IGpzb25SZXNwb25zZS5leHRlbmQoeyBvazogei5ib29sZWFuKCkgfSlcbiAgICAgICAgICAgIDoganNvblJlc3BvbnNlXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBzY2hlbWFXaXRoUmVmZXJlbmNlcyA9IGVtYmVkU2NoZW1hUmVmZXJlbmNlcyhcbiAgICAgICAgICByZXNwb25zZVNjaGVtYSxcbiAgICAgICAgICBnbG9iYWxTY2hlbWFzXG4gICAgICAgIClcblxuICAgICAgICBpZiAocm91dGUucmVzcG9uc2VzICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiB3ZSBzaG91bGQgbm90IGhhcmRjb2RlIDIwMCBoZXJlXG4gICAgICAgICAgcm91dGUucmVzcG9uc2VzWzIwMF0uY29udGVudCA9IHtcbiAgICAgICAgICAgIFwiYXBwbGljYXRpb24vanNvblwiOiB7XG4gICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hV2l0aFJlZmVyZW5jZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByb3V0ZS50YWdzID0gW11cbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgICAgaWYgKHRhZy5kb2VzUm91dGVIYXZlVGFnICYmIHRhZy5kb2VzUm91dGVIYXZlVGFnKHJvdXRlLnN1bW1hcnkgfHwgXCJcIikpIHtcbiAgICAgICAgICByb3V0ZS50YWdzLnB1c2godGFnLm5hbWUpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0aG9kc01hcHBlZFRvRmVyblNka01ldGFkYXRhID0gYXdhaXQgbWFwTWV0aG9kc1RvRmVyblNka01ldGFkYXRhKHtcbiAgICAgICAgbWV0aG9kczogW21ldGhvZF0sIC8vIE9ubHkgcGFzcyB0aGlzIHNwZWNpZmljIG1ldGhvZFxuICAgICAgICBwYXRoOiByb3V0ZVBhdGgsXG4gICAgICAgIHNka1JldHVyblZhbHVlOlxuICAgICAgICAgIGRlc2NyaXB0aW9uTWV0YWRhdGE/LnJlc3BvbnNlX2tleSA/PyByb3V0ZVNwZWMuc2RrUmV0dXJuVmFsdWUsXG4gICAgICB9KVxuXG4gICAgICBPYmplY3QuYXNzaWduKHJvdXRlLCBtZXRob2RzTWFwcGVkVG9GZXJuU2RrTWV0YWRhdGFbbWV0aG9kXSlcbiAgICAgIG1ldGhvZFJvdXRlc1ttZXRob2QudG9Mb3dlckNhc2UoKV0gPSByb3V0ZVxuICAgIH1cblxuICAgIGJ1aWxkZXIuYWRkUGF0aChyb3V0ZVBhdGgsIG1ldGhvZFJvdXRlcylcbiAgfVxuXG4gIGlmIChvdXRwdXRGaWxlKSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKG91dHB1dEZpbGUsIGJ1aWxkZXIuZ2V0U3BlY0FzSnNvbih1bmRlZmluZWQsIDIpKVxuICB9XG5cbiAgcmV0dXJuIGJ1aWxkZXIuZ2V0U3BlY0FzSnNvbih1bmRlZmluZWQsIDIpXG59XG4iLCAiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBSb3V0ZVNwZWMsIFNldHVwUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCJcbmltcG9ydCB7IGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlIH0gZnJvbSBcIi4vZGVmYXVsdC1tYXAtZmlsZS1wYXRoLXRvLWh0dHAtcm91dGVcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlSW5mbyB7XG4gIHNldHVwUGFyYW1zOiBTZXR1cFBhcmFtc1xuICByb3V0ZVNwZWM6IFJvdXRlU3BlY1xuICByb3V0ZUZuOiBGdW5jdGlvblxuICByb3V0ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZVJvdXRlc0luUGFja2FnZSA9IGFzeW5jIChvcHRzOiB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBwYXRoR2xvYj86IHN0cmluZ1xuICBhcGlQcmVmaXg/OiBzdHJpbmdcbiAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZT86IChmaWxlX3BhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG59KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBSb3V0ZUluZm8+PiA9PiB7XG4gIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0XG4gIGNvbnN0IGdsb2JieSA9IChhd2FpdCBpbXBvcnQoXCJnbG9iYnlcIikpLmdsb2JieVxuICBjb25zdCB7XG4gICAgcGFja2FnZURpcixcbiAgICBwYXRoR2xvYiA9IFwiL3BhZ2VzL2FwaS8qKi8qLnRzXCIsXG4gICAgbWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSA9IGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlKG9wdHMuYXBpUHJlZml4KSxcbiAgfSA9IG9wdHNcbiAgLy8gTG9hZCBhbGwgcm91dGUgc3BlY3NcbiAgY29uc3QgZnVsbFBhdGhHbG9iID0gcGF0aC5wb3NpeC5qb2luKHBhY2thZ2VEaXIsIHBhdGhHbG9iKVxuICBjb25zb2xlLmxvZyhgc2VhcmNoaW5nIFwiJHtmdWxsUGF0aEdsb2J9XCIuLi5gKVxuICBjb25zdCBmaWxlcGF0aHMgPSBhd2FpdCBnbG9iYnkoYCR7ZnVsbFBhdGhHbG9ifWApXG4gIGNvbnNvbGUubG9nKGBmb3VuZCAke2ZpbGVwYXRocy5sZW5ndGh9IGZpbGVzYClcbiAgaWYgKGZpbGVwYXRocy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGZpbGVzIGZvdW5kIGF0IFwiJHtmdWxsUGF0aEdsb2J9XCJgKVxuICB9XG4gIGNvbnN0IGZpbGVwYXRoVG9Sb3V0ZUZuID0gbmV3IE1hcDxzdHJpbmcsIFJvdXRlSW5mbz4oKVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVwYXRocy5tYXAoYXN5bmMgKHApID0+IHtcbiAgICAgIGNvbnN0IHsgZGVmYXVsdDogcm91dGVGbiB9ID0gYXdhaXQgcmVxdWlyZShwYXRoLnJlc29sdmUocCkpXG5cbiAgICAgIGlmIChyb3V0ZUZuKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByb3V0ZUZuLl9yb3V0ZVNwZWM/LmV4Y2x1ZGVGcm9tT3BlbkFwaSAmJlxuICAgICAgICAgICFvcHRzLmluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICBgSWdub3JpbmcgXCIke3B9IGJlY2F1c2UgaXQgd2FzIGV4Y2x1ZGVkIGZyb20gT3BlbkFQSSBnZW5lcmF0aW9uXCJgXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghcm91dGVGbi5fc2V0dXBQYXJhbXMpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBJZ25vcmluZyBcIiR7cH1cIiBiZWNhdXNlIGl0IHdhc24ndCBjcmVhdGVkIHdpdGggd2l0aFJvdXRlU3BlY2BcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZmlsZXBhdGhUb1JvdXRlRm4uc2V0KHAsIHtcbiAgICAgICAgICBzZXR1cFBhcmFtczogcm91dGVGbi5fc2V0dXBQYXJhbXMsXG4gICAgICAgICAgcm91dGVTcGVjOiByb3V0ZUZuLl9yb3V0ZVNwZWMsXG4gICAgICAgICAgcm91dGU6IG1hcEZpbGVQYXRoVG9IVFRQUm91dGUocCksXG4gICAgICAgICAgcm91dGVGbixcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihjaGFsay55ZWxsb3coYENvdWxkbid0IGZpbmQgcm91dGUgJHtwfWApKVxuICAgICAgfVxuICAgIH0pXG4gIClcblxuICByZXR1cm4gZmlsZXBhdGhUb1JvdXRlRm5cbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSA9XG4gIChhcGlfcHJlZml4OiBzdHJpbmcgPSBcIi9hcGlcIikgPT5cbiAgKGZpbGVfcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgcm91dGUgPSBmaWxlX3BhdGhcbiAgICAgIC8vIHJlcGxhY2UgLi8gaWYgaXQgc3RhcnRzIHdpdGggLi9cbiAgICAgIC5yZXBsYWNlKC9eXFwuXFwvLywgXCIvXCIpXG4gICAgICAvLyByZXBsYWNlIHN0YXJ0aW5nIC9cbiAgICAgIC5yZXBsYWNlKC9eXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgL3NyYyBpZiBpdCBzdGFydHMgd2l0aCAvc3JjXG4gICAgICAucmVwbGFjZSgvXnNyY1xcLy8sIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIC9wYWdlcyBpZiBpdCBzdGFydHMgd2l0aCAvcGFnZXNcbiAgICAgIC5yZXBsYWNlKC9ecGFnZXNcXC8vLCBcIlwiKVxuICAgICAgLy8gcmVwbGFjZSAvYXBpIGlmIGl0IHN0YXJ0cyB3aXRoIC9hcGlcbiAgICAgIC5yZXBsYWNlKC9eYXBpXFwvLywgXCJcIilcbiAgICAgIC8vIHJlcGxhY2UgLnRzIGlmIGl0IGVuZHMgd2l0aCAudHNcbiAgICAgIC5yZXBsYWNlKC9cXC50cyQvLCBcIlwiKVxuICAgICAgLy8gcmVtb3ZlIHB1YmxpYyByZWZlcmVuY2VcbiAgICAgIC5yZXBsYWNlKFwicHVibGljXCIsIFwiXCIpXG4gICAgICAvLyByZXBsYWNlIGluZGV4IGlmIGl0IGVuZHMgd2l0aCBpbmRleFxuICAgICAgLnJlcGxhY2UoL1xcL1xcaW5kZXgoPyEuKS8sIFwiXCIpXG5cbiAgICByZXR1cm4gcGF0aC5qb2luKGFwaV9wcmVmaXgsIHJvdXRlKVxuICB9XG4iLCAiLyoqXG4gKiBab2QgT3BlbkFQSSBHZW5lcmF0b3IuXG4gKlxuICogVmVuZG9yZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYW5hdGluZS96b2QtcGx1Z2luc1xuICpcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIEJyaWFuIE1jQnJpZGVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU2NoZW1hT2JqZWN0LCBTY2hlbWFPYmplY3RUeXBlIH0gZnJvbSBcIm9wZW5hcGkzLXRzL29hczMxXCJcbmltcG9ydCBtZXJnZSBmcm9tIFwidHMtZGVlcG1lcmdlXCJcbmltcG9ydCB7IEFueVpvZE9iamVjdCwgeiwgWm9kVHlwZUFueSB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IHsgcGFyc2VGcm9udE1hdHRlciwgdGVzdEZyb250TWF0dGVyIH0gZnJvbSBcIi4vZnJvbnQtbWF0dGVyXCJcbmltcG9ydCBkZWRlbnQgZnJvbSBcImRlZGVudFwiXG5pbXBvcnQgeyBwcmVmaXhPYmplY3RLZXlzV2l0aFggfSBmcm9tIFwiLi4vdXRpbHMvcHJlZml4LW9iamVjdC1rZXlzLXdpdGgteFwiXG5pbXBvcnQgeyBkYXNoaWZ5T2JqZWN0S2V5cyB9IGZyb20gXCIuLi91dGlscy9kYXNoaWZ5LW9iamVjdC1rZXlzXCJcblxudHlwZSBBbmF0aW5lU2NoZW1hT2JqZWN0ID0gU2NoZW1hT2JqZWN0ICYgeyBoaWRlRGVmaW5pdGlvbnM/OiBzdHJpbmdbXSB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFwaVpvZEFueSBleHRlbmRzIFpvZFR5cGVBbnkge1xuICBtZXRhT3BlbkFwaT86IEFuYXRpbmVTY2hlbWFPYmplY3QgfCBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbn1cblxuaW50ZXJmYWNlIE9wZW5BcGlab2RBbnlPYmplY3QgZXh0ZW5kcyBBbnlab2RPYmplY3Qge1xuICBtZXRhT3BlbkFwaT86IEFuYXRpbmVTY2hlbWFPYmplY3QgfCBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbn1cblxuaW50ZXJmYWNlIFBhcnNpbmdBcmdzPFQ+IHtcbiAgem9kUmVmOiBUXG4gIHNjaGVtYXM6IEFuYXRpbmVTY2hlbWFPYmplY3RbXVxuICB1c2VPdXRwdXQ/OiBib29sZWFuXG4gIGhpZGVEZWZpbml0aW9ucz86IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRBcGk8VCBleHRlbmRzIE9wZW5BcGlab2RBbnk+KFxuICBzY2hlbWE6IFQsXG4gIHNjaGVtYU9iamVjdDogQW5hdGluZVNjaGVtYU9iamVjdCA9IHt9XG4pOiBUIHtcbiAgc2NoZW1hLm1ldGFPcGVuQXBpID0gT2JqZWN0LmFzc2lnbihzY2hlbWEubWV0YU9wZW5BcGkgfHwge30sIHNjaGVtYU9iamVjdClcbiAgcmV0dXJuIHNjaGVtYVxufVxuXG5mdW5jdGlvbiBpdGVyYXRlWm9kT2JqZWN0KHtcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG4gIGhpZGVEZWZpbml0aW9ucyxcbn06IFBhcnNpbmdBcmdzPE9wZW5BcGlab2RBbnlPYmplY3Q+KSB7XG4gIGNvbnN0IHJlZHVjZWQgPSBPYmplY3Qua2V5cyh6b2RSZWYuc2hhcGUpXG4gICAgLmZpbHRlcigoa2V5KSA9PiBoaWRlRGVmaW5pdGlvbnM/LmluY2x1ZGVzKGtleSkgPT09IGZhbHNlKVxuICAgIC5yZWR1Y2UoXG4gICAgICAoY2FycnksIGtleSkgPT4gKHtcbiAgICAgICAgLi4uY2FycnksXG4gICAgICAgIFtrZXldOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuc2hhcGVba2V5XSwgdXNlT3V0cHV0KSxcbiAgICAgIH0pLFxuICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgU2NoZW1hT2JqZWN0PlxuICAgIClcblxuICByZXR1cm4gcmVkdWNlZFxufVxuXG5mdW5jdGlvbiBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZjogT3BlbkFwaVpvZEFueSk6IFNjaGVtYU9iamVjdCB7XG4gIGlmICghem9kUmVmLmRlc2NyaXB0aW9uKSByZXR1cm4ge31cbiAgY29uc3QgdHJpbW1lZERlc2NyaXB0aW9uID0gZGVkZW50KHpvZFJlZi5kZXNjcmlwdGlvbilcbiAgaWYgKCF0ZXN0RnJvbnRNYXR0ZXIodHJpbW1lZERlc2NyaXB0aW9uKSlcbiAgICByZXR1cm4geyBkZXNjcmlwdGlvbjogem9kUmVmLmRlc2NyaXB0aW9uIH1cbiAgY29uc3QgeyBhdHRyaWJ1dGVzLCBib2R5IH0gPSBwYXJzZUZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbilcbiAgY29uc3Qgb3V0cHV0OiBTY2hlbWFPYmplY3QgPSB7fVxuICBpZiAoYm9keS50cmltKCkpIG91dHB1dC5kZXNjcmlwdGlvbiA9IGJvZHkudHJpbSgpXG4gIGlmICh0eXBlb2YgYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIiAmJiBhdHRyaWJ1dGVzICE9PSBudWxsKSB7XG4gICAgaWYgKFwiZGVwcmVjYXRlZFwiIGluIGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5kZXByZWNhdGVkKSB7XG4gICAgICBvdXRwdXQuZGVwcmVjYXRlZCA9IHRydWVcbiAgICB9XG5cbiAgICBPYmplY3QuZW50cmllcyhcbiAgICAgIHByZWZpeE9iamVjdEtleXNXaXRoWChkYXNoaWZ5T2JqZWN0S2V5cyhhdHRyaWJ1dGVzKSlcbiAgICApLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgb3V0cHV0W2tleV0gPSB2YWx1ZVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gb3V0cHV0XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHJhbnNmb3JtYXRpb24oe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kVHJhbnNmb3JtZXI8bmV2ZXI+IHwgei5ab2RFZmZlY3RzPG5ldmVyPj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBpbnB1dCA9IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLnNjaGVtYSwgdXNlT3V0cHV0KVxuXG4gIGxldCBvdXRwdXQgPSBcInVuZGVmaW5lZFwiXG4gIGlmICh1c2VPdXRwdXQgJiYgem9kUmVmLl9kZWYuZWZmZWN0KSB7XG4gICAgY29uc3QgZWZmZWN0ID1cbiAgICAgIHpvZFJlZi5fZGVmLmVmZmVjdC50eXBlID09PSBcInRyYW5zZm9ybVwiID8gem9kUmVmLl9kZWYuZWZmZWN0IDogbnVsbFxuICAgIGlmIChlZmZlY3QgJiYgXCJ0cmFuc2Zvcm1cIiBpbiBlZmZlY3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG91dHB1dCA9IHR5cGVvZiBlZmZlY3QudHJhbnNmb3JtKFxuICAgICAgICAgIFtcImludGVnZXJcIiwgXCJudW1iZXJcIl0uaW5jbHVkZXMoYCR7aW5wdXQudHlwZX1gKVxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IFwic3RyaW5nXCIgPT09IGlucHV0LnR5cGVcbiAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgOiBcImJvb2xlYW5cIiA9PT0gaW5wdXQudHlwZVxuICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgOiBcIm9iamVjdFwiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICA6IFwibnVsbFwiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogXCJhcnJheVwiID09PSBpbnB1dC50eXBlXG4gICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB7IGFkZElzc3VlOiAoKSA9PiB1bmRlZmluZWQsIHBhdGg6IFtdIH0gLy8gVE9ETzogRGlzY292ZXIgaWYgY29udGV4dCBpcyBuZWNlc3NhcnkgaGVyZVxuICAgICAgICApXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qKi9cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIC4uLih6b2RSZWYuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiB6b2RSZWYuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIC4uLmlucHV0LFxuICAgICAgLi4uKFtcIm51bWJlclwiLCBcInN0cmluZ1wiLCBcImJvb2xlYW5cIiwgXCJudWxsXCJdLmluY2x1ZGVzKG91dHB1dClcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0eXBlOiBvdXRwdXQgYXMgXCJudW1iZXJcIiB8IFwic3RyaW5nXCIgfCBcImJvb2xlYW5cIiB8IFwibnVsbFwiLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VTdHJpbmcoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZFN0cmluZz4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBiYXNlU2NoZW1hOiBTY2hlbWFPYmplY3QgPSB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgfVxuICBjb25zdCB7IGNoZWNrcyA9IFtdIH0gPSB6b2RSZWYuX2RlZlxuICBjaGVja3MuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIHN3aXRjaCAoaXRlbS5raW5kKSB7XG4gICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImVtYWlsXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJ1dWlkXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJjdWlkXCI6XG4gICAgICAgIGJhc2VTY2hlbWEuZm9ybWF0ID0gXCJjdWlkXCJcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcInVyaVwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiZGF0ZXRpbWVcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5mb3JtYXQgPSBcImRhdGUtdGltZVwiXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibGVuZ3RoXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWluTGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBiYXNlU2NoZW1hLm1heExlbmd0aCA9IGl0ZW0udmFsdWVcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5tYXhMZW5ndGggPSBpdGVtLnZhbHVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWluXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWluTGVuZ3RoID0gaXRlbS52YWx1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcInJlZ2V4XCI6XG4gICAgICAgIGJhc2VTY2hlbWEucGF0dGVybiA9IGl0ZW0ucmVnZXguc291cmNlXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9KVxuICByZXR1cm4gbWVyZ2UoYmFzZVNjaGVtYSwgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLCAuLi5zY2hlbWFzKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bWJlcih7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kTnVtYmVyPik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGJhc2VTY2hlbWE6IFNjaGVtYU9iamVjdCA9IHtcbiAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgIGZvcm1hdDogXCJmbG9hdFwiLFxuICB9XG4gIGNvbnN0IHsgY2hlY2tzID0gW10gfSA9IHpvZFJlZi5fZGVmXG4gIGNoZWNrcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgc3dpdGNoIChpdGVtLmtpbmQpIHtcbiAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgICAgYmFzZVNjaGVtYS5tYXhpbXVtID0gaXRlbS52YWx1ZVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFVQU1RSRUFNOiBUaGUgb3BlbmFwaTMtdHMgdHlwZXMgYXJlIHdyb25nOiBleGNsdXNpdmVNYXhpbXVtIGlzIGEgYm9vbGVhbiBpbiB0aGlzIHZlcnNpb24uXG4gICAgICAgIC8vIGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vdjNfMC9kYXRhLW1vZGVscy9kYXRhLXR5cGVzL1xuICAgICAgICBpZiAoIWl0ZW0uaW5jbHVzaXZlKSBiYXNlU2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibWluXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubWluaW11bSA9IGl0ZW0udmFsdWVcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBVUFNUUkVBTTogVGhlIG9wZW5hcGkzLXRzIHR5cGVzIGFyZSB3cm9uZzogZXhjbHVzaXZlTWluaW11bSBpcyBhIGJvb2xlYW4gaW4gdGhpcyB2ZXJzaW9uLlxuICAgICAgICAvLyBodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL3YzXzAvZGF0YS1tb2RlbHMvZGF0YS10eXBlcy9cbiAgICAgICAgaWYgKCFpdGVtLmluY2x1c2l2ZSkgYmFzZVNjaGVtYS5leGNsdXNpdmVNaW5pbXVtID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImludFwiOlxuICAgICAgICBiYXNlU2NoZW1hLnR5cGUgPSBcImludGVnZXJcIlxuICAgICAgICBkZWxldGUgYmFzZVNjaGVtYS5mb3JtYXRcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJtdWx0aXBsZU9mXCI6XG4gICAgICAgIGJhc2VTY2hlbWEubXVsdGlwbGVPZiA9IGl0ZW0udmFsdWVcbiAgICB9XG4gIH0pXG4gIHJldHVybiBtZXJnZShiYXNlU2NoZW1hLCBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIGdldEV4Y2x1ZGVkRGVmaW5pdGlvbnNGcm9tU2NoZW1hKFxuICBzY2hlbWFzOiBBbmF0aW5lU2NoZW1hT2JqZWN0W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXhjbHVkZWREZWZpbml0aW9uczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHNjaGVtYSBvZiBzY2hlbWFzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmhpZGVEZWZpbml0aW9ucykpIHtcbiAgICAgIGV4Y2x1ZGVkRGVmaW5pdGlvbnMucHVzaCguLi5zY2hlbWEuaGlkZURlZmluaXRpb25zKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGNsdWRlZERlZmluaXRpb25zXG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0KHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxuICB1c2VPdXRwdXQsXG4gIGhpZGVEZWZpbml0aW9ucyxcbn06IFBhcnNpbmdBcmdzPFxuICB6LlpvZE9iamVjdDxuZXZlciwgXCJwYXNzdGhyb3VnaFwiIHwgXCJzdHJpY3RcIiB8IFwic3RyaXBcIj5cbj4pOiBTY2hlbWFPYmplY3Qge1xuICBsZXQgYWRkaXRpb25hbFByb3BlcnRpZXM6IFNjaGVtYU9iamVjdFtcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCJdXG5cbiAgLy8gYGNhdGNoYWxsYCBvYnZpYXRlcyBgc3RyaWN0YCwgYHN0cmlwYCwgYW5kIGBwYXNzdGhyb3VnaGBcbiAgaWYgKFxuICAgICEoXG4gICAgICB6b2RSZWYuX2RlZi5jYXRjaGFsbCBpbnN0YW5jZW9mIHouWm9kTmV2ZXIgfHxcbiAgICAgIHpvZFJlZi5fZGVmLmNhdGNoYWxsPy5fZGVmLnR5cGVOYW1lID09PSBcIlpvZE5ldmVyXCJcbiAgICApXG4gIClcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllcyA9IGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmNhdGNoYWxsLCB1c2VPdXRwdXQpXG4gIGVsc2UgaWYgKHpvZFJlZi5fZGVmLnVua25vd25LZXlzID09PSBcInBhc3N0aHJvdWdoXCIpXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXMgPSB0cnVlXG4gIGVsc2UgaWYgKHpvZFJlZi5fZGVmLnVua25vd25LZXlzID09PSBcInN0cmljdFwiKSBhZGRpdGlvbmFsUHJvcGVydGllcyA9IGZhbHNlXG5cbiAgLy8gU28gdGhhdCBgdW5kZWZpbmVkYCB2YWx1ZXMgZG9uJ3QgZW5kIHVwIGluIHRoZSBzY2hlbWEgYW5kIGJlIHdlaXJkXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzID1cbiAgICBhZGRpdGlvbmFsUHJvcGVydGllcyAhPSBudWxsID8geyBhZGRpdGlvbmFsUHJvcGVydGllcyB9IDoge31cblxuICBjb25zdCByZXF1aXJlZFByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhcbiAgICAoem9kUmVmIGFzIHouQW55Wm9kT2JqZWN0KS5zaGFwZVxuICApLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgY29uc3QgaXRlbSA9ICh6b2RSZWYgYXMgei5Bbnlab2RPYmplY3QpLnNoYXBlW2tleV1cbiAgICByZXR1cm4gKFxuICAgICAgIShcbiAgICAgICAgaXRlbS5pc09wdGlvbmFsKCkgfHxcbiAgICAgICAgaXRlbSBpbnN0YW5jZW9mIHouWm9kRGVmYXVsdCB8fFxuICAgICAgICBpdGVtLl9kZWYudHlwZU5hbWUgPT09IFwiWm9kRGVmYXVsdFwiXG4gICAgICApICYmICEoaXRlbSBpbnN0YW5jZW9mIHouWm9kTmV2ZXIgfHwgaXRlbS5fZGVmLnR5cGVOYW1lID09PSBcIlpvZERlZmF1bHRcIilcbiAgICApXG4gIH0pXG5cbiAgY29uc3QgcmVxdWlyZWQgPVxuICAgIHJlcXVpcmVkUHJvcGVydGllcy5sZW5ndGggPiAwID8geyByZXF1aXJlZDogcmVxdWlyZWRQcm9wZXJ0aWVzIH0gOiB7fVxuXG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiIGFzIFNjaGVtYU9iamVjdFR5cGUsXG4gICAgICBwcm9wZXJ0aWVzOiBpdGVyYXRlWm9kT2JqZWN0KHtcbiAgICAgICAgem9kUmVmOiB6b2RSZWYgYXMgT3BlbkFwaVpvZEFueU9iamVjdCxcbiAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgdXNlT3V0cHV0LFxuICAgICAgICBoaWRlRGVmaW5pdGlvbnM6IGdldEV4Y2x1ZGVkRGVmaW5pdGlvbnNGcm9tU2NoZW1hKHNjaGVtYXMpLFxuICAgICAgfSksXG4gICAgICAuLi5yZXF1aXJlZCxcbiAgICAgIC4uLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLFxuICAgICAgLi4uaGlkZURlZmluaXRpb25zLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZVJlY29yZCh7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RSZWNvcmQ+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOlxuICAgICAgICB6b2RSZWYuX2RlZi52YWx1ZVR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd25cbiAgICAgICAgICA/IHt9XG4gICAgICAgICAgOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi52YWx1ZVR5cGUsIHVzZU91dHB1dCksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQmlnSW50KHtcbiAgem9kUmVmLFxuICBzY2hlbWFzLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RCaWdJbnQ+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHsgdHlwZTogXCJpbnRlZ2VyXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSwgZm9ybWF0OiBcImludDY0XCIgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlQm9vbGVhbih7XG4gIHpvZFJlZixcbiAgc2NoZW1hcyxcbn06IFBhcnNpbmdBcmdzPHouWm9kQm9vbGVhbj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgeyB0eXBlOiBcImJvb2xlYW5cIiBhcyBTY2hlbWFPYmplY3RUeXBlIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZURhdGUoeyB6b2RSZWYsIHNjaGVtYXMgfTogUGFyc2luZ0FyZ3M8ei5ab2REYXRlPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7IHR5cGU6IFwic3RyaW5nXCIgYXMgU2NoZW1hT2JqZWN0VHlwZSwgZm9ybWF0OiBcImRhdGUtdGltZVwiIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZU51bGwoeyB6b2RSZWYsIHNjaGVtYXMgfTogUGFyc2luZ0FyZ3M8ei5ab2ROdWxsPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VPcHRpb25hbCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RPcHRpb25hbDxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgZ2VuZXJhdGVTY2hlbWEoem9kUmVmLnVud3JhcCgpLCB1c2VPdXRwdXQpLFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VOdWxsYWJsZSh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2ROdWxsYWJsZTxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBzY2hlbWEgPSBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYudW53cmFwKCksIHVzZU91dHB1dClcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHsgLi4uc2NoZW1hLCB0eXBlOiBzY2hlbWEudHlwZSwgbnVsbGFibGU6IHRydWUgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVmYXVsdCh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2REZWZhdWx0PE9wZW5BcGlab2RBbnk+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBkZWZhdWx0OiB6b2RSZWYuX2RlZi5kZWZhdWx0VmFsdWUoKSxcbiAgICAgIC4uLmdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmlubmVyVHlwZSwgdXNlT3V0cHV0KSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VBcnJheSh7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RBcnJheTxPcGVuQXBpWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICBjb25zdCBjb25zdHJhaW50czogU2NoZW1hT2JqZWN0ID0ge31cbiAgaWYgKHpvZFJlZi5fZGVmLmV4YWN0TGVuZ3RoICE9IG51bGwpIHtcbiAgICBjb25zdHJhaW50cy5taW5JdGVtcyA9IHpvZFJlZi5fZGVmLmV4YWN0TGVuZ3RoLnZhbHVlXG4gICAgY29uc3RyYWludHMubWF4SXRlbXMgPSB6b2RSZWYuX2RlZi5leGFjdExlbmd0aC52YWx1ZVxuICB9XG5cbiAgaWYgKHpvZFJlZi5fZGVmLm1pbkxlbmd0aCAhPSBudWxsKVxuICAgIGNvbnN0cmFpbnRzLm1pbkl0ZW1zID0gem9kUmVmLl9kZWYubWluTGVuZ3RoLnZhbHVlXG4gIGlmICh6b2RSZWYuX2RlZi5tYXhMZW5ndGggIT0gbnVsbClcbiAgICBjb25zdHJhaW50cy5tYXhJdGVtcyA9IHpvZFJlZi5fZGVmLm1heExlbmd0aC52YWx1ZVxuXG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICB0eXBlOiBcImFycmF5XCIgYXMgU2NoZW1hT2JqZWN0VHlwZSxcbiAgICAgIGl0ZW1zOiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuZWxlbWVudCwgdXNlT3V0cHV0KSxcbiAgICAgIC4uLmNvbnN0cmFpbnRzLFxuICAgIH0sXG4gICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgIC4uLnNjaGVtYXNcbiAgKVxufVxuXG5mdW5jdGlvbiBwYXJzZUxpdGVyYWwoe1xuICBzY2hlbWFzLFxuICB6b2RSZWYsXG59OiBQYXJzaW5nQXJnczx6LlpvZExpdGVyYWw8T3BlbkFwaVpvZEFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IHR5cGVvZiB6b2RSZWYuX2RlZi52YWx1ZSBhcyBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiLFxuICAgICAgZW51bTogW3pvZFJlZi5fZGVmLnZhbHVlXSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VFbnVtKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RFbnVtPG5ldmVyPiB8IHouWm9kTmF0aXZlRW51bTxuZXZlcj4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIHR5cGU6IHR5cGVvZiBPYmplY3QudmFsdWVzKHpvZFJlZi5fZGVmLnZhbHVlcylbMF0gYXMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIsXG4gICAgICBlbnVtOiBPYmplY3QudmFsdWVzKHpvZFJlZi5fZGVmLnZhbHVlcyksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlSW50ZXJzZWN0aW9uKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczx6LlpvZEludGVyc2VjdGlvbjx6LlpvZFR5cGVBbnksIHouWm9kVHlwZUFueT4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIGFsbE9mOiBbXG4gICAgICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLmxlZnQsIHVzZU91dHB1dCksXG4gICAgICAgIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLnJpZ2h0LCB1c2VPdXRwdXQpLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuZnVuY3Rpb24gcGFyc2VVbmlvbih7XG4gIHNjaGVtYXMsXG4gIHpvZFJlZixcbiAgdXNlT3V0cHV0LFxufTogUGFyc2luZ0FyZ3M8ei5ab2RVbmlvbjxbei5ab2RUeXBlQW55LCAuLi56LlpvZFR5cGVBbnlbXV0+Pik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IGNvbnRlbnRzID0gem9kUmVmLl9kZWYub3B0aW9uc1xuICBpZiAoXG4gICAgY29udGVudHMucmVkdWNlKFxuICAgICAgKHByZXYsIGNvbnRlbnQpID0+IHByZXYgJiYgY29udGVudC5fZGVmLnR5cGVOYW1lID09PSBcIlpvZExpdGVyYWxcIixcbiAgICAgIHRydWVcbiAgICApXG4gICkge1xuICAgIC8vIHNwZWNpYWwgY2FzZSB0byB0cmFuc2Zvcm0gdW5pb25zIG9mIGxpdGVyYWxzIGludG8gZW51bXNcbiAgICBjb25zdCBsaXRlcmFscyA9IGNvbnRlbnRzIGFzIHVua25vd24gYXMgei5ab2RMaXRlcmFsPE9wZW5BcGlab2RBbnk+W11cbiAgICBjb25zdCB0eXBlID0gbGl0ZXJhbHMucmVkdWNlKFxuICAgICAgKHByZXYsIGNvbnRlbnQpID0+XG4gICAgICAgICFwcmV2IHx8IHByZXYgPT09IHR5cGVvZiBjb250ZW50Ll9kZWYudmFsdWVcbiAgICAgICAgICA/IHR5cGVvZiBjb250ZW50Ll9kZWYudmFsdWVcbiAgICAgICAgICA6IG51bGwsXG4gICAgICBudWxsIGFzIG51bGwgfCBzdHJpbmdcbiAgICApXG5cbiAgICBpZiAodHlwZSkge1xuICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogdHlwZSBhcyBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGVudW06IGxpdGVyYWxzLm1hcCgobGl0ZXJhbCkgPT4gbGl0ZXJhbC5fZGVmLnZhbHVlKSxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyc2VEZXNjcmlwdGlvbih6b2RSZWYpLFxuICAgICAgICAuLi5zY2hlbWFzXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNOdWxsYWJsZSA9IGNvbnRlbnRzLnNvbWUoXG4gICAgKGNvbnRlbnQpID0+IGNvbnRlbnQuX2RlZi50eXBlTmFtZSA9PT0gXCJab2ROdWxsXCJcbiAgKVxuICBjb25zdCBub25OdWxsQ29udGVudHMgPSBjb250ZW50cy5maWx0ZXIoXG4gICAgKGNvbnRlbnQpID0+IGNvbnRlbnQuX2RlZi50eXBlTmFtZSAhPT0gXCJab2ROdWxsXCJcbiAgKVxuXG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBvbmVPZjogbm9uTnVsbENvbnRlbnRzLm1hcCgoc2NoZW1hKSA9PiBnZW5lcmF0ZVNjaGVtYShzY2hlbWEsIHVzZU91dHB1dCkpLFxuICAgICAgLi4uKGlzTnVsbGFibGUgPyB7IG51bGxhYmxlOiB0cnVlIH0gOiB7fSksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGlzY3JpbWluYXRlZFVuaW9uKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG59OiBQYXJzaW5nQXJnczxcbiAgei5ab2REaXNjcmltaW5hdGVkVW5pb248c3RyaW5nLCB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbk9wdGlvbjxzdHJpbmc+W10+XG4+KTogU2NoZW1hT2JqZWN0IHtcbiAgcmV0dXJuIG1lcmdlKFxuICAgIHtcbiAgICAgIGRpc2NyaW1pbmF0b3I6IHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiAoXG4gICAgICAgICAgem9kUmVmIGFzIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uPFxuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgei5ab2REaXNjcmltaW5hdGVkVW5pb25PcHRpb248c3RyaW5nPltdXG4gICAgICAgICAgPlxuICAgICAgICApLl9kZWYuZGlzY3JpbWluYXRvcixcbiAgICAgIH0sXG4gICAgICBvbmVPZjogQXJyYXkuZnJvbShcbiAgICAgICAgKFxuICAgICAgICAgIHpvZFJlZiBhcyB6LlpvZERpc2NyaW1pbmF0ZWRVbmlvbjxcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIHouWm9kRGlzY3JpbWluYXRlZFVuaW9uT3B0aW9uPHN0cmluZz5bXVxuICAgICAgICAgID5cbiAgICAgICAgKS5fZGVmLm9wdGlvbnMudmFsdWVzKClcbiAgICAgICkubWFwKChzY2hlbWEpID0+IGdlbmVyYXRlU2NoZW1hKHNjaGVtYSwgdXNlT3V0cHV0KSksXG4gICAgfSxcbiAgICBwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksXG4gICAgLi4uc2NoZW1hc1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlTmV2ZXIoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZE5ldmVyPik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZSh7IHJlYWRPbmx5OiB0cnVlIH0sIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gcGFyc2VCcmFuZGVkKHtcbiAgc2NoZW1hcyxcbiAgem9kUmVmLFxufTogUGFyc2luZ0FyZ3M8ei5ab2RCcmFuZGVkPHouWm9kQW55LCBzdHJpbmc+Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi50eXBlKSwgLi4uc2NoZW1hcylcbn1cblxuZnVuY3Rpb24gY2F0Y2hBbGxQYXJzZXIoe1xuICB6b2RSZWYsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczxab2RUeXBlQW55Pik6IFNjaGVtYU9iamVjdCB7XG4gIHJldHVybiBtZXJnZShwYXJzZURlc2NyaXB0aW9uKHpvZFJlZiksIC4uLnNjaGVtYXMpXG59XG5cbmZ1bmN0aW9uIHBhcnNlUGlwZWxpbmUoe1xuICB6b2RSZWYsXG4gIHVzZU91dHB1dCxcbn06IFBhcnNpbmdBcmdzPHouWm9kUGlwZWxpbmU8bmV2ZXIsIG5ldmVyPj4pOiBTY2hlbWFPYmplY3Qge1xuICBpZiAodXNlT3V0cHV0KSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlU2NoZW1hKHpvZFJlZi5fZGVmLm91dCwgdXNlT3V0cHV0KVxuICB9XG4gIHJldHVybiBnZW5lcmF0ZVNjaGVtYSh6b2RSZWYuX2RlZi5pbiwgdXNlT3V0cHV0KVxufVxuXG5mdW5jdGlvbiBwYXJzZVJlYWRvbmx5KHtcbiAgem9kUmVmLFxuICB1c2VPdXRwdXQsXG4gIHNjaGVtYXMsXG59OiBQYXJzaW5nQXJnczx6LlpvZFJlYWRvbmx5PHouWm9kQW55Pj4pOiBTY2hlbWFPYmplY3Qge1xuICByZXR1cm4gbWVyZ2UoXG4gICAgZ2VuZXJhdGVTY2hlbWEoem9kUmVmLl9kZWYuaW5uZXJUeXBlLCB1c2VPdXRwdXQpLFxuICAgIHBhcnNlRGVzY3JpcHRpb24oem9kUmVmKSxcbiAgICAuLi5zY2hlbWFzXG4gIClcbn1cblxuY29uc3Qgd29ya2VyTWFwID0ge1xuICBab2RPYmplY3Q6IHBhcnNlT2JqZWN0LFxuICBab2RSZWNvcmQ6IHBhcnNlUmVjb3JkLFxuICBab2RTdHJpbmc6IHBhcnNlU3RyaW5nLFxuICBab2ROdW1iZXI6IHBhcnNlTnVtYmVyLFxuICBab2RCaWdJbnQ6IHBhcnNlQmlnSW50LFxuICBab2RCb29sZWFuOiBwYXJzZUJvb2xlYW4sXG4gIFpvZERhdGU6IHBhcnNlRGF0ZSxcbiAgWm9kTnVsbDogcGFyc2VOdWxsLFxuICBab2RPcHRpb25hbDogcGFyc2VPcHRpb25hbCxcbiAgWm9kTnVsbGFibGU6IHBhcnNlTnVsbGFibGUsXG4gIFpvZERlZmF1bHQ6IHBhcnNlRGVmYXVsdCxcbiAgWm9kQXJyYXk6IHBhcnNlQXJyYXksXG4gIFpvZExpdGVyYWw6IHBhcnNlTGl0ZXJhbCxcbiAgWm9kRW51bTogcGFyc2VFbnVtLFxuICBab2ROYXRpdmVFbnVtOiBwYXJzZUVudW0sXG4gIFpvZFRyYW5zZm9ybWVyOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RFZmZlY3RzOiBwYXJzZVRyYW5zZm9ybWF0aW9uLFxuICBab2RJbnRlcnNlY3Rpb246IHBhcnNlSW50ZXJzZWN0aW9uLFxuICBab2RVbmlvbjogcGFyc2VVbmlvbixcbiAgWm9kRGlzY3JpbWluYXRlZFVuaW9uOiBwYXJzZURpc2NyaW1pbmF0ZWRVbmlvbixcbiAgWm9kTmV2ZXI6IHBhcnNlTmV2ZXIsXG4gIFpvZEJyYW5kZWQ6IHBhcnNlQnJhbmRlZCxcbiAgLy8gVE9ETyBUcmFuc2Zvcm0gdGhlIHJlc3QgdG8gc2NoZW1hc1xuICBab2RVbmRlZmluZWQ6IGNhdGNoQWxsUGFyc2VyLFxuICAvLyBUT0RPOiBgcHJlZml4SXRlbXNgIGlzIGFsbG93ZWQgaW4gT3BlbkFQSSAzLjEgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHR1cGxlc1xuICBab2RUdXBsZTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZE1hcDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZEZ1bmN0aW9uOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kTGF6eTogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFByb21pc2U6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RBbnk6IGNhdGNoQWxsUGFyc2VyLFxuICBab2RVbmtub3duOiBjYXRjaEFsbFBhcnNlcixcbiAgWm9kVm9pZDogY2F0Y2hBbGxQYXJzZXIsXG4gIFpvZFBpcGVsaW5lOiBwYXJzZVBpcGVsaW5lLFxuICBab2RSZWFkb25seTogcGFyc2VSZWFkb25seSxcbn1cbnR5cGUgV29ya2VyS2V5cyA9IGtleW9mIHR5cGVvZiB3b3JrZXJNYXBcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NoZW1hKFxuICB6b2RSZWY6IE9wZW5BcGlab2RBbnksXG4gIHVzZU91dHB1dD86IGJvb2xlYW5cbik6IFNjaGVtYU9iamVjdCB7XG4gIGNvbnN0IHsgbWV0YU9wZW5BcGkgPSB7fSB9ID0gem9kUmVmXG4gIGNvbnN0IHNjaGVtYXM6IEFuYXRpbmVTY2hlbWFPYmplY3RbXSA9IFtcbiAgICAuLi4oQXJyYXkuaXNBcnJheShtZXRhT3BlbkFwaSkgPyBtZXRhT3BlbkFwaSA6IFttZXRhT3BlbkFwaV0pLFxuICBdXG4gIHRyeSB7XG4gICAgY29uc3QgdHlwZU5hbWUgPSB6b2RSZWYuX2RlZi50eXBlTmFtZSBhcyBXb3JrZXJLZXlzXG4gICAgaWYgKHR5cGVOYW1lIGluIHdvcmtlck1hcCkge1xuICAgICAgcmV0dXJuIHdvcmtlck1hcFt0eXBlTmFtZV0oe1xuICAgICAgICB6b2RSZWY6IHpvZFJlZiBhcyBuZXZlcixcbiAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgdXNlT3V0cHV0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gY2F0Y2hBbGxQYXJzZXIoeyB6b2RSZWYsIHNjaGVtYXMgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgcmV0dXJuIGNhdGNoQWxsUGFyc2VyKHsgem9kUmVmLCBzY2hlbWFzIH0pXG4gIH1cbn1cbiIsICIvKipcbiAqIEZyb250LU1hdHRlclxuICpcbiAqIFZlbmRvcmVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2p4c29uL2Zyb250LW1hdHRlclxuICpcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSBKYXNvbiBDYW1wYmVsbCAoXCJBdXRob3JcIilcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7IGxvYWQgfSBmcm9tIFwianMteWFtbFwiXG5jb25zdCBvcHRpb25hbEJ5dGVPcmRlck1hcmsgPSBcIlxcXFx1ZmVmZj9cIlxuY29uc3QgcGxhdGZvcm0gPSB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiA/IHByb2Nlc3MucGxhdGZvcm0gOiBcIlwiXG5jb25zdCBwYXR0ZXJuID1cbiAgXCJeKFwiICtcbiAgb3B0aW9uYWxCeXRlT3JkZXJNYXJrICtcbiAgXCIoPSB5YW1sID18LS0tKVwiICtcbiAgXCIkKFtcXFxcc1xcXFxTXSo/KVwiICtcbiAgXCJeKD86XFxcXDJ8XFxcXC5cXFxcLlxcXFwuKVxcXFxzKlwiICtcbiAgXCIkXCIgK1xuICAocGxhdGZvcm0gPT09IFwid2luMzJcIiA/IFwiXFxcXHI/XCIgOiBcIlwiKSArXG4gIFwiKD86XFxcXG4pPylcIlxuLy8gTk9URTogSWYgdGhpcyBwYXR0ZXJuIHVzZXMgdGhlICdnJyBmbGFnIHRoZSBgcmVnZXhgIHZhcmlhYmxlIGRlZmluaXRpb24gd2lsbFxuLy8gbmVlZCB0byBiZSBtb3ZlZCBkb3duIGludG8gdGhlIGZ1bmN0aW9ucyB0aGF0IHVzZSBpdC5cbmNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcIm1cIilcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRnJvbnRNYXR0ZXIoXG4gIHN0cmluZzogc3RyaW5nLFxuICBvcHRpb25zID0ge31cbik6IHsgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGJvZHk6IHN0cmluZzsgYm9keUJlZ2luOiBudW1iZXIgfSB7XG4gIHN0cmluZyA9IHN0cmluZyB8fCBcIlwiXG4gIHZhciBkZWZhdWx0T3B0aW9ucyA9IHsgYWxsb3dVbnNhZmU6IGZhbHNlIH1cbiAgb3B0aW9ucyA9XG4gICAgb3B0aW9ucyBpbnN0YW5jZW9mIE9iamVjdFxuICAgICAgPyB7IC4uLmRlZmF1bHRPcHRpb25zLCAuLi5vcHRpb25zIH1cbiAgICAgIDogZGVmYXVsdE9wdGlvbnNcbiAgdmFyIGxpbmVzID0gc3RyaW5nLnNwbGl0KC8oXFxyP1xcbikvKVxuICBpZiAobGluZXNbMF0gJiYgLz0geWFtbCA9fC0tLS8udGVzdChsaW5lc1swXSkpIHtcbiAgICByZXR1cm4gcGFyc2Uoc3RyaW5nKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGJvZHk6IHN0cmluZyxcbiAgICAgIGJvZHlCZWdpbjogMSxcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZUxvY2F0aW9uKG1hdGNoOiBSZWdFeHBFeGVjQXJyYXksIGJvZHk6IHN0cmluZykge1xuICB2YXIgbGluZSA9IDFcbiAgdmFyIHBvcyA9IGJvZHkuaW5kZXhPZihcIlxcblwiKVxuICB2YXIgb2Zmc2V0ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGhcblxuICB3aGlsZSAocG9zICE9PSAtMSkge1xuICAgIGlmIChwb3MgPj0gb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gbGluZVxuICAgIH1cbiAgICBsaW5lKytcbiAgICBwb3MgPSBib2R5LmluZGV4T2YoXCJcXG5cIiwgcG9zICsgMSlcbiAgfVxuXG4gIHJldHVybiBsaW5lXG59XG5cbmZ1bmN0aW9uIHBhcnNlKHN0cmluZzogc3RyaW5nKToge1xuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBib2R5OiBzdHJpbmdcbiAgYm9keUJlZ2luOiBudW1iZXJcbn0ge1xuICB2YXIgbWF0Y2ggPSByZWdleC5leGVjKHN0cmluZylcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIGJvZHk6IHN0cmluZyxcbiAgICAgIGJvZHlCZWdpbjogMSxcbiAgICB9XG4gIH1cblxuICB2YXIgeWFtbCA9IG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdLnJlcGxhY2UoL15cXHMrfFxccyskL2csIFwiXCIpXG4gIHZhciBhdHRyaWJ1dGVzID0gKGxvYWQoeWFtbCkgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHZhciBib2R5ID0gc3RyaW5nLnJlcGxhY2UobWF0Y2hbMF0sIFwiXCIpXG4gIHZhciBsaW5lID0gY29tcHV0ZUxvY2F0aW9uKG1hdGNoLCBzdHJpbmcpXG5cbiAgcmV0dXJuIHtcbiAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxuICAgIGJvZHk6IGJvZHksXG4gICAgYm9keUJlZ2luOiBsaW5lLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0RnJvbnRNYXR0ZXIoc3RyaW5nOiBzdHJpbmcpIHtcbiAgc3RyaW5nID0gc3RyaW5nIHx8IFwiXCJcblxuICByZXR1cm4gcmVnZXgudGVzdChzdHJpbmcpXG59XG4iLCAidHlwZSBQcmVmaXhlZE9iamVjdDxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCBhcyBgeC0ke3N0cmluZyAmIEt9YF06IFRbS11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWZpeE9iamVjdEtleXNXaXRoWDxUIGV4dGVuZHMgb2JqZWN0PihcbiAgb2JqOiBUXG4pOiBQcmVmaXhlZE9iamVjdDxUPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2B4LSR7a2V5fWAsIHZhbHVlXSlcbiAgKSBhcyBQcmVmaXhlZE9iamVjdDxUPlxufVxuIiwgInR5cGUgU25ha2VUb0Rhc2g8VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgYXMgSyBleHRlbmRzIHN0cmluZyA/IFNuYWtlVG9EYXNoU3RyaW5nPEs+IDogS106IFRbS11cbn1cblxudHlwZSBTbmFrZVRvRGFzaFN0cmluZzxTIGV4dGVuZHMgc3RyaW5nPiA9IFMgZXh0ZW5kcyBgJHtpbmZlciBUfV8ke2luZmVyIFV9YFxuICA/IGAke1R9LSR7U25ha2VUb0Rhc2hTdHJpbmc8VT59YFxuICA6IFNcblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hpZnlPYmplY3RLZXlzPFQgZXh0ZW5kcyBvYmplY3Q+KG9iajogVCk6IFNuYWtlVG9EYXNoPFQ+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LnJlcGxhY2UoL18vZywgXCItXCIpLCB2YWx1ZV0pXG4gICkgYXMgU25ha2VUb0Rhc2g8VD5cbn1cbiIsICJpbXBvcnQgXyBmcm9tIFwibG9kYXNoXCJcblxuZnVuY3Rpb24gZmluZEtleUluT2JqKG9iajogYW55LCB2YWx1ZTogYW55KTogc3RyaW5nIHwgbnVsbCB7XG4gIGxldCByZXN1bHRLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIF8uZm9yT3duKG9iaiwgKHYsIGspID0+IHtcbiAgICBpZiAoXy5pc09iamVjdCh2KSAmJiBfLmlzTWF0Y2godiwgdmFsdWUpKSB7XG4gICAgICByZXN1bHRLZXkgPSBrXG4gICAgICAvLyBTdG9wIHRoZSBpdGVyYXRpb25cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIHJlc3VsdEtleVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1iZWRTY2hlbWFSZWZlcmVuY2VzKG9iajE6IGFueSwgb2JqMjogYW55KTogYW55IHtcbiAgcmV0dXJuIF8udHJhbnNmb3JtKG9iajEsIChyZXN1bHQsIHZhbHVlLCBrZXkpID0+IHtcbiAgICBpZiAoXy5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nS2V5ID0gZmluZEtleUluT2JqKG9iajIsIHZhbHVlKVxuICAgICAgaWYgKG1hdGNoaW5nS2V5KSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0ge1xuICAgICAgICAgICRyZWY6IGAjL2NvbXBvbmVudHMvc2NoZW1hcy8ke21hdGNoaW5nS2V5fWAsXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZW1iZWRTY2hlbWFSZWZlcmVuY2VzKHZhbHVlLCBvYmoyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9KVxufVxuIiwgImltcG9ydCB7IFJvdXRlU3BlYyB9IGZyb20gXCIuLi8uLi90eXBlc1wiXG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVBhdGhUb0Zlcm5TZGtNZXRob2ROYW1lKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gXCJcIilcbiAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXVxuICBpZiAobGFzdFBhcnQuc3RhcnRzV2l0aChcIltcIikgJiYgbGFzdFBhcnQuZW5kc1dpdGgoXCJdXCIpKSB7XG4gICAgLy8gQ29udmVydCBbcGFyYW1dIHRvIGJ5X3BhcmFtXG4gICAgY29uc3QgcGFyYW0gPSBsYXN0UGFydC5zbGljZSgxLCAtMSlcbiAgICByZXR1cm4gYGJ5XyR7cGFyYW19YFxuICB9XG5cbiAgcmV0dXJuIGxhc3RQYXJ0XG59XG5cbi8vIGZlcm4gZG9jczogaHR0cHM6Ly9idWlsZHdpdGhmZXJuLmNvbS9kb2NzL3NwZWMvZXh0ZW5zaW9uc1xuZnVuY3Rpb24gdHJhbnNmb3JtUGF0aFRvRmVyblNka0dyb3VwTmFtZShwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IFwiXCIpXG4gIHJldHVybiBwYXJ0cy5zbGljZSgwLCBwYXJ0cy5sZW5ndGggLSAxKVxufVxuXG5mdW5jdGlvbiBnZXRGZXJuU2RrTWV0YWRhdGEoXG4gIHBhdGg6IHN0cmluZyxcbiAgc2RrUmV0dXJuVmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXVxuKTpcbiAgfCB7XG4gICAgICBcIngtZmVybi1pZ25vcmVcIjogdHJ1ZVxuICAgIH1cbiAgfCB7XG4gICAgICBcIngtZmVybi1zZGstZ3JvdXAtbmFtZVwiOiBzdHJpbmdbXVxuICAgICAgXCJ4LWZlcm4tc2RrLW1ldGhvZC1uYW1lXCI6IHN0cmluZ1xuICAgIH0ge1xuICBpZiAocGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBcIlwiKS5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgXCJ4LWZlcm4taWdub3JlXCI6IHRydWUsXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBcIngtZmVybi1zZGstZ3JvdXAtbmFtZVwiOiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrR3JvdXBOYW1lKHBhdGgpLFxuICAgIFwieC1mZXJuLXNkay1tZXRob2QtbmFtZVwiOiB0cmFuc2Zvcm1QYXRoVG9GZXJuU2RrTWV0aG9kTmFtZShwYXRoKSxcbiAgICAuLi4oc2RrUmV0dXJuVmFsdWVcbiAgICAgID8ge1xuICAgICAgICAgIFwieC1mZXJuLXNkay1yZXR1cm4tdmFsdWVcIjogc2RrUmV0dXJuVmFsdWUsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXBNZXRob2RzVG9GZXJuU2RrTWV0YWRhdGEoe1xuICBtZXRob2RzLFxuICBwYXRoLFxuICBzZGtSZXR1cm5WYWx1ZSxcbn06IHtcbiAgbWV0aG9kczogUm91dGVTcGVjW1wibWV0aG9kc1wiXVxuICBwYXRoOiBzdHJpbmdcbiAgc2RrUmV0dXJuVmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXVxufSkge1xuICBjb25zdCBmZXJuU2RrTWV0YWRhdGEgPSBnZXRGZXJuU2RrTWV0YWRhdGEocGF0aCwgc2RrUmV0dXJuVmFsdWUpXG4gIGlmIChtZXRob2RzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB7XG4gICAgICBbbWV0aG9kc1swXV06IGZlcm5TZGtNZXRhZGF0YSxcbiAgICB9XG4gIH1cblxuICBjb25zdCBtYXBwZWRNZXRob2RzID0ge31cblxuICBtZXRob2RzLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiKSB7XG4gICAgICBtYXBwZWRNZXRob2RzW21ldGhvZF0gPSBmZXJuU2RrTWV0YWRhdGFcbiAgICB9IGVsc2Uge1xuICAgICAgbWFwcGVkTWV0aG9kc1ttZXRob2RdID0ge1xuICAgICAgICBcIngtZmVybi1pZ25vcmVcIjogdHJ1ZSxcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIG1hcHBlZE1ldGhvZHNcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgeyBwYXJzZVJvdXRlc0luUGFja2FnZSB9IGZyb20gXCIuLi9saWIvcGFyc2Utcm91dGVzLWluLXBhY2thZ2VcIlxuaW1wb3J0IHsgem9kVG9UcywgcHJpbnROb2RlIH0gZnJvbSBcIi4uL2xpYi96b2QtdG8tdHNcIlxuaW1wb3J0IHByZXR0aWVyIGZyb20gXCJwcmV0dGllclwiXG5pbXBvcnQgeyB6LCBab2RFZmZlY3RzLCBab2RPcHRpb25hbCB9IGZyb20gXCJ6b2RcIlxuXG5pbnRlcmZhY2UgR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cyB7XG4gIHBhY2thZ2VEaXI6IHN0cmluZ1xuICBvdXRwdXRGaWxlPzogc3RyaW5nXG4gIHBhdGhHbG9iPzogc3RyaW5nXG4gIGFwaVByZWZpeD86IHN0cmluZ1xuICBtYXBGaWxlUGF0aFRvSFRUUFJvdXRlPzogKGZpbGVfcGF0aDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgLyoqXG4gICAqIElmIHByb3ZpZGVkLCBvbmx5IHJvdXRlcyB0aGF0IHJldHVybiB0cnVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCB0eXBlcy5cbiAgICovXG4gIGZpbHRlclJvdXRlcz86IChyb3V0ZTogc3RyaW5nKSA9PiBib29sZWFuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCByb3V0ZXMgdGhhdCBoYXZlIGBleGNsdWRlRnJvbU9wZW5BcGlgIHNldCB0byB0cnVlIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKiBTZXQgdGhpcyB0byB0cnVlIHRvIGluY2x1ZGUgdGhlbS5cbiAgICovXG4gIGluY2x1ZGVPcGVuQXBpRXhjbHVkZWRSb3V0ZXM/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJvdXRlVHlwZXMgPSBhc3luYyAob3B0czogR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cykgPT4ge1xuICBjb25zdCBmaWxlcGF0aFRvUm91dGUgPSBhd2FpdCBwYXJzZVJvdXRlc0luUGFja2FnZShvcHRzKVxuXG4gIGNvbnN0IHNvcnRlZFJvdXRlcyA9IEFycmF5LmZyb20oZmlsZXBhdGhUb1JvdXRlLmVudHJpZXMoKSkuc29ydCgoYSwgYikgPT5cbiAgICBhWzFdLnJvdXRlLmxvY2FsZUNvbXBhcmUoYlsxXS5yb3V0ZSlcbiAgKVxuICBjb25zdCBmaWx0ZXJlZFJvdXRlcyA9IHNvcnRlZFJvdXRlcy5maWx0ZXIoXG4gICAgKFtfLCB7IHJvdXRlIH1dKSA9PiAhb3B0cy5maWx0ZXJSb3V0ZXMgfHwgb3B0cy5maWx0ZXJSb3V0ZXMocm91dGUpXG4gIClcblxuICAvLyBUT0RPIHdoZW4gbGVzcyBsYXp5LCB1c2UgdHMtbW9ycGggZm9yIGJldHRlciBnZW5lcmF0aW9uXG4gIGNvbnN0IHJvdXRlRGVmczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IFtfLCB7IHJvdXRlLCByb3V0ZVNwZWMsIHNldHVwUGFyYW1zIH1dIG9mIGZpbHRlcmVkUm91dGVzKSB7XG4gICAgY29uc3QgbWF4RHVyYXRpb24gPSByb3V0ZVNwZWMubWF4RHVyYXRpb24gPz8gc2V0dXBQYXJhbXMubWF4RHVyYXRpb25cbiAgICBjb25zdCBxdWVyeUtleXMgPSBPYmplY3Qua2V5cyhyb3V0ZVNwZWMucXVlcnlQYXJhbXM/LnNoYXBlID8/IHt9KVxuICAgIGNvbnN0IHBhdGhQYXJhbWV0ZXJzID0gcXVlcnlLZXlzLmZpbHRlcigoa2V5KSA9PiByb3V0ZS5pbmNsdWRlcyhgWyR7a2V5fV1gKSlcblxuICAgIC8vIHF1ZXJ5UGFyYW1zIG1pZ2h0IGJlIGEgWm9kRWZmZWN0cyBvciBab2RPcHRpb25hbCBpbiBzb21lIGNhc2VzXG4gICAgbGV0IHF1ZXJ5UGFyYW1zID0gcm91dGVTcGVjLnF1ZXJ5UGFyYW1zXG4gICAgd2hpbGUgKFxuICAgICAgcXVlcnlQYXJhbXMgJiZcbiAgICAgIChcInNvdXJjZVR5cGVcIiBpbiBxdWVyeVBhcmFtcyB8fCBcInVud3JhcFwiIGluIHF1ZXJ5UGFyYW1zKVxuICAgICkge1xuICAgICAgaWYgKFwic291cmNlVHlwZVwiIGluIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zID0gKHF1ZXJ5UGFyYW1zIGFzIHVua25vd24gYXMgWm9kRWZmZWN0czxhbnk+KS5zb3VyY2VUeXBlKClcbiAgICAgIH0gZWxzZSBpZiAoXCJ1bndyYXBcIiBpbiBxdWVyeVBhcmFtcykge1xuICAgICAgICBxdWVyeVBhcmFtcyA9IChxdWVyeVBhcmFtcyBhcyB1bmtub3duIGFzIFpvZE9wdGlvbmFsPGFueT4pLnVud3JhcCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5UGFyYW1zICYmIFwib21pdFwiIGluIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICBxdWVyeVBhcmFtcyA9IHF1ZXJ5UGFyYW1zLm9taXQoXG4gICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhwYXRoUGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiBbcGFyYW0sIHRydWVdKSlcbiAgICAgIClcbiAgICB9XG5cbiAgICByb3V0ZURlZnMucHVzaChcbiAgICAgIGBcblwiJHtyb3V0ZX1cIjoge1xuICByb3V0ZTogXCIke3JvdXRlfVwiLFxuICBtZXRob2Q6ICR7cm91dGVTcGVjLm1ldGhvZHMubWFwKChtKSA9PiBgXCIke219XCJgKS5qb2luKFwiIHwgXCIpfSxcbiAgcXVlcnlQYXJhbXM6ICR7cXVlcnlQYXJhbXMgPyBwcmludE5vZGUoem9kVG9UcyhxdWVyeVBhcmFtcykubm9kZSkgOiBcInt9XCJ9LFxuICBqc29uQm9keTogJHtcbiAgICByb3V0ZVNwZWMuanNvbkJvZHkgPyBwcmludE5vZGUoem9kVG9Ucyhyb3V0ZVNwZWMuanNvbkJvZHkpLm5vZGUpIDogXCJ7fVwiXG4gIH0sXG4gIGNvbW1vblBhcmFtczogJHtcbiAgICByb3V0ZVNwZWMuY29tbW9uUGFyYW1zXG4gICAgICA/IHByaW50Tm9kZSh6b2RUb1RzKHJvdXRlU3BlYy5jb21tb25QYXJhbXMpLm5vZGUpXG4gICAgICA6IFwie31cIlxuICB9LFxuICBmb3JtRGF0YTogJHtcbiAgICByb3V0ZVNwZWMuZm9ybURhdGEgPyBwcmludE5vZGUoem9kVG9Ucyhyb3V0ZVNwZWMuZm9ybURhdGEpLm5vZGUpIDogXCJ7fVwiXG4gIH0sXG4gIGpzb25SZXNwb25zZTogJHtcbiAgICByb3V0ZVNwZWMuanNvblJlc3BvbnNlXG4gICAgICA/IHByaW50Tm9kZShcbiAgICAgICAgICB6b2RUb1RzKFxuICAgICAgICAgICAgc2V0dXBQYXJhbXMuYWRkT2tTdGF0dXMgJiZcbiAgICAgICAgICAgICAgcm91dGVTcGVjLmpzb25SZXNwb25zZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0XG4gICAgICAgICAgICAgID8gcm91dGVTcGVjLmpzb25SZXNwb25zZS5leHRlbmQoeyBvazogei5ib29sZWFuKCkgfSlcbiAgICAgICAgICAgICAgOiByb3V0ZVNwZWMuanNvblJlc3BvbnNlXG4gICAgICAgICAgKS5ub2RlXG4gICAgICAgIClcbiAgICAgIDogXCJ7fVwiXG4gIH0sXG4gIG1heER1cmF0aW9uOiAke21heER1cmF0aW9uID8/IFwidW5kZWZpbmVkXCJ9XG59YC50cmltKClcbiAgICApXG4gIH1cbiAgY29uc3Qgcm91dGVEZWZTdHIgPSByb3V0ZURlZnMuam9pbihcIixcXG5cIilcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcHJldHRpZXIuZm9ybWF0KFxuICAgIGBleHBvcnQgdHlwZSBSb3V0ZXMgPSB7XG4ke3JvdXRlRGVmU3RyfVxufVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlc3BvbnNlPFBhdGggZXh0ZW5kcyBrZXlvZiBSb3V0ZXM+ID1cbiAgUm91dGVzW1BhdGhdW1wianNvblJlc3BvbnNlXCJdXG5cbmV4cG9ydCB0eXBlIFJvdXRlUmVxdWVzdEJvZHk8UGF0aCBleHRlbmRzIGtleW9mIFJvdXRlcz4gPVxuICBSb3V0ZXNbUGF0aF1bXCJqc29uQm9keVwiXSAmIFJvdXRlc1tQYXRoXVtcImNvbW1vblBhcmFtc1wiXVxuXG5leHBvcnQgdHlwZSBSb3V0ZVJlcXVlc3RQYXJhbXM8UGF0aCBleHRlbmRzIGtleW9mIFJvdXRlcz4gPVxuICBSb3V0ZXNbUGF0aF1bXCJxdWVyeVBhcmFtc1wiXSAmIFJvdXRlc1tQYXRoXVtcImNvbW1vblBhcmFtc1wiXVxuYC50cmltKCksXG4gICAgeyBzZW1pOiBmYWxzZSwgcGFyc2VyOiBcInR5cGVzY3JpcHRcIiB9XG4gIClcblxuICBpZiAob3B0cy5vdXRwdXRGaWxlKSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKG9wdHMub3V0cHV0RmlsZSwgb3V0cHV0KVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dFxufVxuIiwgIi8qKlxuICogWm9kIFRvIFRTXG4gKlxuICogVmVuZG9yZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2FjaGlucmFqYS96b2QtdG8tdHNcbiAqXG4gKiBNSVQgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMSBTYWNoaW4gUmFqYVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHRzIGZyb20gXCJ0eXBlc2NyaXB0XCJcbmltcG9ydCB7IFpvZFR5cGUsIFpvZFR5cGVBbnkgfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IHBhcnNlRnJvbnRNYXR0ZXIsIHRlc3RGcm9udE1hdHRlciB9IGZyb20gXCIuL2Zyb250LW1hdHRlclwiXG5pbXBvcnQgZGVkZW50IGZyb20gXCJkZWRlbnRcIlxuXG5jb25zdCB7IGZhY3Rvcnk6IGYsIFN5bnRheEtpbmQsIFNjcmlwdEtpbmQsIFNjcmlwdFRhcmdldCwgRW1pdEhpbnQgfSA9IHRzXG5cbmNvbnN0IG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSA9IChcbiAgaWRlbnRpZmllcjogdHMuSWRlbnRpZmllciB8IHRzLlR5cGVOb2RlXG4pID0+IHtcbiAgaWYgKHRzLmlzSWRlbnRpZmllcihpZGVudGlmaWVyKSkge1xuICAgIHJldHVybiBmLmNyZWF0ZVR5cGVSZWZlcmVuY2VOb2RlKGlkZW50aWZpZXIpXG4gIH1cblxuICByZXR1cm4gaWRlbnRpZmllclxufVxuXG5jb25zdCBjcmVhdGVUeXBlUmVmZXJlbmNlRnJvbVN0cmluZyA9IChpZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gIGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKGlkZW50aWZpZXIpKVxuXG5jb25zdCBjcmVhdGVVbmtub3duS2V5d29yZE5vZGUgPSAoKSA9PlxuICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVua25vd25LZXl3b3JkKVxuXG5leHBvcnQgY29uc3QgcHJpbnROb2RlID0gKFxuICBub2RlOiB0cy5Ob2RlLFxuICBwcmludGVyT3B0aW9ucz86IHRzLlByaW50ZXJPcHRpb25zXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBcInByaW50LnRzXCIsXG4gICAgXCJcIixcbiAgICBTY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgIGZhbHNlLFxuICAgIFNjcmlwdEtpbmQuVFNcbiAgKVxuICBjb25zdCBwcmludGVyID0gdHMuY3JlYXRlUHJpbnRlcihwcmludGVyT3B0aW9ucylcbiAgcmV0dXJuIHByaW50ZXIucHJpbnROb2RlKEVtaXRIaW50LlVuc3BlY2lmaWVkLCBub2RlLCBzb3VyY2VGaWxlKVxufVxuXG5jb25zdCBpZGVudGlmaWVyUkUgPSAvXlskQS1aX2Etel1bXFx3JF0qJC9cblxuY29uc3QgZ2V0SWRlbnRpZmllck9yU3RyaW5nTGl0ZXJhbCA9IChzdHJpbmdfOiBzdHJpbmcpID0+IHtcbiAgaWYgKGlkZW50aWZpZXJSRS50ZXN0KHN0cmluZ18pKSB7XG4gICAgcmV0dXJuIGYuY3JlYXRlSWRlbnRpZmllcihzdHJpbmdfKVxuICB9XG5cbiAgcmV0dXJuIGYuY3JlYXRlU3RyaW5nTGl0ZXJhbChzdHJpbmdfKVxufVxuXG5jb25zdCBhZGRKc0RvY0NvbW1lbnQgPSAobm9kZTogdHMuTm9kZSwgdGV4dDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHsgZGVzY3JpcHRpb24sIGRlcHJlY2F0ZWQgfSA9IHBhcnNlRGVzY3JpcHRpb24odGV4dClcblxuICBsZXQgY29tbWVudCA9IGAqICR7ZGVzY3JpcHRpb259YFxuICBpZiAoZGVwcmVjYXRlZCkge1xuICAgIGNvbW1lbnQgKz0gYFxcbiAqIEBkZXByZWNhdGVkICR7XG4gICAgICB0eXBlb2YgZGVwcmVjYXRlZCA9PT0gXCJzdHJpbmdcIiA/IGRlcHJlY2F0ZWQgOiBcIlwiXG4gICAgfWBcbiAgfSBlbHNlIHtcbiAgICBjb21tZW50ICs9IGAgYFxuICB9XG5cbiAgdHMuYWRkU3ludGhldGljTGVhZGluZ0NvbW1lbnQoXG4gICAgbm9kZSxcbiAgICBTeW50YXhLaW5kLk11bHRpTGluZUNvbW1lbnRUcml2aWEsXG4gICAgY29tbWVudCxcbiAgICB0cnVlXG4gIClcbn1cblxudHlwZSBQYXJzZWREZXNjcmlwdGlvbiA9IHtcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBkZXByZWNhdGVkPzogYm9vbGVhbiB8IHN0cmluZ1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmZ1bmN0aW9uIHBhcnNlRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IFBhcnNlZERlc2NyaXB0aW9uIHtcbiAgaWYgKCFkZXNjcmlwdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRpb246IFwiXCIsXG4gICAgfVxuICBjb25zdCB0cmltbWVkRGVzY3JpcHRpb24gPSBkZWRlbnQoZGVzY3JpcHRpb24pXG4gIGlmICghdGVzdEZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbikpIHJldHVybiB7IGRlc2NyaXB0aW9uIH1cbiAgY29uc3QgeyBhdHRyaWJ1dGVzLCBib2R5IH0gPSBwYXJzZUZyb250TWF0dGVyKHRyaW1tZWREZXNjcmlwdGlvbilcbiAgY29uc3Qgb3V0cHV0OiBQYXJzZWREZXNjcmlwdGlvbiA9IHtcbiAgICBkZXNjcmlwdGlvbjogYm9keS50cmltKCksXG4gIH1cbiAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiICYmIGF0dHJpYnV0ZXMgIT09IG51bGwpIHtcbiAgICBpZiAoXCJkZXByZWNhdGVkXCIgaW4gYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlcy5kZXByZWNhdGVkID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBvdXRwdXQuZGVwcmVjYXRlZCA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZGVwcmVjYXRlZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBvdXRwdXQuZGVwcmVjYXRlZCA9XG4gICAgICAgICAgYXR0cmlidXRlcy5kZXByZWNhdGVkLmxlbmd0aCA+IDAgPyBhdHRyaWJ1dGVzLmRlcHJlY2F0ZWQgOiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImRlc2NyaXB0aW9uXCIgfHwga2V5ID09PSBcImRlcHJlY2F0ZWRcIikgY29udGludWVcbiAgICAgIG91dHB1dFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dHB1dFxufVxuXG50eXBlIExpdGVyYWxUeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxuXG50eXBlIFpvZFRvVHNPcHRpb25zID0ge1xuICAvKiogQGRlcHJlY2F0ZWQgdXNlIGBuYXRpdmVFbnVtc2AgaW5zdGVhZCAqL1xuICByZXNvbHZlTmF0aXZlRW51bXM/OiBib29sZWFuXG4gIG5hdGl2ZUVudW1zPzogXCJpZGVudGlmaWVyXCIgfCBcInJlc29sdmVcIiB8IFwidW5pb25cIlxufVxuXG5jb25zdCByZXNvbHZlT3B0aW9ucyA9IChyYXc/OiBab2RUb1RzT3B0aW9ucykgPT4ge1xuICBjb25zdCByZXNvbHZlZCA9IHtcbiAgICBuYXRpdmVFbnVtczogcmF3Py5yZXNvbHZlTmF0aXZlRW51bXMgPyBcInJlc29sdmVcIiA6IFwiaWRlbnRpZmllclwiLFxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb2x2ZWQsIC4uLnJhdyB9XG59XG5cbnR5cGUgUmVzb2x2ZWRab2RUb1RzT3B0aW9ucyA9IFJldHVyblR5cGU8dHlwZW9mIHJlc29sdmVPcHRpb25zPlxuXG50eXBlIFpvZFRvVHNTdG9yZSA9IHtcbiAgbmF0aXZlRW51bXM6IHRzLkVudW1EZWNsYXJhdGlvbltdXG59XG5cbnR5cGUgWm9kVG9Uc1JldHVybiA9IHtcbiAgbm9kZTogdHMuVHlwZU5vZGVcbiAgc3RvcmU6IFpvZFRvVHNTdG9yZVxufVxuXG50eXBlIEdldFR5cGVGdW5jdGlvbiA9IChcbiAgdHlwZXNjcmlwdDogdHlwZW9mIHRzLFxuICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlc29sdmVkWm9kVG9Uc09wdGlvbnNcbikgPT4gdHMuSWRlbnRpZmllciB8IHRzLlR5cGVOb2RlXG5cbnR5cGUgR2V0VHlwZSA9IHsgX2RlZjogeyBnZXRUeXBlPzogR2V0VHlwZUZ1bmN0aW9uIH0gfVxuXG5jb25zdCBjYWxsR2V0VHlwZSA9IChcbiAgem9kOiBab2RUeXBlQW55LFxuICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlc29sdmVkWm9kVG9Uc09wdGlvbnNcbikgPT4ge1xuICBsZXQgdHlwZTogUmV0dXJuVHlwZTxHZXRUeXBlRnVuY3Rpb24+IHwgdW5kZWZpbmVkXG5cbiAgY29uc3QgZ2V0VHlwZVNjaGVtYSA9IHpvZCBhcyBHZXRUeXBlXG4gIC8vIHRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFjY2Vzc2luZyAndHlwZSdcbiAgaWYgKGdldFR5cGVTY2hlbWEuX2RlZi5nZXRUeXBlKVxuICAgIHR5cGUgPSBnZXRUeXBlU2NoZW1hLl9kZWYuZ2V0VHlwZSh0cywgaWRlbnRpZmllciwgb3B0aW9ucylcbiAgcmV0dXJuIHR5cGVcbn1cblxuZXhwb3J0IGNvbnN0IHpvZFRvVHMgPSAoXG4gIHpvZDogWm9kVHlwZUFueSxcbiAgaWRlbnRpZmllcj86IHN0cmluZyxcbiAgb3B0aW9ucz86IFpvZFRvVHNPcHRpb25zXG4pOiBab2RUb1RzUmV0dXJuID0+IHtcbiAgaWYgKCEoem9kIGluc3RhbmNlb2YgWm9kVHlwZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZTogY3JlYXRlVW5rbm93bktleXdvcmROb2RlKCksXG4gICAgICBzdG9yZTogeyBuYXRpdmVFbnVtczogW10gfSxcbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzb2x2ZWRJZGVudGlmaWVyID0gaWRlbnRpZmllciA/PyBcIklkZW50aWZpZXJcIlxuXG4gIGNvbnN0IHJlc29sdmVkT3B0aW9ucyA9IHJlc29sdmVPcHRpb25zKG9wdGlvbnMpXG5cbiAgY29uc3Qgc3RvcmU6IFpvZFRvVHNTdG9yZSA9IHsgbmF0aXZlRW51bXM6IFtdIH1cblxuICBjb25zdCBub2RlID0gem9kVG9Uc05vZGUoem9kLCByZXNvbHZlZElkZW50aWZpZXIsIHN0b3JlLCByZXNvbHZlZE9wdGlvbnMpXG5cbiAgcmV0dXJuIHsgbm9kZSwgc3RvcmUgfVxufVxuXG5jb25zdCB6b2RUb1RzTm9kZSA9IChcbiAgem9kOiBab2RUeXBlQW55LFxuICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gIHN0b3JlOiBab2RUb1RzU3RvcmUsXG4gIG9wdGlvbnM6IFJlc29sdmVkWm9kVG9Uc09wdGlvbnNcbikgPT4ge1xuICBjb25zdCB0eXBlTmFtZSA9IHpvZC5fZGVmLnR5cGVOYW1lXG5cbiAgY29uc3QgZ2V0VHlwZVR5cGUgPSBjYWxsR2V0VHlwZSh6b2QsIGlkZW50aWZpZXIsIG9wdGlvbnMpXG4gIC8vIHNwZWNpYWwgY2FzZSBuYXRpdmUgZW51bSwgd2hpY2ggbmVlZHMgYW4gaWRlbnRpZmllciBub2RlXG4gIGlmIChnZXRUeXBlVHlwZSAmJiB0eXBlTmFtZSAhPT0gXCJab2ROYXRpdmVFbnVtXCIpIHtcbiAgICByZXR1cm4gbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlKGdldFR5cGVUeXBlKVxuICB9XG5cbiAgY29uc3Qgb3RoZXJBcmd1bWVudHMgPSBbaWRlbnRpZmllciwgc3RvcmUsIG9wdGlvbnNdIGFzIGNvbnN0XG5cbiAgc3dpdGNoICh0eXBlTmFtZSkge1xuICAgIGNhc2UgXCJab2RTdHJpbmdcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE51bWJlclwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kQmlnSW50XCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkJpZ0ludEtleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2RCb29sZWFuXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLkJvb2xlYW5LZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kRGF0ZVwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJEYXRlXCIpKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kVW5kZWZpbmVkXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpXG4gICAgfVxuICAgIGNhc2UgXCJab2ROdWxsXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZU51bGwoKSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZFZvaWRcIjoge1xuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuVm9pZEtleXdvcmQpLFxuICAgICAgICBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpLFxuICAgICAgXSlcbiAgICB9XG4gICAgY2FzZSBcIlpvZEFueVwiOiB7XG4gICAgICByZXR1cm4gZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5BbnlLZXl3b3JkKVxuICAgIH1cbiAgICBjYXNlIFwiWm9kVW5rbm93blwiOiB7XG4gICAgICByZXR1cm4gY3JlYXRlVW5rbm93bktleXdvcmROb2RlKClcbiAgICB9XG4gICAgY2FzZSBcIlpvZE5ldmVyXCI6IHtcbiAgICAgIHJldHVybiBmLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShTeW50YXhLaW5kLk5ldmVyS2V5d29yZClcbiAgICB9XG4gICAgY2FzZSBcIlpvZExhenlcIjoge1xuICAgICAgLy8gaXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hhdCB0aGUgbGF6eSB2YWx1ZSBpcyByZWZlcnJpbmcgdG9cbiAgICAgIC8vIHNvIHdlIGZvcmNlIHRoZSB1c2VyIHRvIGRlY2xhcmUgaXRcbiAgICAgIGlmICghZ2V0VHlwZVR5cGUpIHJldHVybiBjcmVhdGVUeXBlUmVmZXJlbmNlRnJvbVN0cmluZyhpZGVudGlmaWVyKVxuICAgICAgYnJlYWtcbiAgICB9XG4gICAgY2FzZSBcIlpvZExpdGVyYWxcIjoge1xuICAgICAgLy8gei5saXRlcmFsKCdoaScpIC0+ICdoaSdcbiAgICAgIGxldCBsaXRlcmFsOiB0cy5MaXRlcmFsRXhwcmVzc2lvbiB8IHRzLkJvb2xlYW5MaXRlcmFsXG5cbiAgICAgIGNvbnN0IGxpdGVyYWxWYWx1ZSA9IHpvZC5fZGVmLnZhbHVlIGFzIExpdGVyYWxUeXBlXG4gICAgICBzd2l0Y2ggKHR5cGVvZiBsaXRlcmFsVmFsdWUpIHtcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOiB7XG4gICAgICAgICAgbGl0ZXJhbCA9IGYuY3JlYXRlTnVtZXJpY0xpdGVyYWwobGl0ZXJhbFZhbHVlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjoge1xuICAgICAgICAgIGxpdGVyYWwgPSBsaXRlcmFsVmFsdWUgPT09IHRydWUgPyBmLmNyZWF0ZVRydWUoKSA6IGYuY3JlYXRlRmFsc2UoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGxpdGVyYWwgPSBmLmNyZWF0ZVN0cmluZ0xpdGVyYWwobGl0ZXJhbFZhbHVlKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGxpdGVyYWwpXG4gICAgfVxuICAgIGNhc2UgXCJab2RPYmplY3RcIjoge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5lbnRyaWVzKHpvZC5fZGVmLnNoYXBlKCkpXG5cbiAgICAgIGNvbnN0IG1lbWJlcnM6IHRzLlR5cGVFbGVtZW50W10gPSBwcm9wZXJ0aWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRab2ROb2RlID0gdmFsdWUgYXMgWm9kVHlwZUFueVxuICAgICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUobmV4dFpvZE5vZGUsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICAgIGNvbnN0IHsgdHlwZU5hbWU6IG5leHRab2ROb2RlVHlwZU5hbWUgfSA9IG5leHRab2ROb2RlLl9kZWZcbiAgICAgICAgY29uc3QgaXNPcHRpb25hbCA9XG4gICAgICAgICAgbmV4dFpvZE5vZGVUeXBlTmFtZSA9PT0gXCJab2RPcHRpb25hbFwiIHx8IG5leHRab2ROb2RlLmlzT3B0aW9uYWwoKVxuXG4gICAgICAgIGNvbnN0IHByb3BlcnR5U2lnbmF0dXJlID0gZi5jcmVhdGVQcm9wZXJ0eVNpZ25hdHVyZShcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgZ2V0SWRlbnRpZmllck9yU3RyaW5nTGl0ZXJhbChrZXkpLFxuICAgICAgICAgIGlzT3B0aW9uYWwgPyBmLmNyZWF0ZVRva2VuKFN5bnRheEtpbmQuUXVlc3Rpb25Ub2tlbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgdHlwZVxuICAgICAgICApXG5cbiAgICAgICAgaWYgKG5leHRab2ROb2RlLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgYWRkSnNEb2NDb21tZW50KHByb3BlcnR5U2lnbmF0dXJlLCBuZXh0Wm9kTm9kZS5kZXNjcmlwdGlvbilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9wZXJ0eVNpZ25hdHVyZVxuICAgICAgfSlcbiAgICAgIHJldHVybiBmLmNyZWF0ZVR5cGVMaXRlcmFsTm9kZShtZW1iZXJzKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RBcnJheVwiOiB7XG4gICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudHlwZSwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVBcnJheVR5cGVOb2RlKHR5cGUpXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RFbnVtXCI6IHtcbiAgICAgIC8vIHouZW51bVsnYScsICdiJywgJ2MnXSAtPiAnYScgfCAnYicgfCAnY1xuICAgICAgY29uc3QgdHlwZXMgPSB6b2QuX2RlZi52YWx1ZXMubWFwKCh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgICBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZVN0cmluZ0xpdGVyYWwodmFsdWUpKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kVW5pb25cIjoge1xuICAgICAgLy8gei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pIC0+IHN0cmluZyB8IG51bWJlclxuICAgICAgY29uc3Qgb3B0aW9uczogWm9kVHlwZUFueVtdID0gem9kLl9kZWYub3B0aW9uc1xuICAgICAgY29uc3QgdHlwZXM6IHRzLlR5cGVOb2RlW10gPSBvcHRpb25zLm1hcCgob3B0aW9uKSA9PlxuICAgICAgICB6b2RUb1RzTm9kZShvcHRpb24sIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRGlzY3JpbWluYXRlZFVuaW9uXCI6IHtcbiAgICAgIC8vIHouZGlzY3JpbWluYXRlZFVuaW9uKCdraW5kJywgW3oub2JqZWN0KHsga2luZDogei5saXRlcmFsKCdhJyksIGE6IHouc3RyaW5nKCkgfSksIHoub2JqZWN0KHsga2luZDogei5saXRlcmFsKCdiJyksIGI6IHoubnVtYmVyKCkgfSldKSAtPiB7IGtpbmQ6ICdhJywgYTogc3RyaW5nIH0gfCB7IGtpbmQ6ICdiJywgYjogbnVtYmVyIH1cbiAgICAgIGNvbnN0IG9wdGlvbnM6IFpvZFR5cGVBbnlbXSA9IFsuLi56b2QuX2RlZi5vcHRpb25zLnZhbHVlcygpXVxuICAgICAgY29uc3QgdHlwZXM6IHRzLlR5cGVOb2RlW10gPSBvcHRpb25zLm1hcCgob3B0aW9uKSA9PlxuICAgICAgICB6b2RUb1RzTm9kZShvcHRpb24sIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgKVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZSh0eXBlcylcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRWZmZWN0c1wiOiB7XG4gICAgICAvLyBpZ25vcmUgYW55IGVmZmVjdHMsIHRoZXkgd29uJ3QgZmFjdG9yIGludG8gdGhlIHR5cGVzXG4gICAgICBjb25zdCBub2RlID0gem9kVG9Uc05vZGUoXG4gICAgICAgIHpvZC5fZGVmLnNjaGVtYSxcbiAgICAgICAgLi4ub3RoZXJBcmd1bWVudHNcbiAgICAgICkgYXMgdHMuVHlwZU5vZGVcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE5hdGl2ZUVudW1cIjoge1xuICAgICAgY29uc3QgdHlwZSA9IGdldFR5cGVUeXBlXG5cbiAgICAgIGlmIChvcHRpb25zLm5hdGl2ZUVudW1zID09PSBcInVuaW9uXCIpIHtcbiAgICAgICAgLy8gYWxsb3cgb3ZlcnJpZGluZyB3aXRoIHRoaXMgb3B0aW9uXG4gICAgICAgIGlmICh0eXBlKSByZXR1cm4gbWF5YmVJZGVudGlmaWVyVG9UeXBlUmVmZXJlbmNlKHR5cGUpXG5cbiAgICAgICAgY29uc3QgdHlwZXMgPSBPYmplY3QudmFsdWVzKHpvZC5fZGVmLnZhbHVlcykubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZU51bWVyaWNMaXRlcmFsKHZhbHVlKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGYuY3JlYXRlTGl0ZXJhbFR5cGVOb2RlKGYuY3JlYXRlU3RyaW5nTGl0ZXJhbCh2YWx1ZSBhcyBzdHJpbmcpKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKHR5cGVzKVxuICAgICAgfVxuXG4gICAgICAvLyB6Lm5hdGl2ZUVudW0oRnJ1aXRzKSAtPiBGcnVpdHNcbiAgICAgIC8vIGNhbiByZXNvbHZlIEZydWl0cyBpbnRvIHN0b3JlIGFuZCB1c2VyIGNhbiBoYW5kbGUgZW51bXNcbiAgICAgIGlmICghdHlwZSkgcmV0dXJuIGNyZWF0ZVVua25vd25LZXl3b3JkTm9kZSgpXG5cbiAgICAgIGlmIChvcHRpb25zLm5hdGl2ZUVudW1zID09PSBcInJlc29sdmVcIikge1xuICAgICAgICBjb25zdCBlbnVtTWVtYmVycyA9IE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgIHpvZC5fZGVmLnZhbHVlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+XG4gICAgICAgICkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBjb25zdCBsaXRlcmFsID1cbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgICA/IGYuY3JlYXRlTnVtZXJpY0xpdGVyYWwodmFsdWUpXG4gICAgICAgICAgICAgIDogZi5jcmVhdGVTdHJpbmdMaXRlcmFsKHZhbHVlKVxuXG4gICAgICAgICAgcmV0dXJuIGYuY3JlYXRlRW51bU1lbWJlcihnZXRJZGVudGlmaWVyT3JTdHJpbmdMaXRlcmFsKGtleSksIGxpdGVyYWwpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcih0eXBlKSkge1xuICAgICAgICAgIHN0b3JlLm5hdGl2ZUVudW1zLnB1c2goXG4gICAgICAgICAgICBmLmNyZWF0ZUVudW1EZWNsYXJhdGlvbih1bmRlZmluZWQsIHR5cGUsIGVudW1NZW1iZXJzKVxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnZ2V0VHlwZSBvbiBuYXRpdmVFbnVtIG11c3QgcmV0dXJuIGFuIGlkZW50aWZpZXIgd2hlbiBuYXRpdmVFbnVtcyBpcyBcInJlc29sdmVcIidcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1heWJlSWRlbnRpZmllclRvVHlwZVJlZmVyZW5jZSh0eXBlKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RPcHRpb25hbFwiOiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUb1RzTm9kZShcbiAgICAgICAgem9kLl9kZWYuaW5uZXJUeXBlLFxuICAgICAgICAuLi5vdGhlckFyZ3VtZW50c1xuICAgICAgKSBhcyB0cy5UeXBlTm9kZVxuICAgICAgcmV0dXJuIGYuY3JlYXRlVW5pb25UeXBlTm9kZShbXG4gICAgICAgIGlubmVyVHlwZSxcbiAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkKSxcbiAgICAgIF0pXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZE51bGxhYmxlXCI6IHtcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFRvVHNOb2RlKFxuICAgICAgICB6b2QuX2RlZi5pbm5lclR5cGUsXG4gICAgICAgIC4uLm90aGVyQXJndW1lbnRzXG4gICAgICApIGFzIHRzLlR5cGVOb2RlXG4gICAgICByZXR1cm4gZi5jcmVhdGVVbmlvblR5cGVOb2RlKFtcbiAgICAgICAgaW5uZXJUeXBlLFxuICAgICAgICBmLmNyZWF0ZUxpdGVyYWxUeXBlTm9kZShmLmNyZWF0ZU51bGwoKSksXG4gICAgICBdKVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RUdXBsZVwiOiB7XG4gICAgICAvLyB6LnR1cGxlKFt6LnN0cmluZygpLCB6Lm51bWJlcigpXSkgLT4gW3N0cmluZywgbnVtYmVyXVxuICAgICAgY29uc3QgdHlwZXMgPSB6b2QuX2RlZi5pdGVtcy5tYXAoKG9wdGlvbjogWm9kVHlwZUFueSkgPT5cbiAgICAgICAgem9kVG9Uc05vZGUob3B0aW9uLCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIClcbiAgICAgIHJldHVybiBmLmNyZWF0ZVR1cGxlVHlwZU5vZGUodHlwZXMpXG4gICAgfVxuXG4gICAgY2FzZSBcIlpvZFJlY29yZFwiOiB7XG4gICAgICAvLyB6LnJlY29yZCh6Lm51bWJlcigpKSAtPiB7IFt4OiBzdHJpbmddOiBudW1iZXIgfVxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZUxpdGVyYWxOb2RlKFtcbiAgICAgICAgZi5jcmVhdGVJbmRleFNpZ25hdHVyZShcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgZi5jcmVhdGVQYXJhbWV0ZXJEZWNsYXJhdGlvbihcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGYuY3JlYXRlSWRlbnRpZmllcihcInhcIiksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgZi5jcmVhdGVLZXl3b3JkVHlwZU5vZGUoU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHZhbHVlVHlwZVxuICAgICAgICApLFxuICAgICAgXSlcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kTWFwXCI6IHtcbiAgICAgIC8vIHoubWFwKHouc3RyaW5nKCkpIC0+IE1hcDxzdHJpbmc+XG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi52YWx1ZVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuICAgICAgY29uc3Qga2V5VHlwZSA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLmtleVR5cGUsIC4uLm90aGVyQXJndW1lbnRzKVxuXG4gICAgICBjb25zdCBub2RlID0gZi5jcmVhdGVUeXBlUmVmZXJlbmNlTm9kZShmLmNyZWF0ZUlkZW50aWZpZXIoXCJNYXBcIiksIFtcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgXSlcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kU2V0XCI6IHtcbiAgICAgIC8vIHouc2V0KHouc3RyaW5nKCkpIC0+IFNldDxzdHJpbmc+XG4gICAgICBjb25zdCB0eXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYudmFsdWVUeXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiU2V0XCIpLCBbdHlwZV0pXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RJbnRlcnNlY3Rpb25cIjoge1xuICAgICAgLy8gei5udW1iZXIoKS5hbmQoei5zdHJpbmcoKSkgLT4gbnVtYmVyICYgc3RyaW5nXG4gICAgICBjb25zdCBsZWZ0ID0gem9kVG9Uc05vZGUoem9kLl9kZWYubGVmdCwgLi4ub3RoZXJBcmd1bWVudHMpXG4gICAgICBjb25zdCByaWdodCA9IHpvZFRvVHNOb2RlKHpvZC5fZGVmLnJpZ2h0LCAuLi5vdGhlckFyZ3VtZW50cylcbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZUludGVyc2VjdGlvblR5cGVOb2RlKFtsZWZ0LCByaWdodF0pXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2RQcm9taXNlXCI6IHtcbiAgICAgIC8vIHoucHJvbWlzZSh6LnN0cmluZygpKSAtPiBQcm9taXNlPHN0cmluZz5cbiAgICAgIGNvbnN0IHR5cGUgPSB6b2RUb1RzTm9kZSh6b2QuX2RlZi50eXBlLCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgY29uc3Qgbm9kZSA9IGYuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoZi5jcmVhdGVJZGVudGlmaWVyKFwiUHJvbWlzZVwiKSwgW1xuICAgICAgICB0eXBlLFxuICAgICAgXSlcblxuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG5cbiAgICBjYXNlIFwiWm9kRnVuY3Rpb25cIjoge1xuICAgICAgLy8gei5mdW5jdGlvbigpLmFyZ3Moei5zdHJpbmcoKSkucmV0dXJucyh6Lm51bWJlcigpKSAtPiAoYXJnc18wOiBzdHJpbmcpID0+IG51bWJlclxuICAgICAgY29uc3QgYXJndW1lbnRUeXBlcyA9IHpvZC5fZGVmLmFyZ3MuX2RlZi5pdGVtcy5tYXAoXG4gICAgICAgIChhcmd1bWVudDogWm9kVHlwZUFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGFyZ3VtZW50VHlwZSA9IHpvZFRvVHNOb2RlKGFyZ3VtZW50LCAuLi5vdGhlckFyZ3VtZW50cylcblxuICAgICAgICAgIHJldHVybiBmLmNyZWF0ZVBhcmFtZXRlckRlY2xhcmF0aW9uKFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgZi5jcmVhdGVJZGVudGlmaWVyKGBhcmdzXyR7aW5kZXh9YCksXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmd1bWVudFR5cGVcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICkgYXMgdHMuUGFyYW1ldGVyRGVjbGFyYXRpb25bXVxuXG4gICAgICBhcmd1bWVudFR5cGVzLnB1c2goXG4gICAgICAgIGYuY3JlYXRlUGFyYW1ldGVyRGVjbGFyYXRpb24oXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGYuY3JlYXRlVG9rZW4oU3ludGF4S2luZC5Eb3REb3REb3RUb2tlbiksXG4gICAgICAgICAgZi5jcmVhdGVJZGVudGlmaWVyKGBhcmdzXyR7YXJndW1lbnRUeXBlcy5sZW5ndGh9YCksXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGYuY3JlYXRlQXJyYXlUeXBlTm9kZShjcmVhdGVVbmtub3duS2V5d29yZE5vZGUoKSlcbiAgICAgICAgKVxuICAgICAgKVxuXG4gICAgICBjb25zdCByZXR1cm5UeXBlID0gem9kVG9Uc05vZGUoem9kLl9kZWYucmV0dXJucywgLi4ub3RoZXJBcmd1bWVudHMpXG5cbiAgICAgIGNvbnN0IG5vZGUgPSBmLmNyZWF0ZUZ1bmN0aW9uVHlwZU5vZGUoXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYXJndW1lbnRUeXBlcyxcbiAgICAgICAgcmV0dXJuVHlwZVxuICAgICAgKVxuXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cblxuICAgIGNhc2UgXCJab2REZWZhdWx0XCI6IHtcbiAgICAgIC8vIHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZWZhdWx0KCdoaScpIC0+IHN0cmluZ1xuICAgICAgY29uc3QgdHlwZSA9IHpvZFRvVHNOb2RlKFxuICAgICAgICB6b2QuX2RlZi5pbm5lclR5cGUsXG4gICAgICAgIC4uLm90aGVyQXJndW1lbnRzXG4gICAgICApIGFzIHRzLlR5cGVOb2RlXG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkTm9kZXM6IHRzLk5vZGVbXSA9IFtdXG5cbiAgICAgIHR5cGUuZm9yRWFjaENoaWxkKChub2RlKSA9PiB7XG4gICAgICAgIGlmICghW1N5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZF0uaW5jbHVkZXMobm9kZS5raW5kKSkge1xuICAgICAgICAgIGZpbHRlcmVkTm9kZXMucHVzaChub2RlKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG5lZWRlZCB0byBzZXQgY2hpbGRyZW5cbiAgICAgIHR5cGUudHlwZXMgPSBmaWx0ZXJlZE5vZGVzXG5cbiAgICAgIHJldHVybiB0eXBlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGYuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFN5bnRheEtpbmQuQW55S2V5d29yZClcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IFByb2plY3QsIFN5bnRheEtpbmQgfSBmcm9tIFwidHMtbW9ycGhcIlxuaW1wb3J0ICogYXMgZXNidWlsZCBmcm9tIFwiZXNidWlsZFwiXG5pbXBvcnQgeyBkZWZhdWx0TWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSB9IGZyb20gXCIuL2xpYi9kZWZhdWx0LW1hcC1maWxlLXBhdGgtdG8taHR0cC1yb3V0ZVwiXG5cbmludGVyZmFjZSBHZW5lcmF0ZVJvdXRlVHlwZXNPcHRzIHtcbiAgcGFja2FnZURpcjogc3RyaW5nXG4gIGFsbG93ZWRJbXBvcnRQYXR0ZXJucz86IHN0cmluZ1tdXG4gIG91dHB1dEZpbGU/OiBzdHJpbmdcbiAgcGF0aEdsb2I/OiBzdHJpbmdcbiAgYXBpUHJlZml4Pzogc3RyaW5nXG4gIG1hcEZpbGVQYXRoVG9IVFRQUm91dGU/OiAoZmlsZV9wYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuICAvKipcbiAgICogSWYgcHJvdmlkZWQsIG9ubHkgcm91dGVzIHRoYXQgcmV0dXJuIHRydWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHR5cGVzLlxuICAgKi9cbiAgZmlsdGVyUm91dGVzPzogKHJvdXRlOiBzdHJpbmcpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIHJvdXRlcyB0aGF0IGhhdmUgYGV4Y2x1ZGVGcm9tT3BlbkFwaWAgc2V0IHRvIHRydWUgd2lsbCBiZSBleGNsdWRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgdHlwZXMuXG4gICAqIFNldCB0aGlzIHRvIHRydWUgdG8gaW5jbHVkZSB0aGVtLlxuICAgKi9cbiAgaW5jbHVkZU9wZW5BcGlFeGNsdWRlZFJvdXRlcz86IGJvb2xlYW5cbiAgZXNidWlsZE9wdGlvbnM/OiBlc2J1aWxkLkJ1aWxkT3B0aW9uc1xufVxuXG5leHBvcnQgY29uc3QgZXh0cmFjdFJvdXRlU3BlY3MgPSBhc3luYyAob3B0czogR2VuZXJhdGVSb3V0ZVR5cGVzT3B0cykgPT4ge1xuICBjb25zdCB7IHBhY2thZ2VEaXIsIHBhdGhHbG9iID0gXCIvcGFnZXMvYXBpLyoqLyoudHNcIiB9ID0gb3B0c1xuICBjb25zdCBmdWxsUGF0aEdsb2IgPSBwYXRoLnBvc2l4LmpvaW4ocGFja2FnZURpciwgcGF0aEdsb2IpXG5cbiAgY29uc3QgcHJvamVjdCA9IG5ldyBQcm9qZWN0KHsgY29tcGlsZXJPcHRpb25zOiB7IGRlY2xhcmF0aW9uOiB0cnVlIH0gfSlcblxuICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvamVjdC5hZGRTb3VyY2VGaWxlc0F0UGF0aHMoZnVsbFBhdGhHbG9iKSkge1xuICAgIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBzb3VyY2VGaWxlLmdldEV4cG9ydEFzc2lnbm1lbnQoXG4gICAgICAoZCkgPT4gIWQuaXNFeHBvcnRFcXVhbHMoKVxuICAgIClcbiAgICBpZiAoIWRlZmF1bHRFeHBvcnQpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgY3VycmllZFdpdGhSb3V0ZVNwZWNDYWxsID0gZGVmYXVsdEV4cG9ydFxuICAgICAgLmdldEV4cHJlc3Npb24oKVxuICAgICAgLmFzS2luZChTeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uKVxuICAgIGlmICghY3VycmllZFdpdGhSb3V0ZVNwZWNDYWxsKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB3aXRoUm91dGVTcGVjQ2FsbCA9IGN1cnJpZWRXaXRoUm91dGVTcGVjQ2FsbFxuICAgICAgLmdldEV4cHJlc3Npb24oKVxuICAgICAgLmFzS2luZChTeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uKVxuICAgIGlmICghd2l0aFJvdXRlU3BlY0NhbGwpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgW3JvdXRlU3BlY10gPSB3aXRoUm91dGVTcGVjQ2FsbC5nZXRBcmd1bWVudHMoKVxuICAgIGlmICghcm91dGVTcGVjKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHNvdXJjZUZpbGUuYWRkU3RhdGVtZW50cyhcbiAgICAgIGBleHBvcnQgY29uc3QgZXh0cmFjdGVkUm91dGVTcGVjID0gJHtyb3V0ZVNwZWMuZ2V0VGV4dCgpfWBcbiAgICApXG5cbiAgICBkZWZhdWx0RXhwb3J0LnJlbW92ZSgpXG5cbiAgICAvLyBSZW1vdmUgYWxsIHVudXNlZCBpbXBvcnRzIHNvIGZpbGUgY2FuIGJlIHRyZWUgc2hha2VuXG4gICAgLy8gKEFzc3VtZXMgYWxsIGltcG9ydHMgYXJlIGZyZWUgb2Ygc2lkZS1lZmZlY3RzKVxuICAgIGxldCBsYXN0V2lkdGg6IG51bWJlclxuICAgIGRvIHtcbiAgICAgIGxhc3RXaWR0aCA9IHNvdXJjZUZpbGUuZ2V0RnVsbFdpZHRoKClcbiAgICAgIC8vIE1heSBuZWVkIHRvIGNhbGwgdGhpcyBtdWx0aXBsZSB0aW1lc1xuICAgICAgc291cmNlRmlsZS5maXhVbnVzZWRJZGVudGlmaWVycygpXG4gICAgfSB3aGlsZSAobGFzdFdpZHRoICE9PSBzb3VyY2VGaWxlLmdldEZ1bGxXaWR0aCgpKVxuXG4gICAgY29uc3QgYWJzb2x1dGVQYWNrYWdlRGlyID0gcGF0aC5yZXNvbHZlKHBhY2thZ2VEaXIpXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShcbiAgICAgIGFic29sdXRlUGFja2FnZURpcixcbiAgICAgIHNvdXJjZUZpbGUuZ2V0RmlsZVBhdGgoKVxuICAgIClcbiAgICBwYXRocy5wdXNoKHJlbGF0aXZlUGF0aClcbiAgfVxuXG4gIGNvbnN0IHBhdGhUb0lkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgLy8gYWRkIHByZWZpeCB0byBhdm9pZCBzdGFydGluZyB3aXRoIGEgbnVtYmVyXG4gICAgcGF0aFRvSWRbcGF0aF0gPVxuICAgICAgXCJoYXNoXCIgKyBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUocGF0aCkuZGlnZXN0KFwiaGV4XCIpXG4gIH1cblxuICBjb25zdCBlbnRyeVBvaW50Q29udGVudCA9IGBcbiAgJHtwYXRoc1xuICAgIC5tYXAoKHApID0+IGBpbXBvcnQge2V4dHJhY3RlZFJvdXRlU3BlYyBhcyAke3BhdGhUb0lkW3BdfX0gZnJvbSBcIi4vJHtwfVwiYClcbiAgICAuam9pbihcIlxcblwiKX1cblxuICBleHBvcnQgY29uc3Qgcm91dGVzID0ge1xuICAgICR7cGF0aHNcbiAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgaHR0cFJvdXRlID0gKFxuICAgICAgICAgIG9wdHMubWFwRmlsZVBhdGhUb0hUVFBSb3V0ZSA/P1xuICAgICAgICAgIGRlZmF1bHRNYXBGaWxlUGF0aFRvSFRUUFJvdXRlKG9wdHMuYXBpUHJlZml4KVxuICAgICAgICApKHApXG5cbiAgICAgICAgcmV0dXJuIGBcIiR7aHR0cFJvdXRlfVwiOiAke3BhdGhUb0lkW3BdfWBcbiAgICAgIH0pXG4gICAgICAuam9pbihcIixcXG5cIil9XG4gIH1cbiAgYFxuXG4gIC8vIENvcHkgYWxsb3dlZCBpbXBvcnQgZ2xvYnMgaW50byBwcm9qZWN0XG4gIGlmIChvcHRzLmFsbG93ZWRJbXBvcnRQYXR0ZXJucykge1xuICAgIHByb2plY3QuYWRkU291cmNlRmlsZXNBdFBhdGhzKG9wdHMuYWxsb3dlZEltcG9ydFBhdHRlcm5zKVxuICB9XG5cbiAgLy8gR2VuZXJhdGUgdHlwZXMgKC5kLnRzKVxuICBjb25zdCBlbnRyeVBvaW50ID0gcHJvamVjdC5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIFwiZXh0cmFjdGVkLXJvdXRlLXNwZWNzLnRzXCIsXG4gICAgZW50cnlQb2ludENvbnRlbnRcbiAgKVxuICBjb25zdCBlbWl0UmVzdWx0ID0gZW50cnlQb2ludC5nZXRFbWl0T3V0cHV0KHsgZW1pdE9ubHlEdHNGaWxlczogdHJ1ZSB9KVxuICBpZiAob3B0cy5vdXRwdXRGaWxlKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb25GaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIHBhdGguZGlybmFtZShvcHRzLm91dHB1dEZpbGUpLFxuICAgICAgcGF0aC5iYXNlbmFtZShvcHRzLm91dHB1dEZpbGUpLnJlcGxhY2UoXCIubWpzXCIsIFwiXCIpLnJlcGxhY2UoXCIuanNcIiwgXCJcIikgK1xuICAgICAgICBcIi5kLnRzXCJcbiAgICApXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKFxuICAgICAgZGVjbGFyYXRpb25GaWxlUGF0aCxcbiAgICAgIGVtaXRSZXN1bHQuZ2V0T3V0cHV0RmlsZXMoKVswXS5nZXRUZXh0KClcbiAgICApXG4gIH1cblxuICAvLyBHZW5lcmF0ZSB2YWx1ZXMgKC5qcylcbiAgY29uc3QgcGtnUmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgcGF0aC5qb2luKHBhY2thZ2VEaXIsIFwicGFja2FnZS5qc29uXCIpLFxuICAgIFwidXRmLThcIlxuICApXG4gIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UocGtnUmF3KVxuXG4gIGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgIC4uLm9wdHMuZXNidWlsZE9wdGlvbnMsXG4gICAgc3RkaW46IHtcbiAgICAgIGNvbnRlbnRzOiBlbnRyeVBvaW50Q29udGVudCxcbiAgICAgIHJlc29sdmVEaXI6IHBhdGgucmVzb2x2ZShwYWNrYWdlRGlyKSxcbiAgICB9LFxuICAgIG91dGZpbGU6IG9wdHMub3V0cHV0RmlsZSxcbiAgICBidW5kbGU6IHRydWUsXG4gICAgcGxhdGZvcm06IFwibm9kZVwiLFxuICAgIGZvcm1hdDogXCJlc21cIixcbiAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICBleHRlcm5hbDogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocGtnLmRlcGVuZGVuY2llcyksXG4gICAgICAuLi5PYmplY3Qua2V5cyhwa2cuZGV2RGVwZW5kZW5jaWVzKSxcbiAgICAgIC4uLihvcHRzLmVzYnVpbGRPcHRpb25zPy5leHRlcm5hbCA/PyBbXSksXG4gICAgXSxcbiAgICBwbHVnaW5zOiBbXG4gICAgICAvLyBXaXRoIHRoaXMgcGx1Z2luLCBlc2J1aWxkIHdpbGwgbmV2ZXIgdG91Y2ggdGhlIGFjdHVhbCBmaWxlc3lzdGVtIGFuZCB0aHVzIGNhbm5vdCBpbnRlcmFjdCB3aXRoIGltcG9ydHMgdGhhdCBkb24ndCBtYXRjaCBhbGxvd2VkSW1wb3J0UGF0dGVybnNbXS5cbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJyZXNvbHZlLXZpcnR1YWwtZnNcIixcbiAgICAgICAgc2V0dXAoYnVpbGQpIHtcbiAgICAgICAgICBidWlsZC5vbkxvYWQoeyBmaWx0ZXI6IC8uKi8gfSwgKGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gcHJvamVjdC5nZXRTb3VyY2VGaWxlKGFyZ3MucGF0aCk/LmdldEZ1bGxUZXh0KClcbiAgICAgICAgICAgIGlmICghY29udGVudHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogXCJleHBvcnQgZGVmYXVsdCB7fVwiLFxuICAgICAgICAgICAgICAgIGxvYWRlcjogXCJ0c1wiLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnRzLFxuICAgICAgICAgICAgICBsb2FkZXI6IFwidHNcIixcbiAgICAgICAgICAgICAgcmVzb2x2ZURpcjogcGF0aC5kaXJuYW1lKGFyZ3MucGF0aCksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi4ob3B0cy5lc2J1aWxkT3B0aW9ucz8ucGx1Z2lucyA/PyBbXSksXG4gICAgXSxcbiAgfSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFBQTs7O0FDQUE7QUFBQSxPQUFPLFFBQVE7QUFDZjtBQUFBLEVBQ0U7QUFBQSxPQUdLO0FBRVAsU0FBUyxLQUFBQSxVQUFTOzs7QUNQbEI7QUFBQSxPQUFPQyxXQUFVOzs7QUNBakI7QUFBQSxPQUFPLFVBQVU7QUFFVixJQUFNLGdDQUNYLENBQUMsYUFBcUIsV0FDdEIsQ0FBQyxjQUFzQjtBQUNyQixRQUFNLFFBQVEsVUFFWCxRQUFRLFNBQVMsR0FBRyxFQUVwQixRQUFRLE9BQU8sRUFBRSxFQUVqQixRQUFRLFVBQVUsRUFBRSxFQUVwQixRQUFRLFlBQVksRUFBRSxFQUV0QixRQUFRLFVBQVUsRUFBRSxFQUVwQixRQUFRLFNBQVMsRUFBRSxFQUVuQixRQUFRLFVBQVUsRUFBRSxFQUVwQixRQUFRLGlCQUFpQixFQUFFO0FBRTlCLFNBQU8sS0FBSyxLQUFLLFlBQVksS0FBSztBQUNwQzs7O0FEYkssSUFBTSx1QkFBdUIsT0FBTyxTQU1KO0FBQ3JDLFFBQU0sU0FBUyxNQUFNLCtDQUFPLDZCQUFVO0FBQ3RDLFFBQU0sVUFBVSxNQUFNLCtDQUFPLDZCQUFXO0FBQ3hDLFFBQU07QUFB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QixnQkFBQUEsSUFBa0M7QUFDbkQsZ0JBQUksQ0FBQyxVQUFVO0FBQ2IscUJBQU87QUFBQSxnQkFDTCxVQUFVO0FBQUEsZ0JBQ1YsUUFBUTtBQUFBLGNBQ1Y7QUFBQSxZQUNGO0FBRUEsbUJBQU87QUFBQSxjQUNMO0FBQUEsY0FDQSxRQUFRO0FBQUEsY0FDUixZQUFZRixNQUFLLFFBQVEsS0FBSyxJQUFJO0FBQUEsWUFDcEM7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLE1BQ0EsSUFBSSxnQkFBSyxtQkFBTCxtQkFBcUIsWUFBckIsWUFBZ0MsQ0FBQztBQUFBLElBQ3ZDO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbInoiLCAicGF0aCIsICJwYXRoIiwgInBhdGgiLCAiZGVkZW50IiwgInBhdGgiLCAiZGVkZW50IiwgIl9hIiwgInoiLCAiZnMiLCAiZGVkZW50IiwgInBhcnNlRGVzY3JpcHRpb24iLCAib3B0aW9ucyIsICJ6IiwgIl8iLCAiZnMiLCAicGF0aCIsICJTeW50YXhLaW5kIiwgInBhdGgiLCAiU3ludGF4S2luZCIsICJfYSIsICJidWlsZCJdCn0K