@blinkk/root-cms 1.1.3 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.js +20 -7
- package/dist/cli.js +1 -1
- package/dist/{client-HeqoTA-T.d.ts → client-RzUT90wD.d.ts} +17 -7
- package/dist/client.d.ts +2 -2
- package/dist/client.js +1 -1
- package/dist/core.d.ts +2 -2
- package/dist/core.js +1 -1
- package/dist/functions.js +1 -1
- package/dist/plugin.d.ts +1 -1
- package/dist/plugin.js +87 -3
- package/dist/ui/ui.css +319 -50
- package/dist/ui/ui.js +83008 -62304
- package/package.json +11 -4
package/dist/plugin.js
CHANGED
|
@@ -210,8 +210,60 @@ function alphanumeric(input) {
|
|
|
210
210
|
// core/api.ts
|
|
211
211
|
import { multipartMiddleware } from "@blinkk/root/middleware";
|
|
212
212
|
|
|
213
|
-
// core/
|
|
213
|
+
// core/ai.ts
|
|
214
214
|
import crypto from "node:crypto";
|
|
215
|
+
import { generate } from "@genkit-ai/ai";
|
|
216
|
+
import { configureGenkit } from "@genkit-ai/core";
|
|
217
|
+
import { vertexAI } from "@genkit-ai/vertexai";
|
|
218
|
+
import { gemini15FlashPreview } from "@genkit-ai/vertexai";
|
|
219
|
+
var genkitIsConfigured = false;
|
|
220
|
+
var Chat = class {
|
|
221
|
+
constructor(chatClient, id) {
|
|
222
|
+
this.chatClient = chatClient;
|
|
223
|
+
this.cmsClient = chatClient.cmsClient;
|
|
224
|
+
this.id = id;
|
|
225
|
+
}
|
|
226
|
+
async sendPrompt(prompt) {
|
|
227
|
+
if (!genkitIsConfigured) {
|
|
228
|
+
const cmsConfig = this.cmsClient.cmsPlugin.getConfig();
|
|
229
|
+
const firebaseConfig = cmsConfig.firebaseConfig;
|
|
230
|
+
configureGenkit({
|
|
231
|
+
plugins: [
|
|
232
|
+
vertexAI({
|
|
233
|
+
projectId: firebaseConfig.projectId,
|
|
234
|
+
// TODO(stevenle): figure out where to get this.
|
|
235
|
+
location: firebaseConfig.location || "us-central1"
|
|
236
|
+
})
|
|
237
|
+
]
|
|
238
|
+
});
|
|
239
|
+
genkitIsConfigured = true;
|
|
240
|
+
}
|
|
241
|
+
console.log(prompt);
|
|
242
|
+
const res = await generate({
|
|
243
|
+
// model: gemini15ProPreview,
|
|
244
|
+
model: gemini15FlashPreview,
|
|
245
|
+
prompt
|
|
246
|
+
});
|
|
247
|
+
console.log(res);
|
|
248
|
+
return res.text();
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
var ChatClient = class {
|
|
252
|
+
constructor(cmsClient, user) {
|
|
253
|
+
this.cmsClient = cmsClient;
|
|
254
|
+
this.user = user;
|
|
255
|
+
}
|
|
256
|
+
async createChat() {
|
|
257
|
+
const chatId = crypto.randomUUID();
|
|
258
|
+
return new Chat(this, chatId);
|
|
259
|
+
}
|
|
260
|
+
async getChat(chatId) {
|
|
261
|
+
return new Chat(this, chatId);
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
// core/client.ts
|
|
266
|
+
import crypto2 from "node:crypto";
|
|
215
267
|
import {
|
|
216
268
|
FieldValue,
|
|
217
269
|
Timestamp
|
|
@@ -564,7 +616,7 @@ var RootCMSClient = class {
|
|
|
564
616
|
* are stored under `Projects/<project id>/Translations/<sha1 hash>`.
|
|
565
617
|
*/
|
|
566
618
|
getTranslationKey(source) {
|
|
567
|
-
const sha1 =
|
|
619
|
+
const sha1 = crypto2.createHash("sha1").update(this.normalizeString(source)).digest("hex");
|
|
568
620
|
return sha1;
|
|
569
621
|
}
|
|
570
622
|
/**
|
|
@@ -1087,6 +1139,38 @@ function api(server) {
|
|
|
1087
1139
|
res.status(500).json({ success: false, error: "UNKNOWN" });
|
|
1088
1140
|
}
|
|
1089
1141
|
});
|
|
1142
|
+
server.use("/cms/api/ai.chat", async (req, res) => {
|
|
1143
|
+
var _a;
|
|
1144
|
+
if (req.method !== "POST" || !String(req.get("content-type")).startsWith("application/json")) {
|
|
1145
|
+
res.status(400).json({ success: false, error: "BAD_REQUEST" });
|
|
1146
|
+
return;
|
|
1147
|
+
}
|
|
1148
|
+
if (!((_a = req.user) == null ? void 0 : _a.email)) {
|
|
1149
|
+
res.status(401).json({ success: false, error: "UNAUTHORIZED" });
|
|
1150
|
+
return;
|
|
1151
|
+
}
|
|
1152
|
+
const reqBody = req.body || {};
|
|
1153
|
+
if (!reqBody.prompt) {
|
|
1154
|
+
res.status(400).json({ success: false, error: "MISSING_PROMPT" });
|
|
1155
|
+
return;
|
|
1156
|
+
}
|
|
1157
|
+
const prompt = reqBody.prompt;
|
|
1158
|
+
try {
|
|
1159
|
+
const cmsClient = new RootCMSClient(req.rootConfig);
|
|
1160
|
+
const chatClient = new ChatClient(cmsClient, req.user.email);
|
|
1161
|
+
let chat;
|
|
1162
|
+
if (reqBody.chatId) {
|
|
1163
|
+
chat = await chatClient.getChat(reqBody.chatId);
|
|
1164
|
+
} else {
|
|
1165
|
+
chat = await chatClient.createChat();
|
|
1166
|
+
}
|
|
1167
|
+
const chatResponse = await chat.sendPrompt(prompt);
|
|
1168
|
+
res.status(200).json({ success: true, chatId: chat.id, response: chatResponse });
|
|
1169
|
+
} catch (err) {
|
|
1170
|
+
console.error(err.stack || err);
|
|
1171
|
+
res.status(500).json({ success: false, error: "UNKNOWN" });
|
|
1172
|
+
}
|
|
1173
|
+
});
|
|
1090
1174
|
}
|
|
1091
1175
|
|
|
1092
1176
|
// core/plugin.ts
|
|
@@ -1397,4 +1481,4 @@ function fileExists(filepath) {
|
|
|
1397
1481
|
export {
|
|
1398
1482
|
cmsPlugin
|
|
1399
1483
|
};
|
|
1400
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9wbHVnaW4udHMiLCAiLi4vY2xpL2dlbmVyYXRlLXR5cGVzLnRzIiwgIi4uL2NvcmUvYXBpLnRzIiwgIi4uL2NvcmUvY2xpZW50LnRzIiwgIi4uL2NvcmUvdmVyc2lvbnMudHMiLCAiLi4vY29yZS9jcm9uLnRzIiwgIi4uL2NvcmUvY3N2LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge3Byb21pc2VzIGFzIGZzfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHtcbiAgQ29uZmlndXJlU2VydmVyT3B0aW9ucyxcbiAgTmV4dEZ1bmN0aW9uLFxuICBQbHVnaW4sXG4gIFJlcXVlc3QsXG4gIFJlc3BvbnNlLFxuICBTZXJ2ZXIsXG59IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQgYm9keVBhcnNlciBmcm9tICdib2R5LXBhcnNlcic7XG5pbXBvcnQge1xuICBBcHAsXG4gIGFwcGxpY2F0aW9uRGVmYXVsdCxcbiAgZ2V0QXBwLFxuICBpbml0aWFsaXplQXBwLFxufSBmcm9tICdmaXJlYmFzZS1hZG1pbi9hcHAnO1xuaW1wb3J0IHtnZXRBdXRoLCBEZWNvZGVkSWRUb2tlbn0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXV0aCc7XG5pbXBvcnQge0ZpcmVzdG9yZSwgZ2V0RmlyZXN0b3JlfSBmcm9tICdmaXJlYmFzZS1hZG1pbi9maXJlc3RvcmUnO1xuaW1wb3J0ICogYXMganNvbndlYnRva2VuIGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgc2lydiBmcm9tICdzaXJ2JztcbmltcG9ydCB7Z2VuZXJhdGVUeXBlc30gZnJvbSAnLi4vY2xpL2dlbmVyYXRlLXR5cGVzLmpzJztcbmltcG9ydCB7YXBpfSBmcm9tICcuL2FwaS5qcyc7XG5pbXBvcnQge0FjdGlvbiwgUm9vdENNU0NsaWVudH0gZnJvbSAnLi9jbGllbnQuanMnO1xuXG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxudHlwZSBBcHBNb2R1bGUgPSB0eXBlb2YgaW1wb3J0KCcuL2FwcC5qcycpO1xuXG4vLyBUaGUgc2Vzc2lvbiBrZXkgbmFtZSB1c2VkIGZvciBSb290IENNUyBhdXRoZW50aWNhdGlvbi5cbmNvbnN0IFNFU1NJT05fQ09PS0lFX0FVVEggPSAncm9vdC1jbXMtYXV0aCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ01TVXNlciB7XG4gIGVtYWlsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ01TU2lkZWJhclRvb2wge1xuICAvKiogVVJMIGZvciB0aGUgc2lkZWJhciBpY29uIGltYWdlLiAqL1xuICBpY29uPzogc3RyaW5nO1xuICAvKiogTGFiZWwuICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKiogSWZyYW1lIFVSTCB0byByZW5kZXIgZm9yIHRoZSB0b29sLiAqL1xuICBpZnJhbWVVcmw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIENNU1BsdWdpbk9wdGlvbnMgPSB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHByb2plY3QuIERhdGEgd2lsbCBiZSBzdG9yZWQgdW5kZXIgdGhlIG5hbWVzcGFjZVxuICAgKiBgUHJvamVjdHMvJHtpZH1gIGluIGZpcmVzdG9yZS5cbiAgICovXG4gIGlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdC4gVXNlZCBpbiB0aGUgaGVhZGVyIG9mIHRoZSBDTVMgdG8gaGVscCBpZGVudGlmeVxuICAgKiB0aGUgcHJvamVjdC5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpcmViYXNlIGNvbmZpZyBvYmplY3QsIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBpbiB0aGUgRmlyZWJhc2UgQ29uc29sZSBieVxuICAgKiBnb2luZyB0byBcIlByb2plY3QgU2V0dGluZ3NcIi5cbiAgICovXG4gIGZpcmViYXNlQ29uZmlnOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGFwaUtleTogc3RyaW5nO1xuICAgIGF1dGhEb21haW46IHN0cmluZztcbiAgICBwcm9qZWN0SWQ6IHN0cmluZztcbiAgICBzdG9yYWdlQnVja2V0OiBzdHJpbmc7XG4gICAgZGF0YWJhc2VJZD86IHN0cmluZztcbiAgfTtcblxuICAvKipcbiAgICogR0FQSSBjcmVkZW50aWFscy4gSW5jbHVkZSBpZiB1c2luZyBHb29nbGUgRHJpdmUgYW5kIEdvb2dsZSBTaGVldHMgZmVhdHVyZXMuXG4gICAqIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc2hlZXRzL2FwaS9xdWlja3N0YXJ0L2pzXG4gICAqL1xuICBnYXBpPzoge1xuICAgIC8qKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zaGVldHMvYXBpL3F1aWNrc3RhcnQvanMjY3JlYXRlX2FuX2FwaV9rZXkgKi9cbiAgICBhcGlLZXk6IHN0cmluZztcbiAgICAvKiogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc2hlZXRzL2FwaS9xdWlja3N0YXJ0L2pzI2F1dGhvcml6ZV9jcmVkZW50aWFsc19mb3JfYV93ZWJfYXBwbGljYXRpb24gKi9cbiAgICBjbGllbnRJZDogc3RyaW5nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZWNyZXQgdmFsdWUocykgdXNlZCBmb3Igc2lnbmluZyB0aGUgdXNlciBhdXRoZW50aWNhdGlvbiBjb29raWUuXG4gICAqIEBkZXByZWNhdGVkIFRoaXMgaXMgbm93IGhhbmRsZWQgZGlyZWN0bHkgYnkgcm9vdCdzIHNlc3Npb25NaWRkbGV3YXJlIHVuZGVyXG4gICAqIGBzZXJ2ZXIuc2Vzc2lvbkNvb2tpZVNlY3JldGAgaW4gcm9vdC5jb25maWcudHMuXG4gICAqL1xuICBjb29raWVTZWNyZXQ/OiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKiogRnVuY3Rpb24gY2FsbGVkIHRvIGNoZWNrIGlmIGEgdXNlciBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8gdGhlIENNUy4gKi9cbiAgaXNVc2VyQXV0aG9yaXplZD86IChcbiAgICByZXE6IFJlcXVlc3QsXG4gICAgdXNlcjogQ01TVXNlclxuICApID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBjYWxsIHRvIGNoZWNrIGlmIGxvZ2luIGlzIHJlcXVpcmVkIGZvciBhIHBhcnRpY3VsYXIgcmVxdWVzdC5cbiAgICovXG4gIGlzTG9naW5SZXF1aXJlZD86IChyZXE6IFJlcXVlc3QpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFVSTCB0byBHQ0kgc2VydmljZSBmb3IgdHJhbnNmb3JtaW5nIHVwbG9hZGVkIEdDUyBpbWFnZXMgdG8gYSBHb29nbGUgQXBwXG4gICAqIEVuZ2luZSBJbWFnZXMgQVBJIHNlcnZpbmcgVVJMLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoaXMgdG8gYHRydWVgIHVzZXMgdGhlIGRlZmF1bHQgaG9zdGVkIHNlcnZpY2UgYXRcbiAgICogaHR0cHM6Ly9nY2kucm9vdGpzLmRldi5cbiAgICpcbiAgICogVG8gc2V0IHVwIEdDSTpcbiAgICpcbiAgICogLSBDcmVhdGUgYSBHQ1MgYnVja2V0IHdpdGggZmluZS1ncmFpbmVkIHBlcm1pc3Npb25zXG4gICAqIC0gU2hhcmUgb3duZXIgYWNjZXNzIHRvIHRoZSBidWNrZXQgd2l0aCB0aGUgc2VydmljZSBhY2NvdW50IHJldHVybmVkIGluXG4gICAqICAgaHR0cHM6Ly9nY2kucm9vdGpzLmRldi9fL3NlcnZpY2VfYWNjb3VudFxuICAgKlxuICAgKiBUbyBkaXNhYmxlIEdDSSwgbGVhdmUgdGhpcyB2YWx1ZSBlbXB0eSBvciBzZXQgdG8gYGZhbHNlYCwgd2hpY2ggd2hpY2ggd2lsbFxuICAgKiBzZXJ2ZSBpbWFnZXMgZGlyZWN0bHkgZnJvbSBHQ1MgaW5zdGVhZC5cbiAgICovXG4gIGdjaT86IHN0cmluZyB8IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEN1c3RvbWl6YXRpb24gb3B0aW9ucyBmb3IgdGhlIENNUyBzaWRlYmFyLlxuICAgKi9cbiAgc2lkZWJhcj86IHtcbiAgICAvKipcbiAgICAgKiBTaWRlYmFyIHRvb2xzLCBhIG1hcCBvZiB0aGUgc2lkZWJhciBpZCB0byBjb25maWcgb3B0aW9ucy4gVGhlIHNpZGViYXJcbiAgICAgKiB0b29sIGlzIHVybC1tYXBwZWQgdG8gYC9jbXMvdG9vbHMvOmlkYCBhbmQgZGlzcGxheXMgdGhlIHRvb2wgaW4gYW5cbiAgICAgKiBpZnJhbWUuXG4gICAgICovXG4gICAgdG9vbHM/OiBSZWNvcmQ8c3RyaW5nLCBDTVNTaWRlYmFyVG9vbD47XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHdoZW4gYW4gYWN0aW9uIG9jY3Vycy5cbiAgICovXG4gIG9uQWN0aW9uPzogKGFjdGlvbjogQWN0aW9uKSA9PiBhbnk7XG59O1xuXG5leHBvcnQgdHlwZSBDTVNQbHVnaW4gPSBQbHVnaW4gJiB7XG4gIG5hbWU6ICdyb290LWNtcyc7XG4gIGdldENvbmZpZzogKCkgPT4gQ01TUGx1Z2luT3B0aW9ucztcbiAgZ2V0RmlyZWJhc2VBcHA6ICgpID0+IEFwcDtcbiAgZ2V0RmlyZXN0b3JlOiAoKSA9PiBGaXJlc3RvcmU7XG59O1xuXG5mdW5jdGlvbiBpc0V4cGlyZWQoZGVjb2RlZElkVG9rZW46IERlY29kZWRJZFRva2VuKSB7XG4gIGNvbnN0IHRzID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApO1xuICByZXR1cm4gdHMgPj0gZGVjb2RlZElkVG9rZW4uZXhwO1xufVxuXG5mdW5jdGlvbiBnZXRGaXJlYmFzZUFwcChnY3BQcm9qZWN0SWQ6IHN0cmluZyk6IEFwcCB7XG4gIGNvbnN0IGFwcE5hbWUgPSAncm9vdC1jbXMnO1xuICB0cnkge1xuICAgIHJldHVybiBnZXRBcHAoYXBwTmFtZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdhcHAvbm8tYXBwJykge1xuICAgICAgcmV0dXJuIGluaXRpYWxpemVBcHAoXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9qZWN0SWQ6IGdjcFByb2plY3RJZCxcbiAgICAgICAgICBjcmVkZW50aWFsOiBhcHBsaWNhdGlvbkRlZmF1bHQoKSxcbiAgICAgICAgfSxcbiAgICAgICAgYXBwTmFtZVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbXNQbHVnaW4ob3B0aW9uczogQ01TUGx1Z2luT3B0aW9ucyk6IENNU1BsdWdpbiB7XG4gIGlmICghb3B0aW9ucy5maXJlYmFzZUNvbmZpZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdtaXNzaW5nIGZpcmViYXNlQ29uZmlnLiBjcmVhdGUgYSBuZXcgYXBwIGluIHRoZSBmaXJlYmFzZSBhZG1pbiBjb25zb2xlIGFuZCBjb3B5IHRoZSBmaXJlYmFzZSBjb25maWcgb2JqZWN0IHRvIHJvb3QuY29uZmlnLnRzJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBmaXJlYmFzZUNvbmZpZyA9IG9wdGlvbnMuZmlyZWJhc2VDb25maWcgfHwge307XG4gIGNvbnN0IGFwcCA9IGdldEZpcmViYXNlQXBwKGZpcmViYXNlQ29uZmlnLnByb2plY3RJZCk7XG4gIGNvbnN0IGF1dGggPSBnZXRBdXRoKGFwcCk7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBsb2dpbiBpcyByZXF1aXJlZCBmb3IgdGhlIHJlcXVlc3QuIEN1cnJlbnRseSByZXR1cm5zIGB0cnVlYCBpZlxuICAgKiB0aGUgVVJMIHBhdGggc3RhcnRzIHdpdGggL2NtcyBvciBpZiA/cHJldmlldz10cnVlIGlzIGluIHRoZSBVUkwuXG4gICAqL1xuICBmdW5jdGlvbiBsb2dpblJlcXVpcmVkKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICAgIC8vIEFsbG93IHRoZSBjcm9uIHRvIHJ1biB1bmF1dGhlbnRpY2F0ZWQuIFRoZSBjcm9uIGpvYiBpcyByZXNwb25zaWJsZVxuICAgIC8vIGZvciBzYXZpbmcgdmVyc2lvbiBoaXN0b3J5LlxuICAgIGlmIChyZXEub3JpZ2luYWxVcmwgPT09ICcvY21zL2FwaS9jcm9uLnJ1bicpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gUmVxdWlyZSBsb2dpbiBvbiBhbGwgYC9jbXMvYCBwYXRocy5cbiAgICBpZiAocmVxLm9yaWdpbmFsVXJsLnN0YXJ0c1dpdGgoJy9jbXMnKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIFJlcXVpcmUgbG9naW4gb24gYWxsIHBhdGhzIHRoYXQgaGF2ZSBgP3ByZXZpZXc9dHJ1ZWAsIHdoaWNoIGlzIHVzZWQgYnlcbiAgICAvLyB0aGUgcHJldmlldyBpZnJhbWUgdG8gcmVuZGVyIHRoZSBwcmV2aWV3IGZvciBhIHBhZ2UuXG4gICAgaWYgKFN0cmluZyhyZXEucXVlcnkucHJldmlldykgPT09ICd0cnVlJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlzTG9naW5SZXF1aXJlZCAmJiBvcHRpb25zLmlzTG9naW5SZXF1aXJlZChyZXEpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGEgbmV3IGxvZ2luIHJlcXVlc3QgZm9yIGEgdXNlci4gVGhlIHJlcXVlc3QgYm9keSBzaG91bGQgY29udGFpblxuICAgKiBhbiBpZFRva2VuLCB3aGljaCBpcyB2ZXJpZmllZCBvbiBwcm9kIHVzaW5nIEZpcmViYXNlIEFkbWluIGFuZCBJZGVudGl0eVxuICAgKiBUb29sa2l0LiBJZiBhIGBpc1VzZXJBdXRob3JpemVkKClgIGNvbmZpZyBpcyBzZXQsIHRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvXG4gICAqIHZlcmlmeSB2aWEgdGhhdCBmdW5jdGlvbi4gUmV0dXJucyB0cnVlIGlmIHRoZSBsb2dpbiB2ZXJpZmljYXRpb24gc3VjY2VlZHMuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiB2ZXJpZnlVc2VyTG9naW4oXG4gICAgcmVxOiBSZXF1ZXN0XG4gICk6IFByb21pc2U8e2F1dGhvcml6ZWQ6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZ30+IHtcbiAgICBjb25zdCBpZFRva2VuID0gcmVxLmJvZHk/LmlkVG9rZW47XG4gICAgaWYgKCFpZFRva2VuKSB7XG4gICAgICBjb25zb2xlLmxvZygnbG9naW4gZmFpbGVkOiBubyBpZCB0b2tlbicpO1xuICAgICAgcmV0dXJuIHthdXRob3JpemVkOiBmYWxzZSwgcmVhc29uOiAnbm8gdG9rZW4nfTtcbiAgICB9XG5cbiAgICBsZXQgdXNlcjogQ01TVXNlcjtcblxuICAgIC8vIE9uIGxvY2FsIGRldiwgc2ltcGx5IHZlcmlmeSB0aGUgZGVjb2RlZCBpZFRva2VuJ3MgZW1haWwgaXMgc2V0LiBUaGVcbiAgICAvLyBpZGVudGl0eSB0b29sa2l0IHRoYXQgdmVyaWZpZXMgaWQgdG9rZW5zIHJlcXVpcmVzIGEgc2VydmljZSBhY2NvdW50LFxuICAgIC8vIHdoaWNoIHdlIHdhbnQgdG8gYXZvaWQgaGF2aW5nIHRvIHNldCB1cCB3aGVuIHVzZXJzIGFyZSBkb2luZyBsb2NhbCBkZXYuXG4gICAgLy8gQXV0aGVudGljYXRpb24gaXMgc3RpbGwgcmVxdWlyZWQgYnkgdGhlIGZyb250ZW5kIHVzaW5nIEZpcmViYXNlIEF1dGgsXG4gICAgLy8gdGhpcyBqdXN0IGJ5cGFzc2VzIHRoZSBpbml0aWFsIHNlcnZlciBjaGVjayBiZWZvcmUgdGhlIHVpIGlzIHJlbmRlcmVkLlxuICAgIHRyeSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgY29uc3Qgand0ID0ganNvbndlYnRva2VuLmRlY29kZShpZFRva2VuKSBhcyBqc29ud2VidG9rZW4uSnd0UGF5bG9hZDtcbiAgICAgICAgaWYgKCFqd3QuZW1haWwgfHwgIWp3dC5lbWFpbF92ZXJpZmllZCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdsb2dpbiBmYWlsZWQ6IGVtYWlsIHVudmVyaWZpZWQnKTtcbiAgICAgICAgICByZXR1cm4ge2F1dGhvcml6ZWQ6IGZhbHNlLCByZWFzb246ICdsb2dpbiBmYWlsZWQnfTtcbiAgICAgICAgfVxuICAgICAgICB1c2VyID0ge2VtYWlsOiBqd3QuZW1haWx9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgand0ID0gYXdhaXQgYXV0aC52ZXJpZnlJZFRva2VuKGlkVG9rZW4sIHRydWUpO1xuICAgICAgICBpZiAoaXNFeHBpcmVkKGp3dCkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnbG9naW4gZmFpbGVkOiBpZCB0b2tlbiBpcyBleHBpcmVkJyk7XG4gICAgICAgICAgcmV0dXJuIHthdXRob3JpemVkOiBmYWxzZSwgcmVhc29uOiAnbG9naW4gZmFpbGVkJ307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFqd3QuZW1haWwgfHwgIWp3dC5lbWFpbF92ZXJpZmllZCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdsb2dpbiBmYWlsZWQ6IGVtYWlsIHVudmVyaWZpZWQnKTtcbiAgICAgICAgICByZXR1cm4ge2F1dGhvcml6ZWQ6IGZhbHNlLCByZWFzb246ICdsb2dpbiBmYWlsZWQnfTtcbiAgICAgICAgfVxuICAgICAgICB1c2VyID0ge2VtYWlsOiBqd3QuZW1haWx9O1xuICAgICAgfVxuXG4gICAgICAvLyBWZXJpZnkgdGhlIHByb2plY3QncyBgaXNVc2VyQXV0aG9yaXplZCgpYCBjb25maWcgb3B0aW9uLlxuICAgICAgaWYgKG9wdGlvbnMuaXNVc2VyQXV0aG9yaXplZCkge1xuICAgICAgICBjb25zdCBhdXRob3JpemVkID0gYXdhaXQgb3B0aW9ucy5pc1VzZXJBdXRob3JpemVkKHJlcSwge1xuICAgICAgICAgIGVtYWlsOiB1c2VyLmVtYWlsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFhdXRob3JpemVkKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2xvZ2luIGZhaWxlZDogdXNlciBpcyBub3QgYXV0aG9yaXplZCcpO1xuICAgICAgICAgIHJldHVybiB7YXV0aG9yaXplZDogZmFsc2UsIHJlYXNvbjogJ25vdCBhdXRob3JpemVkJ307XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZ5IHRoZSB1c2VyIGV4aXN0cyBpbiB0aGUgREIncyBBQ0wgbGlzdC5cbiAgICAgIGNvbnN0IGNtc0NsaWVudCA9IG5ldyBSb290Q01TQ2xpZW50KHJlcS5yb290Q29uZmlnISk7XG4gICAgICBjb25zdCB1c2VySGFzQWNjZXNzID0gYXdhaXQgY21zQ2xpZW50LnVzZXJFeGlzdHNJbkFjbCh1c2VyLmVtYWlsKTtcbiAgICAgIGlmICghdXNlckhhc0FjY2Vzcykge1xuICAgICAgICBjb25zb2xlLmxvZygnbG9naW4gZmFpbGVkOiB1c2VyIGlzIG5vdCBpbiB0aGUgZmlyZXN0b3JlIGFjbCBsaXN0Jyk7XG4gICAgICAgIHJldHVybiB7YXV0aG9yaXplZDogZmFsc2UsIHJlYXNvbjogJ25vdCBhdXRob3JpemVkJ307XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gdmVyaWZ5IGp3dCB0b2tlbicpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgcmV0dXJuIHthdXRob3JpemVkOiBmYWxzZSwgcmVhc29uOiAndW5rbm93biBlcnJvcid9O1xuICAgIH1cblxuICAgIHJldHVybiB7YXV0aG9yaXplZDogdHJ1ZX07XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50VXNlcihyZXE6IFJlcXVlc3QpOiBQcm9taXNlPENNU1VzZXIgfCBudWxsPiB7XG4gICAgY29uc3Qgc2Vzc2lvbkNvb2tpZSA9IHJlcS5zZXNzaW9uLmdldEl0ZW0oU0VTU0lPTl9DT09LSUVfQVVUSCk7XG4gICAgaWYgKCFzZXNzaW9uQ29va2llKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBPbiBsb2NhbCBkZXYsIHZlcmlmeSB0aGUgZGVjb2RlZCBpZFRva2VuIGhhcyBhIHZhbGlkIGVtYWlsLiBUaGUgZmlyZWJhc2VcbiAgICAvLyBhdXRoIHZlcmlmaWNhdGlvbiBvdGhlcndpc2Ugd291bGQgcmVxdWlyZSBhIHNlcnZpY2UgYWNjb3VudC5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgIGNvbnN0IGp3dCA9IGpzb253ZWJ0b2tlbi5kZWNvZGUoc2Vzc2lvbkNvb2tpZSkgYXMganNvbndlYnRva2VuLkp3dFBheWxvYWQ7XG4gICAgICBpZiAoIWp3dD8uZW1haWwgfHwgIWp3dD8uZW1haWxfdmVyaWZpZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB3aGV0aGVyIHVzZXIgaXMgYXV0aG9yaXplZC5cbiAgICAgIGlmIChvcHRpb25zLmlzVXNlckF1dGhvcml6ZWQpIHtcbiAgICAgICAgY29uc3QgYXV0aG9yaXplZCA9IGF3YWl0IG9wdGlvbnMuaXNVc2VyQXV0aG9yaXplZChyZXEsIHtcbiAgICAgICAgICBlbWFpbDogand0LmVtYWlsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFhdXRob3JpemVkKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3Nlc3Npb24gZmFpbGVkOiBub3QgYXV0aG9yaXplZCcpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBWZXJpZnkgdGhlIHVzZXIgZXhpc3RzIGluIHRoZSBEQidzIEFDTCBsaXN0LlxuICAgICAgY29uc3QgY21zQ2xpZW50ID0gbmV3IFJvb3RDTVNDbGllbnQocmVxLnJvb3RDb25maWchKTtcbiAgICAgIGNvbnN0IHVzZXJIYXNBY2Nlc3MgPSBhd2FpdCBjbXNDbGllbnQudXNlckV4aXN0c0luQWNsKGp3dC5lbWFpbCk7XG4gICAgICBpZiAoIXVzZXJIYXNBY2Nlc3MpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3Nlc3Npb24gZmFpbGVkOiB1c2VyIGlzIG5vdCBpbiB0aGUgZmlyZXN0b3JlIGFjbCBsaXN0Jyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtlbWFpbDogand0LmVtYWlsfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmVyaWZ5IHRoZSBpZFRva2VuIHVzaW5nIGZpcmViYXNlIGF1dGgsIGNoZWNraW5nIGZvciB0b2tlbiByZXZvY2F0aW9ucy5cbiAgICAgIGNvbnN0IGp3dCA9IGF3YWl0IGF1dGgudmVyaWZ5U2Vzc2lvbkNvb2tpZShzZXNzaW9uQ29va2llLCB0cnVlKTtcbiAgICAgIGlmIChpc0V4cGlyZWQoand0KSkge1xuICAgICAgICBjb25zb2xlLmxvZygnc2Vzc2lvbiBmYWlsZWQ6IHRva2VuIGlzIGV4cGlyZWQnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICAvLyBWZXJpZnkgdXNlcidzIGVtYWlsIGlzIHZlcmlmaWVkLlxuICAgICAgaWYgKCFqd3QuZW1haWwgfHwgIWp3dC5lbWFpbF92ZXJpZmllZCkge1xuICAgICAgICBjb25zb2xlLmxvZygnc2Vzc2lvbiBmYWlsZWQ6IGVtYWlsIG5vdCB2ZXJpZmllZCcpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgdXNlciBpcyBhdXRob3JpemVkLlxuICAgICAgaWYgKG9wdGlvbnMuaXNVc2VyQXV0aG9yaXplZCkge1xuICAgICAgICBjb25zdCBhdXRob3JpemVkID0gYXdhaXQgb3B0aW9ucy5pc1VzZXJBdXRob3JpemVkKHJlcSwge1xuICAgICAgICAgIGVtYWlsOiBqd3QuZW1haWwhLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFhdXRob3JpemVkKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3Nlc3Npb24gZmFpbGVkOiBub3QgYXV0aG9yaXplZCcpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBWZXJpZnkgdGhlIHVzZXIgZXhpc3RzIGluIHRoZSBEQidzIEFDTCBsaXN0LlxuICAgICAgY29uc3QgY21zQ2xpZW50ID0gbmV3IFJvb3RDTVNDbGllbnQocmVxLnJvb3RDb25maWchKTtcbiAgICAgIGNvbnN0IHVzZXJIYXNBY2Nlc3MgPSBhd2FpdCBjbXNDbGllbnQudXNlckV4aXN0c0luQWNsKGp3dC5lbWFpbCk7XG4gICAgICBpZiAoIXVzZXJIYXNBY2Nlc3MpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3Nlc3Npb24gZmFpbGVkOiB1c2VyIGlzIG5vdCBpbiB0aGUgZmlyZXN0b3JlIGFjbCBsaXN0Jyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgLy8gSldUIHZlcmlmaWVkLlxuICAgICAgcmV0dXJuIHtlbWFpbDogand0LmVtYWlsIX07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gdmVyaWZ5IGp3dCB0b2tlbicpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGx1Z2luOiBDTVNQbHVnaW4gPSB7XG4gICAgbmFtZTogJ3Jvb3QtY21zJyxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbmZpZyBvcHRpb25zIHBhc3NlZCB0byB0aGUgcGx1Z2luLlxuICAgICAqL1xuICAgIGdldENvbmZpZzogKCkgPT4ge1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIEZpcmViYXNlIEFwcCBpbnN0YW5jZSB1c2VkIGJ5IHRoZSBwbHVnaW4uXG4gICAgICovXG4gICAgZ2V0RmlyZWJhc2VBcHA6ICgpID0+IHtcbiAgICAgIHJldHVybiBhcHA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIEZpcmVzdG9yZSBpbnN0YW5jZSB1c2VkIGJ5IHRoZSBwbHVnaW4uXG4gICAgICovXG4gICAgZ2V0RmlyZXN0b3JlOiAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhYmFzZUlkID0gZmlyZWJhc2VDb25maWcuZGF0YWJhc2VJZCB8fCAnKGRlZmF1bHQpJztcbiAgICAgIHJldHVybiBnZXRGaXJlc3RvcmUoYXBwLCBkYXRhYmFzZUlkKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBtYXAgb2Ygc3NyIGZpbGVzIHRvIGluY2x1ZGUgd2hlbiBydW5uaW5nIGByb290IGJ1aWxkYC5cbiAgICAgKi9cbiAgICBzc3JJbnB1dDogKCkgPT4gKHtcbiAgICAgIGNtczogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vYXBwLmpzJyksXG4gICAgfSksXG5cbiAgICAvKipcbiAgICAgKiBXYXRjaGVzIGZvciAuc2NoZW1hLnRzIGZpbGUgY2hhbmdlcyBhbmQgZ2VuZXJhdGVzIGEgcm9vdC1jbXMuZC50cyBmaWxlLlxuICAgICAqL1xuICAgIG9uRmlsZUNoYW5nZTogKFxuICAgICAgZXZlbnROYW1lOiAnYWRkJyB8ICdhZGREaXInIHwgJ2NoYW5nZScgfCAndW5saW5rJyB8ICd1bmxpbmtEaXInLFxuICAgICAgZmlsZXBhdGg6IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGZpbGVwYXRoLmVuZHNXaXRoKCcuc2NoZW1hLnRzJykpIHtcbiAgICAgICAgZ2VuZXJhdGVUeXBlcygpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBDTVMtc3BlY2lmaWMgbWlkZGxld2FyZSB0byB0aGUgUm9vdC5qcyBzZXJ2ZXIuXG4gICAgICovXG4gICAgY29uZmlndXJlU2VydmVyOiBhc3luYyAoXG4gICAgICBzZXJ2ZXI6IFNlcnZlcixcbiAgICAgIHNlcnZlck9wdGlvbnM6IENvbmZpZ3VyZVNlcnZlck9wdGlvbnNcbiAgICApID0+IHtcbiAgICAgIHNlcnZlci51c2UoYm9keVBhcnNlci5qc29uKCkpO1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiBnZXRSZW5kZXJlcihyZXE6IFJlcXVlc3QpOiBQcm9taXNlPEFwcE1vZHVsZT4ge1xuICAgICAgICBpZiAoc2VydmVyT3B0aW9ucy50eXBlID09PSAnZGV2Jykge1xuICAgICAgICAgIGNvbnN0IGFwcEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vYXBwLmpzJyk7XG4gICAgICAgICAgY29uc3QgYXBwID0gKGF3YWl0IHJlcS52aXRlU2VydmVyIS5zc3JMb2FkTW9kdWxlKFxuICAgICAgICAgICAgYXBwRmlsZVBhdGhcbiAgICAgICAgICApKSBhcyBBcHBNb2R1bGU7XG4gICAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFwcEltcG9ydFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgcmVxLnJvb3RDb25maWchLnJvb3REaXIsXG4gICAgICAgICAgJ2Rpc3Qvc2VydmVyL2Ntcy5qcydcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEoYXdhaXQgZmlsZUV4aXN0cyhhcHBJbXBvcnRQYXRoKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnZGlzdC9zZXJ2ZXIvY21zLmpzIG5vdCBmb3VuZC4gcnVuIGByb290IGJ1aWxkYCB0byBjcmVhdGUgaXQuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBwID0gKGF3YWl0IGltcG9ydChhcHBJbXBvcnRQYXRoKSkgYXMgQXBwTW9kdWxlO1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGF0aWNEaXIgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAndWknKTtcbiAgICAgIHNlcnZlci51c2UoJy9jbXMvc3RhdGljJywgc2lydihzdGF0aWNEaXIsIHtkZXY6IGZhbHNlfSkpO1xuXG4gICAgICAvLyBMb2dpbiBoYW5kbGVyLlxuICAgICAgc2VydmVyLnVzZSgnL2Ntcy9sb2dpbicsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlcS5tZXRob2QgPT09ICdQVVQnICYmXG4gICAgICAgICAgcmVxLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID09PSAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHthdXRob3JpemVkLCByZWFzb259ID0gYXdhaXQgdmVyaWZ5VXNlckxvZ2luKHJlcSk7XG4gICAgICAgICAgICBpZiAoIWF1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgLnN0YXR1cyg0MDEpXG4gICAgICAgICAgICAgICAgLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ05PVF9BVVRIT1JJWkVEJywgcmVhc29ufSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IHNlc3Npb24gZXhwaXJhdGlvbiB0byA1IGRheXMuXG4gICAgICAgICAgICBjb25zdCBleHBpcmVzSW4gPSA2MCAqIDYwICogMjQgKiA1ICogMTAwMDtcbiAgICAgICAgICAgIGNvbnN0IGlkVG9rZW4gPSByZXEuYm9keS5pZFRva2VuITtcblxuICAgICAgICAgICAgbGV0IHNlc3Npb25Db29raWU6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICAgICAgICBzZXNzaW9uQ29va2llID0gaWRUb2tlbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlc3Npb25Db29raWUgPSBhd2FpdCBhdXRoLmNyZWF0ZVNlc3Npb25Db29raWUoaWRUb2tlbiwge1xuICAgICAgICAgICAgICAgIGV4cGlyZXNJbixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc2Vzc2lvbi5zZXRJdGVtKFNFU1NJT05fQ09PS0lFX0FVVEgsIHNlc3Npb25Db29raWUpO1xuICAgICAgICAgICAgcmVzLnNhdmVTZXNzaW9uKCk7XG4gICAgICAgICAgICByZXMuanNvbih7c3VjY2VzczogdHJ1ZX0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5zdGFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgLnN0YXR1cyg1MDApXG4gICAgICAgICAgICAgIC5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVTktOT1dOX1NFUlZFUl9FUlJPUid9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhcHAgPSBhd2FpdCBnZXRSZW5kZXJlcihyZXEpO1xuICAgICAgICAgIGFwcC5yZW5kZXJTaWduSW4ocmVxLCByZXMsIG9wdGlvbnMpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZCgnVU5LTk9XTiBTRVJWRVIgRVJST1InKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExvZ291dCBoYW5kbGVyLlxuICAgICAgc2VydmVyLnVzZSgnL2Ntcy9sb2dvdXQnLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHJlcy5zZXNzaW9uLnJlbW92ZUl0ZW0oU0VTU0lPTl9DT09LSUVfQVVUSCk7XG4gICAgICAgIHJlcy5zYXZlU2Vzc2lvbigpO1xuICAgICAgICByZXMucmVkaXJlY3QoJy9jbXMvbG9naW4nKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJbmplY3QgdGhlIGN1cnJlbnQgdXNlciBpbnRvIHRoZSByZXEgb2JqZWN0IGFuZCBjaGVjayBpZiBsb2dpbiBpc1xuICAgICAgLy8gcmVxdWlyZWQsIHNlbmRpbmcgdW5hdXRoZW50aWNhdGVkIHVzZXJzIHRvIHRoZSBsb2dpbiBwYWdlLlxuICAgICAgc2VydmVyLnVzZShhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IGdldEN1cnJlbnRVc2VyKHJlcSk7XG4gICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgcmVxLnVzZXIgPSB1c2VyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gdXNlciBhbmQgbG9naW4gaXMgcmVxdWlyZWQgZm9yIHRoZSBnaXZlbiBwYXRoLCByZWRpcmVjdCB0byB0aGVcbiAgICAgICAgLy8gbG9naW4gcGFnZS5cbiAgICAgICAgaWYgKCF1c2VyICYmIGxvZ2luUmVxdWlyZWQocmVxKSkge1xuICAgICAgICAgIGlmIChyZXEub3JpZ2luYWxVcmwuc3RhcnRzV2l0aCgnL2Ntcy9hcGknKSkge1xuICAgICAgICAgICAgcmVzLnN0YXR1cyg0MDEpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ05PVF9BVVRIT1JJWkVEJ30pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmxvZygncmVkaXJlY3RpbmcgdG8gbG9naW4gcGFnZScpO1xuICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgICAgY29udGludWU6IHJlcS5vcmlnaW5hbFVybCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMucmVkaXJlY3QoYC9jbXMvbG9naW4/JHtwYXJhbXMudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0KCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUmVnaXN0ZXIgQVBJIGhhbmRsZXJzLlxuICAgICAgYXBpKHNlcnZlcik7XG5cbiAgICAgIC8vIFJlbmRlciB0aGUgQ01TIFNQQS5cbiAgICAgIHNlcnZlci51c2UoJy9jbXMnLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXBwID0gYXdhaXQgZ2V0UmVuZGVyZXIocmVxKTtcbiAgICAgICAgICBhd2FpdCBhcHAucmVuZGVyQXBwKHJlcSwgcmVzLCB7XG4gICAgICAgICAgICByb290Q29uZmlnOiByZXEucm9vdENvbmZpZyxcbiAgICAgICAgICAgIGNtc0NvbmZpZzogb3B0aW9ucyxcbiAgICAgICAgICAgIGZpcmViYXNlQ29uZmlnOiBvcHRpb25zLmZpcmViYXNlQ29uZmlnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBUT0RPKHN0ZXZlbmxlKTogcmVuZGVyIGEgY3VzdG9tIGVycm9yIHBhZ2UuXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNTAwKS5zZW5kKCdVTktOT1dOIFNFUlZFUiBFUlJPUicpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBwbHVnaW47XG59XG5cbmZ1bmN0aW9uIGZpbGVFeGlzdHMoZmlsZXBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gZnNcbiAgICAuYWNjZXNzKGZpbGVwYXRoKVxuICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgLmNhdGNoKCgpID0+IGZhbHNlKTtcbn1cbiIsICJpbXBvcnQge3Byb21pc2VzIGFzIGZzfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7bG9hZFJvb3RDb25maWcsIHZpdGVTc3JMb2FkTW9kdWxlfSBmcm9tICdAYmxpbmtrL3Jvb3Qvbm9kZSc7XG5pbXBvcnQgKiBhcyBkb20gZnJvbSAnZHRzLWRvbSc7XG5cbmltcG9ydCB7RmllbGQsIFNjaGVtYX0gZnJvbSAnLi4vY29yZS9zY2hlbWEuanMnO1xuXG50eXBlIFByb2plY3RNb2R1bGUgPSB0eXBlb2YgaW1wb3J0KCcuLi9jb3JlL3Byb2plY3QuanMnKTtcbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUeXBlcygpIHtcbiAgY29uc3Qgcm9vdERpciA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBsb2FkUm9vdENvbmZpZyhyb290RGlyLCB7Y29tbWFuZDogJ3Jvb3QtY21zJ30pO1xuICBjb25zdCBtb2R1bGVQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vcHJvamVjdC5qcycpO1xuICBjb25zdCBwcm9qZWN0ID0gKGF3YWl0IHZpdGVTc3JMb2FkTW9kdWxlKFxuICAgIHJvb3RDb25maWcsXG4gICAgbW9kdWxlUGF0aFxuICApKSBhcyBQcm9qZWN0TW9kdWxlO1xuICBjb25zdCBzY2hlbWFzID0gcHJvamVjdC5nZXRQcm9qZWN0U2NoZW1hcygpO1xuICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXIsICdyb290LWNtcy5kLnRzJyk7XG4gIGF3YWl0IGdlbmVyYXRlU2NoZW1hRHRzKG91dHB1dFBhdGgsIHNjaGVtYXMpO1xuICBjb25zb2xlLmxvZygnc2F2ZWQgcm9vdC1jbXMuZC50cyEnKTtcbn1cblxuY29uc3QgVEVNUExBVEUgPSBgLyoqIFJvb3QuanMgQ01TIHR5cGVzLiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZC4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TSW1hZ2Uge1xuICBzcmM6IHN0cmluZztcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgYWx0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSb290Q01TT25lT2Y8VCA9IGFueT4gPSBUICYge1xuICBfdHlwZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TUmljaFRleHRCbG9jayB7XG4gIHR5cGU6IHN0cmluZztcbiAgZGF0YTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RDTVNSaWNoVGV4dCB7XG4gIGJsb2NrczogUm9vdENNU1JpY2hUZXh0QmxvY2tbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TUmVmZXJlbmNlIHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXMvZm9vLWJhclwiLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogVGhlIGNvbGxlY3Rpb24gaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzXCIuICovXG4gIGNvbGxlY3Rpb246IHN0cmluZztcbiAgLyoqIFRoZSBzbHVnIG9mIHRoZSBkb2MsIGUuZy4gXCJmb28tYmFyXCIuICovXG4gIHNsdWc6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TRG9jPEZpZWxkcyBleHRlbmRzIHt9PiB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzL2Zvby1iYXJcIi4gKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlc1wiLiAqL1xuICBjb2xsZWN0aW9uOiBzdHJpbmc7XG4gIC8qKiBUaGUgc2x1ZyBvZiB0aGUgZG9jLCBlLmcuIFwiZm9vLWJhclwiLiAqL1xuICBzbHVnOiBzdHJpbmc7XG4gIC8qKiBTeXN0ZW0tbGV2ZWwgbWV0YWRhdGEuICovXG4gIHN5czoge1xuICAgIGNyZWF0ZWRBdDogbnVtYmVyO1xuICAgIGNyZWF0ZWRCeTogc3RyaW5nO1xuICAgIG1vZGlmaWVkQXQ6IG51bWJlcjtcbiAgICBtb2RpZmllZEJ5OiBzdHJpbmc7XG4gICAgZmlyc3RQdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBmaXJzdFB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xuICAgIHB1Ymxpc2hlZEF0PzogbnVtYmVyO1xuICAgIHB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xuICAgIGxvY2FsZXM/OiBzdHJpbmdbXTtcbiAgfTtcbiAgLyoqIFVzZXItZW50ZXJlZCBmaWVsZCB2YWx1ZXMgZnJvbSB0aGUgQ01TLiAqL1xuICBmaWVsZHM/OiBGaWVsZHM7XG59YDtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByb290LWNtcy5kLnRzIGZpbGUgZnJvbSB0aGUgLnNjaGVtYS50cyBmaWxlcyBpbiB0aGUgcHJvamVjdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2NoZW1hRHRzKFxuICBvdXRwdXRQYXRoOiBzdHJpbmcsXG4gIHNjaGVtYXM6IFJlY29yZDxzdHJpbmcsIFNjaGVtYT5cbikge1xuICBjb25zdCByZXN1bHRzID0gW1RFTVBMQVRFXTtcbiAgZm9yIChjb25zdCBmaWxlSWQgaW4gc2NoZW1hcykge1xuICAgIGNvbnN0IHNjaGVtYSA9IHNjaGVtYXNbZmlsZUlkXTtcbiAgICByZXN1bHRzLnB1c2gocmVuZGVyU2NoZW1hKGZpbGVJZCwgc2NoZW1hKSk7XG4gIH1cbiAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0c1xuICAgIC5qb2luKCdcXG5cXG4nKVxuICAgIC5yZXBsYWNlQWxsKCcvKiogICcsICcvKiogJylcbiAgICAucmVwbGFjZUFsbCgnICAqLycsICcgKi8nKVxuICAgIC5yZXBsYWNlKC9cXHJcXG58XFxyfFxcbi9nLCAnXFxuJyk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShvdXRwdXRQYXRoLCBvdXRwdXQsICd1dGYtOCcpO1xufVxuXG5mdW5jdGlvbiBmaWVsZFByb3BlcnR5KGZpZWxkOiBGaWVsZCk6IGRvbS5Qcm9wZXJ0eURlY2xhcmF0aW9uIHtcbiAgY29uc3QgcHJvcCA9IGRvbS5jcmVhdGUucHJvcGVydHkoXG4gICAgZmllbGQuaWQhLFxuICAgIGZpZWxkVHlwZShmaWVsZCksXG4gICAgZG9tLkRlY2xhcmF0aW9uRmxhZ3MuT3B0aW9uYWxcbiAgKTtcbiAgY29uc3QganNkb2MgPSBbXTtcbiAgaWYgKGZpZWxkLmxhYmVsKSB7XG4gICAgaWYgKGZpZWxkLmhlbHApIHtcbiAgICAgIGpzZG9jLnB1c2goYCR7ZmllbGQubGFiZWx9LiAke2ZpZWxkLmhlbHB9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGpzZG9jLnB1c2goZmllbGQubGFiZWwpO1xuICAgIH1cbiAgfVxuICBpZiAoZmllbGQuZGVwcmVjYXRlZCkge1xuICAgIGpzZG9jLnB1c2goJ0BkZXByZWNhdGVkJyk7XG4gIH1cbiAgaWYgKGpzZG9jLmxlbmd0aCA+IDApIHtcbiAgICBwcm9wLmpzRG9jQ29tbWVudCA9IGpzZG9jLmpvaW4oJ1xcbicpO1xuICB9XG4gIHJldHVybiBwcm9wO1xufVxuXG5mdW5jdGlvbiBmaWVsZFR5cGUoZmllbGQ6IEZpZWxkKTogZG9tLlR5cGUge1xuICBpZiAoZmllbGQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgIHJldHVybiBkb20udHlwZS5hcnJheShmaWVsZFR5cGUoZmllbGQub2YpKTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLmJvb2xlYW47XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdkYXRlJykge1xuICAgIHJldHVybiBkb20udHlwZS5zdHJpbmc7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdkYXRldGltZScpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUubnVtYmVyO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgY29uc3QgaW1hZ2VUeXBlID0gZG9tLmNyZWF0ZS5uYW1lZFR5cGVSZWZlcmVuY2UoJ1Jvb3RDTVNJbWFnZScpO1xuICAgIHJldHVybiBpbWFnZVR5cGU7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaWxlJykge1xuICAgIHJldHVybiBkb20uY3JlYXRlLm9iamVjdFR5cGUoW2RvbS5jcmVhdGUucHJvcGVydHkoJ3NyYycsIGRvbS50eXBlLnN0cmluZyldKTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgIHJldHVybiBkb20udHlwZS5hcnJheShkb20udHlwZS5zdHJpbmcpO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnb25lb2YnKSB7XG4gICAgY29uc3Qgb25lb2ZUeXBlID0gZG9tLmNyZWF0ZS5uYW1lZFR5cGVSZWZlcmVuY2UoJ1Jvb3RDTVNPbmVPZicpO1xuICAgIHJldHVybiBvbmVvZlR5cGU7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdyZWZlcmVuY2UnKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TUmVmZXJlbmNlJyk7XG4gICAgcmV0dXJuIHJlZmVyZW5jZVR5cGU7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdyaWNodGV4dCcpIHtcbiAgICBjb25zdCByaWNodGV4dFR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU1JpY2hUZXh0Jyk7XG4gICAgcmV0dXJuIHJpY2h0ZXh0VHlwZTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuc3RyaW5nO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkb20udHlwZS5zdHJpbmc7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3Qgc3VicHJvcGVydGllcyA9IChmaWVsZC5maWVsZHMgfHwgW10pLm1hcCgoZikgPT4gZmllbGRQcm9wZXJ0eShmKSk7XG4gICAgcmV0dXJuIGRvbS5jcmVhdGUub2JqZWN0VHlwZShzdWJwcm9wZXJ0aWVzKTtcbiAgfVxuICByZXR1cm4gZG9tLnR5cGUudW5rbm93bjtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU2NoZW1hKGZpbGVJZDogc3RyaW5nLCBzY2hlbWE6IFNjaGVtYSk6IHN0cmluZyB7XG4gIGNvbnN0IGpzZG9jID0gYEdlbmVyYXRlZCBmcm9tIFxcYCR7ZmlsZUlkfVxcYC5gO1xuICBjb25zdCBpZCA9IGFscGhhbnVtZXJpYyhwYXRoLnBhcnNlKGZpbGVJZCkubmFtZS5zcGxpdCgnLicpWzBdKTtcbiAgY29uc3QgZmllbGRzSW50ZXJmYWNlID0gYCR7aWR9RmllbGRzYDtcbiAgY29uc3QgZmllbGRzID0gZG9tLmNyZWF0ZS5pbnRlcmZhY2UoXG4gICAgZmllbGRzSW50ZXJmYWNlLFxuICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLkV4cG9ydFxuICApO1xuICBmaWVsZHMuanNEb2NDb21tZW50ID0ganNkb2M7XG4gIGZvciAoY29uc3QgZmllbGQgb2Ygc2NoZW1hLmZpZWxkcykge1xuICAgIGlmICghZmllbGQuaWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmaWVsZHMubWVtYmVycy5wdXNoKGZpZWxkUHJvcGVydHkoZmllbGQpKTtcbiAgfVxuXG4gIGNvbnN0IGZpZWxkc1R5cGVPdXRwdXQgPSBkb21cbiAgICAuZW1pdChmaWVsZHMsIHtzaW5nbGVMaW5lSnNEb2NDb21tZW50czogdHJ1ZX0pXG4gICAgLnRyaW0oKTtcbiAgaWYgKGZpbGVJZC5zdGFydHNXaXRoKCcvY29sbGVjdGlvbnMvJykpIHtcbiAgICBjb25zdCBiYXNlVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TRG9jJyk7XG4gICAgYmFzZVR5cGUudHlwZUFyZ3VtZW50cy5wdXNoKGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKGZpZWxkc0ludGVyZmFjZSkpO1xuICAgIGNvbnN0IGRvY1R5cGUgPSBkb20uY3JlYXRlLmFsaWFzKFxuICAgICAgYCR7aWR9RG9jYCxcbiAgICAgIGJhc2VUeXBlLFxuICAgICAgZG9tLkRlY2xhcmF0aW9uRmxhZ3MuRXhwb3J0XG4gICAgKTtcbiAgICBkb2NUeXBlLmpzRG9jQ29tbWVudCA9IGpzZG9jO1xuXG4gICAgY29uc3QgZG9jVHlwZU91dHB1dCA9IGRvbVxuICAgICAgLmVtaXQoZG9jVHlwZSwge3NpbmdsZUxpbmVKc0RvY0NvbW1lbnRzOiB0cnVlfSlcbiAgICAgIC50cmltKCk7XG4gICAgcmV0dXJuIHJlaW5kZW50KGZpZWxkc1R5cGVPdXRwdXQgKyAnXFxuXFxuJyArIGRvY1R5cGVPdXRwdXQpO1xuICB9XG4gIHJldHVybiByZWluZGVudChmaWVsZHNUeXBlT3V0cHV0KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyA0LXNwYWNlIGluZGVudHMgdG8gMi5cbiAqL1xuZnVuY3Rpb24gcmVpbmRlbnQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gaW5wdXQuc3BsaXQoJ1xcbicpO1xuICBjb25zdCByZXN1bHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRMaW5lID0gbGluZS5yZXBsYWNlKC8gezR9L2csICcgICcpO1xuICAgIHJlc3VsdHMucHVzaChjb252ZXJ0ZWRMaW5lKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cy5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIG5vbi1hbHBoYW51bWVyaWMgY2hhcnMgZnJvbSBhIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYWxwaGFudW1lcmljKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXQucmVwbGFjZSgvW15hLXpBLVowLTldL2csICcnKTtcbn1cbiIsICJpbXBvcnQge1NlcnZlciwgUmVxdWVzdCwgUmVzcG9uc2V9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge211bHRpcGFydE1pZGRsZXdhcmV9IGZyb20gJ0BibGlua2svcm9vdC9taWRkbGV3YXJlJztcbmltcG9ydCB7Um9vdENNU0NsaWVudH0gZnJvbSAnLi9jbGllbnQuanMnO1xuaW1wb3J0IHtydW5Dcm9uSm9ic30gZnJvbSAnLi9jcm9uLmpzJztcbmltcG9ydCB7YXJyYXlUb0NzdiwgY3N2VG9BcnJheX0gZnJvbSAnLi9jc3YuanMnO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBBUEkgbWlkZGxld2FyZSBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwaShzZXJ2ZXI6IFNlcnZlcikge1xuICAvKipcbiAgICogUnVucyBDTVMgY3JvbiBqb2JzLlxuICAgKi9cbiAgc2VydmVyLnVzZSgnL2Ntcy9hcGkvY3Jvbi5ydW4nLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJ1bkNyb25Kb2JzKHJlcS5yb290Q29uZmlnISk7XG4gICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZX0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlfSk7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogQWNjZXB0cyBhIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcge2hlYWRlcnM6IFsuLi5dLCByb3dzOiBbLi4uXX0gYW5kIHNlbmRzXG4gICAqIGFuIEhUVFAgcmVzcG9uc2Ugd2l0aCBhIGNvcnJlc3BvbmRpbmcgQ1NWIGZpbGUgYXMgYW4gYXR0YWNobWVudC5cbiAgICpcbiAgICogU2FtcGxlIHJlcXVlc3Q6XG4gICAqXG4gICAqIGBgYGpzb25cbiAgICoge1xuICAgKiAgIFwiaGVhZGVyc1wiOiBbXCJmb29cIl0sXG4gICAqICAgXCJyb3dzXCI6IFtcbiAgICogICAgIHtcImZvb1wiOiBcImJhclwifSxcbiAgICogICAgIHtcImZvb1wiOiBcImJhelwifSxcbiAgICogICBdXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBzZXJ2ZXIudXNlKCcvY21zL2FwaS9jc3YuZG93bmxvYWQnLCAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKFxuICAgICAgcmVxLm1ldGhvZCAhPT0gJ1BPU1QnIHx8XG4gICAgICAhU3RyaW5nKHJlcS5nZXQoJ2NvbnRlbnQtdHlwZScpKS5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi9qc29uJylcbiAgICApIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdCQURfUkVRVUVTVCd9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYm9keSA9IHJlcS5ib2R5IHx8IHt9O1xuICAgICAgY29uc3QgaGVhZGVycyA9IGJvZHkuaGVhZGVycyB8fCBbXTtcbiAgICAgIGNvbnN0IHJvd3MgPSBib2R5LnJvd3MgfHwgW107XG4gICAgICBjb25zdCBjc3YgPSBhcnJheVRvQ3N2KHtoZWFkZXJzLCByb3dzfSk7XG4gICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9jc3YnKTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudDsgZmlsZW5hbWU9XCJkYXRhLmNzdlwiJyk7XG4gICAgICByZXMuc3RhdHVzKDIwMCkuZW5kKGNzdik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVyci5zdGFjayB8fCBlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1VOS05PV04nfSk7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogSW1wb3J0cyBhIENTViBmaWxlIGFuZCByZXR1cm5zIGEgSlNPTiBhcnJheSBvZiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGVcbiAgICogQ1NWLlxuICAgKlxuICAgKiBTYW1wbGUgcmVzcG9uc2U6XG4gICAqXG4gICAqIGBgYGpzb25cbiAgICoge1xuICAgKiAgIFwic3VjY2Vzc1wiOiB0cnVlLFxuICAgKiAgIFwiZGF0YVwiOiBbXG4gICAqICAgICB7XCJmb29cIjogXCJiYXJcIn0sXG4gICAqICAgICB7XCJmb29cIjogXCJiYXpcIn0sXG4gICAqICAgXVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgc2VydmVyLnVzZShcbiAgICAnL2Ntcy9hcGkvY3N2LmltcG9ydCcsXG4gICAgbXVsdGlwYXJ0TWlkZGxld2FyZSgpLFxuICAgIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXEubWV0aG9kICE9PSAnUE9TVCcgfHwgIXJlcS5maWxlcyB8fCAhcmVxLmZpbGVzLmZpbGUpIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0JBRF9SRVFVRVNUJ30pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSByZXEuZmlsZXMuZmlsZTtcbiAgICAgICAgY29uc3QgY3N2U3RyaW5nID0gZmlsZS5idWZmZXIudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAgICAgY29uc3Qgcm93cyA9IGNzdlRvQXJyYXkoY3N2U3RyaW5nKTtcbiAgICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe3N1Y2Nlc3M6IHRydWUsIGRhdGE6IHJvd3N9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVyci5zdGFjayB8fCBlcnIpO1xuICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnVU5LTk9XTid9KTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBkYXRhIHNvdXJjZSBzeW5jLlxuICAgKi9cbiAgc2VydmVyLnVzZSgnL2Ntcy9hcGkvZGF0YS5zeW5jJywgYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIGlmIChcbiAgICAgIHJlcS5tZXRob2QgIT09ICdQT1NUJyB8fFxuICAgICAgIVN0cmluZyhyZXEuZ2V0KCdjb250ZW50LXR5cGUnKSkuc3RhcnRzV2l0aCgnYXBwbGljYXRpb24vanNvbicpXG4gICAgKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnQkFEX1JFUVVFU1QnfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZXEudXNlcj8uZW1haWwpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAxKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVTkFVVEhPUklaRUQnfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxQm9keSA9IHJlcS5ib2R5IHx8IHt9O1xuICAgIGNvbnN0IGRhdGFTb3VyY2VJZCA9IHJlcUJvZHkuaWQ7XG4gICAgaWYgKCFkYXRhU291cmNlSWQpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdNSVNTSU5HX0lEJ30pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjbXNDbGllbnQgPSBuZXcgUm9vdENNU0NsaWVudChyZXEucm9vdENvbmZpZyEpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbXNDbGllbnQuc3luY0RhdGFTb3VyY2UoZGF0YVNvdXJjZUlkLCB7c3luY2VkQnk6IHJlcS51c2VyLmVtYWlsfSk7XG4gICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgaWQ6IGRhdGFTb3VyY2VJZH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2sgfHwgZXJyKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVTktOT1dOJ30pO1xuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIExvZ3MgYW4gYWN0aW9uLlxuICAgKi9cbiAgc2VydmVyLnVzZSgnL2Ntcy9hcGkvYWN0aW9ucy5sb2cnLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKFxuICAgICAgcmVxLm1ldGhvZCAhPT0gJ1BPU1QnIHx8XG4gICAgICAhU3RyaW5nKHJlcS5nZXQoJ2NvbnRlbnQtdHlwZScpKS5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi9qc29uJylcbiAgICApIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdCQURfUkVRVUVTVCd9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlcS51c2VyPy5lbWFpbCkge1xuICAgICAgcmVzLnN0YXR1cyg0MDEpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1VOQVVUSE9SSVpFRCd9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXFCb2R5ID0gcmVxLmJvZHkgfHwge307XG4gICAgY29uc3QgYWN0aW9uID0gcmVxQm9keS5hY3Rpb247XG4gICAgaWYgKCFhY3Rpb24pIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiAnTUlTU0lOR19SRVFVSVJFRF9GSUVMRCcsXG4gICAgICAgIGZpZWxkOiAnYWN0aW9uJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBtZXRhZGF0YSA9IHJlcUJvZHkubWV0YWRhdGEgfHwge307XG5cbiAgICBjb25zdCBjbXNDbGllbnQgPSBuZXcgUm9vdENNU0NsaWVudChyZXEucm9vdENvbmZpZyEpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbXNDbGllbnQubG9nQWN0aW9uKGFjdGlvbiwge1xuICAgICAgICBieTogcmVxLnVzZXI/LmVtYWlsLFxuICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICB9KTtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVyci5zdGFjayB8fCBlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1VOS05PV04nfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsICJpbXBvcnQgY3J5cHRvIGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7UGx1Z2luLCBSb290Q29uZmlnfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHtBcHB9IGZyb20gJ2ZpcmViYXNlLWFkbWluL2FwcCc7XG5pbXBvcnQge1xuICBGaWVsZFZhbHVlLFxuICBGaXJlc3RvcmUsXG4gIFF1ZXJ5LFxuICBUaW1lc3RhbXAsXG4gIFdyaXRlQmF0Y2gsXG59IGZyb20gJ2ZpcmViYXNlLWFkbWluL2ZpcmVzdG9yZSc7XG5pbXBvcnQge0NNU1BsdWdpbn0gZnJvbSAnLi9wbHVnaW4uanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERvYzxGaWVsZHMgPSBhbnk+IHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXMvZm9vLWJhclwiLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogVGhlIGNvbGxlY3Rpb24gaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzXCIuICovXG4gIGNvbGxlY3Rpb246IHN0cmluZztcbiAgLyoqIFRoZSBzbHVnIG9mIHRoZSBkb2MsIGUuZy4gXCJmb28tYmFyXCIuICovXG4gIHNsdWc6IHN0cmluZztcbiAgc3lzOiB7XG4gICAgY3JlYXRlZEF0OiBudW1iZXI7XG4gICAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gICAgbW9kaWZpZWRBdDogbnVtYmVyO1xuICAgIG1vZGlmaWVkQnk6IHN0cmluZztcbiAgICBmaXJzdFB1Ymxpc2hlZEF0PzogbnVtYmVyO1xuICAgIGZpcnN0UHVibGlzaGVkQnk/OiBzdHJpbmc7XG4gICAgcHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgcHVibGlzaGVkQnk/OiBzdHJpbmc7XG4gICAgcHVibGlzaGluZ0xvY2tlZDoge1xuICAgICAgbG9ja2VkQXQ6IHN0cmluZztcbiAgICAgIGxvY2tlZEJ5OiBzdHJpbmc7XG4gICAgICByZWFzb246IHN0cmluZztcbiAgICAgIHVudGlsPzogVGltZXN0YW1wO1xuICAgIH07XG4gICAgbG9jYWxlcz86IHN0cmluZ1tdO1xuICB9O1xuICBmaWVsZHM6IEZpZWxkcztcbn1cblxuZXhwb3J0IHR5cGUgRG9jTW9kZSA9ICdkcmFmdCcgfCAncHVibGlzaGVkJztcblxuZXhwb3J0IHR5cGUgSHR0cE1ldGhvZCA9ICdHRVQnIHwgJ1BPU1QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTb3VyY2Uge1xuICBpZDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdHlwZTogJ2h0dHAnIHwgJ2dzaGVldCc7XG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogQ3VycmVudGx5IG9ubHkgdXNlZCBieSBnc2hlZXQuIGBhcnJheWAgcmV0dXJucyB0aGUgc2hlZXQgYXMgYW4gYXJyYXkgb2ZcbiAgICogYXJyYXlzLCBgbWFwYCByZXR1cm5zIHRoZSBzaGVldCBhcyBhbiBhcnJheSBvZiBvYmplY3RzLlxuICAgKi9cbiAgZGF0YUZvcm1hdD86ICdhcnJheScgfCAnbWFwJztcbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIEhUVFAgcmVxdWVzdHMuXG4gICAqL1xuICBodHRwT3B0aW9ucz86IHtcbiAgICBtZXRob2Q6IEh0dHBNZXRob2Q7XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgYm9keT86IHN0cmluZztcbiAgfTtcbiAgY3JlYXRlZEF0OiBUaW1lc3RhbXA7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICBzeW5jZWRBdD86IFRpbWVzdGFtcDtcbiAgc3luY2VkQnk/OiBzdHJpbmc7XG4gIHB1Ymxpc2hlZEF0PzogVGltZXN0YW1wO1xuICBwdWJsaXNoZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhU291cmNlRGF0YTxUID0gYW55PiB7XG4gIGRhdGFTb3VyY2U6IERhdGFTb3VyY2U7XG4gIGRhdGE6IFQ7XG59XG5cbmV4cG9ydCB0eXBlIERhdGFTb3VyY2VNb2RlID0gJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdldERvY09wdGlvbnMge1xuICAvKiogTW9kZSwgZWl0aGVyIFwiZHJhZnRcIiBvciBcInB1Ymxpc2hlZFwiLiAqL1xuICBtb2RlOiBEb2NNb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldERvY09wdGlvbnMge1xuICAvKiogTW9kZSwgZWl0aGVyIFwiZHJhZnRcIiBvciBcInB1Ymxpc2hlZFwiLiAqL1xuICBtb2RlOiBEb2NNb2RlO1xuICAvKipcbiAgICogRW1haWwgb2YgdXNlciBtb2RpZnlpbmcgdGhlIGRvYy4gSWYgYmxhbmssIGRlZmF1bHRzIHRvIGByb290LWNtcy1jbGllbnRgLlxuICAgKi9cbiAgbW9kaWZpZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RG9jc09wdGlvbnMge1xuICBtb2RlOiBEb2NNb2RlO1xuICBvZmZzZXQ/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvcmRlckJ5Pzogc3RyaW5nO1xuICBvcmRlckJ5RGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYyc7XG4gIHF1ZXJ5PzogKHF1ZXJ5OiBRdWVyeSkgPT4gUXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0Q291bnRPcHRpb25zIHtcbiAgbW9kZTogRG9jTW9kZTtcbiAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbiB7XG4gIFtsb2NhbGU6IHN0cmluZ106IHN0cmluZztcbiAgc291cmNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb25zTWFwIHtcbiAgW2hhc2g6IHN0cmluZ106IFRyYW5zbGF0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsZVRyYW5zbGF0aW9ucyB7XG4gIFtzb3VyY2U6IHN0cmluZ106IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2FkVHJhbnNsYXRpb25zT3B0aW9ucyB7XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWxlYXNlIHtcbiAgaWQ6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGRvY0lkcz86IHN0cmluZ1tdO1xuICBjcmVhdGVkQXQ/OiBUaW1lc3RhbXA7XG4gIGNyZWF0ZWRCeT86IHN0cmluZztcbiAgc2NoZWR1bGVkQXQ/OiBUaW1lc3RhbXA7XG4gIHNjaGVkdWxlZEJ5Pzogc3RyaW5nO1xuICBwdWJsaXNoZWRBdD86IFRpbWVzdGFtcDtcbiAgcHVibGlzaGVkQnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uPFQgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24uXG4gICAqL1xuICBhY3Rpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1c2VyJ3MgZW1haWwgdGhhdCBwZXJmb3JtZWQgdGhlIGFjdGlvbiAob3IgXCJzeXN0ZW1cIikuXG4gICAqL1xuICBieT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRpbWVzdGFtcCB3aGVuIHRoZSBhY3Rpb24gb2NjdXJyZWQuXG4gICAqL1xuICB0aW1lc3RhbXA6IFRpbWVzdGFtcDtcbiAgLyoqXG4gICAqIE1ldGFkYXRhIGZvciB0aGUgYWN0aW9uLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RBY3Rpb25zT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBzcGVjaWZpYyBhY3Rpb24uIERlZmF1bHRzIHRvIGFsbCBhY3Rpb25zLlxuICAgKi9cbiAgYWN0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogRmlsdGVyIGJ5IGEgc3BlY2lmaWMgdXNlci4gRGVmYXVsdHMgdG8gYWxsIHVzZXJzLlxuICAgKi9cbiAgYnk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNYXggbnVtYmVyIG9mIGFjdGlvbnMgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byAxMDAuXG4gICAqL1xuICBsaW1pdD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RDTVNDbGllbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RDb25maWc6IFJvb3RDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY21zUGx1Z2luOiBDTVNQbHVnaW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdElkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGI6IEZpcmVzdG9yZTtcblxuICBjb25zdHJ1Y3Rvcihyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gICAgdGhpcy5yb290Q29uZmlnID0gcm9vdENvbmZpZztcbiAgICB0aGlzLmNtc1BsdWdpbiA9IGdldENtc1BsdWdpbih0aGlzLnJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgY21zUGx1Z2luT3B0aW9ucyA9IHRoaXMuY21zUGx1Z2luLmdldENvbmZpZygpO1xuICAgIHRoaXMucHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gICAgdGhpcy5hcHAgPSB0aGlzLmNtc1BsdWdpbi5nZXRGaXJlYmFzZUFwcCgpO1xuICAgIHRoaXMuZGIgPSB0aGlzLmNtc1BsdWdpbi5nZXRGaXJlc3RvcmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgZG9jIGRhdGEgZnJvbSBSb290LmpzIENNUy5cbiAgICovXG4gIGFzeW5jIGdldERvYzxGaWVsZHMgPSBhbnk+KFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIHNsdWc6IHN0cmluZyxcbiAgICBvcHRpb25zOiBHZXREb2NPcHRpb25zXG4gICk6IFByb21pc2U8RG9jPEZpZWxkcz4gfCBudWxsPiB7XG4gICAgY29uc3QgcmF3RGF0YSA9IGF3YWl0IHRoaXMuZ2V0UmF3RG9jKGNvbGxlY3Rpb25JZCwgc2x1Zywgb3B0aW9ucyk7XG4gICAgaWYgKHJhd0RhdGEpIHtcbiAgICAgIHJldHVybiB1bm1hcnNoYWxEYXRhKHJhd0RhdGEpIGFzIERvYzxGaWVsZHM+O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgcmF3IGRvYyBkYXRhIGFzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuIE9ubHkgdXNlIHRoaXMgaWYgeW91IGtub3dcbiAgICogd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmF3RG9jKFxuICAgIGNvbGxlY3Rpb25JZDogc3RyaW5nLFxuICAgIHNsdWc6IHN0cmluZyxcbiAgICBvcHRpb25zOiBHZXREb2NPcHRpb25zXG4gICk6IFByb21pc2U8YW55IHwgbnVsbD4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICAvLyBTbHVncyB3aXRoIHNsYXNoZXMgYXJlIGVuY29kZWQgYXMgYC0tYCBpbiB0aGUgREIuXG4gICAgc2x1ZyA9IHNsdWcucmVwbGFjZUFsbCgnLycsICctLScpO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICAgIHJldHVybiBkb2MuZGF0YSgpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIHNldFJhd0RvYyhcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBzbHVnOiBzdHJpbmcsXG4gICAgZGF0YTogYW55LFxuICAgIG9wdGlvbnM6IFNldERvY09wdGlvbnNcbiAgKSB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBhd2FpdCBkb2NSZWYuc2V0KGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIGRvY3MgZnJvbSBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gICAqL1xuICBhc3luYyBsaXN0RG9jczxUPihcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBMaXN0RG9jc09wdGlvbnNcbiAgKTogUHJvbWlzZTx7ZG9jczogVFtdfT4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259YDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMubGltaXQpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkubGltaXQob3B0aW9ucy5saW1pdCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm9mZnNldCkge1xuICAgICAgcXVlcnkgPSBxdWVyeS5vZmZzZXQob3B0aW9ucy5vZmZzZXQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5Lm9yZGVyQnkob3B0aW9ucy5vcmRlckJ5LCBvcHRpb25zLm9yZGVyQnlEaXJlY3Rpb24pO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuICAgIGNvbnN0IGRvY3M6IFRbXSA9IFtdO1xuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBkb2MgPSB1bm1hcnNoYWxEYXRhKHJlc3VsdC5kYXRhKCkpIGFzIFQ7XG4gICAgICBkb2NzLnB1c2goZG9jKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge2RvY3N9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkb2NzIGluIGEgUm9vdC5qcyBDTVMgY29sbGVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldERvY3NDb3VudChjb2xsZWN0aW9uSWQ6IHN0cmluZywgb3B0aW9uczogR2V0Q291bnRPcHRpb25zKSB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZTtcbiAgICBjb25zdCBtb2RlQ29sbGVjdGlvbiA9IG1vZGUgPT09ICdkcmFmdCcgPyAnRHJhZnRzJyA6ICdQdWJsaXNoZWQnO1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vJHttb2RlQ29sbGVjdGlvbn1gO1xuICAgIGxldCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5xdWVyeSkge1xuICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmNvdW50KCkuZ2V0KCk7XG4gICAgY29uc3QgY291bnQgPSByZXN1bHRzLmRhdGEoKS5jb3VudDtcbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvKipcbiAgICogQmF0Y2ggcHVibGlzaGVzIGEgc2V0IG9mIGRvY3MgYnkgaWQuXG4gICAqL1xuICBhc3luYyBwdWJsaXNoRG9jcyhcbiAgICBkb2NJZHM6IHN0cmluZ1tdLFxuICAgIG9wdGlvbnM/OiB7cHVibGlzaGVkQnk6IHN0cmluZzsgYmF0Y2g/OiBXcml0ZUJhdGNofVxuICApIHtcbiAgICBjb25zdCBwcm9qZWN0Q29sbGVjdGlvbnNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zYDtcbiAgICBjb25zdCBwdWJsaXNoZWRCeSA9IG9wdGlvbnM/LnB1Ymxpc2hlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnO1xuXG4gICAgLy8gRmV0Y2ggdGhlIGN1cnJlbnQgZHJhZnQgZGF0YSBmb3IgZWFjaCBkb2MuXG4gICAgY29uc3QgZG9jUmVmcyA9IGRvY0lkcy5tYXAoKGRvY0lkKSA9PiB7XG4gICAgICBjb25zdCBbY29sbGVjdGlvbiwgc2x1Z10gPSBkb2NJZC5zcGxpdCgnLycpO1xuICAgICAgaWYgKCFjb2xsZWN0aW9uIHx8ICFzbHVnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBkb2MgaWQ6ICR7ZG9jSWR9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZG9jUmVmO1xuICAgIH0pO1xuICAgIGNvbnN0IGRvY1NuYXBzaG90cyA9IGF3YWl0IHRoaXMuZGIuZ2V0QWxsKC4uLmRvY1JlZnMpO1xuICAgIGNvbnN0IGRvY3MgPSBkb2NTbmFwc2hvdHNcbiAgICAgIC8vIFJldHJpZXZlIHNuYXBzaG90IGRhdGEgZm9yIGVhY2ggZG9jLlxuICAgICAgLm1hcCgoc25hcHNob3QpID0+IHNuYXBzaG90LmRhdGEoKSBhcyBEb2MpXG4gICAgICAvLyBSZW1vdmUgZG9jcyB0aGF0IGRvbid0IGV4aXN0LlxuICAgICAgLmZpbHRlcigoZCkgPT4gISFkKTtcblxuICAgIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coJ25vIGRvY3MgdG8gcHVibGlzaCcpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSB0aGVyZSBhcmUgbm8gcHVibGlzaGluZyBsb2NrcyBvbiBhbnkgZG9jcy5cbiAgICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgICBpZiAodGhpcy50ZXN0UHVibGlzaGluZ0xvY2tlZChkb2MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgcHVibGlzaGluZyBpcyBsb2NrZWQgZm9yIGRvYzogJHtkb2MuaWR9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLy8gRWFjaCB0cmFuc2FjdGlvbiBvciBiYXRjaCBjYW4gd3JpdGUgYSBtYXggb2YgNTAwIG9wcy5cbiAgICAvLyAvLyBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9maXJlc3RvcmUvbWFuYWdlLWRhdGEvdHJhbnNhY3Rpb25zXG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIGNvbnN0IGJhdGNoID0gb3B0aW9ucz8uYmF0Y2ggfHwgdGhpcy5kYi5iYXRjaCgpO1xuICAgIGNvbnN0IHB1Ymxpc2hlZERvY3M6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgY29uc3Qge2lkLCBjb2xsZWN0aW9uLCBzbHVnLCBzeXMsIGZpZWxkc30gPSBkb2M7XG4gICAgICBjb25zdCBkcmFmdFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L0RyYWZ0cy8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNjaGVkdWxlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1NjaGVkdWxlZC8ke3NsdWd9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHB1Ymxpc2hlZFJlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgICBgJHtwcm9qZWN0Q29sbGVjdGlvbnNQYXRofS8ke2NvbGxlY3Rpb259L1B1Ymxpc2hlZC8ke3NsdWd9YFxuICAgICAgKTtcblxuICAgICAgLy8gT25seSB1cGRhdGUgYGZpcnN0UHVibGlzaGVkYCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEF0ID1cbiAgICAgICAgc3lzLmZpcnN0UHVibGlzaGVkQXQgPz8gRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKTtcbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQnkgPSBzeXMuZmlyc3RQdWJsaXNoZWRCeSA/PyBwdWJsaXNoZWRCeTtcblxuICAgICAgLy8gU2F2ZSBwdWJsaXNoZWQgZG9jLlxuICAgICAgYmF0Y2guc2V0KHB1Ymxpc2hlZFJlZiwge1xuICAgICAgICBpZCxcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgc2x1ZyxcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgfHwge30sXG4gICAgICAgIHN5czoge1xuICAgICAgICAgIC4uLnN5cyxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEF0OiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQnk6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICAgcHVibGlzaGVkQXQ6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICAgcHVibGlzaGVkQnk6IHB1Ymxpc2hlZEJ5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFJlbW92ZSBzY2hlZHVsZWQgZG9jLCBpZiBhbnkuXG4gICAgICBiYXRjaC5kZWxldGUoc2NoZWR1bGVkUmVmKTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBkcmFmdCBkb2MgdG8gcmVtb3ZlIGBzY2hlZHVsZWRBdGAgYW5kIGBzY2hlZHVsZWRCeWAgZmllbGRzXG4gICAgICAvLyBhbmQgdXBkYXRlIHRoZSBgcHVibGlzaGVkQXRgIGFuZCBgcHVibGlzaGVkQnlgIGZpZWxkcy5cbiAgICAgIGJhdGNoLnVwZGF0ZShkcmFmdFJlZiwge1xuICAgICAgICAnc3lzLnNjaGVkdWxlZEF0JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRCeSc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRBdCc6IGZpcnN0UHVibGlzaGVkQXQsXG4gICAgICAgICdzeXMuZmlyc3RQdWJsaXNoZWRCeSc6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICdzeXMucHVibGlzaGVkQXQnOiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEJ5JzogcHVibGlzaGVkQnksXG4gICAgICB9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcblxuICAgICAgcHVibGlzaGVkRG9jcy5wdXNoKGRvYyk7XG5cbiAgICAgIGlmIChiYXRjaENvdW50ID49IDQwMCkge1xuICAgICAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICAgICAgYmF0Y2hDb3VudCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGJhdGNoQ291bnQgPiAwKSB7XG4gICAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCAke3B1Ymxpc2hlZERvY3MubGVuZ3RofSBkb2NzIWApO1xuICAgIHJldHVybiBwdWJsaXNoZWREb2NzO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBzY2hlZHVsZWQgZG9jcy5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hTY2hlZHVsZWREb2NzKCkge1xuICAgIGNvbnN0IHByb2plY3RDb2xsZWN0aW9uc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnNgO1xuICAgIGNvbnN0IG5vdyA9IE1hdGguY2VpbChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG5cbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRoaXMuZGIuY29sbGVjdGlvbkdyb3VwKCdTY2hlZHVsZWQnKS5nZXQoKTtcbiAgICBjb25zdCBkb2NzID0gc25hcHNob3QuZG9jc1xuICAgICAgLmZpbHRlcigoZCkgPT4ge1xuICAgICAgICAvLyBGaWx0ZXIgZG9jcyBieSBwcm9qZWN0LlxuICAgICAgICBpZiAoIWQucmVmLnBhdGguc3RhcnRzV2l0aChwcm9qZWN0Q29sbGVjdGlvbnNQYXRoKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWx0ZXIgZG9jcyB3aGVyZSBzY2hlZHVsZWRBdCBpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgLy8gTk9URShzdGV2ZW5sZSk6IHRoZSBmaWx0ZXJpbmcgaXMgZG9uZSBtYW51YWxseSBpbnN0ZWFkIG9mIHVzaW5nIGEgcXVlcnlcbiAgICAgICAgLy8gdG8gYXZvaWQgaGF2aW5nIHRvIGNyZWF0ZSBhbiBpbmRleCBpbiBmaXJlc3RvcmUuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBkLmRhdGEoKSB8fCB7fTtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVkQXQ6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCA9IGRhdGEuc3lzPy5zY2hlZHVsZWRBdDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBzY2hlZHVsZWRBdCAmJiBzY2hlZHVsZWRBdC50b01pbGxpcyAmJiBzY2hlZHVsZWRBdC50b01pbGxpcygpIDw9IG5vd1xuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKGQpID0+IHtcbiAgICAgICAgY29uc3QgZGJQYXRoID0gZC5yZWYucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBkYlBhdGguc3BsaXQoJy8nKTtcbiAgICAgICAgY29uc3Qgc2x1ZyA9IHNlZ21lbnRzLmF0KC0xKTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHNlZ21lbnRzLmF0KC0zKTtcbiAgICAgICAgY29uc3QgaWQgPSBgJHtjb2xsZWN0aW9ufS8ke3NsdWd9YDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBkLmRhdGEoKSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgIHNsdWcsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coJ25vIGRvY3MgdG8gc2NoZWR1bGUnKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBFYWNoIHRyYW5zYWN0aW9uIG9yIGJhdGNoIGNhbiB3cml0ZSBhIG1heCBvZiA1MDAgb3BzLlxuICAgIC8vIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2ZpcmVzdG9yZS9tYW5hZ2UtZGF0YS90cmFuc2FjdGlvbnNcbiAgICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgY29uc3QgcHVibGlzaGVkRG9jczogYW55W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgICBjb25zdCB7aWQsIGNvbGxlY3Rpb24sIHNsdWcsIGRhdGF9ID0gZG9jO1xuICAgICAgY29uc3QgZHJhZnRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzY2hlZHVsZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9TY2hlZHVsZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBwdWJsaXNoZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9QdWJsaXNoZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCB7c2NoZWR1bGVkQXQsIHNjaGVkdWxlZEJ5LCAuLi5zeXN9ID0gZGF0YS5zeXMgfHwge307XG5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIGBmaXJzdFB1Ymxpc2hlZGAgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRBdCA9IHN5cy5maXJzdFB1Ymxpc2hlZEF0ID8/IHNjaGVkdWxlZEF0O1xuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRCeSA9XG4gICAgICAgIHN5cy5maXJzdFB1Ymxpc2hlZEJ5ID8/IChzY2hlZHVsZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50Jyk7XG5cbiAgICAgIC8vIFNhdmUgcHVibGlzaGVkIGRvYy5cbiAgICAgIGJhdGNoLnNldChwdWJsaXNoZWRSZWYsIHtcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIHNsdWcsXG4gICAgICAgIGZpZWxkczogZGF0YS5maWVsZHMgfHwge30sXG4gICAgICAgIHN5czoge1xuICAgICAgICAgIC4uLnN5cyxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEF0OiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAgIGZpcnN0UHVibGlzaGVkQnk6IGZpcnN0UHVibGlzaGVkQnksXG4gICAgICAgICAgcHVibGlzaGVkQXQ6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICAgcHVibGlzaGVkQnk6IHNjaGVkdWxlZEJ5IHx8ICcnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFJlbW92ZSBwdWJsaXNoZWQgZG9jLlxuICAgICAgYmF0Y2guZGVsZXRlKHNjaGVkdWxlZFJlZik7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZHJhZnQgZG9jIHRvIHJlbW92ZSBgc2NoZWR1bGVkQXRgIGFuZCBgc2NoZWR1bGVkQnlgIGZpZWxkc1xuICAgICAgLy8gYW5kIHVwZGF0ZSB0aGUgYHB1Ymxpc2hlZEF0YCBhbmQgYHB1Ymxpc2hlZEJ5YCBmaWVsZHMuXG4gICAgICBiYXRjaC51cGRhdGUoZHJhZnRSZWYsIHtcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRBdCc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuc2NoZWR1bGVkQnknOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQXQnOiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQnknOiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEF0JzogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRCeSc6IHNjaGVkdWxlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnLFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIHB1Ymxpc2hlZERvY3MucHVzaChkb2MpO1xuXG4gICAgICBpZiAoYmF0Y2hDb3VudCA+PSA0MDApIHtcbiAgICAgICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgICAgIGJhdGNoQ291bnQgPSAwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYmF0Y2hDb3VudCA+IDApIHtcbiAgICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkICR7cHVibGlzaGVkRG9jcy5sZW5ndGh9IGRvY3MhYCk7XG4gICAgcmV0dXJuIHB1Ymxpc2hlZERvY3M7XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaGVzIGRvY3MgaW4gc2NoZWR1bGVkIHJlbGVhc2VzLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaFNjaGVkdWxlZFJlbGVhc2VzKCkge1xuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9SZWxlYXNlc2A7XG4gICAgY29uc3Qgbm93ID0gTWF0aC5jZWlsKG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcbiAgICBjb25zdCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiXG4gICAgICAuY29sbGVjdGlvbihyZWxlYXNlc1BhdGgpXG4gICAgICAud2hlcmUoJ3NjaGVkdWxlZEF0JywgJzw9JywgVGltZXN0YW1wLmZyb21NaWxsaXMobm93KSk7XG4gICAgY29uc3QgcXVlcnlTbmFwc2hvdCA9IGF3YWl0IHF1ZXJ5LmdldCgpO1xuXG4gICAgZm9yIChjb25zdCBzbmFwc2hvdCBvZiBxdWVyeVNuYXBzaG90LmRvY3MpIHtcbiAgICAgIGNvbnN0IHJlbGVhc2UgPSBzbmFwc2hvdC5kYXRhKCkgYXMgUmVsZWFzZTtcbiAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgICAgY29uc3QgcHVibGlzaGVkQnkgPSByZWxlYXNlLnNjaGVkdWxlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnO1xuICAgICAgYmF0Y2gudXBkYXRlKHNuYXBzaG90LnJlZiwge1xuICAgICAgICBwdWJsaXNoZWRBdDogVGltZXN0YW1wLm5vdygpLFxuICAgICAgICBwdWJsaXNoZWRCeTogcHVibGlzaGVkQnksXG4gICAgICAgIHNjaGVkdWxlZEF0OiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICBzY2hlZHVsZWRCeTogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5wdWJsaXNoRG9jcyhyZWxlYXNlLmRvY0lkcyB8fCBbXSwge3B1Ymxpc2hlZEJ5LCBiYXRjaH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBkb2MgaXMgY3VycmVudGx5IFwibG9ja2VkXCIgZm9yIHB1Ymxpc2hpbmcuXG4gICAqL1xuICB0ZXN0UHVibGlzaGluZ0xvY2tlZChkb2M6IERvYykge1xuICAgIGlmIChkb2Muc3lzPy5wdWJsaXNoaW5nTG9ja2VkKSB7XG4gICAgICBpZiAoZG9jLnN5cy5wdWJsaXNoaW5nTG9ja2VkLnVudGlsKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IFRpbWVzdGFtcC5ub3coKS50b01pbGxpcygpO1xuICAgICAgICBjb25zdCB1bnRpbCA9IGRvYy5zeXMucHVibGlzaGluZ0xvY2tlZC51bnRpbC50b01pbGxpcygpO1xuICAgICAgICByZXR1cm4gbm93IDwgdW50aWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRyYW5zbGF0aW9ucyBzYXZlZCBpbiB0aGUgdHJhbnNsYXRpb25zIGNvbGxlY3Rpb24sIG9wdGlvbmFsbHlcbiAgICogZmlsdGVyZWQgYnkgdGFnLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgXCI8aGFzaD5cIjoge1wic291cmNlXCI6IFwiSGVsbG9cIiwgXCJlc1wiOiBcIkhvbGFcIiwgXCJmclwiOiBcIkJvbmpvdXJcIn0sXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2FkVHJhbnNsYXRpb25zKFxuICAgIG9wdGlvbnM/OiBMb2FkVHJhbnNsYXRpb25zT3B0aW9uc1xuICApOiBQcm9taXNlPFRyYW5zbGF0aW9uc01hcD4ge1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9UcmFuc2xhdGlvbnNgO1xuICAgIGxldCBxdWVyeTogUXVlcnkgPSB0aGlzLmRiLmNvbGxlY3Rpb24oZGJQYXRoKTtcbiAgICBpZiAob3B0aW9ucz8udGFncykge1xuICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZSgndGFncycsICdhcnJheS1jb250YWlucy1hbnknLCBvcHRpb25zLnRhZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5U25hcHNob3QgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnNNYXA6IFRyYW5zbGF0aW9uc01hcCA9IHt9O1xuICAgIHF1ZXJ5U25hcHNob3QuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgICBjb25zdCBoYXNoID0gZG9jLmlkO1xuICAgICAgdHJhbnNsYXRpb25zTWFwW2hhc2hdID0gZG9jLmRhdGEoKSBhcyBUcmFuc2xhdGlvbjtcbiAgICB9KTtcbiAgICByZXR1cm4gdHJhbnNsYXRpb25zTWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGEgbWFwIG9mIHRyYW5zbGF0aW9ucywgZS5nLjpcbiAgICogYGBgXG4gICAqIGF3YWl0IGNsaWVudC5zYXZlVHJhbnNsYXRpb25zKHtcbiAgICogICBcIkhlbGxvXCI6IHtcImVzXCI6IFwiSG9sYVwiLCBcImZyXCI6IFwiQm9uam91clwifSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc2F2ZVRyYW5zbGF0aW9ucyhcbiAgICB0cmFuc2xhdGlvbnM6IHtcbiAgICAgIFtzb3VyY2U6IHN0cmluZ106IHtbbG9jYWxlOiBzdHJpbmddOiBzdHJpbmd9O1xuICAgIH0sXG4gICAgdGFncz86IHN0cmluZ1tdXG4gICkge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vVHJhbnNsYXRpb25zYDtcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICBsZXQgYmF0Y2hDb3VudCA9IDA7XG4gICAgT2JqZWN0LmVudHJpZXModHJhbnNsYXRpb25zKS5mb3JFYWNoKChbc291cmNlLCBzb3VyY2VUcmFuc2xhdGlvbnNdKSA9PiB7XG4gICAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRUcmFuc2xhdGlvbktleShzb3VyY2UpO1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25SZWYgPSB0aGlzLmRiLmRvYyhgJHt0cmFuc2xhdGlvbnNQYXRofS8ke2hhc2h9YCk7XG4gICAgICBjb25zdCBkYXRhOiBhbnkgPSB7XG4gICAgICAgIC4uLnNvdXJjZVRyYW5zbGF0aW9ucyxcbiAgICAgICAgc291cmNlOiB0aGlzLm5vcm1hbGl6ZVN0cmluZyhzb3VyY2UpLFxuICAgICAgfTtcbiAgICAgIGlmICh0YWdzKSB7XG4gICAgICAgIGRhdGEudGFncyA9IHRhZ3M7XG4gICAgICB9XG4gICAgICBiYXRjaC5zZXQodHJhbnNsYXRpb25SZWYsIGRhdGEsIHttZXJnZTogdHJ1ZX0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuICAgIH0pO1xuICAgIGlmIChiYXRjaENvdW50ID4gNTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VwIHRvIDUwMCB0cmFuc2xhdGlvbnMgY2FuIGJlIHNhdmVkIGF0IGEgdGltZS4nKTtcbiAgICB9XG4gICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgXCJrZXlcIiB1c2VkIGZvciBhIHRyYW5zbGF0aW9uIGFzIHN0b3JlZCBpbiB0aGUgZGIuIFRyYW5zbGF0aW9uc1xuICAgKiBhcmUgc3RvcmVkIHVuZGVyIGBQcm9qZWN0cy88cHJvamVjdCBpZD4vVHJhbnNsYXRpb25zLzxzaGExIGhhc2g+YC5cbiAgICovXG4gIGdldFRyYW5zbGF0aW9uS2V5KHNvdXJjZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2hhMSA9IGNyeXB0b1xuICAgICAgLmNyZWF0ZUhhc2goJ3NoYTEnKVxuICAgICAgLnVwZGF0ZSh0aGlzLm5vcm1hbGl6ZVN0cmluZyhzb3VyY2UpKVxuICAgICAgLmRpZ2VzdCgnaGV4Jyk7XG4gICAgcmV0dXJuIHNoYTE7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIGEgc3RyaW5nIHRoYXQncyB1c2VkIGZvciB0cmFuc2xhdGlvbnMuIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gUmVtb3ZlcyBhbnkgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlXG4gICAqIC0gUmVtb3ZlcyBzcGFjZXMgYXQgdGhlIGVuZCBvZiBhbnkgbGluZVxuICAgKi9cbiAgbm9ybWFsaXplU3RyaW5nKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3QgbGluZXMgPSBTdHJpbmcoc3RyKVxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltRW5kKCkpO1xuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0cmFuc2xhdGlvbnMgZm9yIGEgcGFydGljdWxhciBsb2NhbGUuXG4gICAqXG4gICAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAgICogYGBgXG4gICAqIHtcbiAgICogICBcIkhlbGxvXCI6IFwiQm9uam91clwiLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9hZFRyYW5zbGF0aW9uc0ZvckxvY2FsZShcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogTG9hZFRyYW5zbGF0aW9uc09wdGlvbnNcbiAgKTogUHJvbWlzZTxMb2NhbGVUcmFuc2xhdGlvbnM+IHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnNNYXAgPSBhd2FpdCB0aGlzLmxvYWRUcmFuc2xhdGlvbnMob3B0aW9ucyk7XG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uc0ZvckxvY2FsZSh0cmFuc2xhdGlvbnNNYXAsIGxvY2FsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGRhdGEgc291cmNlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKi9cbiAgYXN5bmMgZ2V0RGF0YVNvdXJjZShkYXRhU291cmNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH1gO1xuICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKGRiUGF0aCk7XG4gICAgY29uc3QgZG9jID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICAgIGlmIChkb2MuZXhpc3RzKSB7XG4gICAgICByZXR1cm4gZG9jLmRhdGEoKSBhcyBEYXRhU291cmNlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jcyBhIGRhdGEgc291cmNlIHRvIGRyYWZ0IHN0YXRlLlxuICAgKi9cbiAgYXN5bmMgc3luY0RhdGFTb3VyY2UoZGF0YVNvdXJjZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiB7c3luY2VkQnk/OiBzdHJpbmd9KSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YVNvdXJjZShkYXRhU291cmNlSWQpO1xuICAgIGlmICghZGF0YVNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBkYXRhIHNvdXJjZSBub3QgZm91bmQ6ICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZldGNoRGF0YShkYXRhU291cmNlKTtcblxuICAgIGNvbnN0IGRhdGFTb3VyY2VEb2NSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH1gXG4gICAgKTtcbiAgICBjb25zdCBkYXRhRG9jUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9L0RhdGEvZHJhZnRgXG4gICAgKTtcbiAgICBjb25zdCBzeW5jZWRCeSA9IG9wdGlvbnM/LnN5bmNlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnO1xuXG4gICAgY29uc3QgdXBkYXRlZERhdGFTb3VyY2U6IERhdGFTb3VyY2UgPSB7XG4gICAgICAuLi5kYXRhU291cmNlLFxuICAgICAgc3luY2VkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHN5bmNlZEJ5OiBzeW5jZWRCeSxcbiAgICB9O1xuXG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgYmF0Y2guc2V0KGRhdGFEb2NSZWYsIHtcbiAgICAgIGRhdGFTb3VyY2U6IHVwZGF0ZWREYXRhU291cmNlLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICB9KTtcbiAgICBiYXRjaC51cGRhdGUoZGF0YVNvdXJjZURvY1JlZiwge1xuICAgICAgc3luY2VkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHN5bmNlZEJ5OiBzeW5jZWRCeSxcbiAgICB9KTtcbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcblxuICAgIGNvbnNvbGUubG9nKGBzeW5jZWQgZGF0YSBzb3VyY2U6ICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgIGNvbnNvbGUubG9nKGBzeW5jZWQgYnk6ICR7c3luY2VkQnl9YCk7XG4gIH1cblxuICBhc3luYyBwdWJsaXNoRGF0YVNvdXJjZShcbiAgICBkYXRhU291cmNlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge3B1Ymxpc2hlZEJ5Pzogc3RyaW5nfVxuICApIHtcbiAgICBjb25zdCBkYXRhU291cmNlID0gYXdhaXQgdGhpcy5nZXREYXRhU291cmNlKGRhdGFTb3VyY2VJZCk7XG4gICAgaWYgKCFkYXRhU291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGRhdGEgc291cmNlIG5vdCBmb3VuZDogJHtkYXRhU291cmNlSWR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVNvdXJjZURvY1JlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0RhdGFTb3VyY2VzLyR7ZGF0YVNvdXJjZUlkfWBcbiAgICApO1xuICAgIGNvbnN0IGRhdGFEb2NSZWZEcmFmdCA9IHRoaXMuZGIuZG9jKFxuICAgICAgYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0RhdGFTb3VyY2VzLyR7ZGF0YVNvdXJjZUlkfS9kcmFmdGBcbiAgICApO1xuICAgIGNvbnN0IGRhdGFEb2NSZWZQdWJsaXNoZWQgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH0vcHVibGlzaGVkYFxuICAgICk7XG5cbiAgICBjb25zdCBkYXRhUmVzID0gYXdhaXQgdGhpcy5nZXRGcm9tRGF0YVNvdXJjZShkYXRhU291cmNlSWQsIHttb2RlOiAnZHJhZnQnfSk7XG5cbiAgICBjb25zdCBwdWJsaXNoZWRCeSA9IG9wdGlvbnM/LnB1Ymxpc2hlZEJ5IHx8ICdyb290LWNtcy1jbGllbnQnO1xuXG4gICAgY29uc3QgdXBkYXRlZERhdGFTb3VyY2U6IERhdGFTb3VyY2UgPSB7XG4gICAgICAuLi5kYXRhU291cmNlLFxuICAgICAgcHVibGlzaGVkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHB1Ymxpc2hlZEJ5OiBwdWJsaXNoZWRCeSxcbiAgICB9O1xuXG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgYmF0Y2guc2V0KGRhdGFEb2NSZWZQdWJsaXNoZWQsIHtcbiAgICAgIGRhdGFTb3VyY2U6IHVwZGF0ZWREYXRhU291cmNlLFxuICAgICAgZGF0YTogZGF0YVJlcz8uZGF0YSB8fCBudWxsLFxuICAgIH0pO1xuICAgIGJhdGNoLnVwZGF0ZShkYXRhRG9jUmVmRHJhZnQsIHtcbiAgICAgIGRhdGFTb3VyY2U6IHVwZGF0ZWREYXRhU291cmNlLFxuICAgIH0pO1xuICAgIGJhdGNoLnVwZGF0ZShkYXRhU291cmNlRG9jUmVmLCB7XG4gICAgICBwdWJsaXNoZWRBdDogVGltZXN0YW1wLm5vdygpLFxuICAgICAgcHVibGlzaGVkQnk6IHB1Ymxpc2hlZEJ5LFxuICAgIH0pO1xuICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuXG4gICAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCBkYXRhICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgYnk6ICR7cHVibGlzaGVkQnl9YCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoRGF0YShkYXRhU291cmNlOiBEYXRhU291cmNlKSB7XG4gICAgaWYgKGRhdGFTb3VyY2UudHlwZSA9PT0gJ2h0dHAnKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaEh0dHBEYXRhKGRhdGFTb3VyY2UpO1xuICAgIH1cbiAgICAvLyBUT0RPKHN0ZXZlbmxlKTogaW1wbC5cbiAgICAvLyBpZiAoZGF0YVNvdXJjZS50eXBlID09PSAnZ3NoZWV0Jykge1xuICAgIC8vICAgcmV0dXJuIGF3YWl0IGZldGNoR3NoZWV0RGF0YShkYXRhU291cmNlKTtcbiAgICAvLyB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHNvdXJjZTogJHtkYXRhU291cmNlLnR5cGV9YCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoSHR0cERhdGEoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSkge1xuICAgIGNvbnN0IHVybCA9IGRhdGFTb3VyY2UudXJsIHx8ICcnO1xuICAgIGlmICghdXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdXJsIG5vdCBzdXBwb3J0ZWQ6ICR7dXJsfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiBkYXRhU291cmNlLmh0dHBPcHRpb25zPy5tZXRob2QgfHwgJ0dFVCcsXG4gICAgICBoZWFkZXJzOiBkYXRhU291cmNlLmh0dHBPcHRpb25zPy5oZWFkZXJzIHx8IFtdLFxuICAgICAgYm9keTogZGF0YVNvdXJjZS5odHRwT3B0aW9ucz8uYm9keSB8fCB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGByZXEgZmFpbGVkOiAke2Vycn1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50VHlwZSA9IFN0cmluZyhyZXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKTtcbiAgICBpZiAoY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlcy5qc29uKCk7XG4gICAgfVxuICAgIHJldHVybiByZXMudGV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgZGF0YSBmcm9tIGEgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBhc3luYyBnZXRGcm9tRGF0YVNvdXJjZTxUID0gYW55PihcbiAgICBkYXRhU291cmNlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge21vZGU/OiAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCd9XG4gICk6IFByb21pc2U8RGF0YVNvdXJjZURhdGE8VD4gfCBudWxsPiB7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnM/Lm1vZGUgfHwgJ3B1Ymxpc2hlZCc7XG4gICAgaWYgKCEobW9kZSA9PT0gJ2RyYWZ0JyB8fCBtb2RlID09PSAncHVibGlzaGVkJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBtb2RlOiAke21vZGV9YCk7XG4gICAgfVxuICAgIGlmICghZGF0YVNvdXJjZUlkIHx8IGRhdGFTb3VyY2VJZC5pbmNsdWRlcygnLycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZGF0YSBzb3VyY2UgaWQ6ICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRiUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH0vRGF0YS8ke21vZGV9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBpZiAoZG9jLmV4aXN0cykge1xuICAgICAgcmV0dXJuIGRvYy5kYXRhKCkgYXMgRGF0YVNvdXJjZURhdGE8VD47XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHVzZXIgZXhpc3RzIGluIHRoZSBBQ0wgbGlzdC5cbiAgICovXG4gIGFzeW5jIHVzZXJFeGlzdHNJbkFjbChlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFlbWFpbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH1gKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBjb25zdCBkYXRhID0gc25hcHNob3QuZGF0YSgpIHx8IHt9O1xuICAgIGNvbnN0IGFjbCA9IGRhdGEucm9sZXMgfHwge307XG4gICAgaWYgKGVtYWlsIGluIGFjbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgd2lsZGNhcmQgZG9tYWlucywgZS5nLiBgKkBleGFtcGxlLmNvbWAuXG4gICAgaWYgKCFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYGludmFsaWQgZW1haWw6ICR7ZW1haWx9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGRvbWFpbiA9IGVtYWlsLnNwbGl0KCdAJykuYXQoLTEpO1xuICAgIGlmIChkb21haW4gJiYgYCpAJHtkb21haW59YCBpbiBhY2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyBsb2dBY3Rpb24oYWN0aW9uOiBzdHJpbmcsIG9wdGlvbnM/OiB7Ynk/OiBzdHJpbmc7IG1ldGFkYXRhPzogYW55fSkge1xuICAgIGlmICghYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQ6IFwiYWN0aW9uXCInKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgdGltZXN0YW1wOiBUaW1lc3RhbXAubm93KCksXG4gICAgICBieTogb3B0aW9ucz8uYnkgfHwgJ3N5c3RlbScsXG4gICAgICBtZXRhZGF0YTogb3B0aW9ucz8ubWV0YWRhdGEgfHwge30sXG4gICAgfTtcbiAgICBjb25zdCBjb2xSZWYgPSB0aGlzLmRiLmNvbGxlY3Rpb24oYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0FjdGlvbkxvZ3NgKTtcbiAgICBhd2FpdCBjb2xSZWYuYWRkKGRhdGEpO1xuXG4gICAgY29uc3QgbWV0YVN0ciA9IG9wdGlvbnM/Lm1ldGFkYXRhID8gc3RyaW5naWZ5T2JqKG9wdGlvbnMubWV0YWRhdGEpIDogJyc7XG4gICAgY29uc29sZS5sb2coYFske2RhdGEudGltZXN0YW1wLnRvTWlsbGlzKCl9XSBhY3Rpb246ICR7YWN0aW9ufSAke21ldGFTdHJ9YCk7XG5cbiAgICAvLyBDYWxsIHRoZSBgb25BY3Rpb24oKWAgY2FsbGJhY2sgZnJvbSBjbXNQbHVnaW4oKS5cbiAgICBjb25zdCBjbXNQbHVnaW5Db25maWcgPSB0aGlzLmNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgICBpZiAoY21zUGx1Z2luQ29uZmlnLm9uQWN0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjbXNQbHVnaW5Db25maWcub25BY3Rpb24oZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWc6IFJvb3RDb25maWcpOiBDTVNQbHVnaW4ge1xuICBjb25zdCBwbHVnaW5zOiBQbHVnaW5bXSA9IHJvb3RDb25maWcucGx1Z2lucyB8fCBbXTtcbiAgY29uc3QgcGx1Z2luID0gcGx1Z2lucy5maW5kKChwbHVnaW4pID0+IHBsdWdpbi5uYW1lID09PSAncm9vdC1jbXMnKTtcbiAgaWYgKCFwbHVnaW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBmaW5kIHJvb3QtY21zIHBsdWdpbiBjb25maWcgaW4gcm9vdC5jb25maWcudHMnKTtcbiAgfVxuICByZXR1cm4gcGx1Z2luIGFzIENNU1BsdWdpbjtcbn1cblxuLyoqXG4gKiBXYWxrcyB0aGUgZGF0YSB0cmVlIGFuZCBjb252ZXJ0cyBhbnkgVGltZXN0YW1wIG9iamVjdHMgdG8gbWlsbGlzIGFuZCBhbnlcbiAqIF9hcnJheSBtYXBzIHRvIG5vcm1hbCBhcnJheXMuXG4gKlxuICogRS5nLjpcbiAqXG4gKiBub3JtYWxpemVEYXRhKHtcbiAqICAgc3lzOiB7bW9kaWZpZWRBdDogVGltZXN0YW1wKDEyMyl9LFxuICogICBmaWVsZHM6IHtcbiAqICAgICBfYXJyYXk6IFsnYXNkZiddLFxuICogICAgIGFzZGY6IHt0aXRsZTogJ2hlbGxvJ31cbiAqICAgfVxuICogfSlcbiAqIC8vID0+IHtzeXM6IHttb2RpZmllZEF0OiAxMjN9LCBmaWVsZHM6IHtmb286IFt7dGl0bGU6ICdoZWxsbyd9XX19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bm1hcnNoYWxEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICBjb25zdCB2YWwgPSBkYXRhW2tleV07XG4gICAgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGlmICh2YWwudG9NaWxsaXMpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWwudG9NaWxsaXMoKTtcbiAgICAgIH0gZWxzZSBpZiAoT2JqZWN0Lmhhc093bih2YWwsICdfYXJyYXknKSAmJiBBcnJheS5pc0FycmF5KHZhbC5fYXJyYXkpKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHZhbC5fYXJyYXkubWFwKChhcnJheUtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnVubWFyc2hhbERhdGEodmFsW2FycmF5S2V5XSB8fCB7fSksXG4gICAgICAgICAgICBfYXJyYXlLZXk6IGFycmF5S2V5LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHRba2V5XSA9IGFycjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdW5tYXJzaGFsRGF0YSh2YWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIEBkZXByZWNhdGVkIFVzZSBgdW5tYXJzaGFsRGF0YSgpYCBpbnN0ZWFkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoZGF0YTogYW55KTogYW55IHtcbiAgcmV0dXJuIHVubWFyc2hhbERhdGEoZGF0YSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJyYXlPYmplY3Qge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIF9hcnJheTogc3RyaW5nW107XG59XG5cbi8qKlxuICogU2VyaWFsaXplcyBhbiBhcnJheSBpbnRvIGFuIGBBcnJheU9iamVjdGAsIGUuZy46XG4gKlxuICogYGBgXG4gKiBtYXJzaGFsQXJyYXkoWzEsIDIsIDNdKVxuICogLy8gPT4ge2E6IDEsIGI6IDIsIGM6IDMsIF9hcnJheTogWydhJywgJ2InLCAnYyddfVxuICogYGBgXG4gKlxuICogVGhpcyBkYXRhYmFzZSBzdG9yYWdlIG1ldGhvZCBtYWtlcyBpdCBlYXNpZXIgdG8gdXBkYXRlIGEgc2luZ2xlIGZpZWxkIGluIGFcbiAqIGRlZXBseSBuZXN0ZWQgYXJyYXkgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFyc2hhbEFycmF5KGFycjogYW55W10pOiBBcnJheU9iamVjdCB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuICBjb25zdCBhcnJPYmplY3Q6IEFycmF5T2JqZWN0ID0ge19hcnJheTogW119O1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyKSB7XG4gICAgY29uc3Qga2V5ID0gcmFuZFN0cmluZyg2KTtcbiAgICBhcnJPYmplY3Rba2V5XSA9IGl0ZW07XG4gICAgYXJyT2JqZWN0Ll9hcnJheS5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGFyck9iamVjdDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBgQXJyYXlPYmplY3RgIHRvIGEgbm9ybWFsIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5tYXJzaGFsQXJyYXkoYXJyT2JqZWN0OiBBcnJheU9iamVjdCk6IGFueVtdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFyck9iamVjdD8uX2FycmF5KSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBhcnIgPSBhcnJPYmplY3QuX2FycmF5Lm1hcCgoazogc3RyaW5nKSA9PiBhcnJPYmplY3Rba10pO1xuICByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChkYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiByYW5kU3RyaW5nKGxlbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IGNoYXJzID1cbiAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgcmFuZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCk7XG4gICAgcmVzdWx0LnB1c2goY2hhcnMuY2hhckF0KHJhbmQpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LmpvaW4oJycpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgdHJhbnNsYXRpb25zIG1hcCBmcm9tIGBsb2FkVHJhbnNsYXRpb25zKClgIHRvIGEgbWFwIG9mIHNvdXJjZSB0b1xuICogdHJhbnNsYXRlZCBzdHJpbmcgZm9yIGEgcGFydGljdWxhciBsb2NhbGUuXG4gKlxuICogUmV0dXJucyBhIG1hcCBsaWtlOlxuICogYGBgXG4gKiB7XG4gKiAgIFwiSGVsbG9cIjogXCJCb25qb3VyXCIsXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0aW9uc0ZvckxvY2FsZShcbiAgdHJhbnNsYXRpb25zTWFwOiBUcmFuc2xhdGlvbnNNYXAsXG4gIGxvY2FsZTogc3RyaW5nXG4pIHtcbiAgY29uc3QgbG9jYWxlVHJhbnNsYXRpb25zOiBMb2NhbGVUcmFuc2xhdGlvbnMgPSB7fTtcbiAgT2JqZWN0LnZhbHVlcyh0cmFuc2xhdGlvbnNNYXApLmZvckVhY2goKHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0cmluZy5zb3VyY2U7XG4gICAgY29uc3QgdHJhbnNsYXRpb24gPSBzdHJpbmdbbG9jYWxlXSB8fCBzdHJpbmcuZW4gfHwgc3RyaW5nLnNvdXJjZTtcbiAgICBsb2NhbGVUcmFuc2xhdGlvbnNbc291cmNlXSA9IHRyYW5zbGF0aW9uO1xuICB9KTtcbiAgcmV0dXJuIGxvY2FsZVRyYW5zbGF0aW9ucztcbn1cblxuLyoqIEEgcHJldHR5IHByaW50ZXIgZm9yIEphdmFTY3JpcHQgb2JqZWN0cy4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iaihvYmo6IGFueSkge1xuICBmdW5jdGlvbiBmb3JtYXQob2JqOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBgXCIke29iai5yZXBsYWNlQWxsKCdcIicsICdcXFxcXCInKX1cImA7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFN0cmluZyhvYmopO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICByZXR1cm4gYFske29iai5tYXAoZm9ybWF0KS5qb2luKCcsICcpfV1gO1xuICAgIH1cbiAgICBjb25zdCBlbnRyaWVzOiBzdHJpbmdbXSA9IE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiBgJHtrZXl9OiAke2Zvcm1hdCh2YWx1ZSl9YDtcbiAgICB9KTtcbiAgICByZXR1cm4gYHske2VudHJpZXMuam9pbignLCAnKX19YDtcbiAgfVxuICByZXR1cm4gZm9ybWF0KG9iaik7XG59XG4iLCAiLyoqXG4gKiBEb2N1bWVudCB2ZXJpb24gaGlzdG9yeS5cbiAqXG4gKiBWZXJpb25zIHNhdmUgdGhlIHN0YXRlIG9mIGEgZG9jdW1lbnQgYXQgZGlmZmVyZW50IG1vbWVudHMgaW4gdGltZSwgYWxsb3dpbmdcbiAqIHVzZXJzIHRvIHJldmVydCBiYWNrIHRvIGEgdmVyc2lvbiBpZi93aGVuIG5lZWRlZC5cbiAqXG4gKiBUaGUgc2F2ZVZlcnNpb25zKCkgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgcnVuIHdpdGhpbiBhIGNyb24gam9iIChlLmcgdXNpbmdcbiAqIGZpcmViYXNlIGZ1bmN0aW9ucykuIEV2ZXJ5IG1pbnV0ZSwgdGhlIHJ1bm5lciBjaGVja3MgZm9yIGFsbCBkb2N1bWVudHMgdGhhdFxuICogaGF2ZSBiZWVuIGVkaXRlZCBzaW5jZSB0aGUgbGFzdCBydW4uIFRvIGF2b2lkIHNhdmluZyBcInBhcnRpYWxcIiB2ZXJzaW9uc1xuICogKHdoZW4gdGhlIHVzZXIgbWlnaHQgYmUgaW4gdGhlIG1pZGRsZSBvZiBlZGl0aW5nIGEgZG9jdW1lbnQpLCB2ZXJzaW9ucyBvbmx5XG4gKiBydW4gb24gZG9jdW1lbnRzIHRoYXQgaGF2ZW4ndCBiZWVuIGVkaXRlZCB3aXRoaW4gdGhlIGxhc3QgNSBtaW5zIHRvIGVuc3VyZVxuICogdGhhdCB2ZXJzaW9uIGlzIFwic3RhYmxlXCIuXG4gKlxuICogSW4gdGhlIGRhdGFiYXNlLCB2ZXJzaW9ucyBhcmUgc3RvcmVkIGFzOlxuICogL1Byb2plY3RzLzxwcm9qZWN0SWQ+L0NvbGxlY3Rpb25zLzxjb2xsZWN0aW9uSWQ+L0RyYWZ0cy88ZG9jSWQ+L1ZlcnNpb25zLzx0aW1lc3RhbXA+XG4gKlxuICogV2hlcmUgPHRpbWVzdGFtcD4gaXMgdGhlIHVuaXggdGltZXN0YW1wIChtaWxsaXMpIHRoYXQgdGhlIGRvY3VtZW50IHdhcyBsYXN0XG4gKiBlZGl0ZWQuXG4gKi9cblxuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7Um9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7RmlyZXN0b3JlLCBRdWVyeSwgVGltZXN0YW1wfSBmcm9tICdmaXJlYmFzZS1hZG1pbi9maXJlc3RvcmUnO1xuaW1wb3J0IGdsb2IgZnJvbSAndGlueS1nbG9iJztcbmltcG9ydCB7Z2V0Q21zUGx1Z2lufSBmcm9tICcuL2NsaWVudC5qcyc7XG5cbi8vIFRvIGF2b2lkIHNhdmluZyBcInBhcnRpYWxcIiB2ZXJzaW9ucyAod2hlbiB0aGUgdXNlciBtaWdodCBiZSBpbiB0aGUgbWlkZGxlIG9mXG4vLyBlZGl0aW5nIGEgZG9jdW1lbnQpLCB2ZXJzaW9ucyBvbmx5IHJ1biBvbiBkb2N1bWVudHMgdGhhdCBoYXZlbid0IGJlZW4gZWRpdGVkXG4vLyB3aXRoaW4gdGhlIGxhc3QgNSBtaW5zIHRvIGVuc3VyZSB0aGF0IHZlcnNpb24gaXMgXCJzdGFibGVcIi5cbmNvbnN0IERPQ1VNRU5UX1NBVkVfT0ZGU0VUID0gNSAqIDYwICogMTAwMDtcblxuaW50ZXJmYWNlIFBhcnRpYWxDTVNEb2Mge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGlkOiBzdHJpbmc7XG4gIGNvbGxlY3Rpb246IHN0cmluZztcbiAgc2x1Zzogc3RyaW5nO1xuICBzeXM6IHtcbiAgICBtb2RpZmllZEF0OiBUaW1lc3RhbXA7XG4gICAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgVmVyc2lvbnNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSByb290Q29uZmlnOiBSb290Q29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3RJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRiOiBGaXJlc3RvcmU7XG5cbiAgY29uc3RydWN0b3Iocm9vdENvbmZpZzogUm9vdENvbmZpZykge1xuICAgIHRoaXMucm9vdENvbmZpZyA9IHJvb3RDb25maWc7XG4gICAgY29uc3QgY21zUGx1Z2luID0gZ2V0Q21zUGx1Z2luKHJvb3RDb25maWcpO1xuICAgIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSBjbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgcHJvamVjdElkID0gY21zUGx1Z2luT3B0aW9ucy5pZCB8fCAnZGVmYXVsdCc7XG4gICAgdGhpcy5wcm9qZWN0SWQgPSBwcm9qZWN0SWQ7XG4gICAgdGhpcy5kYiA9IGNtc1BsdWdpbi5nZXRGaXJlc3RvcmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIHZlcnNpb24gb2YgYWxsIGRvY3VtZW50cyB0aGF0IGhhdmUgYmVlbiBlZGl0ZWQgc2luY2UgdGhlIGxhc3QgcnVuLlxuICAgKi9cbiAgYXN5bmMgc2F2ZVZlcnNpb25zKCkge1xuICAgIC8vIE9mZnNldCB0aGUgXCJsYXN0IHJ1blwiIHRpbWUgYnkgNSBtaW5zLiBWZXJzaW9ucyBpZ25vcmUgZG9jcyB0aGF0IHdlcmVcbiAgICAvLyBlZGl0ZWQgd2l0aGluIHRoZSBsYXN0IDUgbWlucyB0byBhdm9pZCBwb3RlbnRpYWwgXCJwYXJ0aWFsXCIgdmVyc2lvbnMgd2hlblxuICAgIC8vIHVzZXIgaXMgaW4gdGhlIG1pZGRsZSBvZiBlZGl0aW5nIGEgZG9jdW1lbnQuXG4gICAgY29uc3QgbGFzdFJ1biA9IGF3YWl0IHRoaXMuZ2V0TGFzdFJ1bigpO1xuICAgIGNvbnN0IGxhc3RSdW5XaXRoT2Zmc2V0ID1cbiAgICAgIGxhc3RSdW4gPT09IDAgPyBsYXN0UnVuIDogbGFzdFJ1biAtIERPQ1VNRU5UX1NBVkVfT0ZGU0VUO1xuICAgIGNvbnN0IGNoYW5nZWREb2NzID0gYXdhaXQgdGhpcy5nZXREb2NzTW9kaWZpZWRBZnRlcihsYXN0UnVuV2l0aE9mZnNldCk7XG4gICAgY29uc3Qgbm93ID0gVGltZXN0YW1wLm5vdygpLnRvTWlsbGlzKCk7XG4gICAgY29uc3QgdmVyc2lvbnMgPSBjaGFuZ2VkRG9jcy5maWx0ZXIoKGRvYykgPT4ge1xuICAgICAgY29uc3QgbW9kaWZpZWRBdCA9IGRvYy5zeXMubW9kaWZpZWRBdC50b01pbGxpcygpO1xuICAgICAgcmV0dXJuIG1vZGlmaWVkQXQgPD0gbm93IC0gRE9DVU1FTlRfU0FWRV9PRkZTRVQ7XG4gICAgfSk7XG4gICAgaWYgKHZlcnNpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2F2ZVZlcnNpb25zVG9GaXJlc3RvcmUodmVyc2lvbnMpO1xuICAgIH1cbiAgICB0aGlzLnNhdmVMYXN0UnVuKG5vdyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVWZXJzaW9uc1RvRmlyZXN0b3JlKHZlcnNpb25zOiBQYXJ0aWFsQ01TRG9jW10pIHtcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICB2ZXJzaW9ucy5mb3JFYWNoKCh2ZXJzaW9uKSA9PiB7XG4gICAgICBpZiAoIXZlcnNpb24uY29sbGVjdGlvbiB8fCAhdmVyc2lvbi5zbHVnIHx8ICF2ZXJzaW9uLnN5cz8ubW9kaWZpZWRBdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtb2RpZmllZEF0TWlsbGlzID0gdmVyc2lvbi5zeXMubW9kaWZpZWRBdC50b01pbGxpcygpO1xuICAgICAgY29uc3QgdmVyc2lvblBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHt2ZXJzaW9uLmNvbGxlY3Rpb259L0RyYWZ0cy8ke3ZlcnNpb24uc2x1Z30vVmVyc2lvbnMvJHttb2RpZmllZEF0TWlsbGlzfWA7XG4gICAgICBjb25zb2xlLmxvZyh2ZXJzaW9uUGF0aCk7XG4gICAgICBjb25zdCB2ZXJzaW9uUmVmID0gdGhpcy5kYi5kb2ModmVyc2lvblBhdGgpO1xuICAgICAgYmF0Y2guc2V0KHZlcnNpb25SZWYsIHZlcnNpb24pO1xuICAgIH0pO1xuICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICAgIGNvbnNvbGUubG9nKGB2ZXJzaW9uczogc2F2ZWQgJHt2ZXJzaW9ucy5sZW5ndGh9IHZlcnNpb25zYCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGFzdCB0aW1lIChpbiBtaWxsaXMpIHNhdmVWZXJzaW9ucygpIHdhcyBydW4sIG9yIDAgaWYgaGFzXG4gICAqIG5ldmVyIGJlZW4gcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRMYXN0UnVuKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgcHJvamVjdERvY1JlZiA9IHRoaXMuZGIuY29sbGVjdGlvbignUHJvamVjdHMnKS5kb2ModGhpcy5wcm9qZWN0SWQpO1xuICAgIGNvbnN0IHByb2plY3REb2MgPSBhd2FpdCBwcm9qZWN0RG9jUmVmLmdldCgpO1xuICAgIGlmIChwcm9qZWN0RG9jLmV4aXN0cykge1xuICAgICAgY29uc3QgZGF0YSA9IHByb2plY3REb2MuZGF0YSgpIHx8IHt9O1xuICAgICAgY29uc3QgdHMgPSBkYXRhLnZlcnNpb25zTGFzdFJ1biBhcyBUaW1lc3RhbXA7XG4gICAgICBpZiAodHMpIHtcbiAgICAgICAgcmV0dXJuIHRzLnRvTWlsbGlzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHt2ZXJzaW9uTGFzdFJ1bjogPHRpbWVzdGFtcD59IHRvIHRoZSBQcm9qZWN0cy88cHJvamVjdElkPiBkb2MuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVMYXN0UnVuKG1pbGxpczogbnVtYmVyKSB7XG4gICAgY29uc3QgdHMgPSBUaW1lc3RhbXAuZnJvbU1pbGxpcyhtaWxsaXMpO1xuICAgIGNvbnN0IHByb2plY3REb2NSZWYgPSB0aGlzLmRiLmNvbGxlY3Rpb24oJ1Byb2plY3RzJykuZG9jKHRoaXMucHJvamVjdElkKTtcbiAgICBhd2FpdCBwcm9qZWN0RG9jUmVmLnNldCh7dmVyc2lvbnNMYXN0UnVuOiB0c30sIHttZXJnZTogdHJ1ZX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBkb2NzIHRoYXQgd2VyZSBlZGl0ZWQgYWZ0ZXIgYSBjZXJ0YWluIHRpbWUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldERvY3NNb2RpZmllZEFmdGVyKG1pbGxpczogbnVtYmVyKTogUHJvbWlzZTxQYXJ0aWFsQ01TRG9jW10+IHtcbiAgICBjb25zdCB0cyA9IFRpbWVzdGFtcC5mcm9tTWlsbGlzKG1pbGxpcyk7XG4gICAgY29uc3QgcmVzdWx0czogUGFydGlhbENNU0RvY1tdID0gW107XG4gICAgY29uc3QgY29sbGVjdGlvbklkcyA9IGF3YWl0IHRoaXMubGlzdENvbGxlY3Rpb25zKCk7XG4gICAgLy8gTk9URTogSW5kaXZpZHVhbCBjb2xsZWN0aW9ucyBhcmUgcXVlcmllZCBpbnN0ZWFkIG9mIHVzaW5nIGFcbiAgICAvLyBjb2xsZWN0aW9uR3JvdXAgcXVlcnkgYmVjYXVzZSB0aGUgbGF0dGVyIHJlcXVpcmVzIGEgZmlyZXN0b3JlIGluZGV4IHRvIGJlXG4gICAgLy8gc2V0IHVwLlxuICAgIGZvciAoY29uc3QgY29sbGVjdGlvbklkIG9mIGNvbGxlY3Rpb25JZHMpIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25QYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS9EcmFmdHNgO1xuICAgICAgY29uc3QgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYlxuICAgICAgICAuY29sbGVjdGlvbihjb2xsZWN0aW9uUGF0aClcbiAgICAgICAgLndoZXJlKCdzeXMubW9kaWZpZWRBdCcsICc+PScsIHRzKTtcbiAgICAgIGNvbnN0IHF1ZXJ5U25hcHNob3QgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgICAgIHF1ZXJ5U25hcHNob3QuZm9yRWFjaCgoZG9jKSA9PiB7XG4gICAgICAgIHJlc3VsdHMucHVzaChkb2MuZGF0YSgpIGFzIFBhcnRpYWxDTVNEb2MpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGNvbGxlY3Rpb24gaWRzIGZvciB0aGUgUm9vdCBwcm9qZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0Q29sbGVjdGlvbnMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25JZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY29sbGVjdGlvbkZpbGVOYW1lcyA9IGF3YWl0IGdsb2IoJyouc2NoZW1hLnRzJywge1xuICAgICAgY3dkOiBwYXRoLmpvaW4odGhpcy5yb290Q29uZmlnLnJvb3REaXIsICdjb2xsZWN0aW9ucycpLFxuICAgIH0pO1xuICAgIGNvbGxlY3Rpb25GaWxlTmFtZXMuZm9yRWFjaCgoZmlsZW5hbWUpID0+IHtcbiAgICAgIGNvbGxlY3Rpb25JZHMucHVzaChmaWxlbmFtZS5zbGljZSgwLCAtMTApKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29sbGVjdGlvbklkcztcbiAgfVxufVxuIiwgImltcG9ydCB7Um9vdENvbmZpZ30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7Um9vdENNU0NsaWVudH0gZnJvbSAnLi9jbGllbnQuanMnO1xuaW1wb3J0IHtWZXJzaW9uc1NlcnZpY2V9IGZyb20gJy4vdmVyc2lvbnMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQ3JvbkpvYnMocm9vdENvbmZpZzogUm9vdENvbmZpZykge1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgcnVuQ3JvbkpvYigncHVibGlzaFNjaGVkdWxlZERvY3MnLCBydW5QdWJsaXNoU2NoZWR1bGVkRG9jcywgcm9vdENvbmZpZyksXG4gICAgcnVuQ3JvbkpvYignc2F2ZVZlcnNpb25zJywgcnVuU2F2ZVZlcnNpb25zLCByb290Q29uZmlnKSxcbiAgXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkNyb25Kb2IoXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICAuLi5hcmdzOiBhbnlbXVxuKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZm4oLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKGBjcm9uIGZhaWxlZDogJHtuYW1lfWApO1xuICAgIGNvbnNvbGUuZXJyb3IoU3RyaW5nKGVyci5zdGFjayB8fCBlcnIpKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHVibGlzaFNjaGVkdWxlZERvY3Mocm9vdENvbmZpZzogUm9vdENvbmZpZykge1xuICBjb25zdCBjbXNDbGllbnQgPSBuZXcgUm9vdENNU0NsaWVudChyb290Q29uZmlnKTtcbiAgYXdhaXQgY21zQ2xpZW50LnB1Ymxpc2hTY2hlZHVsZWREb2NzKCk7XG4gIGF3YWl0IGNtc0NsaWVudC5wdWJsaXNoU2NoZWR1bGVkUmVsZWFzZXMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuU2F2ZVZlcnNpb25zKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgY29uc3Qgc2VydmljZSA9IG5ldyBWZXJzaW9uc1NlcnZpY2Uocm9vdENvbmZpZyk7XG4gIGF3YWl0IHNlcnZpY2Uuc2F2ZVZlcnNpb25zKCk7XG59XG4iLCAiaW1wb3J0IHtwYXJzZSBhcyBjc3ZQYXJzZX0gZnJvbSAnY3N2LXBhcnNlL3N5bmMnO1xuaW1wb3J0IHtzdHJpbmdpZnkgYXMgY3N2U3RyaW5naWZ5fSBmcm9tICdjc3Ytc3RyaW5naWZ5L3N5bmMnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlUb0NzdihyZXE6IHtcbiAgaGVhZGVyczogc3RyaW5nW107XG4gIHJvd3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+O1xufSk6IHN0cmluZyB7XG4gIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycyB8fCBbXTtcbiAgY29uc3Qgcm93cyA9IHJlcS5yb3dzIHx8IFtdO1xuICByZXR1cm4gY3N2U3RyaW5naWZ5KHJvd3MsIHtcbiAgICBoZWFkZXI6IHRydWUsXG4gICAgY29sdW1uczogaGVhZGVycyxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjc3ZUb0FycmF5KGNzdlN0cmluZzogc3RyaW5nKSB7XG4gIGNvbnN0IHJvd3MgPSBjc3ZQYXJzZShjc3ZTdHJpbmcsIHtcbiAgICBjb2x1bW5zOiB0cnVlLFxuICAgIHNraXBfZW1wdHlfbGluZXM6IHRydWUsXG4gIH0pO1xuICByZXR1cm4gcm93cztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFRLFlBQVlBLFdBQVM7QUFDN0IsT0FBT0MsV0FBVTtBQUNqQixTQUFRLGlCQUFBQyxzQkFBb0I7QUFVNUIsT0FBTyxnQkFBZ0I7QUFDdkI7QUFBQSxFQUVFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUSxlQUE4QjtBQUN0QyxTQUFtQixvQkFBbUI7QUFDdEMsWUFBWSxrQkFBa0I7QUFDOUIsT0FBTyxVQUFVOzs7QUN0QmpCLFNBQVEsWUFBWSxVQUFTO0FBQzdCLE9BQU8sVUFBVTtBQUNqQixTQUFRLHFCQUFvQjtBQUM1QixTQUFRLGdCQUFnQix5QkFBd0I7QUFDaEQsWUFBWSxTQUFTO0FBS3JCLElBQU0sWUFBWSxLQUFLLFFBQVEsY0FBYyxZQUFZLEdBQUcsQ0FBQztBQUU3RCxlQUFzQixnQkFBZ0I7QUFDcEMsUUFBTSxVQUFVLFFBQVEsSUFBSTtBQUM1QixRQUFNLGFBQWEsTUFBTSxlQUFlLFNBQVMsRUFBQyxTQUFTLFdBQVUsQ0FBQztBQUN0RSxRQUFNLGFBQWEsS0FBSyxRQUFRLFdBQVcsY0FBYztBQUN6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N0M7QUFBQSxNQUNGLENBQUM7QUFHRCxhQUFPLElBQUksZUFBZSxPQUFPLEtBQWMsUUFBa0I7QUFDL0QsWUFBSSxRQUFRLFdBQVcsbUJBQW1CO0FBQzFDLFlBQUksWUFBWTtBQUNoQixZQUFJLFNBQVMsWUFBWTtBQUFBLE1BQzNCLENBQUM7QUFJRCxhQUFPLElBQUksT0FBTyxLQUFjLEtBQWUsU0FBdUI7QUFDcEUsY0FBTSxPQUFPLE1BQU0sZUFBZSxHQUFHO0FBQ3JDLFlBQUksTUFBTTtBQUNSLGNBQUksT0FBTztBQUFBLFFBQ2I7QUFJQSxZQUFJLENBQUMsUUFBUSxjQUFjLEdBQUcsR0FBRztBQUMvQixjQUFJLElBQUksWUFBWSxXQUFXLFVBQVUsR0FBRztBQUMxQyxnQkFBSSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUMsU0FBUyxPQUFPLE9BQU8saUJBQWdCLENBQUM7QUFDOUQ7QUFBQSxVQUNGO0FBQ0Esa0JBQVEsSUFBSSwyQkFBMkI7QUFDdkMsZ0JBQU0sU0FBUyxJQUFJLGdCQUFnQjtBQUFBLFlBQ2pDLFVBQVUsSUFBSTtBQUFBLFVBQ2hCLENBQUM7QUFDRCxjQUFJLFNBQVMsY0FBYyxPQUFPLFNBQVMsQ0FBQyxFQUFFO0FBQzlDO0FBQUEsUUFDRjtBQUVBLGFBQUs7QUFBQSxNQUNQLENBQUM7QUFHRCxVQUFJLE1BQU07QUFHVixhQUFPLElBQUksUUFBUSxPQUFPLEtBQWMsUUFBa0I7QUFDeEQsWUFBSTtBQUNGLGdCQUFNQSxPQUFNLE1BQU0sWUFBWSxHQUFHO0FBQ2pDLGdCQUFNQSxLQUFJLFVBQVUsS0FBSyxLQUFLO0FBQUEsWUFDNUIsWUFBWSxJQUFJO0FBQUEsWUFDaEIsV0FBVztBQUFBLFlBQ1gsZ0JBQWdCLFFBQVE7QUFBQSxVQUMxQixDQUFDO0FBQUEsUUFDSCxTQUFTLEtBQUs7QUFFWixrQkFBUSxNQUFNLEdBQUc7QUFDakIsY0FBSSxPQUFPLEdBQUcsRUFBRSxLQUFLLHNCQUFzQjtBQUFBLFFBQzdDO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLFdBQVcsVUFBb0M7QUFDdEQsU0FBT0MsSUFDSixPQUFPLFFBQVEsRUFDZixLQUFLLE1BQU0sSUFBSSxFQUNmLE1BQU0sTUFBTSxLQUFLO0FBQ3RCOyIsCiAgIm5hbWVzIjogWyJmcyIsICJwYXRoIiwgImZpbGVVUkxUb1BhdGgiLCAicGx1Z2luIiwgIm9iaiIsICJwYXRoIiwgIlRpbWVzdGFtcCIsICJjbXNQbHVnaW4iLCAiVGltZXN0YW1wIiwgInBhdGgiLCAiX19kaXJuYW1lIiwgInBhdGgiLCAiZmlsZVVSTFRvUGF0aCIsICJhcHAiLCAiZnMiXQp9Cg==
|
|
1484
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9wbHVnaW4udHMiLCAiLi4vY2xpL2dlbmVyYXRlLXR5cGVzLnRzIiwgIi4uL2NvcmUvYXBpLnRzIiwgIi4uL2NvcmUvYWkudHMiLCAiLi4vY29yZS9jbGllbnQudHMiLCAiLi4vY29yZS92ZXJzaW9ucy50cyIsICIuLi9jb3JlL2Nyb24udHMiLCAiLi4vY29yZS9jc3YudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7cHJvbWlzZXMgYXMgZnN9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQge1xuICBDb25maWd1cmVTZXJ2ZXJPcHRpb25zLFxuICBOZXh0RnVuY3Rpb24sXG4gIFBsdWdpbixcbiAgUmVxdWVzdCxcbiAgUmVzcG9uc2UsXG4gIFNlcnZlcixcbn0gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCBib2R5UGFyc2VyIGZyb20gJ2JvZHktcGFyc2VyJztcbmltcG9ydCB7XG4gIEFwcCxcbiAgYXBwbGljYXRpb25EZWZhdWx0LFxuICBnZXRBcHAsXG4gIGluaXRpYWxpemVBcHAsXG59IGZyb20gJ2ZpcmViYXNlLWFkbWluL2FwcCc7XG5pbXBvcnQge2dldEF1dGgsIERlY29kZWRJZFRva2VufSBmcm9tICdmaXJlYmFzZS1hZG1pbi9hdXRoJztcbmltcG9ydCB7RmlyZXN0b3JlLCBnZXRGaXJlc3RvcmV9IGZyb20gJ2ZpcmViYXNlLWFkbWluL2ZpcmVzdG9yZSc7XG5pbXBvcnQgKiBhcyBqc29ud2VidG9rZW4gZnJvbSAnanNvbndlYnRva2VuJztcbmltcG9ydCBzaXJ2IGZyb20gJ3NpcnYnO1xuaW1wb3J0IHtnZW5lcmF0ZVR5cGVzfSBmcm9tICcuLi9jbGkvZ2VuZXJhdGUtdHlwZXMuanMnO1xuaW1wb3J0IHthcGl9IGZyb20gJy4vYXBpLmpzJztcbmltcG9ydCB7QWN0aW9uLCBSb290Q01TQ2xpZW50fSBmcm9tICcuL2NsaWVudC5qcyc7XG5cbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG50eXBlIEFwcE1vZHVsZSA9IHR5cGVvZiBpbXBvcnQoJy4vYXBwLmpzJyk7XG5cbi8vIFRoZSBzZXNzaW9uIGtleSBuYW1lIHVzZWQgZm9yIFJvb3QgQ01TIGF1dGhlbnRpY2F0aW9uLlxuY29uc3QgU0VTU0lPTl9DT09LSUVfQVVUSCA9ICdyb290LWNtcy1hdXRoJztcblxuZXhwb3J0IGludGVyZmFjZSBDTVNVc2VyIHtcbiAgZW1haWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDTVNBSUNvbmZpZyB7XG4gIC8qKiBDdXN0b20gQVBJIGVuZHBvaW50IGZvciBjaGF0IHByb21wdHMuICovXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENNU1NpZGViYXJUb29sIHtcbiAgLyoqIFVSTCBmb3IgdGhlIHNpZGViYXIgaWNvbiBpbWFnZS4gKi9cbiAgaWNvbj86IHN0cmluZztcbiAgLyoqIExhYmVsLiAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqIElmcmFtZSBVUkwgdG8gcmVuZGVyIGZvciB0aGUgdG9vbC4gKi9cbiAgaWZyYW1lVXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBDTVNQbHVnaW5PcHRpb25zID0ge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBwcm9qZWN0LiBEYXRhIHdpbGwgYmUgc3RvcmVkIHVuZGVyIHRoZSBuYW1lc3BhY2VcbiAgICogYFByb2plY3RzLyR7aWR9YCBpbiBmaXJlc3RvcmUuXG4gICAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3QuIFVzZWQgaW4gdGhlIGhlYWRlciBvZiB0aGUgQ01TIHRvIGhlbHAgaWRlbnRpZnlcbiAgICogdGhlIHByb2plY3QuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaXJlYmFzZSBjb25maWcgb2JqZWN0LCB3aGljaCBjYW4gYmUgb2J0YWluZWQgaW4gdGhlIEZpcmViYXNlIENvbnNvbGUgYnlcbiAgICogZ29pbmcgdG8gXCJQcm9qZWN0IFNldHRpbmdzXCIuXG4gICAqL1xuICBmaXJlYmFzZUNvbmZpZzoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBhcGlLZXk6IHN0cmluZztcbiAgICBhdXRoRG9tYWluOiBzdHJpbmc7XG4gICAgcHJvamVjdElkOiBzdHJpbmc7XG4gICAgc3RvcmFnZUJ1Y2tldDogc3RyaW5nO1xuICAgIGRhdGFiYXNlSWQ/OiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdBUEkgY3JlZGVudGlhbHMuIEluY2x1ZGUgaWYgdXNpbmcgR29vZ2xlIERyaXZlIGFuZCBHb29nbGUgU2hlZXRzIGZlYXR1cmVzLlxuICAgKiBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NoZWV0cy9hcGkvcXVpY2tzdGFydC9qc1xuICAgKi9cbiAgZ2FwaT86IHtcbiAgICAvKiogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc2hlZXRzL2FwaS9xdWlja3N0YXJ0L2pzI2NyZWF0ZV9hbl9hcGlfa2V5ICovXG4gICAgYXBpS2V5OiBzdHJpbmc7XG4gICAgLyoqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NoZWV0cy9hcGkvcXVpY2tzdGFydC9qcyNhdXRob3JpemVfY3JlZGVudGlhbHNfZm9yX2Ffd2ViX2FwcGxpY2F0aW9uICovXG4gICAgY2xpZW50SWQ6IHN0cmluZztcbiAgfTtcblxuICAvKipcbiAgICogU2VjcmV0IHZhbHVlKHMpIHVzZWQgZm9yIHNpZ25pbmcgdGhlIHVzZXIgYXV0aGVudGljYXRpb24gY29va2llLlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIGlzIG5vdyBoYW5kbGVkIGRpcmVjdGx5IGJ5IHJvb3QncyBzZXNzaW9uTWlkZGxld2FyZSB1bmRlclxuICAgKiBgc2VydmVyLnNlc3Npb25Db29raWVTZWNyZXRgIGluIHJvb3QuY29uZmlnLnRzLlxuICAgKi9cbiAgY29va2llU2VjcmV0Pzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLyoqIEZ1bmN0aW9uIGNhbGxlZCB0byBjaGVjayBpZiBhIHVzZXIgc2hvdWxkIGhhdmUgYWNjZXNzIHRvIHRoZSBDTVMuICovXG4gIGlzVXNlckF1dGhvcml6ZWQ/OiAoXG4gICAgcmVxOiBSZXF1ZXN0LFxuICAgIHVzZXI6IENNU1VzZXJcbiAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogRnVuY3Rpb24gdG8gY2FsbCB0byBjaGVjayBpZiBsb2dpbiBpcyByZXF1aXJlZCBmb3IgYSBwYXJ0aWN1bGFyIHJlcXVlc3QuXG4gICAqL1xuICBpc0xvZ2luUmVxdWlyZWQ/OiAocmVxOiBSZXF1ZXN0KSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBVUkwgdG8gR0NJIHNlcnZpY2UgZm9yIHRyYW5zZm9ybWluZyB1cGxvYWRlZCBHQ1MgaW1hZ2VzIHRvIGEgR29vZ2xlIEFwcFxuICAgKiBFbmdpbmUgSW1hZ2VzIEFQSSBzZXJ2aW5nIFVSTC5cbiAgICpcbiAgICogU2V0dGluZyB0aGlzIHRvIGB0cnVlYCB1c2VzIHRoZSBkZWZhdWx0IGhvc3RlZCBzZXJ2aWNlIGF0XG4gICAqIGh0dHBzOi8vZ2NpLnJvb3Rqcy5kZXYuXG4gICAqXG4gICAqIFRvIHNldCB1cCBHQ0k6XG4gICAqXG4gICAqIC0gQ3JlYXRlIGEgR0NTIGJ1Y2tldCB3aXRoIGZpbmUtZ3JhaW5lZCBwZXJtaXNzaW9uc1xuICAgKiAtIFNoYXJlIG93bmVyIGFjY2VzcyB0byB0aGUgYnVja2V0IHdpdGggdGhlIHNlcnZpY2UgYWNjb3VudCByZXR1cm5lZCBpblxuICAgKiAgIGh0dHBzOi8vZ2NpLnJvb3Rqcy5kZXYvXy9zZXJ2aWNlX2FjY291bnRcbiAgICpcbiAgICogVG8gZGlzYWJsZSBHQ0ksIGxlYXZlIHRoaXMgdmFsdWUgZW1wdHkgb3Igc2V0IHRvIGBmYWxzZWAsIHdoaWNoIHdoaWNoIHdpbGxcbiAgICogc2VydmUgaW1hZ2VzIGRpcmVjdGx5IGZyb20gR0NTIGluc3RlYWQuXG4gICAqL1xuICBnY2k/OiBzdHJpbmcgfCBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDdXN0b21pemF0aW9uIG9wdGlvbnMgZm9yIHRoZSBDTVMgc2lkZWJhci5cbiAgICovXG4gIHNpZGViYXI/OiB7XG4gICAgLyoqXG4gICAgICogU2lkZWJhciB0b29scywgYSBtYXAgb2YgdGhlIHNpZGViYXIgaWQgdG8gY29uZmlnIG9wdGlvbnMuIFRoZSBzaWRlYmFyXG4gICAgICogdG9vbCBpcyB1cmwtbWFwcGVkIHRvIGAvY21zL3Rvb2xzLzppZGAgYW5kIGRpc3BsYXlzIHRoZSB0b29sIGluIGFuXG4gICAgICogaWZyYW1lLlxuICAgICAqL1xuICAgIHRvb2xzPzogUmVjb3JkPHN0cmluZywgQ01TU2lkZWJhclRvb2w+O1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIGFuIGFjdGlvbiBvY2N1cnMuXG4gICAqL1xuICBvbkFjdGlvbj86IChhY3Rpb246IEFjdGlvbikgPT4gYW55O1xuXG4gIC8qKlxuICAgKiBFeHBlcmltZW50YWwgY29uZmlnIG9wdGlvbnMuIE5vdGU6IHRoZXNlIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBhdCBhbnkgdGltZS5cbiAgICovXG4gIGV4cGVyaW1lbnRzPzoge1xuICAgIGFpPzogYm9vbGVhbiB8IENNU0FJQ29uZmlnO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgQ01TUGx1Z2luID0gUGx1Z2luICYge1xuICBuYW1lOiAncm9vdC1jbXMnO1xuICBnZXRDb25maWc6ICgpID0+IENNU1BsdWdpbk9wdGlvbnM7XG4gIGdldEZpcmViYXNlQXBwOiAoKSA9PiBBcHA7XG4gIGdldEZpcmVzdG9yZTogKCkgPT4gRmlyZXN0b3JlO1xufTtcblxuZnVuY3Rpb24gaXNFeHBpcmVkKGRlY29kZWRJZFRva2VuOiBEZWNvZGVkSWRUb2tlbikge1xuICBjb25zdCB0cyA9IE1hdGguZmxvb3IobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTtcbiAgcmV0dXJuIHRzID49IGRlY29kZWRJZFRva2VuLmV4cDtcbn1cblxuZnVuY3Rpb24gZ2V0RmlyZWJhc2VBcHAoZ2NwUHJvamVjdElkOiBzdHJpbmcpOiBBcHAge1xuICBjb25zdCBhcHBOYW1lID0gJ3Jvb3QtY21zJztcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0QXBwKGFwcE5hbWUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnYXBwL25vLWFwcCcpIHtcbiAgICAgIHJldHVybiBpbml0aWFsaXplQXBwKFxuICAgICAgICB7XG4gICAgICAgICAgcHJvamVjdElkOiBnY3BQcm9qZWN0SWQsXG4gICAgICAgICAgY3JlZGVudGlhbDogYXBwbGljYXRpb25EZWZhdWx0KCksXG4gICAgICAgIH0sXG4gICAgICAgIGFwcE5hbWVcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY21zUGx1Z2luKG9wdGlvbnM6IENNU1BsdWdpbk9wdGlvbnMpOiBDTVNQbHVnaW4ge1xuICBpZiAoIW9wdGlvbnMuZmlyZWJhc2VDb25maWcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnbWlzc2luZyBmaXJlYmFzZUNvbmZpZy4gY3JlYXRlIGEgbmV3IGFwcCBpbiB0aGUgZmlyZWJhc2UgYWRtaW4gY29uc29sZSBhbmQgY29weSB0aGUgZmlyZWJhc2UgY29uZmlnIG9iamVjdCB0byByb290LmNvbmZpZy50cydcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZmlyZWJhc2VDb25maWcgPSBvcHRpb25zLmZpcmViYXNlQ29uZmlnIHx8IHt9O1xuICBjb25zdCBhcHAgPSBnZXRGaXJlYmFzZUFwcChmaXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQpO1xuICBjb25zdCBhdXRoID0gZ2V0QXV0aChhcHApO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgbG9naW4gaXMgcmVxdWlyZWQgZm9yIHRoZSByZXF1ZXN0LiBDdXJyZW50bHkgcmV0dXJucyBgdHJ1ZWAgaWZcbiAgICogdGhlIFVSTCBwYXRoIHN0YXJ0cyB3aXRoIC9jbXMgb3IgaWYgP3ByZXZpZXc9dHJ1ZSBpcyBpbiB0aGUgVVJMLlxuICAgKi9cbiAgZnVuY3Rpb24gbG9naW5SZXF1aXJlZChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgICAvLyBBbGxvdyB0aGUgY3JvbiB0byBydW4gdW5hdXRoZW50aWNhdGVkLiBUaGUgY3JvbiBqb2IgaXMgcmVzcG9uc2libGVcbiAgICAvLyBmb3Igc2F2aW5nIHZlcnNpb24gaGlzdG9yeS5cbiAgICBpZiAocmVxLm9yaWdpbmFsVXJsID09PSAnL2Ntcy9hcGkvY3Jvbi5ydW4nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFJlcXVpcmUgbG9naW4gb24gYWxsIGAvY21zL2AgcGF0aHMuXG4gICAgaWYgKHJlcS5vcmlnaW5hbFVybC5zdGFydHNXaXRoKCcvY21zJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBSZXF1aXJlIGxvZ2luIG9uIGFsbCBwYXRocyB0aGF0IGhhdmUgYD9wcmV2aWV3PXRydWVgLCB3aGljaCBpcyB1c2VkIGJ5XG4gICAgLy8gdGhlIHByZXZpZXcgaWZyYW1lIHRvIHJlbmRlciB0aGUgcHJldmlldyBmb3IgYSBwYWdlLlxuICAgIGlmIChTdHJpbmcocmVxLnF1ZXJ5LnByZXZpZXcpID09PSAndHJ1ZScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc0xvZ2luUmVxdWlyZWQgJiYgb3B0aW9ucy5pc0xvZ2luUmVxdWlyZWQocmVxKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBhIG5ldyBsb2dpbiByZXF1ZXN0IGZvciBhIHVzZXIuIFRoZSByZXF1ZXN0IGJvZHkgc2hvdWxkIGNvbnRhaW5cbiAgICogYW4gaWRUb2tlbiwgd2hpY2ggaXMgdmVyaWZpZWQgb24gcHJvZCB1c2luZyBGaXJlYmFzZSBBZG1pbiBhbmQgSWRlbnRpdHlcbiAgICogVG9vbGtpdC4gSWYgYSBgaXNVc2VyQXV0aG9yaXplZCgpYCBjb25maWcgaXMgc2V0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWxzb1xuICAgKiB2ZXJpZnkgdmlhIHRoYXQgZnVuY3Rpb24uIFJldHVybnMgdHJ1ZSBpZiB0aGUgbG9naW4gdmVyaWZpY2F0aW9uIHN1Y2NlZWRzLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VXNlckxvZ2luKFxuICAgIHJlcTogUmVxdWVzdFxuICApOiBQcm9taXNlPHthdXRob3JpemVkOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmd9PiB7XG4gICAgY29uc3QgaWRUb2tlbiA9IHJlcS5ib2R5Py5pZFRva2VuO1xuICAgIGlmICghaWRUb2tlbikge1xuICAgICAgY29uc29sZS5sb2coJ2xvZ2luIGZhaWxlZDogbm8gaWQgdG9rZW4nKTtcbiAgICAgIHJldHVybiB7YXV0aG9yaXplZDogZmFsc2UsIHJlYXNvbjogJ25vIHRva2VuJ307XG4gICAgfVxuXG4gICAgbGV0IHVzZXI6IENNU1VzZXI7XG5cbiAgICAvLyBPbiBsb2NhbCBkZXYsIHNpbXBseSB2ZXJpZnkgdGhlIGRlY29kZWQgaWRUb2tlbidzIGVtYWlsIGlzIHNldC4gVGhlXG4gICAgLy8gaWRlbnRpdHkgdG9vbGtpdCB0aGF0IHZlcmlmaWVzIGlkIHRva2VucyByZXF1aXJlcyBhIHNlcnZpY2UgYWNjb3VudCxcbiAgICAvLyB3aGljaCB3ZSB3YW50IHRvIGF2b2lkIGhhdmluZyB0byBzZXQgdXAgd2hlbiB1c2VycyBhcmUgZG9pbmcgbG9jYWwgZGV2LlxuICAgIC8vIEF1dGhlbnRpY2F0aW9uIGlzIHN0aWxsIHJlcXVpcmVkIGJ5IHRoZSBmcm9udGVuZCB1c2luZyBGaXJlYmFzZSBBdXRoLFxuICAgIC8vIHRoaXMganVzdCBieXBhc3NlcyB0aGUgaW5pdGlhbCBzZXJ2ZXIgY2hlY2sgYmVmb3JlIHRoZSB1aSBpcyByZW5kZXJlZC5cbiAgICB0cnkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIGNvbnN0IGp3dCA9IGpzb253ZWJ0b2tlbi5kZWNvZGUoaWRUb2tlbikgYXMganNvbndlYnRva2VuLkp3dFBheWxvYWQ7XG4gICAgICAgIGlmICghand0LmVtYWlsIHx8ICFqd3QuZW1haWxfdmVyaWZpZWQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnbG9naW4gZmFpbGVkOiBlbWFpbCB1bnZlcmlmaWVkJyk7XG4gICAgICAgICAgcmV0dXJuIHthdXRob3JpemVkOiBmYWxzZSwgcmVhc29uOiAnbG9naW4gZmFpbGVkJ307XG4gICAgICAgIH1cbiAgICAgICAgdXNlciA9IHtlbWFpbDogand0LmVtYWlsfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGp3dCA9IGF3YWl0IGF1dGgudmVyaWZ5SWRUb2tlbihpZFRva2VuLCB0cnVlKTtcbiAgICAgICAgaWYgKGlzRXhwaXJlZChqd3QpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2xvZ2luIGZhaWxlZDogaWQgdG9rZW4gaXMgZXhwaXJlZCcpO1xuICAgICAgICAgIHJldHVybiB7YXV0aG9yaXplZDogZmFsc2UsIHJlYXNvbjogJ2xvZ2luIGZhaWxlZCd9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghand0LmVtYWlsIHx8ICFqd3QuZW1haWxfdmVyaWZpZWQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnbG9naW4gZmFpbGVkOiBlbWFpbCB1bnZlcmlmaWVkJyk7XG4gICAgICAgICAgcmV0dXJuIHthdXRob3JpemVkOiBmYWxzZSwgcmVhc29uOiAnbG9naW4gZmFpbGVkJ307XG4gICAgICAgIH1cbiAgICAgICAgdXNlciA9IHtlbWFpbDogand0LmVtYWlsfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZ5IHRoZSBwcm9qZWN0J3MgYGlzVXNlckF1dGhvcml6ZWQoKWAgY29uZmlnIG9wdGlvbi5cbiAgICAgIGlmIChvcHRpb25zLmlzVXNlckF1dGhvcml6ZWQpIHtcbiAgICAgICAgY29uc3QgYXV0aG9yaXplZCA9IGF3YWl0IG9wdGlvbnMuaXNVc2VyQXV0aG9yaXplZChyZXEsIHtcbiAgICAgICAgICBlbWFpbDogdXNlci5lbWFpbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghYXV0aG9yaXplZCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdsb2dpbiBmYWlsZWQ6IHVzZXIgaXMgbm90IGF1dGhvcml6ZWQnKTtcbiAgICAgICAgICByZXR1cm4ge2F1dGhvcml6ZWQ6IGZhbHNlLCByZWFzb246ICdub3QgYXV0aG9yaXplZCd9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgdXNlciBleGlzdHMgaW4gdGhlIERCJ3MgQUNMIGxpc3QuXG4gICAgICBjb25zdCBjbXNDbGllbnQgPSBuZXcgUm9vdENNU0NsaWVudChyZXEucm9vdENvbmZpZyEpO1xuICAgICAgY29uc3QgdXNlckhhc0FjY2VzcyA9IGF3YWl0IGNtc0NsaWVudC51c2VyRXhpc3RzSW5BY2wodXNlci5lbWFpbCk7XG4gICAgICBpZiAoIXVzZXJIYXNBY2Nlc3MpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2xvZ2luIGZhaWxlZDogdXNlciBpcyBub3QgaW4gdGhlIGZpcmVzdG9yZSBhY2wgbGlzdCcpO1xuICAgICAgICByZXR1cm4ge2F1dGhvcml6ZWQ6IGZhbHNlLCByZWFzb246ICdub3QgYXV0aG9yaXplZCd9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignZmFpbGVkIHRvIHZlcmlmeSBqd3QgdG9rZW4nKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHJldHVybiB7YXV0aG9yaXplZDogZmFsc2UsIHJlYXNvbjogJ3Vua25vd24gZXJyb3InfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2F1dGhvcml6ZWQ6IHRydWV9O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXIocmVxOiBSZXF1ZXN0KTogUHJvbWlzZTxDTVNVc2VyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHNlc3Npb25Db29raWUgPSByZXEuc2Vzc2lvbi5nZXRJdGVtKFNFU1NJT05fQ09PS0lFX0FVVEgpO1xuICAgIGlmICghc2Vzc2lvbkNvb2tpZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gT24gbG9jYWwgZGV2LCB2ZXJpZnkgdGhlIGRlY29kZWQgaWRUb2tlbiBoYXMgYSB2YWxpZCBlbWFpbC4gVGhlIGZpcmViYXNlXG4gICAgLy8gYXV0aCB2ZXJpZmljYXRpb24gb3RoZXJ3aXNlIHdvdWxkIHJlcXVpcmUgYSBzZXJ2aWNlIGFjY291bnQuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICBjb25zdCBqd3QgPSBqc29ud2VidG9rZW4uZGVjb2RlKHNlc3Npb25Db29raWUpIGFzIGpzb253ZWJ0b2tlbi5Kd3RQYXlsb2FkO1xuICAgICAgaWYgKCFqd3Q/LmVtYWlsIHx8ICFqd3Q/LmVtYWlsX3ZlcmlmaWVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgd2hldGhlciB1c2VyIGlzIGF1dGhvcml6ZWQuXG4gICAgICBpZiAob3B0aW9ucy5pc1VzZXJBdXRob3JpemVkKSB7XG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZWQgPSBhd2FpdCBvcHRpb25zLmlzVXNlckF1dGhvcml6ZWQocmVxLCB7XG4gICAgICAgICAgZW1haWw6IGp3dC5lbWFpbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghYXV0aG9yaXplZCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdzZXNzaW9uIGZhaWxlZDogbm90IGF1dGhvcml6ZWQnKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVmVyaWZ5IHRoZSB1c2VyIGV4aXN0cyBpbiB0aGUgREIncyBBQ0wgbGlzdC5cbiAgICAgIGNvbnN0IGNtc0NsaWVudCA9IG5ldyBSb290Q01TQ2xpZW50KHJlcS5yb290Q29uZmlnISk7XG4gICAgICBjb25zdCB1c2VySGFzQWNjZXNzID0gYXdhaXQgY21zQ2xpZW50LnVzZXJFeGlzdHNJbkFjbChqd3QuZW1haWwpO1xuICAgICAgaWYgKCF1c2VySGFzQWNjZXNzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdzZXNzaW9uIGZhaWxlZDogdXNlciBpcyBub3QgaW4gdGhlIGZpcmVzdG9yZSBhY2wgbGlzdCcpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7ZW1haWw6IGp3dC5lbWFpbH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZlcmlmeSB0aGUgaWRUb2tlbiB1c2luZyBmaXJlYmFzZSBhdXRoLCBjaGVja2luZyBmb3IgdG9rZW4gcmV2b2NhdGlvbnMuXG4gICAgICBjb25zdCBqd3QgPSBhd2FpdCBhdXRoLnZlcmlmeVNlc3Npb25Db29raWUoc2Vzc2lvbkNvb2tpZSwgdHJ1ZSk7XG4gICAgICBpZiAoaXNFeHBpcmVkKGp3dCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3Nlc3Npb24gZmFpbGVkOiB0b2tlbiBpcyBleHBpcmVkJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgLy8gVmVyaWZ5IHVzZXIncyBlbWFpbCBpcyB2ZXJpZmllZC5cbiAgICAgIGlmICghand0LmVtYWlsIHx8ICFqd3QuZW1haWxfdmVyaWZpZWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3Nlc3Npb24gZmFpbGVkOiBlbWFpbCBub3QgdmVyaWZpZWQnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayB3aGV0aGVyIHVzZXIgaXMgYXV0aG9yaXplZC5cbiAgICAgIGlmIChvcHRpb25zLmlzVXNlckF1dGhvcml6ZWQpIHtcbiAgICAgICAgY29uc3QgYXV0aG9yaXplZCA9IGF3YWl0IG9wdGlvbnMuaXNVc2VyQXV0aG9yaXplZChyZXEsIHtcbiAgICAgICAgICBlbWFpbDogand0LmVtYWlsISxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghYXV0aG9yaXplZCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdzZXNzaW9uIGZhaWxlZDogbm90IGF1dGhvcml6ZWQnKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVmVyaWZ5IHRoZSB1c2VyIGV4aXN0cyBpbiB0aGUgREIncyBBQ0wgbGlzdC5cbiAgICAgIGNvbnN0IGNtc0NsaWVudCA9IG5ldyBSb290Q01TQ2xpZW50KHJlcS5yb290Q29uZmlnISk7XG4gICAgICBjb25zdCB1c2VySGFzQWNjZXNzID0gYXdhaXQgY21zQ2xpZW50LnVzZXJFeGlzdHNJbkFjbChqd3QuZW1haWwpO1xuICAgICAgaWYgKCF1c2VySGFzQWNjZXNzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdzZXNzaW9uIGZhaWxlZDogdXNlciBpcyBub3QgaW4gdGhlIGZpcmVzdG9yZSBhY2wgbGlzdCcpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIEpXVCB2ZXJpZmllZC5cbiAgICAgIHJldHVybiB7ZW1haWw6IGp3dC5lbWFpbCF9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignZmFpbGVkIHRvIHZlcmlmeSBqd3QgdG9rZW4nKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBsdWdpbjogQ01TUGx1Z2luID0ge1xuICAgIG5hbWU6ICdyb290LWNtcycsXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb25maWcgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHBsdWdpbi5cbiAgICAgKi9cbiAgICBnZXRDb25maWc6ICgpID0+IHtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBGaXJlYmFzZSBBcHAgaW5zdGFuY2UgdXNlZCBieSB0aGUgcGx1Z2luLlxuICAgICAqL1xuICAgIGdldEZpcmViYXNlQXBwOiAoKSA9PiB7XG4gICAgICByZXR1cm4gYXBwO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBGaXJlc3RvcmUgaW5zdGFuY2UgdXNlZCBieSB0aGUgcGx1Z2luLlxuICAgICAqL1xuICAgIGdldEZpcmVzdG9yZTogKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YWJhc2VJZCA9IGZpcmViYXNlQ29uZmlnLmRhdGFiYXNlSWQgfHwgJyhkZWZhdWx0KSc7XG4gICAgICByZXR1cm4gZ2V0RmlyZXN0b3JlKGFwcCwgZGF0YWJhc2VJZCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIHNzciBmaWxlcyB0byBpbmNsdWRlIHdoZW4gcnVubmluZyBgcm9vdCBidWlsZGAuXG4gICAgICovXG4gICAgc3NySW5wdXQ6ICgpID0+ICh7XG4gICAgICBjbXM6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL2FwcC5qcycpLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogV2F0Y2hlcyBmb3IgLnNjaGVtYS50cyBmaWxlIGNoYW5nZXMgYW5kIGdlbmVyYXRlcyBhIHJvb3QtY21zLmQudHMgZmlsZS5cbiAgICAgKi9cbiAgICBvbkZpbGVDaGFuZ2U6IChcbiAgICAgIGV2ZW50TmFtZTogJ2FkZCcgfCAnYWRkRGlyJyB8ICdjaGFuZ2UnIHwgJ3VubGluaycgfCAndW5saW5rRGlyJyxcbiAgICAgIGZpbGVwYXRoOiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChmaWxlcGF0aC5lbmRzV2l0aCgnLnNjaGVtYS50cycpKSB7XG4gICAgICAgIGdlbmVyYXRlVHlwZXMoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgQ01TLXNwZWNpZmljIG1pZGRsZXdhcmUgdG8gdGhlIFJvb3QuanMgc2VydmVyLlxuICAgICAqL1xuICAgIGNvbmZpZ3VyZVNlcnZlcjogYXN5bmMgKFxuICAgICAgc2VydmVyOiBTZXJ2ZXIsXG4gICAgICBzZXJ2ZXJPcHRpb25zOiBDb25maWd1cmVTZXJ2ZXJPcHRpb25zXG4gICAgKSA9PiB7XG4gICAgICBzZXJ2ZXIudXNlKGJvZHlQYXJzZXIuanNvbigpKTtcblxuICAgICAgYXN5bmMgZnVuY3Rpb24gZ2V0UmVuZGVyZXIocmVxOiBSZXF1ZXN0KTogUHJvbWlzZTxBcHBNb2R1bGU+IHtcbiAgICAgICAgaWYgKHNlcnZlck9wdGlvbnMudHlwZSA9PT0gJ2RldicpIHtcbiAgICAgICAgICBjb25zdCBhcHBGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL2FwcC5qcycpO1xuICAgICAgICAgIGNvbnN0IGFwcCA9IChhd2FpdCByZXEudml0ZVNlcnZlciEuc3NyTG9hZE1vZHVsZShcbiAgICAgICAgICAgIGFwcEZpbGVQYXRoXG4gICAgICAgICAgKSkgYXMgQXBwTW9kdWxlO1xuICAgICAgICAgIHJldHVybiBhcHA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcHBJbXBvcnRQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHJlcS5yb290Q29uZmlnIS5yb290RGlyLFxuICAgICAgICAgICdkaXN0L3NlcnZlci9jbXMuanMnXG4gICAgICAgICk7XG4gICAgICAgIGlmICghKGF3YWl0IGZpbGVFeGlzdHMoYXBwSW1wb3J0UGF0aCkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2Rpc3Qvc2VydmVyL2Ntcy5qcyBub3QgZm91bmQuIHJ1biBgcm9vdCBidWlsZGAgdG8gY3JlYXRlIGl0LidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwcCA9IChhd2FpdCBpbXBvcnQoYXBwSW1wb3J0UGF0aCkpIGFzIEFwcE1vZHVsZTtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhdGljRGlyID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3VpJyk7XG4gICAgICBzZXJ2ZXIudXNlKCcvY21zL3N0YXRpYycsIHNpcnYoc3RhdGljRGlyLCB7ZGV2OiBmYWxzZX0pKTtcblxuICAgICAgLy8gTG9naW4gaGFuZGxlci5cbiAgICAgIHNlcnZlci51c2UoJy9jbXMvbG9naW4nLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXEubWV0aG9kID09PSAnUFVUJyAmJlxuICAgICAgICAgIHJlcS5oZWFkZXJzWydjb250ZW50LXR5cGUnXSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7YXV0aG9yaXplZCwgcmVhc29ufSA9IGF3YWl0IHZlcmlmeVVzZXJMb2dpbihyZXEpO1xuICAgICAgICAgICAgaWYgKCFhdXRob3JpemVkKSB7XG4gICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICAgIC5zdGF0dXMoNDAxKVxuICAgICAgICAgICAgICAgIC5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdOT1RfQVVUSE9SSVpFRCcsIHJlYXNvbn0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCBzZXNzaW9uIGV4cGlyYXRpb24gdG8gNSBkYXlzLlxuICAgICAgICAgICAgY29uc3QgZXhwaXJlc0luID0gNjAgKiA2MCAqIDI0ICogNSAqIDEwMDA7XG4gICAgICAgICAgICBjb25zdCBpZFRva2VuID0gcmVxLmJvZHkuaWRUb2tlbiE7XG5cbiAgICAgICAgICAgIGxldCBzZXNzaW9uQ29va2llOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgICAgICAgc2Vzc2lvbkNvb2tpZSA9IGlkVG9rZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZXNzaW9uQ29va2llID0gYXdhaXQgYXV0aC5jcmVhdGVTZXNzaW9uQ29va2llKGlkVG9rZW4sIHtcbiAgICAgICAgICAgICAgICBleHBpcmVzSW4sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnNlc3Npb24uc2V0SXRlbShTRVNTSU9OX0NPT0tJRV9BVVRILCBzZXNzaW9uQ29va2llKTtcbiAgICAgICAgICAgIHJlcy5zYXZlU2Vzc2lvbigpO1xuICAgICAgICAgICAgcmVzLmpzb24oe3N1Y2Nlc3M6IHRydWV9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgIC5zdGF0dXMoNTAwKVxuICAgICAgICAgICAgICAuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnVU5LTk9XTl9TRVJWRVJfRVJST1InfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXBwID0gYXdhaXQgZ2V0UmVuZGVyZXIocmVxKTtcbiAgICAgICAgICBhcHAucmVuZGVyU2lnbkluKHJlcSwgcmVzLCBvcHRpb25zKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoJ1VOS05PV04gU0VSVkVSIEVSUk9SJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMb2dvdXQgaGFuZGxlci5cbiAgICAgIHNlcnZlci51c2UoJy9jbXMvbG9nb3V0JywgYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICByZXMuc2Vzc2lvbi5yZW1vdmVJdGVtKFNFU1NJT05fQ09PS0lFX0FVVEgpO1xuICAgICAgICByZXMuc2F2ZVNlc3Npb24oKTtcbiAgICAgICAgcmVzLnJlZGlyZWN0KCcvY21zL2xvZ2luJyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gSW5qZWN0IHRoZSBjdXJyZW50IHVzZXIgaW50byB0aGUgcmVxIG9iamVjdCBhbmQgY2hlY2sgaWYgbG9naW4gaXNcbiAgICAgIC8vIHJlcXVpcmVkLCBzZW5kaW5nIHVuYXV0aGVudGljYXRlZCB1c2VycyB0byB0aGUgbG9naW4gcGFnZS5cbiAgICAgIHNlcnZlci51c2UoYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBnZXRDdXJyZW50VXNlcihyZXEpO1xuICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgIHJlcS51c2VyID0gdXNlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIHVzZXIgYW5kIGxvZ2luIGlzIHJlcXVpcmVkIGZvciB0aGUgZ2l2ZW4gcGF0aCwgcmVkaXJlY3QgdG8gdGhlXG4gICAgICAgIC8vIGxvZ2luIHBhZ2UuXG4gICAgICAgIGlmICghdXNlciAmJiBsb2dpblJlcXVpcmVkKHJlcSkpIHtcbiAgICAgICAgICBpZiAocmVxLm9yaWdpbmFsVXJsLnN0YXJ0c1dpdGgoJy9jbXMvYXBpJykpIHtcbiAgICAgICAgICAgIHJlcy5zdGF0dXMoNDAxKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdOT1RfQVVUSE9SSVpFRCd9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5sb2coJ3JlZGlyZWN0aW5nIHRvIGxvZ2luIHBhZ2UnKTtcbiAgICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgICAgIGNvbnRpbnVlOiByZXEub3JpZ2luYWxVcmwsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnJlZGlyZWN0KGAvY21zL2xvZ2luPyR7cGFyYW1zLnRvU3RyaW5nKCl9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV4dCgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIEFQSSBoYW5kbGVycy5cbiAgICAgIGFwaShzZXJ2ZXIpO1xuXG4gICAgICAvLyBSZW5kZXIgdGhlIENNUyBTUEEuXG4gICAgICBzZXJ2ZXIudXNlKCcvY21zJywgYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFwcCA9IGF3YWl0IGdldFJlbmRlcmVyKHJlcSk7XG4gICAgICAgICAgYXdhaXQgYXBwLnJlbmRlckFwcChyZXEsIHJlcywge1xuICAgICAgICAgICAgcm9vdENvbmZpZzogcmVxLnJvb3RDb25maWcsXG4gICAgICAgICAgICBjbXNDb25maWc6IG9wdGlvbnMsXG4gICAgICAgICAgICBmaXJlYmFzZUNvbmZpZzogb3B0aW9ucy5maXJlYmFzZUNvbmZpZyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gVE9ETyhzdGV2ZW5sZSk6IHJlbmRlciBhIGN1c3RvbSBlcnJvciBwYWdlLlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZCgnVU5LTk9XTiBTRVJWRVIgRVJST1InKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gcGx1Z2luO1xufVxuXG5mdW5jdGlvbiBmaWxlRXhpc3RzKGZpbGVwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGZzXG4gICAgLmFjY2VzcyhmaWxlcGF0aClcbiAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgIC5jYXRjaCgoKSA9PiBmYWxzZSk7XG59XG4iLCAiaW1wb3J0IHtwcm9taXNlcyBhcyBmc30gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQge2xvYWRSb290Q29uZmlnLCB2aXRlU3NyTG9hZE1vZHVsZX0gZnJvbSAnQGJsaW5ray9yb290L25vZGUnO1xuaW1wb3J0ICogYXMgZG9tIGZyb20gJ2R0cy1kb20nO1xuXG5pbXBvcnQge0ZpZWxkLCBTY2hlbWF9IGZyb20gJy4uL2NvcmUvc2NoZW1hLmpzJztcblxudHlwZSBQcm9qZWN0TW9kdWxlID0gdHlwZW9mIGltcG9ydCgnLi4vY29yZS9wcm9qZWN0LmpzJyk7XG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHlwZXMoKSB7XG4gIGNvbnN0IHJvb3REaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgbG9hZFJvb3RDb25maWcocm9vdERpciwge2NvbW1hbmQ6ICdyb290LWNtcyd9KTtcbiAgY29uc3QgbW9kdWxlUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL3Byb2plY3QuanMnKTtcbiAgY29uc3QgcHJvamVjdCA9IChhd2FpdCB2aXRlU3NyTG9hZE1vZHVsZShcbiAgICByb290Q29uZmlnLFxuICAgIG1vZHVsZVBhdGhcbiAgKSkgYXMgUHJvamVjdE1vZHVsZTtcbiAgY29uc3Qgc2NoZW1hcyA9IHByb2plY3QuZ2V0UHJvamVjdFNjaGVtYXMoKTtcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyLCAncm9vdC1jbXMuZC50cycpO1xuICBhd2FpdCBnZW5lcmF0ZVNjaGVtYUR0cyhvdXRwdXRQYXRoLCBzY2hlbWFzKTtcbiAgY29uc29sZS5sb2coJ3NhdmVkIHJvb3QtY21zLmQudHMhJyk7XG59XG5cbmNvbnN0IFRFTVBMQVRFID0gYC8qKiBSb290LmpzIENNUyB0eXBlcy4gVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU0ltYWdlIHtcbiAgc3JjOiBzdHJpbmc7XG4gIHdpZHRoPzogbnVtYmVyO1xuICBoZWlnaHQ/OiBudW1iZXI7XG4gIGFsdD86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUm9vdENNU09uZU9mPFQgPSBhbnk+ID0gVCAmIHtcbiAgX3R5cGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU1JpY2hUZXh0QmxvY2sge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb290Q01TUmljaFRleHQge1xuICBibG9ja3M6IFJvb3RDTVNSaWNoVGV4dEJsb2NrW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU1JlZmVyZW5jZSB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIGRvYywgZS5nLiBcIlBhZ2VzL2Zvby1iYXJcIi4gKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRoZSBjb2xsZWN0aW9uIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlc1wiLiAqL1xuICBjb2xsZWN0aW9uOiBzdHJpbmc7XG4gIC8qKiBUaGUgc2x1ZyBvZiB0aGUgZG9jLCBlLmcuIFwiZm9vLWJhclwiLiAqL1xuICBzbHVnOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdENNU0RvYzxGaWVsZHMgZXh0ZW5kcyB7fT4ge1xuICAvKiogVGhlIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlcy9mb28tYmFyXCIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXNcIi4gKi9cbiAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgc2x1Zzogc3RyaW5nO1xuICAvKiogU3lzdGVtLWxldmVsIG1ldGFkYXRhLiAqL1xuICBzeXM6IHtcbiAgICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICBtb2RpZmllZEF0OiBudW1iZXI7XG4gICAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICAgIGZpcnN0UHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgZmlyc3RQdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBwdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBwdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBsb2NhbGVzPzogc3RyaW5nW107XG4gIH07XG4gIC8qKiBVc2VyLWVudGVyZWQgZmllbGQgdmFsdWVzIGZyb20gdGhlIENNUy4gKi9cbiAgZmllbGRzPzogRmllbGRzO1xufWA7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcm9vdC1jbXMuZC50cyBmaWxlIGZyb20gdGhlIC5zY2hlbWEudHMgZmlsZXMgaW4gdGhlIHByb2plY3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVNjaGVtYUR0cyhcbiAgb3V0cHV0UGF0aDogc3RyaW5nLFxuICBzY2hlbWFzOiBSZWNvcmQ8c3RyaW5nLCBTY2hlbWE+XG4pIHtcbiAgY29uc3QgcmVzdWx0cyA9IFtURU1QTEFURV07XG4gIGZvciAoY29uc3QgZmlsZUlkIGluIHNjaGVtYXMpIHtcbiAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFzW2ZpbGVJZF07XG4gICAgcmVzdWx0cy5wdXNoKHJlbmRlclNjaGVtYShmaWxlSWQsIHNjaGVtYSkpO1xuICB9XG4gIGNvbnN0IG91dHB1dCA9IHJlc3VsdHNcbiAgICAuam9pbignXFxuXFxuJylcbiAgICAucmVwbGFjZUFsbCgnLyoqICAnLCAnLyoqICcpXG4gICAgLnJlcGxhY2VBbGwoJyAgKi8nLCAnICovJylcbiAgICAucmVwbGFjZSgvXFxyXFxufFxccnxcXG4vZywgJ1xcbicpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUob3V0cHV0UGF0aCwgb3V0cHV0LCAndXRmLTgnKTtcbn1cblxuZnVuY3Rpb24gZmllbGRQcm9wZXJ0eShmaWVsZDogRmllbGQpOiBkb20uUHJvcGVydHlEZWNsYXJhdGlvbiB7XG4gIGNvbnN0IHByb3AgPSBkb20uY3JlYXRlLnByb3BlcnR5KFxuICAgIGZpZWxkLmlkISxcbiAgICBmaWVsZFR5cGUoZmllbGQpLFxuICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLk9wdGlvbmFsXG4gICk7XG4gIGNvbnN0IGpzZG9jID0gW107XG4gIGlmIChmaWVsZC5sYWJlbCkge1xuICAgIGlmIChmaWVsZC5oZWxwKSB7XG4gICAgICBqc2RvYy5wdXNoKGAke2ZpZWxkLmxhYmVsfS4gJHtmaWVsZC5oZWxwfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBqc2RvYy5wdXNoKGZpZWxkLmxhYmVsKTtcbiAgICB9XG4gIH1cbiAgaWYgKGZpZWxkLmRlcHJlY2F0ZWQpIHtcbiAgICBqc2RvYy5wdXNoKCdAZGVwcmVjYXRlZCcpO1xuICB9XG4gIGlmIChqc2RvYy5sZW5ndGggPiAwKSB7XG4gICAgcHJvcC5qc0RvY0NvbW1lbnQgPSBqc2RvYy5qb2luKCdcXG4nKTtcbiAgfVxuICByZXR1cm4gcHJvcDtcbn1cblxuZnVuY3Rpb24gZmllbGRUeXBlKGZpZWxkOiBGaWVsZCk6IGRvbS5UeXBlIHtcbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuYXJyYXkoZmllbGRUeXBlKGZpZWxkLm9mKSk7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBkb20udHlwZS5ib29sZWFuO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZScpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuc3RyaW5nO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLm51bWJlcjtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ2ltYWdlJykge1xuICAgIGNvbnN0IGltYWdlVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TSW1hZ2UnKTtcbiAgICByZXR1cm4gaW1hZ2VUeXBlO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnZmlsZScpIHtcbiAgICByZXR1cm4gZG9tLmNyZWF0ZS5vYmplY3RUeXBlKFtkb20uY3JlYXRlLnByb3BlcnR5KCdzcmMnLCBkb20udHlwZS5zdHJpbmcpXSk7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdtdWx0aXNlbGVjdCcpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuYXJyYXkoZG9tLnR5cGUuc3RyaW5nKTtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ29uZW9mJykge1xuICAgIGNvbnN0IG9uZW9mVHlwZSA9IGRvbS5jcmVhdGUubmFtZWRUeXBlUmVmZXJlbmNlKCdSb290Q01TT25lT2YnKTtcbiAgICByZXR1cm4gb25lb2ZUeXBlO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAncmVmZXJlbmNlJykge1xuICAgIGNvbnN0IHJlZmVyZW5jZVR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU1JlZmVyZW5jZScpO1xuICAgIHJldHVybiByZWZlcmVuY2VUeXBlO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAncmljaHRleHQnKSB7XG4gICAgY29uc3QgcmljaHRleHRUeXBlID0gZG9tLmNyZWF0ZS5uYW1lZFR5cGVSZWZlcmVuY2UoJ1Jvb3RDTVNSaWNoVGV4dCcpO1xuICAgIHJldHVybiByaWNodGV4dFR5cGU7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgcmV0dXJuIGRvbS50eXBlLnN0cmluZztcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZG9tLnR5cGUuc3RyaW5nO1xuICB9XG4gIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IHN1YnByb3BlcnRpZXMgPSAoZmllbGQuZmllbGRzIHx8IFtdKS5tYXAoKGYpID0+IGZpZWxkUHJvcGVydHkoZikpO1xuICAgIHJldHVybiBkb20uY3JlYXRlLm9iamVjdFR5cGUoc3VicHJvcGVydGllcyk7XG4gIH1cbiAgcmV0dXJuIGRvbS50eXBlLnVua25vd247XG59XG5cbmZ1bmN0aW9uIHJlbmRlclNjaGVtYShmaWxlSWQ6IHN0cmluZywgc2NoZW1hOiBTY2hlbWEpOiBzdHJpbmcge1xuICBjb25zdCBqc2RvYyA9IGBHZW5lcmF0ZWQgZnJvbSBcXGAke2ZpbGVJZH1cXGAuYDtcbiAgY29uc3QgaWQgPSBhbHBoYW51bWVyaWMocGF0aC5wYXJzZShmaWxlSWQpLm5hbWUuc3BsaXQoJy4nKVswXSk7XG4gIGNvbnN0IGZpZWxkc0ludGVyZmFjZSA9IGAke2lkfUZpZWxkc2A7XG4gIGNvbnN0IGZpZWxkcyA9IGRvbS5jcmVhdGUuaW50ZXJmYWNlKFxuICAgIGZpZWxkc0ludGVyZmFjZSxcbiAgICBkb20uRGVjbGFyYXRpb25GbGFncy5FeHBvcnRcbiAgKTtcbiAgZmllbGRzLmpzRG9jQ29tbWVudCA9IGpzZG9jO1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNjaGVtYS5maWVsZHMpIHtcbiAgICBpZiAoIWZpZWxkLmlkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZmllbGRzLm1lbWJlcnMucHVzaChmaWVsZFByb3BlcnR5KGZpZWxkKSk7XG4gIH1cblxuICBjb25zdCBmaWVsZHNUeXBlT3V0cHV0ID0gZG9tXG4gICAgLmVtaXQoZmllbGRzLCB7c2luZ2xlTGluZUpzRG9jQ29tbWVudHM6IHRydWV9KVxuICAgIC50cmltKCk7XG4gIGlmIChmaWxlSWQuc3RhcnRzV2l0aCgnL2NvbGxlY3Rpb25zLycpKSB7XG4gICAgY29uc3QgYmFzZVR5cGUgPSBkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZSgnUm9vdENNU0RvYycpO1xuICAgIGJhc2VUeXBlLnR5cGVBcmd1bWVudHMucHVzaChkb20uY3JlYXRlLm5hbWVkVHlwZVJlZmVyZW5jZShmaWVsZHNJbnRlcmZhY2UpKTtcbiAgICBjb25zdCBkb2NUeXBlID0gZG9tLmNyZWF0ZS5hbGlhcyhcbiAgICAgIGAke2lkfURvY2AsXG4gICAgICBiYXNlVHlwZSxcbiAgICAgIGRvbS5EZWNsYXJhdGlvbkZsYWdzLkV4cG9ydFxuICAgICk7XG4gICAgZG9jVHlwZS5qc0RvY0NvbW1lbnQgPSBqc2RvYztcblxuICAgIGNvbnN0IGRvY1R5cGVPdXRwdXQgPSBkb21cbiAgICAgIC5lbWl0KGRvY1R5cGUsIHtzaW5nbGVMaW5lSnNEb2NDb21tZW50czogdHJ1ZX0pXG4gICAgICAudHJpbSgpO1xuICAgIHJldHVybiByZWluZGVudChmaWVsZHNUeXBlT3V0cHV0ICsgJ1xcblxcbicgKyBkb2NUeXBlT3V0cHV0KTtcbiAgfVxuICByZXR1cm4gcmVpbmRlbnQoZmllbGRzVHlwZU91dHB1dCk7XG59XG5cbi8qKlxuICogQ29udmVydHMgNC1zcGFjZSBpbmRlbnRzIHRvIDIuXG4gKi9cbmZ1bmN0aW9uIHJlaW5kZW50KGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IGlucHV0LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgY29udmVydGVkTGluZSA9IGxpbmUucmVwbGFjZSgvIHs0fS9nLCAnICAnKTtcbiAgICByZXN1bHRzLnB1c2goY29udmVydGVkTGluZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBub24tYWxwaGFudW1lcmljIGNoYXJzIGZyb20gYSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGFscGhhbnVtZXJpYyhpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCAnJyk7XG59XG4iLCAiaW1wb3J0IHtTZXJ2ZXIsIFJlcXVlc3QsIFJlc3BvbnNlfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHttdWx0aXBhcnRNaWRkbGV3YXJlfSBmcm9tICdAYmxpbmtrL3Jvb3QvbWlkZGxld2FyZSc7XG5pbXBvcnQge0NoYXQsIENoYXRDbGllbnR9IGZyb20gJy4vYWkuanMnO1xuaW1wb3J0IHtSb290Q01TQ2xpZW50fSBmcm9tICcuL2NsaWVudC5qcyc7XG5pbXBvcnQge3J1bkNyb25Kb2JzfSBmcm9tICcuL2Nyb24uanMnO1xuaW1wb3J0IHthcnJheVRvQ3N2LCBjc3ZUb0FycmF5fSBmcm9tICcuL2Nzdi5qcyc7XG5cbi8qKlxuICogUmVnaXN0ZXJzIEFQSSBtaWRkbGV3YXJlIGhhbmRsZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBpKHNlcnZlcjogU2VydmVyKSB7XG4gIC8qKlxuICAgKiBSdW5zIENNUyBjcm9uIGpvYnMuXG4gICAqL1xuICBzZXJ2ZXIudXNlKCcvY21zL2FwaS9jcm9uLnJ1bicsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcnVuQ3JvbkpvYnMocmVxLnJvb3RDb25maWchKTtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7c3VjY2VzczogZmFsc2V9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBBY2NlcHRzIGEgSlNPTiBvYmplY3QgY29udGFpbmluZyB7aGVhZGVyczogWy4uLl0sIHJvd3M6IFsuLi5dfSBhbmQgc2VuZHNcbiAgICogYW4gSFRUUCByZXNwb25zZSB3aXRoIGEgY29ycmVzcG9uZGluZyBDU1YgZmlsZSBhcyBhbiBhdHRhY2htZW50LlxuICAgKlxuICAgKiBTYW1wbGUgcmVxdWVzdDpcbiAgICpcbiAgICogYGBganNvblxuICAgKiB7XG4gICAqICAgXCJoZWFkZXJzXCI6IFtcImZvb1wiXSxcbiAgICogICBcInJvd3NcIjogW1xuICAgKiAgICAge1wiZm9vXCI6IFwiYmFyXCJ9LFxuICAgKiAgICAge1wiZm9vXCI6IFwiYmF6XCJ9LFxuICAgKiAgIF1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHNlcnZlci51c2UoJy9jbXMvYXBpL2Nzdi5kb3dubG9hZCcsIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoXG4gICAgICByZXEubWV0aG9kICE9PSAnUE9TVCcgfHxcbiAgICAgICFTdHJpbmcocmVxLmdldCgnY29udGVudC10eXBlJykpLnN0YXJ0c1dpdGgoJ2FwcGxpY2F0aW9uL2pzb24nKVxuICAgICkge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0JBRF9SRVFVRVNUJ30pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBib2R5ID0gcmVxLmJvZHkgfHwge307XG4gICAgICBjb25zdCBoZWFkZXJzID0gYm9keS5oZWFkZXJzIHx8IFtdO1xuICAgICAgY29uc3Qgcm93cyA9IGJvZHkucm93cyB8fCBbXTtcbiAgICAgIGNvbnN0IGNzdiA9IGFycmF5VG9Dc3Yoe2hlYWRlcnMsIHJvd3N9KTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2NzdicpO1xuICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50OyBmaWxlbmFtZT1cImRhdGEuY3N2XCInKTtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKS5lbmQoY3N2KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrIHx8IGVycik7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnVU5LTk9XTid9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGEgQ1NWIGZpbGUgYW5kIHJldHVybnMgYSBKU09OIGFycmF5IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZVxuICAgKiBDU1YuXG4gICAqXG4gICAqIFNhbXBsZSByZXNwb25zZTpcbiAgICpcbiAgICogYGBganNvblxuICAgKiB7XG4gICAqICAgXCJzdWNjZXNzXCI6IHRydWUsXG4gICAqICAgXCJkYXRhXCI6IFtcbiAgICogICAgIHtcImZvb1wiOiBcImJhclwifSxcbiAgICogICAgIHtcImZvb1wiOiBcImJhelwifSxcbiAgICogICBdXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBzZXJ2ZXIudXNlKFxuICAgICcvY21zL2FwaS9jc3YuaW1wb3J0JyxcbiAgICBtdWx0aXBhcnRNaWRkbGV3YXJlKCksXG4gICAgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKHJlcS5tZXRob2QgIT09ICdQT1NUJyB8fCAhcmVxLmZpbGVzIHx8ICFyZXEuZmlsZXMuZmlsZSkge1xuICAgICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnQkFEX1JFUVVFU1QnfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmlsZSA9IHJlcS5maWxlcy5maWxlO1xuICAgICAgICBjb25zdCBjc3ZTdHJpbmcgPSBmaWxlLmJ1ZmZlci50b1N0cmluZygndXRmOCcpO1xuICAgICAgICBjb25zdCByb3dzID0gY3N2VG9BcnJheShjc3ZTdHJpbmcpO1xuICAgICAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7c3VjY2VzczogdHJ1ZSwgZGF0YTogcm93c30pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrIHx8IGVycik7XG4gICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVTktOT1dOJ30pO1xuICAgICAgfVxuICAgIH1cbiAgKTtcblxuICAvKipcbiAgICogUnVucyBhIGRhdGEgc291cmNlIHN5bmMuXG4gICAqL1xuICBzZXJ2ZXIudXNlKCcvY21zL2FwaS9kYXRhLnN5bmMnLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKFxuICAgICAgcmVxLm1ldGhvZCAhPT0gJ1BPU1QnIHx8XG4gICAgICAhU3RyaW5nKHJlcS5nZXQoJ2NvbnRlbnQtdHlwZScpKS5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi9qc29uJylcbiAgICApIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdCQURfUkVRVUVTVCd9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlcS51c2VyPy5lbWFpbCkge1xuICAgICAgcmVzLnN0YXR1cyg0MDEpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1VOQVVUSE9SSVpFRCd9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXFCb2R5ID0gcmVxLmJvZHkgfHwge307XG4gICAgY29uc3QgZGF0YVNvdXJjZUlkID0gcmVxQm9keS5pZDtcbiAgICBpZiAoIWRhdGFTb3VyY2VJZCkge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ01JU1NJTkdfSUQnfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNtc0NsaWVudCA9IG5ldyBSb290Q01TQ2xpZW50KHJlcS5yb290Q29uZmlnISk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNtc0NsaWVudC5zeW5jRGF0YVNvdXJjZShkYXRhU291cmNlSWQsIHtzeW5jZWRCeTogcmVxLnVzZXIuZW1haWx9KTtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBpZDogZGF0YVNvdXJjZUlkfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVyci5zdGFjayB8fCBlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1VOS05PV04nfSk7XG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogTG9ncyBhbiBhY3Rpb24uXG4gICAqL1xuICBzZXJ2ZXIudXNlKCcvY21zL2FwaS9hY3Rpb25zLmxvZycsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoXG4gICAgICByZXEubWV0aG9kICE9PSAnUE9TVCcgfHxcbiAgICAgICFTdHJpbmcocmVxLmdldCgnY29udGVudC10eXBlJykpLnN0YXJ0c1dpdGgoJ2FwcGxpY2F0aW9uL2pzb24nKVxuICAgICkge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0JBRF9SRVFVRVNUJ30pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghcmVxLnVzZXI/LmVtYWlsKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMSkuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnVU5BVVRIT1JJWkVEJ30pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcUJvZHkgPSByZXEuYm9keSB8fCB7fTtcbiAgICBjb25zdCBhY3Rpb24gPSByZXFCb2R5LmFjdGlvbjtcbiAgICBpZiAoIWFjdGlvbikge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6ICdNSVNTSU5HX1JFUVVJUkVEX0ZJRUxEJyxcbiAgICAgICAgZmllbGQ6ICdhY3Rpb24nLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IG1ldGFkYXRhID0gcmVxQm9keS5tZXRhZGF0YSB8fCB7fTtcblxuICAgIGNvbnN0IGNtc0NsaWVudCA9IG5ldyBSb290Q01TQ2xpZW50KHJlcS5yb290Q29uZmlnISk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNtc0NsaWVudC5sb2dBY3Rpb24oYWN0aW9uLCB7XG4gICAgICAgIGJ5OiByZXEudXNlcj8uZW1haWwsXG4gICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnN0YXR1cygyMDApLmpzb24oe3N1Y2Nlc3M6IHRydWV9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrIHx8IGVycik7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnVU5LTk9XTid9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBBSSBjaGF0Ym90LlxuICAgKi9cbiAgc2VydmVyLnVzZSgnL2Ntcy9hcGkvYWkuY2hhdCcsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoXG4gICAgICByZXEubWV0aG9kICE9PSAnUE9TVCcgfHxcbiAgICAgICFTdHJpbmcocmVxLmdldCgnY29udGVudC10eXBlJykpLnN0YXJ0c1dpdGgoJ2FwcGxpY2F0aW9uL2pzb24nKVxuICAgICkge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0JBRF9SRVFVRVNUJ30pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXJlcS51c2VyPy5lbWFpbCkge1xuICAgICAgcmVzLnN0YXR1cyg0MDEpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1VOQVVUSE9SSVpFRCd9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVxQm9keSA9IHJlcS5ib2R5IHx8IHt9O1xuICAgIGlmICghcmVxQm9keS5wcm9tcHQpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdNSVNTSU5HX1BST01QVCd9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJvbXB0ID0gcmVxQm9keS5wcm9tcHQ7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY21zQ2xpZW50ID0gbmV3IFJvb3RDTVNDbGllbnQocmVxLnJvb3RDb25maWchKTtcbiAgICAgIGNvbnN0IGNoYXRDbGllbnQgPSBuZXcgQ2hhdENsaWVudChjbXNDbGllbnQsIHJlcS51c2VyLmVtYWlsKTtcbiAgICAgIGxldCBjaGF0OiBDaGF0O1xuICAgICAgaWYgKHJlcUJvZHkuY2hhdElkKSB7XG4gICAgICAgIGNoYXQgPSBhd2FpdCBjaGF0Q2xpZW50LmdldENoYXQocmVxQm9keS5jaGF0SWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hhdCA9IGF3YWl0IGNoYXRDbGllbnQuY3JlYXRlQ2hhdCgpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hhdFJlc3BvbnNlID0gYXdhaXQgY2hhdC5zZW5kUHJvbXB0KHByb21wdCk7XG4gICAgICByZXNcbiAgICAgICAgLnN0YXR1cygyMDApXG4gICAgICAgIC5qc29uKHtzdWNjZXNzOiB0cnVlLCBjaGF0SWQ6IGNoYXQuaWQsIHJlc3BvbnNlOiBjaGF0UmVzcG9uc2V9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrIHx8IGVycik7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnVU5LTk9XTid9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwgImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtnZW5lcmF0ZX0gZnJvbSAnQGdlbmtpdC1haS9haSc7XG5pbXBvcnQge2NvbmZpZ3VyZUdlbmtpdH0gZnJvbSAnQGdlbmtpdC1haS9jb3JlJztcbmltcG9ydCB7dmVydGV4QUl9IGZyb20gJ0BnZW5raXQtYWkvdmVydGV4YWknO1xuaW1wb3J0IHtnZW1pbmkxNVByb1ByZXZpZXcsIGdlbWluaTE1Rmxhc2hQcmV2aWV3fSBmcm9tICdAZ2Vua2l0LWFpL3ZlcnRleGFpJztcbmltcG9ydCB7Um9vdENNU0NsaWVudH0gZnJvbSAnLi9jbGllbnQuanMnO1xuXG5sZXQgZ2Vua2l0SXNDb25maWd1cmVkID0gZmFsc2U7XG5cbmludGVyZmFjZSBDaGF0UHJvbXB0IHtcbiAgdGV4dD86IHN0cmluZztcbiAgbWVkaWE/OiB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgY29udGVudFR5cGU6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIENoYXQge1xuICBjaGF0Q2xpZW50OiBDaGF0Q2xpZW50O1xuICBjbXNDbGllbnQ6IFJvb3RDTVNDbGllbnQ7XG4gIGlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY2hhdENsaWVudDogQ2hhdENsaWVudCwgaWQ6IHN0cmluZykge1xuICAgIHRoaXMuY2hhdENsaWVudCA9IGNoYXRDbGllbnQ7XG4gICAgdGhpcy5jbXNDbGllbnQgPSBjaGF0Q2xpZW50LmNtc0NsaWVudDtcbiAgICB0aGlzLmlkID0gaWQ7XG4gIH1cblxuICBhc3luYyBzZW5kUHJvbXB0KHByb21wdDogc3RyaW5nIHwgQ2hhdFByb21wdCB8IENoYXRQcm9tcHRbXSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFnZW5raXRJc0NvbmZpZ3VyZWQpIHtcbiAgICAgIGNvbnN0IGNtc0NvbmZpZyA9IHRoaXMuY21zQ2xpZW50LmNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgICAgIGNvbnN0IGZpcmViYXNlQ29uZmlnID0gY21zQ29uZmlnLmZpcmViYXNlQ29uZmlnO1xuICAgICAgY29uZmlndXJlR2Vua2l0KHtcbiAgICAgICAgcGx1Z2luczogW1xuICAgICAgICAgIHZlcnRleEFJKHtcbiAgICAgICAgICAgIHByb2plY3RJZDogZmlyZWJhc2VDb25maWcucHJvamVjdElkLFxuICAgICAgICAgICAgLy8gVE9ETyhzdGV2ZW5sZSk6IGZpZ3VyZSBvdXQgd2hlcmUgdG8gZ2V0IHRoaXMuXG4gICAgICAgICAgICBsb2NhdGlvbjogZmlyZWJhc2VDb25maWcubG9jYXRpb24gfHwgJ3VzLWNlbnRyYWwxJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgICAgZ2Vua2l0SXNDb25maWd1cmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhwcm9tcHQpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdlbmVyYXRlKHtcbiAgICAgIC8vIG1vZGVsOiBnZW1pbmkxNVByb1ByZXZpZXcsXG4gICAgICBtb2RlbDogZ2VtaW5pMTVGbGFzaFByZXZpZXcsXG4gICAgICBwcm9tcHQ6IHByb21wdCBhcyBhbnksXG4gICAgfSk7XG4gICAgY29uc29sZS5sb2cocmVzKTtcbiAgICByZXR1cm4gcmVzLnRleHQoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2hhdENsaWVudCB7XG4gIGNtc0NsaWVudDogUm9vdENNU0NsaWVudDtcbiAgdXNlcjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNtc0NsaWVudDogUm9vdENNU0NsaWVudCwgdXNlcjogc3RyaW5nKSB7XG4gICAgdGhpcy5jbXNDbGllbnQgPSBjbXNDbGllbnQ7XG4gICAgdGhpcy51c2VyID0gdXNlcjtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUNoYXQoKTogUHJvbWlzZTxDaGF0PiB7XG4gICAgY29uc3QgY2hhdElkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICAvLyBUT0RPKHN0ZXZlbmxlKTogc2F2ZSBjaGF0IHRvIGRiIHNvIHRoYXQgdXNlciBoYXMgYSBjaGF0IGhpc3RvcnkgYW5kIGNhblxuICAgIC8vIGVuYWJsZSBcInNoYXJpbmdcIiB3aXRoIG90aGVycy5cbiAgICAvLyBUT0RPKHN0ZXZlbmxlKTogcmVtZW1iZXIgdG8gc3RvcmUgdGhlIG1vZGVsIHVzZWQgaW4gdGhlIGNoYXQgbWV0YWRhdGEuXG4gICAgcmV0dXJuIG5ldyBDaGF0KHRoaXMsIGNoYXRJZCk7XG4gIH1cblxuICBhc3luYyBnZXRDaGF0KGNoYXRJZDogc3RyaW5nKTogUHJvbWlzZTxDaGF0PiB7XG4gICAgLy8gVE9ETyhzdGV2ZW5sZSk6IGZldGNoIGNoYXQgZnJvbSBkYi5cbiAgICByZXR1cm4gbmV3IENoYXQodGhpcywgY2hhdElkKTtcbiAgfVxufVxuIiwgImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtQbHVnaW4sIFJvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge0FwcH0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXBwJztcbmltcG9ydCB7XG4gIEZpZWxkVmFsdWUsXG4gIEZpcmVzdG9yZSxcbiAgUXVlcnksXG4gIFRpbWVzdGFtcCxcbiAgV3JpdGVCYXRjaCxcbn0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vZmlyZXN0b3JlJztcbmltcG9ydCB7Q01TUGx1Z2lufSBmcm9tICcuL3BsdWdpbi5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9jPEZpZWxkcyA9IGFueT4ge1xuICAvKiogVGhlIGlkIG9mIHRoZSBkb2MsIGUuZy4gXCJQYWdlcy9mb28tYmFyXCIuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgY29sbGVjdGlvbiBpZCBvZiB0aGUgZG9jLCBlLmcuIFwiUGFnZXNcIi4gKi9cbiAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAvKiogVGhlIHNsdWcgb2YgdGhlIGRvYywgZS5nLiBcImZvby1iYXJcIi4gKi9cbiAgc2x1Zzogc3RyaW5nO1xuICBzeXM6IHtcbiAgICBjcmVhdGVkQXQ6IG51bWJlcjtcbiAgICBjcmVhdGVkQnk6IHN0cmluZztcbiAgICBtb2RpZmllZEF0OiBudW1iZXI7XG4gICAgbW9kaWZpZWRCeTogc3RyaW5nO1xuICAgIGZpcnN0UHVibGlzaGVkQXQ/OiBudW1iZXI7XG4gICAgZmlyc3RQdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBwdWJsaXNoZWRBdD86IG51bWJlcjtcbiAgICBwdWJsaXNoZWRCeT86IHN0cmluZztcbiAgICBwdWJsaXNoaW5nTG9ja2VkOiB7XG4gICAgICBsb2NrZWRBdDogc3RyaW5nO1xuICAgICAgbG9ja2VkQnk6IHN0cmluZztcbiAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgdW50aWw/OiBUaW1lc3RhbXA7XG4gICAgfTtcbiAgICBsb2NhbGVzPzogc3RyaW5nW107XG4gIH07XG4gIGZpZWxkczogRmllbGRzO1xufVxuXG5leHBvcnQgdHlwZSBEb2NNb2RlID0gJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnO1xuXG5leHBvcnQgdHlwZSBIdHRwTWV0aG9kID0gJ0dFVCcgfCAnUE9TVCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVNvdXJjZSB7XG4gIGlkOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB0eXBlOiAnaHR0cCcgfCAnZ3NoZWV0JztcbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXJyZW50bHkgb25seSB1c2VkIGJ5IGdzaGVldC4gYGFycmF5YCByZXR1cm5zIHRoZSBzaGVldCBhcyBhbiBhcnJheSBvZlxuICAgKiBhcnJheXMsIGBtYXBgIHJldHVybnMgdGhlIHNoZWV0IGFzIGFuIGFycmF5IG9mIG9iamVjdHMuXG4gICAqL1xuICBkYXRhRm9ybWF0PzogJ2FycmF5JyB8ICdtYXAnO1xuICAvKipcbiAgICogT3B0aW9ucyBmb3IgSFRUUCByZXF1ZXN0cy5cbiAgICovXG4gIGh0dHBPcHRpb25zPzoge1xuICAgIG1ldGhvZDogSHR0cE1ldGhvZDtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBib2R5Pzogc3RyaW5nO1xuICB9O1xuICBjcmVhdGVkQXQ6IFRpbWVzdGFtcDtcbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIHN5bmNlZEF0PzogVGltZXN0YW1wO1xuICBzeW5jZWRCeT86IHN0cmluZztcbiAgcHVibGlzaGVkQXQ/OiBUaW1lc3RhbXA7XG4gIHB1Ymxpc2hlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTb3VyY2VEYXRhPFQgPSBhbnk+IHtcbiAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbiAgZGF0YTogVDtcbn1cblxuZXhwb3J0IHR5cGUgRGF0YVNvdXJjZU1vZGUgPSAnZHJhZnQnIHwgJ3B1Ymxpc2hlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RG9jT3B0aW9ucyB7XG4gIC8qKiBNb2RlLCBlaXRoZXIgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCIuICovXG4gIG1vZGU6IERvY01vZGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0RG9jT3B0aW9ucyB7XG4gIC8qKiBNb2RlLCBlaXRoZXIgXCJkcmFmdFwiIG9yIFwicHVibGlzaGVkXCIuICovXG4gIG1vZGU6IERvY01vZGU7XG4gIC8qKlxuICAgKiBFbWFpbCBvZiB1c2VyIG1vZGlmeWluZyB0aGUgZG9jLiBJZiBibGFuaywgZGVmYXVsdHMgdG8gYHJvb3QtY21zLWNsaWVudGAuXG4gICAqL1xuICBtb2RpZmllZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3REb2NzT3B0aW9ucyB7XG4gIG1vZGU6IERvY01vZGU7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIG9yZGVyQnk/OiBzdHJpbmc7XG4gIG9yZGVyQnlEaXJlY3Rpb24/OiAnYXNjJyB8ICdkZXNjJztcbiAgcXVlcnk/OiAocXVlcnk6IFF1ZXJ5KSA9PiBRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRDb3VudE9wdGlvbnMge1xuICBtb2RlOiBEb2NNb2RlO1xuICBxdWVyeT86IChxdWVyeTogUXVlcnkpID0+IFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uIHtcbiAgW2xvY2FsZTogc3RyaW5nXTogc3RyaW5nO1xuICBzb3VyY2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbnNNYXAge1xuICBbaGFzaDogc3RyaW5nXTogVHJhbnNsYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxlVHJhbnNsYXRpb25zIHtcbiAgW3NvdXJjZTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRUcmFuc2xhdGlvbnNPcHRpb25zIHtcbiAgdGFncz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbGVhc2Uge1xuICBpZDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZG9jSWRzPzogc3RyaW5nW107XG4gIGNyZWF0ZWRBdD86IFRpbWVzdGFtcDtcbiAgY3JlYXRlZEJ5Pzogc3RyaW5nO1xuICBzY2hlZHVsZWRBdD86IFRpbWVzdGFtcDtcbiAgc2NoZWR1bGVkQnk/OiBzdHJpbmc7XG4gIHB1Ymxpc2hlZEF0PzogVGltZXN0YW1wO1xuICBwdWJsaXNoZWRCeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb248VCA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGFjdGlvbi5cbiAgICovXG4gIGFjdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHVzZXIncyBlbWFpbCB0aGF0IHBlcmZvcm1lZCB0aGUgYWN0aW9uIChvciBcInN5c3RlbVwiKS5cbiAgICovXG4gIGJ5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGltZXN0YW1wIHdoZW4gdGhlIGFjdGlvbiBvY2N1cnJlZC5cbiAgICovXG4gIHRpbWVzdGFtcDogVGltZXN0YW1wO1xuICAvKipcbiAgICogTWV0YWRhdGEgZm9yIHRoZSBhY3Rpb24uXG4gICAqL1xuICBtZXRhZGF0YT86IFQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEFjdGlvbnNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIHNwZWNpZmljIGFjdGlvbi4gRGVmYXVsdHMgdG8gYWxsIGFjdGlvbnMuXG4gICAqL1xuICBhY3Rpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBzcGVjaWZpYyB1c2VyLiBEZWZhdWx0cyB0byBhbGwgdXNlcnMuXG4gICAqL1xuICBieT86IHN0cmluZztcbiAgLyoqXG4gICAqIE1heCBudW1iZXIgb2YgYWN0aW9ucyB0byByZXR1cm4uIERlZmF1bHRzIHRvIDEwMC5cbiAgICovXG4gIGxpbWl0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgUm9vdENNU0NsaWVudCB7XG4gIHJlYWRvbmx5IHJvb3RDb25maWc6IFJvb3RDb25maWc7XG4gIHJlYWRvbmx5IGNtc1BsdWdpbjogQ01TUGx1Z2luO1xuICByZWFkb25seSBwcm9qZWN0SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGRiOiBGaXJlc3RvcmU7XG5cbiAgY29uc3RydWN0b3Iocm9vdENvbmZpZzogUm9vdENvbmZpZykge1xuICAgIHRoaXMucm9vdENvbmZpZyA9IHJvb3RDb25maWc7XG4gICAgdGhpcy5jbXNQbHVnaW4gPSBnZXRDbXNQbHVnaW4odGhpcy5yb290Q29uZmlnKTtcblxuICAgIGNvbnN0IGNtc1BsdWdpbk9wdGlvbnMgPSB0aGlzLmNtc1BsdWdpbi5nZXRDb25maWcoKTtcbiAgICB0aGlzLnByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICAgIHRoaXMuYXBwID0gdGhpcy5jbXNQbHVnaW4uZ2V0RmlyZWJhc2VBcHAoKTtcbiAgICB0aGlzLmRiID0gdGhpcy5jbXNQbHVnaW4uZ2V0RmlyZXN0b3JlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGRvYyBkYXRhIGZyb20gUm9vdC5qcyBDTVMuXG4gICAqL1xuICBhc3luYyBnZXREb2M8RmllbGRzID0gYW55PihcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBzbHVnOiBzdHJpbmcsXG4gICAgb3B0aW9uczogR2V0RG9jT3B0aW9uc1xuICApOiBQcm9taXNlPERvYzxGaWVsZHM+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJhd0RhdGEgPSBhd2FpdCB0aGlzLmdldFJhd0RvYyhjb2xsZWN0aW9uSWQsIHNsdWcsIG9wdGlvbnMpO1xuICAgIGlmIChyYXdEYXRhKSB7XG4gICAgICByZXR1cm4gdW5tYXJzaGFsRGF0YShyYXdEYXRhKSBhcyBEb2M8RmllbGRzPjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHJhdyBkb2MgZGF0YSBhcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBPbmx5IHVzZSB0aGlzIGlmIHlvdSBrbm93XG4gICAqIHdoYXQgeW91IGFyZSBkb2luZy5cbiAgICovXG4gIGFzeW5jIGdldFJhd0RvYyhcbiAgICBjb2xsZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBzbHVnOiBzdHJpbmcsXG4gICAgb3B0aW9uczogR2V0RG9jT3B0aW9uc1xuICApOiBQcm9taXNlPGFueSB8IG51bGw+IHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgLy8gU2x1Z3Mgd2l0aCBzbGFzaGVzIGFyZSBlbmNvZGVkIGFzIGAtLWAgaW4gdGhlIERCLlxuICAgIHNsdWcgPSBzbHVnLnJlcGxhY2VBbGwoJy8nLCAnLS0nKTtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259LyR7c2x1Z31gO1xuICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKGRiUGF0aCk7XG4gICAgY29uc3QgZG9jID0gYXdhaXQgZG9jUmVmLmdldCgpO1xuICAgIGlmIChkb2MuZXhpc3RzKSB7XG4gICAgICByZXR1cm4gZG9jLmRhdGEoKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBhc3luYyBzZXRSYXdEb2MoXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgc2x1Zzogc3RyaW5nLFxuICAgIGRhdGE6IGFueSxcbiAgICBvcHRpb25zOiBTZXREb2NPcHRpb25zXG4gICkge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259LyR7c2x1Z31gO1xuICAgIGNvbnN0IGRvY1JlZiA9IHRoaXMuZGIuZG9jKGRiUGF0aCk7XG4gICAgYXdhaXQgZG9jUmVmLnNldChkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBkb2NzIGZyb20gYSBSb290LmpzIENNUyBjb2xsZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgbGlzdERvY3M8VD4oXG4gICAgY29sbGVjdGlvbklkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogTGlzdERvY3NPcHRpb25zXG4gICk6IFByb21pc2U8e2RvY3M6IFRbXX0+IHtcbiAgICBjb25zdCBtb2RlID0gb3B0aW9ucy5tb2RlO1xuICAgIGNvbnN0IG1vZGVDb2xsZWN0aW9uID0gbW9kZSA9PT0gJ2RyYWZ0JyA/ICdEcmFmdHMnIDogJ1B1Ymxpc2hlZCc7XG4gICAgY29uc3QgZGJQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbklkfS8ke21vZGVDb2xsZWN0aW9ufWA7XG4gICAgbGV0IHF1ZXJ5OiBRdWVyeSA9IHRoaXMuZGIuY29sbGVjdGlvbihkYlBhdGgpO1xuICAgIGlmIChvcHRpb25zLmxpbWl0KSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LmxpbWl0KG9wdGlvbnMubGltaXQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vZmZzZXQpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkub2Zmc2V0KG9wdGlvbnMub2Zmc2V0KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMub3JkZXJCeSkge1xuICAgICAgcXVlcnkgPSBxdWVyeS5vcmRlckJ5KG9wdGlvbnMub3JkZXJCeSwgb3B0aW9ucy5vcmRlckJ5RGlyZWN0aW9uKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucXVlcnkpIHtcbiAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShxdWVyeSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5nZXQoKTtcbiAgICBjb25zdCBkb2NzOiBUW10gPSBbXTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gdW5tYXJzaGFsRGF0YShyZXN1bHQuZGF0YSgpKSBhcyBUO1xuICAgICAgZG9jcy5wdXNoKGRvYyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtkb2NzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZG9jcyBpbiBhIFJvb3QuanMgQ01TIGNvbGxlY3Rpb24uXG4gICAqL1xuICBhc3luYyBnZXREb2NzQ291bnQoY29sbGVjdGlvbklkOiBzdHJpbmcsIG9wdGlvbnM6IEdldENvdW50T3B0aW9ucykge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgY29uc3QgbW9kZUNvbGxlY3Rpb24gPSBtb2RlID09PSAnZHJhZnQnID8gJ0RyYWZ0cycgOiAnUHVibGlzaGVkJztcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vQ29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uSWR9LyR7bW9kZUNvbGxlY3Rpb259YDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMucXVlcnkpIHtcbiAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShxdWVyeSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeS5jb3VudCgpLmdldCgpO1xuICAgIGNvbnN0IGNvdW50ID0gcmVzdWx0cy5kYXRhKCkuY291bnQ7XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEJhdGNoIHB1Ymxpc2hlcyBhIHNldCBvZiBkb2NzIGJ5IGlkLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaERvY3MoXG4gICAgZG9jSWRzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzoge3B1Ymxpc2hlZEJ5OiBzdHJpbmc7IGJhdGNoPzogV3JpdGVCYXRjaH1cbiAgKSB7XG4gICAgY29uc3QgcHJvamVjdENvbGxlY3Rpb25zUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9uc2A7XG4gICAgY29uc3QgcHVibGlzaGVkQnkgPSBvcHRpb25zPy5wdWJsaXNoZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIC8vIEZldGNoIHRoZSBjdXJyZW50IGRyYWZ0IGRhdGEgZm9yIGVhY2ggZG9jLlxuICAgIGNvbnN0IGRvY1JlZnMgPSBkb2NJZHMubWFwKChkb2NJZCkgPT4ge1xuICAgICAgY29uc3QgW2NvbGxlY3Rpb24sIHNsdWddID0gZG9jSWQuc3BsaXQoJy8nKTtcbiAgICAgIGlmICghY29sbGVjdGlvbiB8fCAhc2x1Zykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZG9jIGlkOiAke2RvY0lkfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vRHJhZnRzLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRvY1JlZjtcbiAgICB9KTtcbiAgICBjb25zdCBkb2NTbmFwc2hvdHMgPSBhd2FpdCB0aGlzLmRiLmdldEFsbCguLi5kb2NSZWZzKTtcbiAgICBjb25zdCBkb2NzID0gZG9jU25hcHNob3RzXG4gICAgICAvLyBSZXRyaWV2ZSBzbmFwc2hvdCBkYXRhIGZvciBlYWNoIGRvYy5cbiAgICAgIC5tYXAoKHNuYXBzaG90KSA9PiBzbmFwc2hvdC5kYXRhKCkgYXMgRG9jKVxuICAgICAgLy8gUmVtb3ZlIGRvY3MgdGhhdCBkb24ndCBleGlzdC5cbiAgICAgIC5maWx0ZXIoKGQpID0+ICEhZCk7XG5cbiAgICBpZiAoZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdubyBkb2NzIHRvIHB1Ymxpc2gnKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgdGhlcmUgYXJlIG5vIHB1Ymxpc2hpbmcgbG9ja3Mgb24gYW55IGRvY3MuXG4gICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgaWYgKHRoaXMudGVzdFB1Ymxpc2hpbmdMb2NrZWQoZG9jKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHB1Ymxpc2hpbmcgaXMgbG9ja2VkIGZvciBkb2M6ICR7ZG9jLmlkfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC8vIEVhY2ggdHJhbnNhY3Rpb24gb3IgYmF0Y2ggY2FuIHdyaXRlIGEgbWF4IG9mIDUwMCBvcHMuXG4gICAgLy8gLy8gaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvZmlyZXN0b3JlL21hbmFnZS1kYXRhL3RyYW5zYWN0aW9uc1xuICAgIGxldCBiYXRjaENvdW50ID0gMDtcbiAgICBjb25zdCBiYXRjaCA9IG9wdGlvbnM/LmJhdGNoIHx8IHRoaXMuZGIuYmF0Y2goKTtcbiAgICBjb25zdCBwdWJsaXNoZWREb2NzOiBhbnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICAgIGNvbnN0IHtpZCwgY29sbGVjdGlvbiwgc2x1Zywgc3lzLCBmaWVsZHN9ID0gZG9jO1xuICAgICAgY29uc3QgZHJhZnRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9EcmFmdHMvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzY2hlZHVsZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9TY2hlZHVsZWQvJHtzbHVnfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBwdWJsaXNoZWRSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgICAgYCR7cHJvamVjdENvbGxlY3Rpb25zUGF0aH0vJHtjb2xsZWN0aW9ufS9QdWJsaXNoZWQvJHtzbHVnfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIE9ubHkgdXBkYXRlIGBmaXJzdFB1Ymxpc2hlZGAgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICAgICAgY29uc3QgZmlyc3RQdWJsaXNoZWRBdCA9XG4gICAgICAgIHN5cy5maXJzdFB1Ymxpc2hlZEF0ID8/IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCk7XG4gICAgICBjb25zdCBmaXJzdFB1Ymxpc2hlZEJ5ID0gc3lzLmZpcnN0UHVibGlzaGVkQnkgPz8gcHVibGlzaGVkQnk7XG5cbiAgICAgIC8vIFNhdmUgcHVibGlzaGVkIGRvYy5cbiAgICAgIGJhdGNoLnNldChwdWJsaXNoZWRSZWYsIHtcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIHNsdWcsXG4gICAgICAgIGZpZWxkczogZmllbGRzIHx8IHt9LFxuICAgICAgICBzeXM6IHtcbiAgICAgICAgICAuLi5zeXMsXG4gICAgICAgICAgZmlyc3RQdWJsaXNoZWRBdDogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEJ5OiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAgIHB1Ymxpc2hlZEF0OiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAgIHB1Ymxpc2hlZEJ5OiBwdWJsaXNoZWRCeSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBSZW1vdmUgc2NoZWR1bGVkIGRvYywgaWYgYW55LlxuICAgICAgYmF0Y2guZGVsZXRlKHNjaGVkdWxlZFJlZik7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZHJhZnQgZG9jIHRvIHJlbW92ZSBgc2NoZWR1bGVkQXRgIGFuZCBgc2NoZWR1bGVkQnlgIGZpZWxkc1xuICAgICAgLy8gYW5kIHVwZGF0ZSB0aGUgYHB1Ymxpc2hlZEF0YCBhbmQgYHB1Ymxpc2hlZEJ5YCBmaWVsZHMuXG4gICAgICBiYXRjaC51cGRhdGUoZHJhZnRSZWYsIHtcbiAgICAgICAgJ3N5cy5zY2hlZHVsZWRBdCc6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICAgICdzeXMuc2NoZWR1bGVkQnknOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQXQnOiBmaXJzdFB1Ymxpc2hlZEF0LFxuICAgICAgICAnc3lzLmZpcnN0UHVibGlzaGVkQnknOiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAnc3lzLnB1Ymxpc2hlZEF0JzogRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRCeSc6IHB1Ymxpc2hlZEJ5LFxuICAgICAgfSk7XG4gICAgICBiYXRjaENvdW50ICs9IDE7XG5cbiAgICAgIHB1Ymxpc2hlZERvY3MucHVzaChkb2MpO1xuXG4gICAgICBpZiAoYmF0Y2hDb3VudCA+PSA0MDApIHtcbiAgICAgICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgICAgIGJhdGNoQ291bnQgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiYXRjaENvdW50ID4gMCkge1xuICAgICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgJHtwdWJsaXNoZWREb2NzLmxlbmd0aH0gZG9jcyFgKTtcbiAgICByZXR1cm4gcHVibGlzaGVkRG9jcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgc2NoZWR1bGVkIGRvY3MuXG4gICAqL1xuICBhc3luYyBwdWJsaXNoU2NoZWR1bGVkRG9jcygpIHtcbiAgICBjb25zdCBwcm9qZWN0Q29sbGVjdGlvbnNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zYDtcbiAgICBjb25zdCBub3cgPSBNYXRoLmNlaWwobmV3IERhdGUoKS5nZXRUaW1lKCkpO1xuXG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0aGlzLmRiLmNvbGxlY3Rpb25Hcm91cCgnU2NoZWR1bGVkJykuZ2V0KCk7XG4gICAgY29uc3QgZG9jcyA9IHNuYXBzaG90LmRvY3NcbiAgICAgIC5maWx0ZXIoKGQpID0+IHtcbiAgICAgICAgLy8gRmlsdGVyIGRvY3MgYnkgcHJvamVjdC5cbiAgICAgICAgaWYgKCFkLnJlZi5wYXRoLnN0YXJ0c1dpdGgocHJvamVjdENvbGxlY3Rpb25zUGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlsdGVyIGRvY3Mgd2hlcmUgc2NoZWR1bGVkQXQgaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgIC8vIE5PVEUoc3RldmVubGUpOiB0aGUgZmlsdGVyaW5nIGlzIGRvbmUgbWFudWFsbHkgaW5zdGVhZCBvZiB1c2luZyBhIHF1ZXJ5XG4gICAgICAgIC8vIHRvIGF2b2lkIGhhdmluZyB0byBjcmVhdGUgYW4gaW5kZXggaW4gZmlyZXN0b3JlLlxuICAgICAgICBjb25zdCBkYXRhID0gZC5kYXRhKCkgfHwge307XG4gICAgICAgIGNvbnN0IHNjaGVkdWxlZEF0OiBUaW1lc3RhbXAgfCB1bmRlZmluZWQgPSBkYXRhLnN5cz8uc2NoZWR1bGVkQXQ7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgc2NoZWR1bGVkQXQgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMgJiYgc2NoZWR1bGVkQXQudG9NaWxsaXMoKSA8PSBub3dcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChkKSA9PiB7XG4gICAgICAgIGNvbnN0IGRiUGF0aCA9IGQucmVmLnBhdGg7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gZGJQYXRoLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IHNsdWcgPSBzZWdtZW50cy5hdCgtMSk7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBzZWdtZW50cy5hdCgtMyk7XG4gICAgICAgIGNvbnN0IGlkID0gYCR7Y29sbGVjdGlvbn0vJHtzbHVnfWA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogZC5kYXRhKCksXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgICBzbHVnLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICBpZiAoZG9jcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdubyBkb2NzIHRvIHNjaGVkdWxlJyk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gRWFjaCB0cmFuc2FjdGlvbiBvciBiYXRjaCBjYW4gd3JpdGUgYSBtYXggb2YgNTAwIG9wcy5cbiAgICAvLyBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9maXJlc3RvcmUvbWFuYWdlLWRhdGEvdHJhbnNhY3Rpb25zXG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGNvbnN0IHB1Ymxpc2hlZERvY3M6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgY29uc3Qge2lkLCBjb2xsZWN0aW9uLCBzbHVnLCBkYXRhfSA9IGRvYztcbiAgICAgIGNvbnN0IGRyYWZ0UmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vRHJhZnRzLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3Qgc2NoZWR1bGVkUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vU2NoZWR1bGVkLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3QgcHVibGlzaGVkUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICAgIGAke3Byb2plY3RDb2xsZWN0aW9uc1BhdGh9LyR7Y29sbGVjdGlvbn0vUHVibGlzaGVkLyR7c2x1Z31gXG4gICAgICApO1xuICAgICAgY29uc3Qge3NjaGVkdWxlZEF0LCBzY2hlZHVsZWRCeSwgLi4uc3lzfSA9IGRhdGEuc3lzIHx8IHt9O1xuXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBgZmlyc3RQdWJsaXNoZWRgIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQXQgPSBzeXMuZmlyc3RQdWJsaXNoZWRBdCA/PyBzY2hlZHVsZWRBdDtcbiAgICAgIGNvbnN0IGZpcnN0UHVibGlzaGVkQnkgPVxuICAgICAgICBzeXMuZmlyc3RQdWJsaXNoZWRCeSA/PyAoc2NoZWR1bGVkQnkgfHwgJ3Jvb3QtY21zLWNsaWVudCcpO1xuXG4gICAgICAvLyBTYXZlIHB1Ymxpc2hlZCBkb2MuXG4gICAgICBiYXRjaC5zZXQocHVibGlzaGVkUmVmLCB7XG4gICAgICAgIGlkLFxuICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICBzbHVnLFxuICAgICAgICBmaWVsZHM6IGRhdGEuZmllbGRzIHx8IHt9LFxuICAgICAgICBzeXM6IHtcbiAgICAgICAgICAuLi5zeXMsXG4gICAgICAgICAgZmlyc3RQdWJsaXNoZWRBdDogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgICBmaXJzdFB1Ymxpc2hlZEJ5OiBmaXJzdFB1Ymxpc2hlZEJ5LFxuICAgICAgICAgIHB1Ymxpc2hlZEF0OiBGaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAgIHB1Ymxpc2hlZEJ5OiBzY2hlZHVsZWRCeSB8fCAnJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBSZW1vdmUgcHVibGlzaGVkIGRvYy5cbiAgICAgIGJhdGNoLmRlbGV0ZShzY2hlZHVsZWRSZWYpO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGRyYWZ0IGRvYyB0byByZW1vdmUgYHNjaGVkdWxlZEF0YCBhbmQgYHNjaGVkdWxlZEJ5YCBmaWVsZHNcbiAgICAgIC8vIGFuZCB1cGRhdGUgdGhlIGBwdWJsaXNoZWRBdGAgYW5kIGBwdWJsaXNoZWRCeWAgZmllbGRzLlxuICAgICAgYmF0Y2gudXBkYXRlKGRyYWZ0UmVmLCB7XG4gICAgICAgICdzeXMuc2NoZWR1bGVkQXQnOiBGaWVsZFZhbHVlLmRlbGV0ZSgpLFxuICAgICAgICAnc3lzLnNjaGVkdWxlZEJ5JzogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEF0JzogZmlyc3RQdWJsaXNoZWRBdCxcbiAgICAgICAgJ3N5cy5maXJzdFB1Ymxpc2hlZEJ5JzogZmlyc3RQdWJsaXNoZWRCeSxcbiAgICAgICAgJ3N5cy5wdWJsaXNoZWRBdCc6IEZpZWxkVmFsdWUuc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICdzeXMucHVibGlzaGVkQnknOiBzY2hlZHVsZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JyxcbiAgICAgIH0pO1xuICAgICAgYmF0Y2hDb3VudCArPSAxO1xuXG4gICAgICBwdWJsaXNoZWREb2NzLnB1c2goZG9jKTtcblxuICAgICAgaWYgKGJhdGNoQ291bnQgPj0gNDAwKSB7XG4gICAgICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICAgICAgICBiYXRjaENvdW50ID0gMDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGJhdGNoQ291bnQgPiAwKSB7XG4gICAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYHB1Ymxpc2hlZCAke3B1Ymxpc2hlZERvY3MubGVuZ3RofSBkb2NzIWApO1xuICAgIHJldHVybiBwdWJsaXNoZWREb2NzO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBkb2NzIGluIHNjaGVkdWxlZCByZWxlYXNlcy5cbiAgICovXG4gIGFzeW5jIHB1Ymxpc2hTY2hlZHVsZWRSZWxlYXNlcygpIHtcbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vUmVsZWFzZXNgO1xuICAgIGNvbnN0IG5vdyA9IE1hdGguY2VpbChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG4gICAgY29uc3QgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYlxuICAgICAgLmNvbGxlY3Rpb24ocmVsZWFzZXNQYXRoKVxuICAgICAgLndoZXJlKCdzY2hlZHVsZWRBdCcsICc8PScsIFRpbWVzdGFtcC5mcm9tTWlsbGlzKG5vdykpO1xuICAgIGNvbnN0IHF1ZXJ5U25hcHNob3QgPSBhd2FpdCBxdWVyeS5nZXQoKTtcblxuICAgIGZvciAoY29uc3Qgc25hcHNob3Qgb2YgcXVlcnlTbmFwc2hvdC5kb2NzKSB7XG4gICAgICBjb25zdCByZWxlYXNlID0gc25hcHNob3QuZGF0YSgpIGFzIFJlbGVhc2U7XG4gICAgICBjb25zdCBiYXRjaCA9IHRoaXMuZGIuYmF0Y2goKTtcbiAgICAgIGNvbnN0IHB1Ymxpc2hlZEJ5ID0gcmVsZWFzZS5zY2hlZHVsZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcbiAgICAgIGJhdGNoLnVwZGF0ZShzbmFwc2hvdC5yZWYsIHtcbiAgICAgICAgcHVibGlzaGVkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgICAgcHVibGlzaGVkQnk6IHB1Ymxpc2hlZEJ5LFxuICAgICAgICBzY2hlZHVsZWRBdDogRmllbGRWYWx1ZS5kZWxldGUoKSxcbiAgICAgICAgc2NoZWR1bGVkQnk6IEZpZWxkVmFsdWUuZGVsZXRlKCksXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMucHVibGlzaERvY3MocmVsZWFzZS5kb2NJZHMgfHwgW10sIHtwdWJsaXNoZWRCeSwgYmF0Y2h9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgZG9jIGlzIGN1cnJlbnRseSBcImxvY2tlZFwiIGZvciBwdWJsaXNoaW5nLlxuICAgKi9cbiAgdGVzdFB1Ymxpc2hpbmdMb2NrZWQoZG9jOiBEb2MpIHtcbiAgICBpZiAoZG9jLnN5cz8ucHVibGlzaGluZ0xvY2tlZCkge1xuICAgICAgaWYgKGRvYy5zeXMucHVibGlzaGluZ0xvY2tlZC51bnRpbCkge1xuICAgICAgICBjb25zdCBub3cgPSBUaW1lc3RhbXAubm93KCkudG9NaWxsaXMoKTtcbiAgICAgICAgY29uc3QgdW50aWwgPSBkb2Muc3lzLnB1Ymxpc2hpbmdMb2NrZWQudW50aWwudG9NaWxsaXMoKTtcbiAgICAgICAgcmV0dXJuIG5vdyA8IHVudGlsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0cmFuc2xhdGlvbnMgc2F2ZWQgaW4gdGhlIHRyYW5zbGF0aW9ucyBjb2xsZWN0aW9uLCBvcHRpb25hbGx5XG4gICAqIGZpbHRlcmVkIGJ5IHRhZy5cbiAgICpcbiAgICogUmV0dXJucyBhIG1hcCBsaWtlOlxuICAgKiBgYGBcbiAgICoge1xuICAgKiAgIFwiPGhhc2g+XCI6IHtcInNvdXJjZVwiOiBcIkhlbGxvXCIsIFwiZXNcIjogXCJIb2xhXCIsIFwiZnJcIjogXCJCb25qb3VyXCJ9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9hZFRyYW5zbGF0aW9ucyhcbiAgICBvcHRpb25zPzogTG9hZFRyYW5zbGF0aW9uc09wdGlvbnNcbiAgKTogUHJvbWlzZTxUcmFuc2xhdGlvbnNNYXA+IHtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vVHJhbnNsYXRpb25zYDtcbiAgICBsZXQgcXVlcnk6IFF1ZXJ5ID0gdGhpcy5kYi5jb2xsZWN0aW9uKGRiUGF0aCk7XG4gICAgaWYgKG9wdGlvbnM/LnRhZ3MpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ3RhZ3MnLCAnYXJyYXktY29udGFpbnMtYW55Jywgb3B0aW9ucy50YWdzKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVNuYXBzaG90ID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zTWFwOiBUcmFuc2xhdGlvbnNNYXAgPSB7fTtcbiAgICBxdWVyeVNuYXBzaG90LmZvckVhY2goKGRvYykgPT4ge1xuICAgICAgY29uc3QgaGFzaCA9IGRvYy5pZDtcbiAgICAgIHRyYW5zbGF0aW9uc01hcFtoYXNoXSA9IGRvYy5kYXRhKCkgYXMgVHJhbnNsYXRpb247XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uc01hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIG1hcCBvZiB0cmFuc2xhdGlvbnMsIGUuZy46XG4gICAqIGBgYFxuICAgKiBhd2FpdCBjbGllbnQuc2F2ZVRyYW5zbGF0aW9ucyh7XG4gICAqICAgXCJIZWxsb1wiOiB7XCJlc1wiOiBcIkhvbGFcIiwgXCJmclwiOiBcIkJvbmpvdXJcIn0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNhdmVUcmFuc2xhdGlvbnMoXG4gICAgdHJhbnNsYXRpb25zOiB7XG4gICAgICBbc291cmNlOiBzdHJpbmddOiB7W2xvY2FsZTogc3RyaW5nXTogc3RyaW5nfTtcbiAgICB9LFxuICAgIHRhZ3M/OiBzdHJpbmdbXVxuICApIHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnNQYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L1RyYW5zbGF0aW9uc2A7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgbGV0IGJhdGNoQ291bnQgPSAwO1xuICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zbGF0aW9ucykuZm9yRWFjaCgoW3NvdXJjZSwgc291cmNlVHJhbnNsYXRpb25zXSkgPT4ge1xuICAgICAgY29uc3QgaGFzaCA9IHRoaXMuZ2V0VHJhbnNsYXRpb25LZXkoc291cmNlKTtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uUmVmID0gdGhpcy5kYi5kb2MoYCR7dHJhbnNsYXRpb25zUGF0aH0vJHtoYXNofWApO1xuICAgICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgICAuLi5zb3VyY2VUcmFuc2xhdGlvbnMsXG4gICAgICAgIHNvdXJjZTogdGhpcy5ub3JtYWxpemVTdHJpbmcoc291cmNlKSxcbiAgICAgIH07XG4gICAgICBpZiAodGFncykge1xuICAgICAgICBkYXRhLnRhZ3MgPSB0YWdzO1xuICAgICAgfVxuICAgICAgYmF0Y2guc2V0KHRyYW5zbGF0aW9uUmVmLCBkYXRhLCB7bWVyZ2U6IHRydWV9KTtcbiAgICAgIGJhdGNoQ291bnQgKz0gMTtcbiAgICB9KTtcbiAgICBpZiAoYmF0Y2hDb3VudCA+IDUwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1cCB0byA1MDAgdHJhbnNsYXRpb25zIGNhbiBiZSBzYXZlZCBhdCBhIHRpbWUuJyk7XG4gICAgfVxuICAgIGF3YWl0IGJhdGNoLmNvbW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFwia2V5XCIgdXNlZCBmb3IgYSB0cmFuc2xhdGlvbiBhcyBzdG9yZWQgaW4gdGhlIGRiLiBUcmFuc2xhdGlvbnNcbiAgICogYXJlIHN0b3JlZCB1bmRlciBgUHJvamVjdHMvPHByb2plY3QgaWQ+L1RyYW5zbGF0aW9ucy88c2hhMSBoYXNoPmAuXG4gICAqL1xuICBnZXRUcmFuc2xhdGlvbktleShzb3VyY2U6IHN0cmluZykge1xuICAgIGNvbnN0IHNoYTEgPSBjcnlwdG9cbiAgICAgIC5jcmVhdGVIYXNoKCdzaGExJylcbiAgICAgIC51cGRhdGUodGhpcy5ub3JtYWxpemVTdHJpbmcoc291cmNlKSlcbiAgICAgIC5kaWdlc3QoJ2hleCcpO1xuICAgIHJldHVybiBzaGExO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyBhIHN0cmluZyB0aGF0J3MgdXNlZCBmb3IgdHJhbnNsYXRpb25zLiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nOlxuICAgKiAtIFJlbW92ZXMgYW55IGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgKiAtIFJlbW92ZXMgc3BhY2VzIGF0IHRoZSBlbmQgb2YgYW55IGxpbmVcbiAgICovXG4gIG5vcm1hbGl6ZVN0cmluZyhzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IGxpbmVzID0gU3RyaW5nKHN0cilcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbUVuZCgpKTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdHJhbnNsYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgbWFwIGxpa2U6XG4gICAqIGBgYFxuICAgKiB7XG4gICAqICAgXCJIZWxsb1wiOiBcIkJvbmpvdXJcIixcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvYWRUcmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IExvYWRUcmFuc2xhdGlvbnNPcHRpb25zXG4gICk6IFByb21pc2U8TG9jYWxlVHJhbnNsYXRpb25zPiB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zTWFwID0gYXdhaXQgdGhpcy5sb2FkVHJhbnNsYXRpb25zKG9wdGlvbnMpO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUodHJhbnNsYXRpb25zTWFwLCBsb2NhbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkYXRhIHNvdXJjZSBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICovXG4gIGFzeW5jIGdldERhdGFTb3VyY2UoZGF0YVNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9YDtcbiAgICBjb25zdCBkb2NSZWYgPSB0aGlzLmRiLmRvYyhkYlBhdGgpO1xuICAgIGNvbnN0IGRvYyA9IGF3YWl0IGRvY1JlZi5nZXQoKTtcbiAgICBpZiAoZG9jLmV4aXN0cykge1xuICAgICAgcmV0dXJuIGRvYy5kYXRhKCkgYXMgRGF0YVNvdXJjZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3luY3MgYSBkYXRhIHNvdXJjZSB0byBkcmFmdCBzdGF0ZS5cbiAgICovXG4gIGFzeW5jIHN5bmNEYXRhU291cmNlKGRhdGFTb3VyY2VJZDogc3RyaW5nLCBvcHRpb25zPzoge3N5bmNlZEJ5Pzogc3RyaW5nfSkge1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBhd2FpdCB0aGlzLmdldERhdGFTb3VyY2UoZGF0YVNvdXJjZUlkKTtcbiAgICBpZiAoIWRhdGFTb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGF0YSBzb3VyY2Ugbm90IGZvdW5kOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5mZXRjaERhdGEoZGF0YVNvdXJjZSk7XG5cbiAgICBjb25zdCBkYXRhU291cmNlRG9jUmVmID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9YFxuICAgICk7XG4gICAgY29uc3QgZGF0YURvY1JlZiA9IHRoaXMuZGIuZG9jKFxuICAgICAgYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0RhdGFTb3VyY2VzLyR7ZGF0YVNvdXJjZUlkfS9EYXRhL2RyYWZ0YFxuICAgICk7XG4gICAgY29uc3Qgc3luY2VkQnkgPSBvcHRpb25zPy5zeW5jZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIGNvbnN0IHVwZGF0ZWREYXRhU291cmNlOiBEYXRhU291cmNlID0ge1xuICAgICAgLi4uZGF0YVNvdXJjZSxcbiAgICAgIHN5bmNlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBzeW5jZWRCeTogc3luY2VkQnksXG4gICAgfTtcblxuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGJhdGNoLnNldChkYXRhRG9jUmVmLCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgfSk7XG4gICAgYmF0Y2gudXBkYXRlKGRhdGFTb3VyY2VEb2NSZWYsIHtcbiAgICAgIHN5bmNlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBzeW5jZWRCeTogc3luY2VkQnksXG4gICAgfSk7XG4gICAgYXdhaXQgYmF0Y2guY29tbWl0KCk7XG5cbiAgICBjb25zb2xlLmxvZyhgc3luY2VkIGRhdGEgc291cmNlOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICBjb25zb2xlLmxvZyhgc3luY2VkIGJ5OiAke3N5bmNlZEJ5fWApO1xuICB9XG5cbiAgYXN5bmMgcHVibGlzaERhdGFTb3VyY2UoXG4gICAgZGF0YVNvdXJjZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtwdWJsaXNoZWRCeT86IHN0cmluZ31cbiAgKSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IGF3YWl0IHRoaXMuZ2V0RGF0YVNvdXJjZShkYXRhU291cmNlSWQpO1xuICAgIGlmICghZGF0YVNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBkYXRhIHNvdXJjZSBub3QgZm91bmQ6ICR7ZGF0YVNvdXJjZUlkfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFTb3VyY2VEb2NSZWYgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH1gXG4gICAgKTtcbiAgICBjb25zdCBkYXRhRG9jUmVmRHJhZnQgPSB0aGlzLmRiLmRvYyhcbiAgICAgIGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9EYXRhU291cmNlcy8ke2RhdGFTb3VyY2VJZH0vZHJhZnRgXG4gICAgKTtcbiAgICBjb25zdCBkYXRhRG9jUmVmUHVibGlzaGVkID0gdGhpcy5kYi5kb2MoXG4gICAgICBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9L3B1Ymxpc2hlZGBcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YVJlcyA9IGF3YWl0IHRoaXMuZ2V0RnJvbURhdGFTb3VyY2UoZGF0YVNvdXJjZUlkLCB7bW9kZTogJ2RyYWZ0J30pO1xuXG4gICAgY29uc3QgcHVibGlzaGVkQnkgPSBvcHRpb25zPy5wdWJsaXNoZWRCeSB8fCAncm9vdC1jbXMtY2xpZW50JztcblxuICAgIGNvbnN0IHVwZGF0ZWREYXRhU291cmNlOiBEYXRhU291cmNlID0ge1xuICAgICAgLi4uZGF0YVNvdXJjZSxcbiAgICAgIHB1Ymxpc2hlZEF0OiBUaW1lc3RhbXAubm93KCksXG4gICAgICBwdWJsaXNoZWRCeTogcHVibGlzaGVkQnksXG4gICAgfTtcblxuICAgIGNvbnN0IGJhdGNoID0gdGhpcy5kYi5iYXRjaCgpO1xuICAgIGJhdGNoLnNldChkYXRhRG9jUmVmUHVibGlzaGVkLCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICAgIGRhdGE6IGRhdGFSZXM/LmRhdGEgfHwgbnVsbCxcbiAgICB9KTtcbiAgICBiYXRjaC51cGRhdGUoZGF0YURvY1JlZkRyYWZ0LCB7XG4gICAgICBkYXRhU291cmNlOiB1cGRhdGVkRGF0YVNvdXJjZSxcbiAgICB9KTtcbiAgICBiYXRjaC51cGRhdGUoZGF0YVNvdXJjZURvY1JlZiwge1xuICAgICAgcHVibGlzaGVkQXQ6IFRpbWVzdGFtcC5ub3coKSxcbiAgICAgIHB1Ymxpc2hlZEJ5OiBwdWJsaXNoZWRCeSxcbiAgICB9KTtcbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcblxuICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoZWQgZGF0YSAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICBjb25zb2xlLmxvZyhgcHVibGlzaGVkIGJ5OiAke3B1Ymxpc2hlZEJ5fWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaERhdGEoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSkge1xuICAgIGlmIChkYXRhU291cmNlLnR5cGUgPT09ICdodHRwJykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hIdHRwRGF0YShkYXRhU291cmNlKTtcbiAgICB9XG4gICAgLy8gVE9ETyhzdGV2ZW5sZSk6IGltcGwuXG4gICAgLy8gaWYgKGRhdGFTb3VyY2UudHlwZSA9PT0gJ2dzaGVldCcpIHtcbiAgICAvLyAgIHJldHVybiBhd2FpdCBmZXRjaEdzaGVldERhdGEoZGF0YVNvdXJjZSk7XG4gICAgLy8gfVxuICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSBzb3VyY2U6ICR7ZGF0YVNvdXJjZS50eXBlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEh0dHBEYXRhKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UpIHtcbiAgICBjb25zdCB1cmwgPSBkYXRhU291cmNlLnVybCB8fCAnJztcbiAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVybCBub3Qgc3VwcG9ydGVkOiAke3VybH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogZGF0YVNvdXJjZS5odHRwT3B0aW9ucz8ubWV0aG9kIHx8ICdHRVQnLFxuICAgICAgaGVhZGVyczogZGF0YVNvdXJjZS5odHRwT3B0aW9ucz8uaGVhZGVycyB8fCBbXSxcbiAgICAgIGJvZHk6IGRhdGFTb3VyY2UuaHR0cE9wdGlvbnM/LmJvZHkgfHwgdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVxIGZhaWxlZDogJHtlcnJ9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudFR5cGUgPSBTdHJpbmcocmVzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSk7XG4gICAgaWYgKGNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXMuanNvbigpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnRleHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGRhdGEgZnJvbSBhIGRhdGEgc291cmNlLlxuICAgKi9cbiAgYXN5bmMgZ2V0RnJvbURhdGFTb3VyY2U8VCA9IGFueT4oXG4gICAgZGF0YVNvdXJjZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHttb2RlPzogJ2RyYWZ0JyB8ICdwdWJsaXNoZWQnfVxuICApOiBQcm9taXNlPERhdGFTb3VyY2VEYXRhPFQ+IHwgbnVsbD4ge1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zPy5tb2RlIHx8ICdwdWJsaXNoZWQnO1xuICAgIGlmICghKG1vZGUgPT09ICdkcmFmdCcgfHwgbW9kZSA9PT0gJ3B1Ymxpc2hlZCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgbW9kZTogJHttb2RlfWApO1xuICAgIH1cbiAgICBpZiAoIWRhdGFTb3VyY2VJZCB8fCBkYXRhU291cmNlSWQuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRhdGEgc291cmNlIGlkOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYlBhdGggPSBgUHJvamVjdHMvJHt0aGlzLnByb2plY3RJZH0vRGF0YVNvdXJjZXMvJHtkYXRhU291cmNlSWR9L0RhdGEvJHttb2RlfWA7XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoZGJQYXRoKTtcbiAgICBjb25zdCBkb2MgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgaWYgKGRvYy5leGlzdHMpIHtcbiAgICAgIHJldHVybiBkb2MuZGF0YSgpIGFzIERhdGFTb3VyY2VEYXRhPFQ+O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB1c2VyIGV4aXN0cyBpbiB0aGUgQUNMIGxpc3QuXG4gICAqL1xuICBhc3luYyB1c2VyRXhpc3RzSW5BY2woZW1haWw6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghZW1haWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZG9jUmVmID0gdGhpcy5kYi5kb2MoYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9YCk7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBkb2NSZWYuZ2V0KCk7XG4gICAgY29uc3QgZGF0YSA9IHNuYXBzaG90LmRhdGEoKSB8fCB7fTtcbiAgICBjb25zdCBhY2wgPSBkYXRhLnJvbGVzIHx8IHt9O1xuICAgIGlmIChlbWFpbCBpbiBhY2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHdpbGRjYXJkIGRvbWFpbnMsIGUuZy4gYCpAZXhhbXBsZS5jb21gLlxuICAgIGlmICghZW1haWwuaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgY29uc29sZS53YXJuKGBpbnZhbGlkIGVtYWlsOiAke2VtYWlsfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBkb21haW4gPSBlbWFpbC5zcGxpdCgnQCcpLmF0KC0xKTtcbiAgICBpZiAoZG9tYWluICYmIGAqQCR7ZG9tYWlufWAgaW4gYWNsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgbG9nQWN0aW9uKGFjdGlvbjogc3RyaW5nLCBvcHRpb25zPzoge2J5Pzogc3RyaW5nOyBtZXRhZGF0YT86IGFueX0pIHtcbiAgICBpZiAoIWFjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkOiBcImFjdGlvblwiJyk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgIHRpbWVzdGFtcDogVGltZXN0YW1wLm5vdygpLFxuICAgICAgYnk6IG9wdGlvbnM/LmJ5IHx8ICdzeXN0ZW0nLFxuICAgICAgbWV0YWRhdGE6IG9wdGlvbnM/Lm1ldGFkYXRhIHx8IHt9LFxuICAgIH07XG4gICAgY29uc3QgY29sUmVmID0gdGhpcy5kYi5jb2xsZWN0aW9uKGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9BY3Rpb25Mb2dzYCk7XG4gICAgYXdhaXQgY29sUmVmLmFkZChkYXRhKTtcblxuICAgIGNvbnN0IG1ldGFTdHIgPSBvcHRpb25zPy5tZXRhZGF0YSA/IHN0cmluZ2lmeU9iaihvcHRpb25zLm1ldGFkYXRhKSA6ICcnO1xuICAgIGNvbnNvbGUubG9nKGBbJHtkYXRhLnRpbWVzdGFtcC50b01pbGxpcygpfV0gYWN0aW9uOiAke2FjdGlvbn0gJHttZXRhU3RyfWApO1xuXG4gICAgLy8gQ2FsbCB0aGUgYG9uQWN0aW9uKClgIGNhbGxiYWNrIGZyb20gY21zUGx1Z2luKCkuXG4gICAgY29uc3QgY21zUGx1Z2luQ29uZmlnID0gdGhpcy5jbXNQbHVnaW4uZ2V0Q29uZmlnKCk7XG4gICAgaWYgKGNtc1BsdWdpbkNvbmZpZy5vbkFjdGlvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY21zUGx1Z2luQ29uZmlnLm9uQWN0aW9uKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENtc1BsdWdpbihyb290Q29uZmlnOiBSb290Q29uZmlnKTogQ01TUGx1Z2luIHtcbiAgY29uc3QgcGx1Z2luczogUGx1Z2luW10gPSByb290Q29uZmlnLnBsdWdpbnMgfHwgW107XG4gIGNvbnN0IHBsdWdpbiA9IHBsdWdpbnMuZmluZCgocGx1Z2luKSA9PiBwbHVnaW4ubmFtZSA9PT0gJ3Jvb3QtY21zJyk7XG4gIGlmICghcGx1Z2luKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCByb290LWNtcyBwbHVnaW4gY29uZmlnIGluIHJvb3QuY29uZmlnLnRzJyk7XG4gIH1cbiAgcmV0dXJuIHBsdWdpbiBhcyBDTVNQbHVnaW47XG59XG5cbi8qKlxuICogV2Fsa3MgdGhlIGRhdGEgdHJlZSBhbmQgY29udmVydHMgYW55IFRpbWVzdGFtcCBvYmplY3RzIHRvIG1pbGxpcyBhbmQgYW55XG4gKiBfYXJyYXkgbWFwcyB0byBub3JtYWwgYXJyYXlzLlxuICpcbiAqIEUuZy46XG4gKlxuICogbm9ybWFsaXplRGF0YSh7XG4gKiAgIHN5czoge21vZGlmaWVkQXQ6IFRpbWVzdGFtcCgxMjMpfSxcbiAqICAgZmllbGRzOiB7XG4gKiAgICAgX2FycmF5OiBbJ2FzZGYnXSxcbiAqICAgICBhc2RmOiB7dGl0bGU6ICdoZWxsbyd9XG4gKiAgIH1cbiAqIH0pXG4gKiAvLyA9PiB7c3lzOiB7bW9kaWZpZWRBdDogMTIzfSwgZmllbGRzOiB7Zm9vOiBbe3RpdGxlOiAnaGVsbG8nfV19fVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5tYXJzaGFsRGF0YShkYXRhOiBhbnkpOiBhbnkge1xuICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgY29uc3QgdmFsID0gZGF0YVtrZXldO1xuICAgIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgICBpZiAodmFsLnRvTWlsbGlzKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsLnRvTWlsbGlzKCk7XG4gICAgICB9IGVsc2UgaWYgKE9iamVjdC5oYXNPd24odmFsLCAnX2FycmF5JykgJiYgQXJyYXkuaXNBcnJheSh2YWwuX2FycmF5KSkge1xuICAgICAgICBjb25zdCBhcnIgPSB2YWwuX2FycmF5Lm1hcCgoYXJyYXlLZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi51bm1hcnNoYWxEYXRhKHZhbFthcnJheUtleV0gfHwge30pLFxuICAgICAgICAgICAgX2FycmF5S2V5OiBhcnJheUtleSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBhcnI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IHVubWFyc2hhbERhdGEodmFsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgYHVubWFyc2hhbERhdGEoKWAgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gIHJldHVybiB1bm1hcnNoYWxEYXRhKGRhdGEpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFycmF5T2JqZWN0IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBfYXJyYXk6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgYW4gYXJyYXkgaW50byBhbiBgQXJyYXlPYmplY3RgLCBlLmcuOlxuICpcbiAqIGBgYFxuICogbWFyc2hhbEFycmF5KFsxLCAyLCAzXSlcbiAqIC8vID0+IHthOiAxLCBiOiAyLCBjOiAzLCBfYXJyYXk6IFsnYScsICdiJywgJ2MnXX1cbiAqIGBgYFxuICpcbiAqIFRoaXMgZGF0YWJhc2Ugc3RvcmFnZSBtZXRob2QgbWFrZXMgaXQgZWFzaWVyIHRvIHVwZGF0ZSBhIHNpbmdsZSBmaWVsZCBpbiBhXG4gKiBkZWVwbHkgbmVzdGVkIGFycmF5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcnNoYWxBcnJheShhcnI6IGFueVtdKTogQXJyYXlPYmplY3Qge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIHJldHVybiBhcnI7XG4gIH1cbiAgY29uc3QgYXJyT2JqZWN0OiBBcnJheU9iamVjdCA9IHtfYXJyYXk6IFtdfTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGFycikge1xuICAgIGNvbnN0IGtleSA9IHJhbmRTdHJpbmcoNik7XG4gICAgYXJyT2JqZWN0W2tleV0gPSBpdGVtO1xuICAgIGFyck9iamVjdC5fYXJyYXkucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBhcnJPYmplY3Q7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYEFycmF5T2JqZWN0YCB0byBhIG5vcm1hbCBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubWFyc2hhbEFycmF5KGFyck9iamVjdDogQXJyYXlPYmplY3QpOiBhbnlbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJPYmplY3Q/Ll9hcnJheSkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgYXJyID0gYXJyT2JqZWN0Ll9hcnJheS5tYXAoKGs6IHN0cmluZykgPT4gYXJyT2JqZWN0W2tdKTtcbiAgcmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmFuZFN0cmluZyhsZW46IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBjaGFycyA9XG4gICAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHJhbmQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpO1xuICAgIHJlc3VsdC5wdXNoKGNoYXJzLmNoYXJBdChyYW5kKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHRyYW5zbGF0aW9ucyBtYXAgZnJvbSBgbG9hZFRyYW5zbGF0aW9ucygpYCB0byBhIG1hcCBvZiBzb3VyY2UgdG9cbiAqIHRyYW5zbGF0ZWQgc3RyaW5nIGZvciBhIHBhcnRpY3VsYXIgbG9jYWxlLlxuICpcbiAqIFJldHVybnMgYSBtYXAgbGlrZTpcbiAqIGBgYFxuICoge1xuICogICBcIkhlbGxvXCI6IFwiQm9uam91clwiLFxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGlvbnNGb3JMb2NhbGUoXG4gIHRyYW5zbGF0aW9uc01hcDogVHJhbnNsYXRpb25zTWFwLFxuICBsb2NhbGU6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGxvY2FsZVRyYW5zbGF0aW9uczogTG9jYWxlVHJhbnNsYXRpb25zID0ge307XG4gIE9iamVjdC52YWx1ZXModHJhbnNsYXRpb25zTWFwKS5mb3JFYWNoKChzdHJpbmcpID0+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJpbmcuc291cmNlO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gc3RyaW5nW2xvY2FsZV0gfHwgc3RyaW5nLmVuIHx8IHN0cmluZy5zb3VyY2U7XG4gICAgbG9jYWxlVHJhbnNsYXRpb25zW3NvdXJjZV0gPSB0cmFuc2xhdGlvbjtcbiAgfSk7XG4gIHJldHVybiBsb2NhbGVUcmFuc2xhdGlvbnM7XG59XG5cbi8qKiBBIHByZXR0eSBwcmludGVyIGZvciBKYXZhU2NyaXB0IG9iamVjdHMuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmoob2JqOiBhbnkpIHtcbiAgZnVuY3Rpb24gZm9ybWF0KG9iajogYW55KTogc3RyaW5nIHtcbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJ251bGwnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYFwiJHtvYmoucmVwbGFjZUFsbCgnXCInLCAnXFxcXFwiJyl9XCJgO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcob2JqKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcmV0dXJuIGBbJHtvYmoubWFwKGZvcm1hdCkuam9pbignLCAnKX1dYDtcbiAgICB9XG4gICAgY29uc3QgZW50cmllczogc3RyaW5nW10gPSBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gYCR7a2V5fTogJHtmb3JtYXQodmFsdWUpfWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGB7JHtlbnRyaWVzLmpvaW4oJywgJyl9fWA7XG4gIH1cbiAgcmV0dXJuIGZvcm1hdChvYmopO1xufVxuIiwgIi8qKlxuICogRG9jdW1lbnQgdmVyaW9uIGhpc3RvcnkuXG4gKlxuICogVmVyaW9ucyBzYXZlIHRoZSBzdGF0ZSBvZiBhIGRvY3VtZW50IGF0IGRpZmZlcmVudCBtb21lbnRzIGluIHRpbWUsIGFsbG93aW5nXG4gKiB1c2VycyB0byByZXZlcnQgYmFjayB0byBhIHZlcnNpb24gaWYvd2hlbiBuZWVkZWQuXG4gKlxuICogVGhlIHNhdmVWZXJzaW9ucygpIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIHJ1biB3aXRoaW4gYSBjcm9uIGpvYiAoZS5nIHVzaW5nXG4gKiBmaXJlYmFzZSBmdW5jdGlvbnMpLiBFdmVyeSBtaW51dGUsIHRoZSBydW5uZXIgY2hlY2tzIGZvciBhbGwgZG9jdW1lbnRzIHRoYXRcbiAqIGhhdmUgYmVlbiBlZGl0ZWQgc2luY2UgdGhlIGxhc3QgcnVuLiBUbyBhdm9pZCBzYXZpbmcgXCJwYXJ0aWFsXCIgdmVyc2lvbnNcbiAqICh3aGVuIHRoZSB1c2VyIG1pZ2h0IGJlIGluIHRoZSBtaWRkbGUgb2YgZWRpdGluZyBhIGRvY3VtZW50KSwgdmVyc2lvbnMgb25seVxuICogcnVuIG9uIGRvY3VtZW50cyB0aGF0IGhhdmVuJ3QgYmVlbiBlZGl0ZWQgd2l0aGluIHRoZSBsYXN0IDUgbWlucyB0byBlbnN1cmVcbiAqIHRoYXQgdmVyc2lvbiBpcyBcInN0YWJsZVwiLlxuICpcbiAqIEluIHRoZSBkYXRhYmFzZSwgdmVyc2lvbnMgYXJlIHN0b3JlZCBhczpcbiAqIC9Qcm9qZWN0cy88cHJvamVjdElkPi9Db2xsZWN0aW9ucy88Y29sbGVjdGlvbklkPi9EcmFmdHMvPGRvY0lkPi9WZXJzaW9ucy88dGltZXN0YW1wPlxuICpcbiAqIFdoZXJlIDx0aW1lc3RhbXA+IGlzIHRoZSB1bml4IHRpbWVzdGFtcCAobWlsbGlzKSB0aGF0IHRoZSBkb2N1bWVudCB3YXMgbGFzdFxuICogZWRpdGVkLlxuICovXG5cbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge1Jvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge0ZpcmVzdG9yZSwgUXVlcnksIFRpbWVzdGFtcH0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vZmlyZXN0b3JlJztcbmltcG9ydCBnbG9iIGZyb20gJ3RpbnktZ2xvYic7XG5pbXBvcnQge2dldENtc1BsdWdpbn0gZnJvbSAnLi9jbGllbnQuanMnO1xuXG4vLyBUbyBhdm9pZCBzYXZpbmcgXCJwYXJ0aWFsXCIgdmVyc2lvbnMgKHdoZW4gdGhlIHVzZXIgbWlnaHQgYmUgaW4gdGhlIG1pZGRsZSBvZlxuLy8gZWRpdGluZyBhIGRvY3VtZW50KSwgdmVyc2lvbnMgb25seSBydW4gb24gZG9jdW1lbnRzIHRoYXQgaGF2ZW4ndCBiZWVuIGVkaXRlZFxuLy8gd2l0aGluIHRoZSBsYXN0IDUgbWlucyB0byBlbnN1cmUgdGhhdCB2ZXJzaW9uIGlzIFwic3RhYmxlXCIuXG5jb25zdCBET0NVTUVOVF9TQVZFX09GRlNFVCA9IDUgKiA2MCAqIDEwMDA7XG5cbmludGVyZmFjZSBQYXJ0aWFsQ01TRG9jIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBpZDogc3RyaW5nO1xuICBjb2xsZWN0aW9uOiBzdHJpbmc7XG4gIHNsdWc6IHN0cmluZztcbiAgc3lzOiB7XG4gICAgbW9kaWZpZWRBdDogVGltZXN0YW1wO1xuICAgIG1vZGlmaWVkQnk6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFZlcnNpb25zU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdENvbmZpZzogUm9vdENvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9qZWN0SWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkYjogRmlyZXN0b3JlO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgICB0aGlzLnJvb3RDb25maWcgPSByb290Q29uZmlnO1xuICAgIGNvbnN0IGNtc1BsdWdpbiA9IGdldENtc1BsdWdpbihyb290Q29uZmlnKTtcbiAgICBjb25zdCBjbXNQbHVnaW5PcHRpb25zID0gY21zUGx1Z2luLmdldENvbmZpZygpO1xuICAgIGNvbnN0IHByb2plY3RJZCA9IGNtc1BsdWdpbk9wdGlvbnMuaWQgfHwgJ2RlZmF1bHQnO1xuICAgIHRoaXMucHJvamVjdElkID0gcHJvamVjdElkO1xuICAgIHRoaXMuZGIgPSBjbXNQbHVnaW4uZ2V0RmlyZXN0b3JlKCk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgYSB2ZXJzaW9uIG9mIGFsbCBkb2N1bWVudHMgdGhhdCBoYXZlIGJlZW4gZWRpdGVkIHNpbmNlIHRoZSBsYXN0IHJ1bi5cbiAgICovXG4gIGFzeW5jIHNhdmVWZXJzaW9ucygpIHtcbiAgICAvLyBPZmZzZXQgdGhlIFwibGFzdCBydW5cIiB0aW1lIGJ5IDUgbWlucy4gVmVyc2lvbnMgaWdub3JlIGRvY3MgdGhhdCB3ZXJlXG4gICAgLy8gZWRpdGVkIHdpdGhpbiB0aGUgbGFzdCA1IG1pbnMgdG8gYXZvaWQgcG90ZW50aWFsIFwicGFydGlhbFwiIHZlcnNpb25zIHdoZW5cbiAgICAvLyB1c2VyIGlzIGluIHRoZSBtaWRkbGUgb2YgZWRpdGluZyBhIGRvY3VtZW50LlxuICAgIGNvbnN0IGxhc3RSdW4gPSBhd2FpdCB0aGlzLmdldExhc3RSdW4oKTtcbiAgICBjb25zdCBsYXN0UnVuV2l0aE9mZnNldCA9XG4gICAgICBsYXN0UnVuID09PSAwID8gbGFzdFJ1biA6IGxhc3RSdW4gLSBET0NVTUVOVF9TQVZFX09GRlNFVDtcbiAgICBjb25zdCBjaGFuZ2VkRG9jcyA9IGF3YWl0IHRoaXMuZ2V0RG9jc01vZGlmaWVkQWZ0ZXIobGFzdFJ1bldpdGhPZmZzZXQpO1xuICAgIGNvbnN0IG5vdyA9IFRpbWVzdGFtcC5ub3coKS50b01pbGxpcygpO1xuICAgIGNvbnN0IHZlcnNpb25zID0gY2hhbmdlZERvY3MuZmlsdGVyKChkb2MpID0+IHtcbiAgICAgIGNvbnN0IG1vZGlmaWVkQXQgPSBkb2Muc3lzLm1vZGlmaWVkQXQudG9NaWxsaXMoKTtcbiAgICAgIHJldHVybiBtb2RpZmllZEF0IDw9IG5vdyAtIERPQ1VNRU5UX1NBVkVfT0ZGU0VUO1xuICAgIH0pO1xuICAgIGlmICh2ZXJzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNhdmVWZXJzaW9uc1RvRmlyZXN0b3JlKHZlcnNpb25zKTtcbiAgICB9XG4gICAgdGhpcy5zYXZlTGFzdFJ1bihub3cpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlVmVyc2lvbnNUb0ZpcmVzdG9yZSh2ZXJzaW9uczogUGFydGlhbENNU0RvY1tdKSB7XG4gICAgY29uc3QgYmF0Y2ggPSB0aGlzLmRiLmJhdGNoKCk7XG4gICAgdmVyc2lvbnMuZm9yRWFjaCgodmVyc2lvbikgPT4ge1xuICAgICAgaWYgKCF2ZXJzaW9uLmNvbGxlY3Rpb24gfHwgIXZlcnNpb24uc2x1ZyB8fCAhdmVyc2lvbi5zeXM/Lm1vZGlmaWVkQXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW9kaWZpZWRBdE1pbGxpcyA9IHZlcnNpb24uc3lzLm1vZGlmaWVkQXQudG9NaWxsaXMoKTtcbiAgICAgIGNvbnN0IHZlcnNpb25QYXRoID0gYFByb2plY3RzLyR7dGhpcy5wcm9qZWN0SWR9L0NvbGxlY3Rpb25zLyR7dmVyc2lvbi5jb2xsZWN0aW9ufS9EcmFmdHMvJHt2ZXJzaW9uLnNsdWd9L1ZlcnNpb25zLyR7bW9kaWZpZWRBdE1pbGxpc31gO1xuICAgICAgY29uc29sZS5sb2codmVyc2lvblBhdGgpO1xuICAgICAgY29uc3QgdmVyc2lvblJlZiA9IHRoaXMuZGIuZG9jKHZlcnNpb25QYXRoKTtcbiAgICAgIGJhdGNoLnNldCh2ZXJzaW9uUmVmLCB2ZXJzaW9uKTtcbiAgICB9KTtcbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgICBjb25zb2xlLmxvZyhgdmVyc2lvbnM6IHNhdmVkICR7dmVyc2lvbnMubGVuZ3RofSB2ZXJzaW9uc2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhc3QgdGltZSAoaW4gbWlsbGlzKSBzYXZlVmVyc2lvbnMoKSB3YXMgcnVuLCBvciAwIGlmIGhhc1xuICAgKiBuZXZlciBiZWVuIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0TGFzdFJ1bigpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHByb2plY3REb2NSZWYgPSB0aGlzLmRiLmNvbGxlY3Rpb24oJ1Byb2plY3RzJykuZG9jKHRoaXMucHJvamVjdElkKTtcbiAgICBjb25zdCBwcm9qZWN0RG9jID0gYXdhaXQgcHJvamVjdERvY1JlZi5nZXQoKTtcbiAgICBpZiAocHJvamVjdERvYy5leGlzdHMpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBwcm9qZWN0RG9jLmRhdGEoKSB8fCB7fTtcbiAgICAgIGNvbnN0IHRzID0gZGF0YS52ZXJzaW9uc0xhc3RSdW4gYXMgVGltZXN0YW1wO1xuICAgICAgaWYgKHRzKSB7XG4gICAgICAgIHJldHVybiB0cy50b01pbGxpcygpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB7dmVyc2lvbkxhc3RSdW46IDx0aW1lc3RhbXA+fSB0byB0aGUgUHJvamVjdHMvPHByb2plY3RJZD4gZG9jLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzYXZlTGFzdFJ1bihtaWxsaXM6IG51bWJlcikge1xuICAgIGNvbnN0IHRzID0gVGltZXN0YW1wLmZyb21NaWxsaXMobWlsbGlzKTtcbiAgICBjb25zdCBwcm9qZWN0RG9jUmVmID0gdGhpcy5kYi5jb2xsZWN0aW9uKCdQcm9qZWN0cycpLmRvYyh0aGlzLnByb2plY3RJZCk7XG4gICAgYXdhaXQgcHJvamVjdERvY1JlZi5zZXQoe3ZlcnNpb25zTGFzdFJ1bjogdHN9LCB7bWVyZ2U6IHRydWV9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgZG9jcyB0aGF0IHdlcmUgZWRpdGVkIGFmdGVyIGEgY2VydGFpbiB0aW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXREb2NzTW9kaWZpZWRBZnRlcihtaWxsaXM6IG51bWJlcik6IFByb21pc2U8UGFydGlhbENNU0RvY1tdPiB7XG4gICAgY29uc3QgdHMgPSBUaW1lc3RhbXAuZnJvbU1pbGxpcyhtaWxsaXMpO1xuICAgIGNvbnN0IHJlc3VsdHM6IFBhcnRpYWxDTVNEb2NbXSA9IFtdO1xuICAgIGNvbnN0IGNvbGxlY3Rpb25JZHMgPSBhd2FpdCB0aGlzLmxpc3RDb2xsZWN0aW9ucygpO1xuICAgIC8vIE5PVEU6IEluZGl2aWR1YWwgY29sbGVjdGlvbnMgYXJlIHF1ZXJpZWQgaW5zdGVhZCBvZiB1c2luZyBhXG4gICAgLy8gY29sbGVjdGlvbkdyb3VwIHF1ZXJ5IGJlY2F1c2UgdGhlIGxhdHRlciByZXF1aXJlcyBhIGZpcmVzdG9yZSBpbmRleCB0byBiZVxuICAgIC8vIHNldCB1cC5cbiAgICBmb3IgKGNvbnN0IGNvbGxlY3Rpb25JZCBvZiBjb2xsZWN0aW9uSWRzKSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uUGF0aCA9IGBQcm9qZWN0cy8ke3RoaXMucHJvamVjdElkfS9Db2xsZWN0aW9ucy8ke2NvbGxlY3Rpb25JZH0vRHJhZnRzYDtcbiAgICAgIGNvbnN0IHF1ZXJ5OiBRdWVyeSA9IHRoaXMuZGJcbiAgICAgICAgLmNvbGxlY3Rpb24oY29sbGVjdGlvblBhdGgpXG4gICAgICAgIC53aGVyZSgnc3lzLm1vZGlmaWVkQXQnLCAnPj0nLCB0cyk7XG4gICAgICBjb25zdCBxdWVyeVNuYXBzaG90ID0gYXdhaXQgcXVlcnkuZ2V0KCk7XG4gICAgICBxdWVyeVNuYXBzaG90LmZvckVhY2goKGRvYykgPT4ge1xuICAgICAgICByZXN1bHRzLnB1c2goZG9jLmRhdGEoKSBhcyBQYXJ0aWFsQ01TRG9jKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBjb2xsZWN0aW9uIGlkcyBmb3IgdGhlIFJvb3QgcHJvamVjdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbGlzdENvbGxlY3Rpb25zKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBjb2xsZWN0aW9uSWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNvbGxlY3Rpb25GaWxlTmFtZXMgPSBhd2FpdCBnbG9iKCcqLnNjaGVtYS50cycsIHtcbiAgICAgIGN3ZDogcGF0aC5qb2luKHRoaXMucm9vdENvbmZpZy5yb290RGlyLCAnY29sbGVjdGlvbnMnKSxcbiAgICB9KTtcbiAgICBjb2xsZWN0aW9uRmlsZU5hbWVzLmZvckVhY2goKGZpbGVuYW1lKSA9PiB7XG4gICAgICBjb2xsZWN0aW9uSWRzLnB1c2goZmlsZW5hbWUuc2xpY2UoMCwgLTEwKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb25JZHM7XG4gIH1cbn1cbiIsICJpbXBvcnQge1Jvb3RDb25maWd9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge1Jvb3RDTVNDbGllbnR9IGZyb20gJy4vY2xpZW50LmpzJztcbmltcG9ydCB7VmVyc2lvbnNTZXJ2aWNlfSBmcm9tICcuL3ZlcnNpb25zLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNyb25Kb2JzKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHJ1bkNyb25Kb2IoJ3B1Ymxpc2hTY2hlZHVsZWREb2NzJywgcnVuUHVibGlzaFNjaGVkdWxlZERvY3MsIHJvb3RDb25maWcpLFxuICAgIHJ1bkNyb25Kb2IoJ3NhdmVWZXJzaW9ucycsIHJ1blNhdmVWZXJzaW9ucywgcm9vdENvbmZpZyksXG4gIF0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Dcm9uSm9iKFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuOiAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgLi4uYXJnczogYW55W11cbikge1xuICB0cnkge1xuICAgIGF3YWl0IGZuKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmxvZyhgY3JvbiBmYWlsZWQ6ICR7bmFtZX1gKTtcbiAgICBjb25zb2xlLmVycm9yKFN0cmluZyhlcnIuc3RhY2sgfHwgZXJyKSk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blB1Ymxpc2hTY2hlZHVsZWREb2NzKHJvb3RDb25maWc6IFJvb3RDb25maWcpIHtcbiAgY29uc3QgY21zQ2xpZW50ID0gbmV3IFJvb3RDTVNDbGllbnQocm9vdENvbmZpZyk7XG4gIGF3YWl0IGNtc0NsaWVudC5wdWJsaXNoU2NoZWR1bGVkRG9jcygpO1xuICBhd2FpdCBjbXNDbGllbnQucHVibGlzaFNjaGVkdWxlZFJlbGVhc2VzKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blNhdmVWZXJzaW9ucyhyb290Q29uZmlnOiBSb290Q29uZmlnKSB7XG4gIGNvbnN0IHNlcnZpY2UgPSBuZXcgVmVyc2lvbnNTZXJ2aWNlKHJvb3RDb25maWcpO1xuICBhd2FpdCBzZXJ2aWNlLnNhdmVWZXJzaW9ucygpO1xufVxuIiwgImltcG9ydCB7cGFyc2UgYXMgY3N2UGFyc2V9IGZyb20gJ2Nzdi1wYXJzZS9zeW5jJztcbmltcG9ydCB7c3RyaW5naWZ5IGFzIGNzdlN0cmluZ2lmeX0gZnJvbSAnY3N2LXN0cmluZ2lmeS9zeW5jJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5VG9Dc3YocmVxOiB7XG4gIGhlYWRlcnM6IHN0cmluZ1tdO1xuICByb3dzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pjtcbn0pOiBzdHJpbmcge1xuICBjb25zdCBoZWFkZXJzID0gcmVxLmhlYWRlcnMgfHwgW107XG4gIGNvbnN0IHJvd3MgPSByZXEucm93cyB8fCBbXTtcbiAgcmV0dXJuIGNzdlN0cmluZ2lmeShyb3dzLCB7XG4gICAgaGVhZGVyOiB0cnVlLFxuICAgIGNvbHVtbnM6IGhlYWRlcnMsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3N2VG9BcnJheShjc3ZTdHJpbmc6IHN0cmluZykge1xuICBjb25zdCByb3dzID0gY3N2UGFyc2UoY3N2U3RyaW5nLCB7XG4gICAgY29sdW1uczogdHJ1ZSxcbiAgICBza2lwX2VtcHR5X2xpbmVzOiB0cnVlLFxuICB9KTtcbiAgcmV0dXJuIHJvd3M7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUSxZQUFZQSxXQUFTO0FBQzdCLE9BQU9DLFdBQVU7QUFDakIsU0FBUSxpQkFBQUMsc0JBQW9CO0FBVTVCLE9BQU8sZ0JBQWdCO0FBQ3ZCO0FBQUEsRUFFRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVEsZUFBOEI7QUFDdEMsU0FBbUIsb0JBQW1CO0FBQ3RDLFlBQVksa0JBQWtCO0FBQzlCLE9BQU8sVUFBVTs7O0FDdEJqQixTQUFRLFlBQVksVUFBUztBQUM3QixPQUFPLFVBQVU7QUFDakIsU0FBUSxxQkFBb0I7QUFDNUIsU0FBUSxnQkFBZ0IseUJBQXdCO0FBQ2hELFlBQVksU0FBUztBQUtyQixJQUFNLFlBQVksS0FBSyxRQUFRLGNBQWMsWUFBWSxHQUFHLENBQUM7QUFFN0QsZUFBc0IsZ0JBQWdCO0FBQ3BDLFFBQU0sVUFBVSxRQUFRLElBQUk7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RztBQUNqQixjQUFJLElBQUksT0FBTztBQUNiLG9CQUFRLE1BQU0sSUFBSSxLQUFLO0FBQUEsVUFDekI7QUFDQSxjQUFJLE9BQU8sR0FBRyxFQUFFLEtBQUssc0JBQXNCO0FBQUEsUUFDN0M7QUFBQSxNQUNGLENBQUM7QUFHRCxhQUFPLElBQUksZUFBZSxPQUFPLEtBQWMsUUFBa0I7QUFDL0QsWUFBSSxRQUFRLFdBQVcsbUJBQW1CO0FBQzFDLFlBQUksWUFBWTtBQUNoQixZQUFJLFNBQVMsWUFBWTtBQUFBLE1BQzNCLENBQUM7QUFJRCxhQUFPLElBQUksT0FBTyxLQUFjLEtBQWUsU0FBdUI7QUFDcEUsY0FBTSxPQUFPLE1BQU0sZUFBZSxHQUFHO0FBQ3JDLFlBQUksTUFBTTtBQUNSLGNBQUksT0FBTztBQUFBLFFBQ2I7QUFJQSxZQUFJLENBQUMsUUFBUSxjQUFjLEdBQUcsR0FBRztBQUMvQixjQUFJLElBQUksWUFBWSxXQUFXLFVBQVUsR0FBRztBQUMxQyxnQkFBSSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUMsU0FBUyxPQUFPLE9BQU8saUJBQWdCLENBQUM7QUFDOUQ7QUFBQSxVQUNGO0FBQ0Esa0JBQVEsSUFBSSwyQkFBMkI7QUFDdkMsZ0JBQU0sU0FBUyxJQUFJLGdCQUFnQjtBQUFBLFlBQ2pDLFVBQVUsSUFBSTtBQUFBLFVBQ2hCLENBQUM7QUFDRCxjQUFJLFNBQVMsY0FBYyxPQUFPLFNBQVMsQ0FBQyxFQUFFO0FBQzlDO0FBQUEsUUFDRjtBQUVBLGFBQUs7QUFBQSxNQUNQLENBQUM7QUFHRCxVQUFJLE1BQU07QUFHVixhQUFPLElBQUksUUFBUSxPQUFPLEtBQWMsUUFBa0I7QUFDeEQsWUFBSTtBQUNGLGdCQUFNQSxPQUFNLE1BQU0sWUFBWSxHQUFHO0FBQ2pDLGdCQUFNQSxLQUFJLFVBQVUsS0FBSyxLQUFLO0FBQUEsWUFDNUIsWUFBWSxJQUFJO0FBQUEsWUFDaEIsV0FBVztBQUFBLFlBQ1gsZ0JBQWdCLFFBQVE7QUFBQSxVQUMxQixDQUFDO0FBQUEsUUFDSCxTQUFTLEtBQUs7QUFFWixrQkFBUSxNQUFNLEdBQUc7QUFDakIsY0FBSSxPQUFPLEdBQUcsRUFBRSxLQUFLLHNCQUFzQjtBQUFBLFFBQzdDO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLFdBQVcsVUFBb0M7QUFDdEQsU0FBT0MsSUFDSixPQUFPLFFBQVEsRUFDZixLQUFLLE1BQU0sSUFBSSxFQUNmLE1BQU0sTUFBTSxLQUFLO0FBQ3RCOyIsCiAgIm5hbWVzIjogWyJmcyIsICJwYXRoIiwgImZpbGVVUkxUb1BhdGgiLCAiY3J5cHRvIiwgInBsdWdpbiIsICJvYmoiLCAicGF0aCIsICJUaW1lc3RhbXAiLCAiY21zUGx1Z2luIiwgIlRpbWVzdGFtcCIsICJwYXRoIiwgIl9fZGlybmFtZSIsICJwYXRoIiwgImZpbGVVUkxUb1BhdGgiLCAiYXBwIiwgImZzIl0KfQo=
|