UNPKG

@tai-kun/surrealdb

Version:

The SurrealDB SDK for JavaScript

184 lines (182 loc) 44.4 kB
var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); // src/clients/standard/client.ts import Base from "../basic/index.mjs"; import { QueryFailedError } from "../../errors/index.mjs"; import { isTable } from "../../utils/index.mjs"; import Jwt from "./jwt.mjs"; var _Client = class _Client extends Base { async ping(options) { await this.rpc("ping", [], options); } async use(...args) { let namespace; let database; let options; if (typeof args[0] === "string" || args[0] == null) { const [ns, arg1, arg2] = args; const [db, opts] = typeof arg1 === "string" || arg1 == null ? [arg1, arg2] : [void 0, arg2]; namespace = ns; database = db; options = opts; } else if (Array.isArray(args[0])) { const [[ns, db], opts] = args; namespace = ns; database = db; options = opts; } else if ("ns" in args[0] || "db" in args[0]) { const [{ ns, db }, opts] = args; namespace = ns; database = db; options = opts; } else if ("namespace" in args[0] || "database" in args[0]) { const [{ namespace: ns, database: db }, opts] = args; namespace = ns; database = db; options = opts; } await this.rpc("use", [namespace, database], options); } async info(options) { return await this.rpc("info", [], options); } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#signup) */ async signup(auth, options) { return new Jwt(await this.rpc("signup", [auth], options)); } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#signin) */ async signin(auth, options) { return new Jwt(await this.rpc("signin", [auth], options)); } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#authenticate) */ async authenticate(token, options) { if (typeof token !== "string") { token = token.raw; } await this.rpc("authenticate", [token], options); } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/connecting/#invalidate) */ async invalidate(options) { await this.rpc("invalidate", [], options); } // TODO(tai-kun): バッファリングオプションを追加 async live(table, options = {}) { const { diff, ...rest } = options; const queryUuid = await this.rpc("live", [table, diff], rest); return queryUuid; } subscribe(queryUuid, callback) { this.ee.on(`live_${queryUuid}`, callback); } unsubscribe(queryUuid, callback) { this.ee.off(`live_${queryUuid}`, callback); } async kill(queryUuid, options) { if (Array.isArray(queryUuid)) { await Promise.all(queryUuid.map(async (uuid) => { await this.kill(uuid, options); })); } else { this.ee.off(`live_${queryUuid}`); await this.rpc("kill", [queryUuid], options); } } /** * [API Reference](https://tai-kun.github.io/surrealdb.js/v2/guides/querying/#queryraw) */ async queryRaw(surql, vars, options) { const results = await this.rpc( "query", [surql, vars], options ); return results; } async query(surql, vars, options) { const results = await this.queryRaw(surql, vars, options); const output = []; const errors = []; for (const result of results) { if (result.status === "OK") { output.push(result.result); } else { errors.push(result.result); } } if (errors.length > 0) { throw new QueryFailedError(errors); } if (typeof surql === "string") { return output; } return surql._trans(surql._parse(output)); } async let(name, value, options) { await this.rpc("let", [name, value], options); } async unset(name, options) { await this.rpc("unset", [name], options); } async select(target, options) { return await this.rpc("select", [target], options); } async create(target, data, options) { return await this.rpc("create", [target, data], options); } async insert(...args) { const [table, data, options] = isTable(args[0]) || typeof args[0] === "string" || typeof args[0] == null ? args : [null, args[0], args[1]]; return await this.rpc("insert", [table, data], options); } async insert_relation(...args) { const [table, data, options] = isTable(args[0]) || typeof args[0] === "string" || typeof args[0] == null ? args : [null, args[0], args[1]]; return await this.rpc("insert_relation", [table, data], options); } async update(target, data, options) { return await this.rpc("update", [target, data], options); } async upsert(target, data, options) { return await this.rpc("upsert", [target, data], options); } async merge(target, data, options) { return await this.rpc("merge", [target, data], options); } async patch(target, patches, options) { const { diff, ...rest } = options || {}; return await this.rpc("patch", [target, patches, diff], rest); } async delete(target, options) { return await this.rpc("delete", [target], options); } async version(options) { return await this.rpc("version", [], options); } async run(funcName, arg1, arg2) { const [args, opts] = Array.isArray(arg1) || arg1 === void 0 ? [arg1, arg2] : [, arg1]; const { version, ...rest } = opts || {}; return await this.rpc("run", [funcName, version, args], rest); } /** * @experimental */ async graphql(query, options = {}) { const { signal, ...gqlOptions } = options; return await this.rpc("graphql", [query, gqlOptions], { signal }); } async relate(from, thing, to, data, options) { return await this.rpc("relate", [from, thing, to, data], options); } }; __name(_Client, "Client"); var Client = _Client; export { Client as default }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NsaWVudHMvc3RhbmRhcmQvY2xpZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgQmFzZSwgeyB0eXBlIENsaWVudFJwY09wdGlvbnMgfSBmcm9tIFwiQHRhaS1rdW4vc3VycmVhbGRiL2Jhc2ljLWNsaWVudFwiO1xuaW1wb3J0IHsgUXVlcnlGYWlsZWRFcnJvciB9IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEF1dGgsXG4gIExpdmVQYXlsb2FkLFxuICBQYXRjaCxcbiAgUHJlcGFyZWRRdWVyeUxpa2UsXG4gIFF1ZXJ5UmVzdWx0LFxuICBSZWFkb25seVBhdGNoLFxuICBSZWNvcmRBY2Nlc3NBdXRoLFxuICBScGNHcmFwaHFsUmVxdWVzdCxcbiAgUnBjUmVzdWx0TWFwcGluZyxcbiAgU2xvdExpa2UsXG59IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvdHlwZXNcIjtcbmltcG9ydCB7IGlzVGFibGUsIHR5cGUgVGFza0xpc3RlbmVyIH0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBTaW1wbGlmeSwgVW5pb25Ub0ludGVyc2VjdGlvbiB9IGZyb20gXCJ0eXBlLWZlc3RcIjtcbmltcG9ydCB0eXBlIHsgRGF0YVR5cGUgfSBmcm9tIFwiLi4vLi4vc3VycmVhbC9kYXRhLXR5cGVzXCI7XG5pbXBvcnQgSnd0IGZyb20gXCIuL2p3dFwiO1xuXG4vLyByZS1leHBvcnRzXG5leHBvcnQgdHlwZSAqIGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvYmFzaWMtY2xpZW50XCI7XG5cbnR5cGUgT3ZlcnJpZGU8VCwgVT4gPSBTaW1wbGlmeTxPbWl0PFQsIGtleW9mIFU+ICYgVT47XG5cbmV4cG9ydCB0eXBlIEluZmVyU2xvdFZhcnM8VFNsb3QgZXh0ZW5kcyBTbG90TGlrZT4gPSBVbmlvblRvSW50ZXJzZWN0aW9uPFxuICAvLyBkcHJpbnQtaWdub3JlXG4gIHtcbiAgICBbVE5hbWUgaW4gVFNsb3RbXCJuYW1lXCJdXTpcbiAgICAgIFRTbG90IGV4dGVuZHMgU2xvdExpa2U8VE5hbWUsIGluZmVyIFRSZXF1aXJlZCwgaW5mZXIgVFZhbHVlPlxuICAgICAgICA/IFRSZXF1aXJlZCBleHRlbmRzIGZhbHNlXG4gICAgICAgID8geyByZWFkb25seSBbXyBpbiBUTmFtZV0/OiBUVmFsdWUgfVxuICAgICAgICA6IHsgcmVhZG9ubHkgW18gaW4gVE5hbWVdOiAgVFZhbHVlIH0gLy8gYm9vbGVhbiBcdTMwNkVcdTU4MzRcdTU0MDhcdTMwODJcdTVGQzVcdTk4MDhcdTMwNjdcdTMwMDJcbiAgICAgICAgOiBuZXZlcjtcbiAgfVtUU2xvdFtcIm5hbWVcIl1dXG4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIExpdmVPcHRpb25zIGV4dGVuZHMgQ2xpZW50UnBjT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGRpZmY/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBMaXZlSGFuZGxlcjxUUGF5bG9hZCBleHRlbmRzIExpdmVQYXlsb2FkPGFueSwgYW55PiA9IExpdmVQYXlsb2FkPiA9XG4gIFRhc2tMaXN0ZW5lcjxbcGF5bG9hZDogVFBheWxvYWRdPjtcblxuZXhwb3J0IHR5cGUgSW5mZXJMaXZlUGF5bG9hZDxcbiAgVFV1aWQsXG4gIFREYXRhIGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICBUUGF0Y2ggZXh0ZW5kcyBQYXRjaFtdID0gUGF0Y2hbXSxcbj4gPSBUVXVpZCBleHRlbmRzIHsgX19kaWZmOiBmYWxzZSB9XG4gID8gTGl2ZVBheWxvYWQuRGF0YTxURGF0YSwgRGF0YVR5cGUuVGhpbmcgfCBzdHJpbmc+XG4gIDogVFV1aWQgZXh0ZW5kcyB7IF9fZGlmZjogdHJ1ZSB9XG4gICAgPyBMaXZlUGF5bG9hZC5EaWZmPFREYXRhLCBUUGF0Y2gsIERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nPlxuICA6IExpdmVQYXlsb2FkPFREYXRhLCBUUGF0Y2g+O1xuXG5leHBvcnQgdHlwZSBBY3Rpb25SZXN1bHQ8XG4gIFREYXRhIGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuPiA9IFtFeHRyYWN0PGtleW9mIFREYXRhLCBcImlkXCI+XSBleHRlbmRzIFtuZXZlcl1cbiAgPyAoeyBpZDogRGF0YVR5cGUuVGhpbmcgfCBzdHJpbmcgfSAmIFREYXRhKVxuICA6IFREYXRhO1xuXG50eXBlIF9JbjxUPiA9IFtFeHRyYWN0PGtleW9mIFQsIFwiaW5cIj5dIGV4dGVuZHMgW25ldmVyXVxuICA/ICh7IGluOiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZyB9ICYgVClcbiAgOiBUO1xuXG50eXBlIF9PdXQ8VD4gPSBbRXh0cmFjdDxrZXlvZiBULCBcIm91dFwiPl0gZXh0ZW5kcyBbbmV2ZXJdXG4gID8gKHsgb3V0OiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZyB9ICYgVClcbiAgOiBUO1xuXG5leHBvcnQgdHlwZSBSZWxhdGVSZXN1bHQ8XG4gIFREYXRhIGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuPiA9IEFjdGlvblJlc3VsdDxfSW48X091dDxURGF0YT4+PjtcblxuZXhwb3J0IGludGVyZmFjZSBQYXRjaE9wdGlvbnMgZXh0ZW5kcyBDbGllbnRScGNPcHRpb25zIHtcbiAgcmVhZG9ubHkgZGlmZj86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuT3B0aW9ucyBleHRlbmRzIENsaWVudFJwY09wdGlvbnMge1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyYXBocWxPcHRpb25zXG4gIGV4dGVuZHMgQ2xpZW50UnBjT3B0aW9ucywgTm9uTnVsbGFibGU8UnBjR3JhcGhxbFJlcXVlc3RbXCJwYXJhbXNcIl1bMV0+XG57fVxuXG50eXBlIFJlY29yZERhdGEgPSB7XG4gIFtwOiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuLy8gREVGSU5FIFRBQkxFIC4uLiBUWVBFIE5PUk1BTFxudHlwZSBOb3JtYWxSZWNvcmQgPSB7XG4gIGlkOiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZztcbiAgLy8gUmVjb3JkRGF0YVxuICBbcDogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWVudCBleHRlbmRzIEJhc2Uge1xuICBhc3luYyBwaW5nKG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5ycGMoXCJwaW5nXCIsIFtdLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIHVzZShcbiAgICBuczogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPjtcblxuICBhc3luYyB1c2UoXG4gICAgbnM6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgZGI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPHZvaWQ+O1xuXG4gIGFzeW5jIHVzZShcbiAgICB0YXJnZXQ6IFtuczogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGI/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXSxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPjtcblxuICBhc3luYyB1c2UoXG4gICAgdGFyZ2V0OiB7XG4gICAgICByZWFkb25seSBucz86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICByZWFkb25seSBkYj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPjtcblxuICBhc3luYyB1c2UoXG4gICAgdGFyZ2V0OiB7XG4gICAgICByZWFkb25seSBuYW1lc3BhY2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgcmVhZG9ubHkgZGF0YWJhc2U/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8dm9pZD47XG5cbiAgYXN5bmMgdXNlKFxuICAgIC4uLmFyZ3M6XG4gICAgICB8IFtcbiAgICAgICAgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICAgICAgKENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQpPyxcbiAgICAgIF1cbiAgICAgIHwgW1xuICAgICAgICBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgICAgICAoc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk/LFxuICAgICAgICAoQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCk/LFxuICAgICAgXVxuICAgICAgfCBbXG4gICAgICAgIFtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCAoc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk/XSxcbiAgICAgICAgKENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQpPyxcbiAgICAgIF1cbiAgICAgIHwgW1xuICAgICAgICB7XG4gICAgICAgICAgcmVhZG9ubHkgbnM/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIHJlYWRvbmx5IGRiPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgICAgKENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQpPyxcbiAgICAgIF1cbiAgICAgIHwgW1xuICAgICAgICB7XG4gICAgICAgICAgcmVhZG9ubHkgbmFtZXNwYWNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICByZWFkb25seSBkYXRhYmFzZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIChDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkKT8sXG4gICAgICBdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBuYW1lc3BhY2U6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGRhdGFiYXNlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGxldCBvcHRpb25zOiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSBcInN0cmluZ1wiIHx8IGFyZ3NbMF0gPT0gbnVsbCkge1xuICAgICAgY29uc3QgW25zLCBhcmcxLCBhcmcyXSA9IGFyZ3M7XG4gICAgICBjb25zdCBbZGIsIG9wdHNdID0gdHlwZW9mIGFyZzEgPT09IFwic3RyaW5nXCIgfHwgYXJnMSA9PSBudWxsXG4gICAgICAgID8gW2FyZzEsIGFyZzJdXG4gICAgICAgIDogW3VuZGVmaW5lZCwgYXJnMl07XG4gICAgICBuYW1lc3BhY2UgPSBucztcbiAgICAgIGRhdGFiYXNlID0gZGI7XG4gICAgICBvcHRpb25zID0gb3B0cztcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnc1swXSkpIHtcbiAgICAgIGNvbnN0IFtbbnMsIGRiXSwgb3B0c10gPSBhcmdzO1xuICAgICAgbmFtZXNwYWNlID0gbnM7XG4gICAgICBkYXRhYmFzZSA9IGRiO1xuICAgICAgb3B0aW9ucyA9IG9wdHMgYXMgQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKFwibnNcIiBpbiBhcmdzWzBdIHx8IFwiZGJcIiBpbiBhcmdzWzBdKSB7XG4gICAgICBjb25zdCBbeyBucywgZGIgfSwgb3B0c10gPSBhcmdzO1xuICAgICAgbmFtZXNwYWNlID0gbnM7XG4gICAgICBkYXRhYmFzZSA9IGRiO1xuICAgICAgb3B0aW9ucyA9IG9wdHMgYXMgQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKFwibmFtZXNwYWNlXCIgaW4gYXJnc1swXSB8fCBcImRhdGFiYXNlXCIgaW4gYXJnc1swXSkge1xuICAgICAgY29uc3QgW3sgbmFtZXNwYWNlOiBucywgZGF0YWJhc2U6IGRiIH0sIG9wdHNdID0gYXJncztcbiAgICAgIG5hbWVzcGFjZSA9IG5zO1xuICAgICAgZGF0YWJhc2UgPSBkYjtcbiAgICAgIG9wdGlvbnMgPSBvcHRzIGFzIENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5ycGMoXCJ1c2VcIiwgW25hbWVzcGFjZSwgZGF0YWJhc2VdLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIGluZm88VCBleHRlbmRzIFJwY1Jlc3VsdE1hcHBpbmdbXCJpbmZvXCJdID0gUnBjUmVzdWx0TWFwcGluZ1tcImluZm9cIl0+KFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ycGMoXCJpbmZvXCIsIFtdLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL2Nvbm5lY3RpbmcvI3NpZ251cClcbiAgICovXG4gIGFzeW5jIHNpZ251cChcbiAgICBhdXRoOiBSZWNvcmRBY2Nlc3NBdXRoLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEp3dD4ge1xuICAgIHJldHVybiBuZXcgSnd0KGF3YWl0IHRoaXMucnBjKFwic2lnbnVwXCIsIFthdXRoXSwgb3B0aW9ucykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9ndWlkZXMvY29ubmVjdGluZy8jc2lnbmluKVxuICAgKi9cbiAgYXN5bmMgc2lnbmluKFxuICAgIGF1dGg6IEF1dGgsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8Snd0PiB7XG4gICAgcmV0dXJuIG5ldyBKd3QoYXdhaXQgdGhpcy5ycGMoXCJzaWduaW5cIiwgW2F1dGhdLCBvcHRpb25zKSk7XG4gIH1cblxuICAvKipcbiAgICogW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vdGFpLWt1bi5naXRodWIuaW8vc3VycmVhbGRiLmpzL3YyL2d1aWRlcy9jb25uZWN0aW5nLyNhdXRoZW50aWNhdGUpXG4gICAqL1xuICBhc3luYyBhdXRoZW50aWNhdGUoXG4gICAgdG9rZW46IHN0cmluZyB8IEp3dCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdG9rZW4gPSB0b2tlbi5yYXc7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5ycGMoXCJhdXRoZW50aWNhdGVcIiwgW3Rva2VuXSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vdGFpLWt1bi5naXRodWIuaW8vc3VycmVhbGRiLmpzL3YyL2d1aWRlcy9jb25uZWN0aW5nLyNpbnZhbGlkYXRlKVxuICAgKi9cbiAgYXN5bmMgaW52YWxpZGF0ZShcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5ycGMoXCJpbnZhbGlkYXRlXCIsIFtdLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIGxpdmU8VCBleHRlbmRzIERhdGFUeXBlLlV1aWQgfCBzdHJpbmcgPSBEYXRhVHlwZS5VdWlkIHwgc3RyaW5nPihcbiAgICB0YWJsZTogRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogQ2xpZW50UnBjT3B0aW9ucyAmIHsgcmVhZG9ubHkgZGlmZjogdHJ1ZSB9LFxuICApOiBQcm9taXNlPFQgJiB7IF9fZGlmZjogdHJ1ZSB9PjtcblxuICBhc3luYyBsaXZlPFQgZXh0ZW5kcyBEYXRhVHlwZS5VdWlkIHwgc3RyaW5nID0gRGF0YVR5cGUuVXVpZCB8IHN0cmluZz4oXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nLFxuICAgIG9wdGlvbnM/OlxuICAgICAgfCAoQ2xpZW50UnBjT3B0aW9ucyAmIHsgcmVhZG9ubHkgZGlmZj86IGZhbHNlIHwgdW5kZWZpbmVkIH0pXG4gICAgICB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxUICYgeyBfX2RpZmY6IGZhbHNlIH0+O1xuXG4gIGFzeW5jIGxpdmU8VCBleHRlbmRzIERhdGFUeXBlLlV1aWQgfCBzdHJpbmcgPSBEYXRhVHlwZS5VdWlkIHwgc3RyaW5nPihcbiAgICB0YWJsZTogRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcsXG4gICAgb3B0aW9ucz86IExpdmVPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPFQgJiB7IF9fZGlmZjogYm9vbGVhbiB9PjtcblxuICAvLyBUT0RPKHRhaS1rdW4pOiBcdTMwRDBcdTMwQzNcdTMwRDVcdTMwQTFcdTMwRUFcdTMwRjNcdTMwQjBcdTMwQUFcdTMwRDdcdTMwQjdcdTMwRTdcdTMwRjNcdTMwOTJcdThGRkRcdTUyQTBcbiAgYXN5bmMgbGl2ZShcbiAgICB0YWJsZTogRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogTGl2ZU9wdGlvbnMgfCB1bmRlZmluZWQgPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgeyBkaWZmLCAuLi5yZXN0IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHF1ZXJ5VXVpZCA9IGF3YWl0IHRoaXMucnBjKFwibGl2ZVwiLCBbdGFibGUsIGRpZmZdLCByZXN0KTtcblxuICAgIHJldHVybiBxdWVyeVV1aWQ7XG4gIH1cblxuICBzdWJzY3JpYmU8XG4gICAgVFV1aWQsXG4gICAgVFBheWxvYWQgZXh0ZW5kcyBMaXZlUGF5bG9hZDxhbnksIGFueT4gPSBJbmZlckxpdmVQYXlsb2FkPFRVdWlkPixcbiAgPihcbiAgICBxdWVyeVV1aWQ6IFRVdWlkLFxuICAgIGNhbGxiYWNrOiBMaXZlSGFuZGxlcjxUUGF5bG9hZD4sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZWUub24oYGxpdmVfJHtxdWVyeVV1aWR9YCwgY2FsbGJhY2sgYXMgTGl2ZUhhbmRsZXI8YW55Pik7XG4gIH1cblxuICB1bnN1YnNjcmliZShcbiAgICBxdWVyeVV1aWQ6IERhdGFUeXBlLlV1aWQgfCBzdHJpbmcsXG4gICAgY2FsbGJhY2s6IExpdmVIYW5kbGVyPGFueT4sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZWUub2ZmKGBsaXZlXyR7cXVlcnlVdWlkfWAsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGFzeW5jIGtpbGwoXG4gICAgcXVlcnlVdWlkOiBEYXRhVHlwZS5VdWlkIHwgc3RyaW5nIHwgcmVhZG9ubHkgKERhdGFUeXBlLlV1aWQgfCBzdHJpbmcpW10sXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5VXVpZCkpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHF1ZXJ5VXVpZC5tYXAoYXN5bmMgdXVpZCA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMua2lsbCh1dWlkLCBvcHRpb25zKTtcbiAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZS5vZmYoYGxpdmVfJHtxdWVyeVV1aWR9YCk7XG4gICAgICBhd2FpdCB0aGlzLnJwYyhcImtpbGxcIiwgW3F1ZXJ5VXVpZF0sIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL3F1ZXJ5aW5nLyNxdWVyeXJhdylcbiAgICovXG4gIGFzeW5jIHF1ZXJ5UmF3PFRSZXN1bHRzIGV4dGVuZHMgcmVhZG9ubHkgUXVlcnlSZXN1bHRbXSA9IFF1ZXJ5UmVzdWx0W10+KFxuICAgIHN1cnFsOiBzdHJpbmcgfCBQcmVwYXJlZFF1ZXJ5TGlrZSxcbiAgICB2YXJzPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8VFJlc3VsdHM+IHtcbiAgICBjb25zdCByZXN1bHRzOiByZWFkb25seSBRdWVyeVJlc3VsdFtdID0gYXdhaXQgdGhpcy5ycGMoXG4gICAgICBcInF1ZXJ5XCIsXG4gICAgICBbc3VycWwsIHZhcnNdLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdHMgYXMgVFJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vdGFpLWt1bi5naXRodWIuaW8vc3VycmVhbGRiLmpzL3YyL2d1aWRlcy9xdWVyeWluZy8jcXVlcnkpXG4gICAqL1xuICBhc3luYyBxdWVyeTxUUmV0dXJucyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSA9IHVua25vd25bXT4oXG4gICAgc3VycWw6IHN0cmluZyxcbiAgICB2YXJzPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8VFJldHVybnM+O1xuXG4gIC8qKlxuICAgKiBbQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly90YWkta3VuLmdpdGh1Yi5pby9zdXJyZWFsZGIuanMvdjIvZ3VpZGVzL3F1ZXJ5aW5nLyNxdWVyeSlcbiAgICovXG4gIGFzeW5jIHF1ZXJ5PFRSZXN1bHQ+KFxuICAgIHN1cnFsOiBPdmVycmlkZTxQcmVwYXJlZFF1ZXJ5TGlrZSwge1xuICAgICAgcmVhZG9ubHkgc2xvdHM6IHJlYWRvbmx5IFNsb3RMaWtlPGFueSwgZmFsc2UsIGFueT5bXTtcbiAgICAgIHJlYWRvbmx5IF9fdHlwZTogVFJlc3VsdDtcbiAgICB9PixcbiAgICB2YXJzPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8VFJlc3VsdD47XG5cbiAgLyoqXG4gICAqIFtBUEkgUmVmZXJlbmNlXShodHRwczovL3RhaS1rdW4uZ2l0aHViLmlvL3N1cnJlYWxkYi5qcy92Mi9ndWlkZXMvcXVlcnlpbmcvI3F1ZXJ5KVxuICAgKi9cbiAgYXN5bmMgcXVlcnk8VFNsb3QgZXh0ZW5kcyBTbG90TGlrZSwgVFJlc3VsdD4oXG4gICAgc3VycWw6IE92ZXJyaWRlPFByZXBhcmVkUXVlcnlMaWtlLCB7XG4gICAgICByZWFkb25seSBzbG90czogcmVhZG9ubHkgVFNsb3RbXTtcbiAgICAgIHJlYWRvbmx5IF9fdHlwZTogVFJlc3VsdDtcbiAgICB9PixcbiAgICB2YXJzOiBTaW1wbGlmeTxJbmZlclNsb3RWYXJzPFRTbG90Pj4gJiBSZWFkb25seTxSZWNvcmREYXRhPixcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0PjtcblxuICBhc3luYyBxdWVyeShcbiAgICBzdXJxbDogc3RyaW5nIHwgUHJlcGFyZWRRdWVyeUxpa2UsXG4gICAgdmFycz86IFJlYWRvbmx5PFJlY29yZERhdGE+IHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5xdWVyeVJhdyhzdXJxbCwgdmFycywgb3B0aW9ucyk7XG4gICAgY29uc3Qgb3V0cHV0OiB1bmtub3duW10gPSBbXTtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJPS1wiKSB7XG4gICAgICAgIG91dHB1dC5wdXNoKHJlc3VsdC5yZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0LnJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgUXVlcnlGYWlsZWRFcnJvcihlcnJvcnMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc3VycWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cnFsLl90cmFucyhzdXJxbC5fcGFyc2Uob3V0cHV0KSk7XG4gIH1cblxuICBhc3luYyBsZXQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJwYyhcImxldFwiLCBbbmFtZSwgdmFsdWVdLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIHVuc2V0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5ycGMoXCJ1bnNldFwiLCBbbmFtZV0sIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgc2VsZWN0PFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gID4oXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0PltdPjtcblxuICBhc3luYyBzZWxlY3Q8XG4gICAgVFJlc3VsdCBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gUmVjb3JkRGF0YSxcbiAgPihcbiAgICB0aGluZzogRGF0YVR5cGUuVGhpbmcsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8QWN0aW9uUmVzdWx0PFRSZXN1bHQ+PjtcblxuICBhc3luYyBzZWxlY3QoXG4gICAgdGFyZ2V0OlxuICAgICAgfCAoRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcpXG4gICAgICB8IERhdGFUeXBlLlRoaW5nLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ycGMoXCJzZWxlY3RcIiwgW3RhcmdldF0sIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nLFxuICAgIGRhdGE/OiBURGF0YSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBY3Rpb25SZXN1bHQ8VFJlc3VsdD4+O1xuXG4gIGFzeW5jIGNyZWF0ZTxcbiAgICBUUmVzdWx0IGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICAgIFREYXRhIGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBUUmVzdWx0LFxuICA+KFxuICAgIHRoaW5nOiBEYXRhVHlwZS5UaGluZyxcbiAgICBkYXRhPzogVERhdGEgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8QWN0aW9uUmVzdWx0PFRSZXN1bHQ+PjtcblxuICBhc3luYyBjcmVhdGUoXG4gICAgdGFyZ2V0OlxuICAgICAgfCAoRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcpXG4gICAgICB8IERhdGFUeXBlLlRoaW5nLFxuICAgIGRhdGE/OiBSZWFkb25seTxSZWNvcmREYXRhPiB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnBjKFwiY3JlYXRlXCIsIFt0YXJnZXQsIGRhdGFdLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydDxcbiAgICBUUmVzdWx0IGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICAgIFREYXRhIGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBUUmVzdWx0LFxuICA+KFxuICAgIHRhYmxlOiBEYXRhVHlwZS5UYWJsZSB8IHN0cmluZyxcbiAgICBkYXRhPzogVERhdGEgfCByZWFkb25seSBURGF0YVtdIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0PltdPjtcblxuICBhc3luYyBpbnNlcnQ8XG4gICAgVFJlc3VsdCBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gUmVjb3JkRGF0YSxcbiAgICBURGF0YSBleHRlbmRzIFJlYWRvbmx5PE5vcm1hbFJlY29yZD4gPSAoXG4gICAgICBUUmVzdWx0IGV4dGVuZHMgeyByZWFkb25seSBpZDogYW55IH0gPyBUUmVzdWx0XG4gICAgICAgIDogKHsgaWQ6IERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nIH0gJiBUUmVzdWx0KVxuICAgICksXG4gID4oXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICBkYXRhPzogVERhdGEgfCByZWFkb25seSBURGF0YVtdIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0PltdPjtcblxuICBhc3luYyBpbnNlcnQ8XG4gICAgVFJlc3VsdCBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gUmVjb3JkRGF0YSxcbiAgICBURGF0YSBleHRlbmRzIFJlYWRvbmx5PE5vcm1hbFJlY29yZD4gPSAoXG4gICAgICBUUmVzdWx0IGV4dGVuZHMgeyByZWFkb25seSBpZDogYW55IH0gPyBUUmVzdWx0XG4gICAgICAgIDogKHsgaWQ6IERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nIH0gJiBUUmVzdWx0KVxuICAgICksXG4gID4oXG4gICAgZGF0YTogVERhdGEgfCByZWFkb25seSBURGF0YVtdLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0PltdPjtcblxuICBhc3luYyBpbnNlcnQoXG4gICAgLi4uYXJnczpcbiAgICAgIHwgW1xuICAgICAgICB0YWJsZTogRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgICAgICBkYXRhPzpcbiAgICAgICAgICB8IFJlYWRvbmx5PFJlY29yZERhdGE+XG4gICAgICAgICAgfCByZWFkb25seSBSZWFkb25seTxSZWNvcmREYXRhPltdXG4gICAgICAgICAgfCB1bmRlZmluZWQsXG4gICAgICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICAgICAgXVxuICAgICAgfCBbXG4gICAgICAgIGRhdGE6IFJlYWRvbmx5PE5vcm1hbFJlY29yZD4gfCByZWFkb25seSBSZWFkb25seTxOb3JtYWxSZWNvcmQ+W10sXG4gICAgICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICAgICAgXVxuICApIHtcbiAgICBjb25zdCBbdGFibGUsIGRhdGEsIG9wdGlvbnNdOiBbYW55PywgYW55PywgYW55P10gPVxuICAgICAgaXNUYWJsZTxEYXRhVHlwZS5UYWJsZT4oYXJnc1swXSlcbiAgICAgICAgfHwgdHlwZW9mIGFyZ3NbMF0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgfHwgdHlwZW9mIGFyZ3NbMF0gPT0gbnVsbFxuICAgICAgICA/IGFyZ3NcbiAgICAgICAgOiBbbnVsbCwgYXJnc1swXSwgYXJnc1sxXV07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ycGMoXCJpbnNlcnRcIiwgW3RhYmxlLCBkYXRhXSwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBpbnNlcnRfcmVsYXRpb248XG4gICAgVFJlc3VsdCBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gUmVjb3JkRGF0YSxcbiAgICBURGF0YSBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gVFJlc3VsdCxcbiAgPihcbiAgICB0YWJsZTogRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcsXG4gICAgZGF0YT86IFREYXRhIHwgcmVhZG9ubHkgVERhdGFbXSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxSZWxhdGVSZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgaW5zZXJ0X3JlbGF0aW9uPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxOb3JtYWxSZWNvcmQ+ID0gKFxuICAgICAgVFJlc3VsdCBleHRlbmRzIHsgcmVhZG9ubHkgaWQ6IGFueSB9ID8gVFJlc3VsdFxuICAgICAgICA6ICh7IGlkOiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZyB9ICYgVFJlc3VsdClcbiAgICApLFxuICA+KFxuICAgIHRhYmxlOiBEYXRhVHlwZS5UYWJsZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgZGF0YT86IFREYXRhIHwgcmVhZG9ubHkgVERhdGFbXSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxSZWxhdGVSZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgaW5zZXJ0X3JlbGF0aW9uPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxOb3JtYWxSZWNvcmQ+ID0gKFxuICAgICAgVFJlc3VsdCBleHRlbmRzIHsgcmVhZG9ubHkgaWQ6IGFueSB9ID8gVFJlc3VsdFxuICAgICAgICA6ICh7IGlkOiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZyB9ICYgVFJlc3VsdClcbiAgICApLFxuICA+KFxuICAgIGRhdGE6IFREYXRhIHwgcmVhZG9ubHkgVERhdGFbXSxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxSZWxhdGVSZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgaW5zZXJ0X3JlbGF0aW9uKFxuICAgIC4uLmFyZ3M6XG4gICAgICB8IFtcbiAgICAgICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YT86XG4gICAgICAgICAgfCBSZWFkb25seTxSZWNvcmREYXRhPlxuICAgICAgICAgIHwgcmVhZG9ubHkgUmVhZG9ubHk8UmVjb3JkRGF0YT5bXVxuICAgICAgICAgIHwgdW5kZWZpbmVkLFxuICAgICAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgICAgIF1cbiAgICAgIHwgW1xuICAgICAgICBkYXRhOiBSZWFkb25seTxOb3JtYWxSZWNvcmQ+IHwgcmVhZG9ubHkgUmVhZG9ubHk8Tm9ybWFsUmVjb3JkPltdLFxuICAgICAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgICAgIF1cbiAgKSB7XG4gICAgY29uc3QgW3RhYmxlLCBkYXRhLCBvcHRpb25zXTogW2FueT8sIGFueT8sIGFueT9dID1cbiAgICAgIGlzVGFibGU8RGF0YVR5cGUuVGFibGU+KGFyZ3NbMF0pXG4gICAgICAgIHx8IHR5cGVvZiBhcmdzWzBdID09PSBcInN0cmluZ1wiXG4gICAgICAgIHx8IHR5cGVvZiBhcmdzWzBdID09IG51bGxcbiAgICAgICAgPyBhcmdzXG4gICAgICAgIDogW251bGwsIGFyZ3NbMF0sIGFyZ3NbMV1dO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnBjKFwiaW5zZXJ0X3JlbGF0aW9uXCIsIFt0YWJsZSwgZGF0YV0sIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nLFxuICAgIGRhdGE/OiBURGF0YSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBY3Rpb25SZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgdXBkYXRlPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgdGhpbmc6IERhdGFUeXBlLlRoaW5nLFxuICAgIGRhdGE/OiBURGF0YSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBY3Rpb25SZXN1bHQ8VFJlc3VsdD4+O1xuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICB0YXJnZXQ6XG4gICAgICB8IChEYXRhVHlwZS5UYWJsZSB8IHN0cmluZylcbiAgICAgIHwgRGF0YVR5cGUuVGhpbmcsXG4gICAgZGF0YT86IFJlYWRvbmx5PFJlY29yZERhdGE+IHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ycGMoXCJ1cGRhdGVcIiwgW3RhcmdldCwgZGF0YV0sIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgdXBzZXJ0PFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nLFxuICAgIGRhdGE/OiBURGF0YSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBY3Rpb25SZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgdXBzZXJ0PFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgdGhpbmc6IERhdGFUeXBlLlRoaW5nLFxuICAgIGRhdGE/OiBURGF0YSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBY3Rpb25SZXN1bHQ8VFJlc3VsdD4+O1xuXG4gIGFzeW5jIHVwc2VydChcbiAgICB0YXJnZXQ6XG4gICAgICB8IChEYXRhVHlwZS5UYWJsZSB8IHN0cmluZylcbiAgICAgIHwgRGF0YVR5cGUuVGhpbmcsXG4gICAgZGF0YT86IFJlYWRvbmx5PFJlY29yZERhdGE+IHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ycGMoXCJ1cHNlcnRcIiwgW3RhcmdldCwgZGF0YV0sIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgbWVyZ2U8XG4gICAgVFJlc3VsdCBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gUmVjb3JkRGF0YSxcbiAgICBURGF0YSBleHRlbmRzIFJlYWRvbmx5PFJlY29yZERhdGE+ID0gVFJlc3VsdCxcbiAgPihcbiAgICB0YWJsZTogRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcsXG4gICAgZGF0YTogVERhdGEsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8QWN0aW9uUmVzdWx0PFRSZXN1bHQ+W10+O1xuXG4gIGFzeW5jIG1lcmdlPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgdGhpbmc6IERhdGFUeXBlLlRoaW5nLFxuICAgIGRhdGE6IFREYXRhLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0Pj47XG5cbiAgYXN5bmMgbWVyZ2UoXG4gICAgdGFyZ2V0OlxuICAgICAgfCAoRGF0YVR5cGUuVGFibGUgfCBzdHJpbmcpXG4gICAgICB8IERhdGFUeXBlLlRoaW5nLFxuICAgIGRhdGE6IFJlYWRvbmx5PFJlY29yZERhdGE+LFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ycGMoXCJtZXJnZVwiLCBbdGFyZ2V0LCBkYXRhXSwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBwYXRjaDxcbiAgICBUUmVzdWx0IGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICA+KFxuICAgIHRhYmxlOiBEYXRhVHlwZS5UYWJsZSB8IHN0cmluZyxcbiAgICBwYXRjaGVzOiByZWFkb25seSBSZWFkb25seVBhdGNoW10sXG4gICAgb3B0aW9ucz86XG4gICAgICB8IChDbGllbnRScGNPcHRpb25zICYgeyByZWFkb25seSBkaWZmPzogZmFsc2UgfCB1bmRlZmluZWQgfSlcbiAgICAgIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0PltdPjtcblxuICBhc3luYyBwYXRjaDxcbiAgICBUUmVzdWx0IGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICA+KFxuICAgIHRoaW5nOiBEYXRhVHlwZS5UaGluZyxcbiAgICBwYXRjaGVzOiByZWFkb25seSBSZWFkb25seVBhdGNoW10sXG4gICAgb3B0aW9ucz86XG4gICAgICB8IChDbGllbnRScGNPcHRpb25zICYgeyByZWFkb25seSBkaWZmPzogZmFsc2UgfCB1bmRlZmluZWQgfSlcbiAgICAgIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0Pj47XG5cbiAgYXN5bmMgcGF0Y2goXG4gICAgdGFibGU6IERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nLFxuICAgIHBhdGNoZXM6IHJlYWRvbmx5IFJlYWRvbmx5UGF0Y2hbXSxcbiAgICBvcHRpb25zOiBDbGllbnRScGNPcHRpb25zICYgeyByZWFkb25seSBkaWZmOiB0cnVlIH0sXG4gICk6IFByb21pc2U8UGF0Y2hbXVtdPjtcblxuICBhc3luYyBwYXRjaChcbiAgICB0aGluZzogRGF0YVR5cGUuVGhpbmcsXG4gICAgcGF0Y2hlczogcmVhZG9ubHkgUmVhZG9ubHlQYXRjaFtdLFxuICAgIG9wdGlvbnM6IENsaWVudFJwY09wdGlvbnMgJiB7IHJlYWRvbmx5IGRpZmY6IHRydWUgfSxcbiAgKTogUHJvbWlzZTxQYXRjaFtdPjtcblxuICBhc3luYyBwYXRjaChcbiAgICB0YXJnZXQ6XG4gICAgICB8IChEYXRhVHlwZS5UYWJsZSB8IHN0cmluZylcbiAgICAgIHwgRGF0YVR5cGUuVGhpbmcsXG4gICAgcGF0Y2hlczogcmVhZG9ubHkgUmVhZG9ubHlQYXRjaFtdLFxuICAgIG9wdGlvbnM/OiBQYXRjaE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGNvbnN0IHsgZGlmZiwgLi4ucmVzdCB9ID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnJwYyhcInBhdGNoXCIsIFt0YXJnZXQsIHBhdGNoZXMsIGRpZmZdLCByZXN0KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZTxcbiAgICBUUmVzdWx0IGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICA+KFxuICAgIHRhYmxlOiBEYXRhVHlwZS5UYWJsZSB8IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBY3Rpb25SZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgZGVsZXRlPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gID4oXG4gICAgdGhpbmc6IERhdGFUeXBlLlRoaW5nLFxuICAgIG9wdGlvbnM/OiBDbGllbnRScGNPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPEFjdGlvblJlc3VsdDxUUmVzdWx0Pj47XG5cbiAgYXN5bmMgZGVsZXRlKFxuICAgIHRhcmdldDpcbiAgICAgIHwgKERhdGFUeXBlLlRhYmxlIHwgc3RyaW5nKVxuICAgICAgfCBEYXRhVHlwZS5UaGluZyxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnBjKFwiZGVsZXRlXCIsIFt0YXJnZXRdLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIHZlcnNpb24ob3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJwYyhcInZlcnNpb25cIiwgW10sIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgcnVuPFQgPSB1bmtub3duPihcbiAgICBmdW5jTmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBSdW5PcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPFQ+O1xuXG4gIGFzeW5jIHJ1bjxUID0gdW5rbm93bj4oXG4gICAgZnVuY05hbWU6IHN0cmluZyxcbiAgICBhcmdzPzogcmVhZG9ubHkgdW5rbm93bltdIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM/OiBSdW5PcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPFQ+O1xuXG4gIGFzeW5jIHJ1bihcbiAgICBmdW5jTmFtZTogc3RyaW5nLFxuICAgIGFyZzE/OiByZWFkb25seSB1bmtub3duW10gfCBSdW5PcHRpb25zIHwgdW5kZWZpbmVkLFxuICAgIGFyZzI/OiBSdW5PcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBjb25zdCBbYXJncywgb3B0c10gPSBBcnJheS5pc0FycmF5KGFyZzEpIHx8IGFyZzEgPT09IHVuZGVmaW5lZFxuICAgICAgPyBbYXJnMSwgYXJnMl0gYXMgY29uc3RcbiAgICAgIDogWywgYXJnMV0gYXMgY29uc3Q7XG4gICAgY29uc3QgeyB2ZXJzaW9uLCAuLi5yZXN0IH0gPSBvcHRzIHx8IHt9O1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnBjKFwicnVuXCIsIFtmdW5jTmFtZSwgdmVyc2lvbiwgYXJnc10sIHJlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIGFzeW5jIGdyYXBocWwoXG4gICAgLy8gYHZhcnNgIG9mIGB2YXJpYWJsZXNgXG4gICAgLy8gYG9wZXJhdGlvbmAgb3IgYG9wZXJhdGlvbk5hbWVgXG4gICAgcXVlcnk6IHN0cmluZyB8IHtcbiAgICAgIHJlYWRvbmx5IHF1ZXJ5OiBzdHJpbmc7XG4gICAgICByZWFkb25seSB2YXJzPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQ7XG4gICAgICByZWFkb25seSBvcGVyYXRpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgfSB8IHtcbiAgICAgIHJlYWRvbmx5IHF1ZXJ5OiBzdHJpbmc7XG4gICAgICByZWFkb25seSB2YXJzPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQ7XG4gICAgICByZWFkb25seSBvcGVyYXRpb25OYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIH0gfCB7XG4gICAgICByZWFkb25seSBxdWVyeTogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgdmFyaWFibGVzPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQ7XG4gICAgICByZWFkb25seSBvcGVyYXRpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgfSB8IHtcbiAgICAgIHJlYWRvbmx5IHF1ZXJ5OiBzdHJpbmc7XG4gICAgICByZWFkb25seSB2YXJpYWJsZXM/OiBSZWFkb25seTxSZWNvcmREYXRhPiB8IHVuZGVmaW5lZDtcbiAgICAgIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICBvcHRpb25zOiBHcmFwaHFsT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHt9LFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgc2lnbmFsLCAuLi5ncWxPcHRpb25zIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnBjKFwiZ3JhcGhxbFwiLCBbcXVlcnksIGdxbE9wdGlvbnNdLCB7IHNpZ25hbCB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlbGF0ZTxcbiAgICBUUmVzdWx0IGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBSZWNvcmREYXRhLFxuICAgIFREYXRhIGV4dGVuZHMgUmVhZG9ubHk8UmVjb3JkRGF0YT4gPSBUUmVzdWx0LFxuICA+KFxuICAgIGZyb206IERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nIHwgcmVhZG9ubHkgKERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nKVtdLFxuICAgIHRoaW5nOiBzdHJpbmcsXG4gICAgdG86IERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nIHwgcmVhZG9ubHkgKERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nKVtdLFxuICAgIGRhdGE/OiBURGF0YSB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogQ2xpZW50UnBjT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxSZWxhdGVSZXN1bHQ8VFJlc3VsdD5bXT47XG5cbiAgYXN5bmMgcmVsYXRlPFxuICAgIFRSZXN1bHQgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFJlY29yZERhdGEsXG4gICAgVERhdGEgZXh0ZW5kcyBSZWFkb25seTxSZWNvcmREYXRhPiA9IFRSZXN1bHQsXG4gID4oXG4gICAgZnJvbTogRGF0YVR5cGUuVGhpbmcgfCBzdHJpbmcgfCByZWFkb25seSAoRGF0YVR5cGUuVGhpbmcgfCBzdHJpbmcpW10sXG4gICAgdGhpbmc6IERhdGFUeXBlLlRoaW5nLFxuICAgIHRvOiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZyB8IHJlYWRvbmx5IChEYXRhVHlwZS5UaGluZyB8IHN0cmluZylbXSxcbiAgICBkYXRhPzogVERhdGEgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8UmVsYXRlUmVzdWx0PFRSZXN1bHQ+PjtcblxuICBhc3luYyByZWxhdGUoXG4gICAgZnJvbTogRGF0YVR5cGUuVGhpbmcgfCBzdHJpbmcgfCByZWFkb25seSAoRGF0YVR5cGUuVGhpbmcgfCBzdHJpbmcpW10sXG4gICAgdGhpbmc6IERhdGFUeXBlLlRoaW5nIHwgc3RyaW5nLFxuICAgIHRvOiBEYXRhVHlwZS5UaGluZyB8IHN0cmluZyB8IHJlYWRvbmx5IChEYXRhVHlwZS5UaGluZyB8IHN0cmluZylbXSxcbiAgICBkYXRhPzogUmVhZG9ubHk8UmVjb3JkRGF0YT4gfCB1bmRlZmluZWQsXG4gICAgb3B0aW9ucz86IENsaWVudFJwY09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJwYyhcInJlbGF0ZVwiLCBbZnJvbSwgdGhpbmcsIHRvLCBkYXRhXSwgb3B0aW9ucyk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7QUFBQSxPQUFPLFVBQXFDO0FBQzVDLFNBQVMsd0JBQXdCO0FBYWpDLFNBQVMsZUFBa0M7QUFHM0MsT0FBTyxTQUFTO0FBNkVoQixJQUFxQixVQUFyQixNQUFxQixnQkFBZSxLQUFLO0FBQUEsRUFDdkMsTUFBTSxLQUFLLFNBQXVEO0FBQ2hFLFVBQU0sS0FBSyxJQUFJLFFBQVEsQ0FBQyxHQUFHLE9BQU87QUFBQSxFQUNwQztBQUFBLEVBa0NBLE1BQU0sT0FDRCxNQTRCWTtBQUNmLFFBQUk7QUFDSixRQUFJO0FBQ0osUUFBSTtBQUVKLFFBQUksT0FBTyxLQUFLLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQyxLQUFLLE1BQU07QUFDbEQsWUFBTSxDQUFDLElBQUksTUFBTSxJQUFJLElBQUk7QUFDekIsWUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLE9BQU8sU0FBUyxZQUFZLFFBQVEsT0FDbkQsQ0FBQyxNQUFNLElBQUksSUFDWCxDQUFDLFFBQVcsSUFBSTtBQUNwQixrQkFBWTtBQUNaLGlCQUFXO0FBQ1gsZ0JBQVU7QUFBQSxJQUNaLFdBQVcsTUFBTSxRQUFRLEtBQUssQ0FBQyxDQUFDLEdBQUc7QUFDakMsWUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJO0FBQ3pCLGtCQUFZO0FBQ1osaUJBQVc7QUFDWCxnQkFBVTtBQUFBLElBQ1osV0FBVyxRQUFRLEtBQUssQ0FBQyxLQUFLLFFBQVEsS0FBSyxDQUFDLEdBQUc7QUFDN0MsWUFBTSxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJO0FBQzNCLGtCQUFZO0FBQ1osaUJBQVc7QUFDWCxnQkFBVTtBQUFBLElBQ1osV0FBVyxlQUFlLEtBQUssQ0FBQyxLQUFLLGNBQWMsS0FBSyxDQUFDLEdBQUc7QUFDMUQsWUFBTSxDQUFDLEVBQUUsV0FBVyxJQUFJLFVBQVUsR0FBRyxHQUFHLElBQUksSUFBSTtBQUNoRCxrQkFBWTtBQUNaLGlCQUFXO0FBQ1gsZ0JBQVU7QUFBQSxJQUNaO0FBRUEsVUFBTSxLQUFLLElBQUksT0FBTyxDQUFDLFdBQVcsUUFBUSxHQUFHLE9BQU87QUFBQSxFQUN0RDtBQUFBLEVBRUEsTUFBTSxLQUNKLFNBQ1k7QUFDWixXQUFPLE1BQU0sS0FBSyxJQUFJLFFBQVEsQ0FBQyxHQUFHLE9BQU87QUFBQSxFQUMzQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBTSxPQUNKLE1BQ0EsU0FDYztBQUNkLFdBQU8sSUFBSSxJQUFJLE1BQU0sS0FBSyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO0FBQUEsRUFDMUQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQU0sT0FDSixNQUNBLFNBQ2M7QUFDZCxXQUFPLElBQUksSUFBSSxNQUFNLEtBQUssSUFBSSxVQUFVLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUFBLEVBQzFEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFNLGFBQ0osT0FDQSxTQUNlO0FBQ2YsUUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM3QixjQUFRLE1BQU07QUFBQSxJQUNoQjtBQUVBLFVBQU0sS0FBSyxJQUFJLGdCQUFnQixDQUFDLEtBQUssR0FBRyxPQUFPO0FBQUEsRUFDakQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQU0sV0FDSixTQUNlO0FBQ2YsVUFBTSxLQUFLLElBQUksY0FBYyxDQUFDLEdBQUcsT0FBTztBQUFBLEVBQzFDO0FBQUE7QUFBQSxFQW9CQSxNQUFNLEtBQ0osT0FDQSxVQUFtQyxDQUFDLEdBQ3BDO0FBQ0EsVUFBTSxFQUFFLE1BQU0sR0FBRyxLQUFLLElBQUk7QUFDMUIsVUFBTSxZQUFZLE1BQU0sS0FBSyxJQUFJLFFBQVEsQ0FBQyxPQUFPLElBQUksR0FBRyxJQUFJO0FBRTVELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxVQUlFLFdBQ0EsVUFDTTtBQUNOLFNBQUssR0FBRyxHQUFHLFFBQVEsU0FBUyxJQUFJLFFBQTRCO0FBQUEsRUFDOUQ7QUFBQSxFQUVBLFlBQ0UsV0FDQSxVQUNNO0FBQ04sU0FBSyxHQUFHLElBQUksUUFBUSxTQUFTLElBQUksUUFBUTtBQUFBLEVBQzNDO0FBQUEsRUFFQSxNQUFNLEtBQ0osV0FDQSxTQUNlO0FBQ2YsUUFBSSxNQUFNLFFBQVEsU0FBUyxHQUFHO0FBQzVCLFlBQU0sUUFBUSxJQUFJLFVBQVUsSUFBSSxPQUFNLFNBQVE7QUFDNUMsY0FBTSxLQUFLLEtBQUssTUFBTSxPQUFPO0FBQUEsTUFDL0IsQ0FBQyxDQUFDO0FBQUEsSUFDSixPQUFPO0FBQ0wsV0FBSyxHQUFHLElBQUksUUFBUSxTQUFTLEVBQUU7QUFDL0IsWUFBTSxLQUFLLElBQUksUUFBUSxDQUFDLFNBQVMsR0FBRyxPQUFPO0FBQUEsSUFDN0M7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFNLFNBQ0osT0FDQSxNQUNBLFNBQ21CO0FBQ25CLFVBQU0sVUFBa0MsTUFBTSxLQUFLO0FBQUEsTUFDakQ7QUFBQSxNQUNBLENBQUMsT0FBTyxJQUFJO0FBQUEsTUFDWjtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBbUNBLE1BQU0sTUFDSixPQUNBLE1BQ0EsU0FDa0I7QUFDbEIsVUFBTSxVQUFVLE1BQU0sS0FBSyxTQUFTLE9BQU8sTUFBTSxPQUFPO0FBQ3hELFVBQU0sU0FBb0IsQ0FBQztBQUMzQixVQUFNLFNBQW1CLENBQUM7QUFFMUIsZUFBVyxVQUFVLFNBQVM7QUFDNUIsVUFBSSxPQUFPLFdBQVcsTUFBTTtBQUMxQixlQUFPLEtBQUssT0FBTyxNQUFNO0FBQUEsTUFDM0IsT0FBTztBQUNMLGVBQU8sS0FBSyxPQUFPLE1BQU07QUFBQSxNQUMzQjtBQUFBLElBQ0Y7QUFFQSxRQUFJLE9BQU8sU0FBUyxHQUFHO0FBQ3JCLFlBQU0sSUFBSSxpQkFBaUIsTUFBTTtBQUFBLElBQ25DO0FBRUEsUUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM3QixhQUFPO0FBQUEsSUFDVDtBQUVBLFdBQU8sTUFBTSxPQUFPLE1BQU0sT0FBTyxNQUFNLENBQUM7QUFBQSxFQUMxQztBQUFBLEVBRUEsTUFBTSxJQUNKLE1BQ0EsT0FDQSxTQUNlO0FBQ2YsVUFBTSxLQUFLLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxHQUFHLE9BQU87QUFBQSxFQUM5QztBQUFBLEVBRUEsTUFBTSxNQUNKLE1BQ0EsU0FDZTtBQUNmLFVBQU0sS0FBSyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEdBQUcsT0FBTztBQUFBLEVBQ3pDO0FBQUEsRUFnQkEsTUFBTSxPQUNKLFFBR0EsU0FDQTtBQUNBLFdBQU8sTUFBTSxLQUFLLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxPQUFPO0FBQUEsRUFDbkQ7QUFBQSxFQW9CQSxNQUFNLE9BQ0osUUFHQSxNQUNBLFNBQ0E7QUFDQSxXQUFPLE1BQU0sS0FBSyxJQUFJLFVBQVUsQ0FBQyxRQUFRLElBQUksR0FBRyxPQUFPO0FBQUEsRUFDekQ7QUFBQSxFQWtDQSxNQUFNLFVBQ0QsTUFhSDtBQUNBLFVBQU0sQ0FBQyxPQUFPLE1BQU0sT0FBTyxJQUN6QixRQUF3QixLQUFLLENBQUMsQ0FBQyxLQUMxQixPQUFPLEtBQUssQ0FBQyxNQUFNLFlBQ25CLE9BQU8sS0FBSyxDQUFDLEtBQUssT0FDbkIsT0FDQSxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFFN0IsV0FBTyxNQUFNLEtBQUssSUFBSSxVQUFVLENBQUMsT0FBTyxJQUFJLEdBQUcsT0FBTztBQUFBLEVBQ3hEO0FBQUEsRUFrQ0EsTUFBTSxtQkFDRCxNQWFIO0FBQ0EsVUFBTSxDQUFDLE9BQU8sTUFBTSxPQUFPLElBQ3pCLFFBQXdCLEtBQUssQ0FBQyxDQUFDLEtBQzFCLE9BQU8sS0FBSyxDQUFDLE1BQU0sWUFDbkIsT0FBTyxLQUFLLENBQUMsS0FBSyxPQUNuQixPQUNBLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUU3QixXQUFPLE1BQU0sS0FBSyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sSUFBSSxHQUFHLE9BQU87QUFBQSxFQUNqRTtBQUFBLEVBb0JBLE1BQU0sT0FDSixRQUdBLE1BQ0EsU0FDQTtBQUNBLFdBQU8sTUFBTSxLQUFLLElBQUksVUFBVSxDQUFDLFFBQVEsSUFBSSxHQUFHLE9BQU87QUFBQSxFQUN6RDtBQUFBLEVBb0JBLE1BQU0sT0FDSixRQUdBLE1BQ0EsU0FDQTtBQUNBLFdBQU8sTUFBTSxLQUFLLElBQUksVUFBVSxDQUFDLFFBQVEsSUFBSSxHQUFHLE9BQU87QUFBQSxFQUN6RDtBQUFBLEVBb0JBLE1BQU0sTUFDSixRQUdBLE1BQ0EsU0FDQTtBQUNBLFdBQU8sTUFBTSxLQUFLLElBQUksU0FBUyxDQUFDLFFBQVEsSUFBSSxHQUFHLE9BQU87QUFBQSxFQUN4RDtBQUFBLEVBa0NBLE1BQU0sTUFDSixRQUdBLFNBQ0EsU0FDQTtBQUNBLFVBQU0sRUFBRSxNQUFNLEdBQUcsS0FBSyxJQUFJLFdBQVcsQ0FBQztBQUV0QyxXQUFPLE1BQU0sS0FBSyxJQUFJLFNBQVMsQ0FBQyxRQUFRLFNBQVMsSUFBSSxHQUFHLElBQUk7QUFBQSxFQUM5RDtBQUFBLEVBZ0JBLE1BQU0sT0FDSixRQUdBLFNBQ0E7QUFDQSxXQUFPLE1BQU0sS0FBSyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsT0FBTztBQUFBLEVBQ25EO0FBQUEsRUFFQSxNQUFNLFFBQVEsU0FBeUQ7QUFDckUsV0FBTyxNQUFNLEtBQUssSUFBSSxXQUFXLENBQUMsR0FBRyxPQUFPO0FBQUEsRUFDOUM7QUFBQSxFQWFBLE1BQU0sSUFDSixVQUNBLE1BQ0EsTUFDQTtBQUNBLFVBQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxNQUFNLFFBQVEsSUFBSSxLQUFLLFNBQVMsU0FDakQsQ0FBQyxNQUFNLElBQUksSUFDWCxDQUFDLEVBQUUsSUFBSTtBQUNYLFVBQU0sRUFBRSxTQUFTLEdBQUcsS0FBSyxJQUFJLFFBQVEsQ0FBQztBQUV0QyxXQUFPLE1BQU0sS0FBSyxJQUFJLE9BQU8sQ0FBQyxVQUFVLFNBQVMsSUFBSSxHQUFHLElBQUk7QUFBQSxFQUM5RDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBTSxRQUdKLE9BaUJBLFVBQXNDLENBQUMsR0FDdEI7QUFDakIsVUFBTSxFQUFFLFFBQVEsR0FBRyxXQUFXLElBQUk7QUFFbEMsV0FBTyxNQUFNLEtBQUssSUFBSSxXQUFXLENBQUMsT0FBTyxVQUFVLEdBQUcsRUFBRSxPQUFPLENBQUM7QUFBQSxFQUNsRTtBQUFBLEVBd0JBLE1BQU0sT0FDSixNQUNBLE9BQ0EsSUFDQSxNQUNBLFNBQ0E7QUFDQSxXQUFPLE1BQU0sS0FBSyxJQUFJLFVBQVUsQ0FBQyxNQUFNLE9BQU8sSUFBSSxJQUFJLEdBQUcsT0FBTztBQUFBLEVBQ2xFO0FBQ0Y7QUFqc0J5QztBQUF6QyxJQUFxQixTQUFyQjsiLAogICJuYW1lcyI6IFtdCn0K