discord-player 6.2.0 → 6.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/index.js +3 -5
- package/dist/index.mjs +4 -5
- package/package.json +1 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
package/dist/index.js
CHANGED
|
@@ -59,7 +59,6 @@ __export(src_exports, {
|
|
|
59
59
|
BASS_EQ_BANDS: () => import_equalizer3.BASS_EQ_BANDS,
|
|
60
60
|
BaseExtractor: () => BaseExtractor,
|
|
61
61
|
BiquadFilterType: () => import_equalizer3.FilterType,
|
|
62
|
-
CreateAudioPlayerOptions: () => import_voice7.CreateAudioPlayerOptions,
|
|
63
62
|
DiscordPlayerQueryResultCache: () => DiscordPlayerQueryResultCache,
|
|
64
63
|
EqualizerConfigurationPreset: () => EqualizerConfigurationPreset,
|
|
65
64
|
ErrorStatusCode: () => ErrorStatusCode,
|
|
@@ -1575,7 +1574,7 @@ var GuildQueueStatistics = class {
|
|
|
1575
1574
|
memoryUsage: process.memoryUsage(),
|
|
1576
1575
|
versions: {
|
|
1577
1576
|
node: process.version,
|
|
1578
|
-
player: "6.2.
|
|
1577
|
+
player: "6.2.1"
|
|
1579
1578
|
}
|
|
1580
1579
|
};
|
|
1581
1580
|
}
|
|
@@ -3185,7 +3184,7 @@ __name(onBeforeCreateStream, "onBeforeCreateStream");
|
|
|
3185
3184
|
// src/index.ts
|
|
3186
3185
|
var import_equalizer3 = require("@discord-player/equalizer");
|
|
3187
3186
|
var import_voice7 = require("@discordjs/voice");
|
|
3188
|
-
var version2 = "6.2.
|
|
3187
|
+
var version2 = "6.2.1";
|
|
3189
3188
|
if (!import_discord5.version.startsWith("14")) {
|
|
3190
3189
|
process.emitWarning(`Discord.js v${import_discord5.version} is incompatible with Discord Player v${version2}! Please use >=v14.x of Discord.js`);
|
|
3191
3190
|
}
|
|
@@ -3201,7 +3200,6 @@ if (!import_discord5.version.startsWith("14")) {
|
|
|
3201
3200
|
BASS_EQ_BANDS,
|
|
3202
3201
|
BaseExtractor,
|
|
3203
3202
|
BiquadFilterType,
|
|
3204
|
-
CreateAudioPlayerOptions,
|
|
3205
3203
|
DiscordPlayerQueryResultCache,
|
|
3206
3204
|
EqualizerConfigurationPreset,
|
|
3207
3205
|
ErrorStatusCode,
|
|
@@ -3248,4 +3246,4 @@ if (!import_discord5.version.startsWith("14")) {
|
|
|
3248
3246
|
useTimeline,
|
|
3249
3247
|
version
|
|
3250
3248
|
});
|
|
3251
|
-
//# sourceMappingURL=index.js.map
|
|
3249
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy91dGlscy9VdGlsLnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvci50cyIsICIuLi9zcmMvZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LnRzIiwgIi4uL3NyYy91dGlscy9UeXBlVXRpbC50cyIsICIuLi9zcmMvU3RydWN0dXJlcy9HdWlsZE5vZGVNYW5hZ2VyLnRzIiwgIi4uL3NyYy9TdHJ1Y3R1cmVzL0d1aWxkUXVldWUudHMiLCAiLi4vc3JjL1N0cnVjdHVyZXMvUGxheWxpc3QudHMiLCAiLi4vc3JjL1N0cnVjdHVyZXMvR3VpbGRRdWV1ZUhpc3RvcnkudHMiLCAiLi4vc3JjL1N0cnVjdHVyZXMvR3VpbGRRdWV1ZVBsYXllck5vZGUudHMiLCAiLi4vc3JjL3V0aWxzL1F1ZXJ5UmVzb2x2ZXIudHMiLCAiLi4vc3JjL3R5cGVzL3R5cGVzLnRzIiwgIi4uL3NyYy9TdHJ1Y3R1cmVzL1RyYWNrLnRzIiwgIi4uL3NyYy91dGlscy9Bc3luY1F1ZXVlLnRzIiwgIi4uL3NyYy9TdHJ1Y3R1cmVzL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvU3RydWN0dXJlcy9HdWlsZFF1ZXVlU3RhdGlzdGljcy50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL19jb250YWluZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9hZGRQbGF5ZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9jbGVhclBsYXllci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldFBsYXllcnMudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9nZXRHbG9iYWxSZWdpc3RyeS50cyIsICIuLi9zcmMvU3RydWN0dXJlcy9Wb2ljZVJlY2VpdmVyTm9kZS50cyIsICIuLi9zcmMvU3RydWN0dXJlcy9TZWFyY2hSZXN1bHQudHMiLCAiLi4vc3JjL1N0cnVjdHVyZXMvUGxheWVyRXJyb3IudHMiLCAiLi4vc3JjL1ZvaWNlSW50ZXJmYWNlL1ZvaWNlVXRpbHMudHMiLCAiLi4vc3JjL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXIudHMiLCAiLi4vc3JjL3V0aWxzL1F1ZXJ5Q2FjaGUudHMiLCAiLi4vc3JjL1BsYXllci50cyIsICIuLi9zcmMvaG9va3MvY29tbW9uLnRzIiwgIi4uL3NyYy9ob29rcy91c2VIaXN0b3J5LnRzIiwgIi4uL3NyYy9ob29rcy91c2VQbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVF1ZXVlLnRzIiwgIi4uL3NyYy9ob29rcy91c2VNYXN0ZXJQbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1ldGFkYXRhLnRzIiwgIi4uL3NyYy9ob29rcy91c2VUaW1lc3RhbXAudHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkFmdGVyQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25CZWZvcmVDcmVhdGVTdHJlYW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHZlcnNpb24gYXMgZGpzVmVyc2lvbiB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9TdHJ1Y3R1cmVzJztcbmV4cG9ydCAqIGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscyc7XG5leHBvcnQgKiBmcm9tICcuL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9VdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVHlwZVV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9Bc3luY1F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5leHBvcnQgKiBmcm9tICcuL1BsYXllcic7XG5leHBvcnQgKiBmcm9tICcuL2hvb2tzJztcbmV4cG9ydCB7XG4gICAgQXVkaW9GaWx0ZXJzIGFzIFBDTUF1ZGlvRmlsdGVycyxcbiAgICB0eXBlIEJpcXVhZEZpbHRlcnMsXG4gICAgRmlsdGVyVHlwZSBhcyBCaXF1YWRGaWx0ZXJUeXBlLFxuICAgIHR5cGUgUENNRmlsdGVycyxcbiAgICBRX0JVVFRFUldPUlRILFxuICAgIFZvbHVtZVRyYW5zZm9ybWVyLFxuICAgIEJBU1NfRVFfQkFORFMsXG4gICAgQUZfTklHSFRDT1JFX1JBVEUsXG4gICAgQUZfVkFQT1JXQVZFX1JBVEUsXG4gICAgRmlsdGVyc0NoYWluXG59IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuZXhwb3J0IHsgY3JlYXRlQXVkaW9QbGF5ZXIsIEF1ZGlvUGxheWVyLCB0eXBlIENyZWF0ZUF1ZGlvUGxheWVyT3B0aW9ucyB9IGZyb20gJ0BkaXNjb3JkanMvdm9pY2UnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcbmV4cG9ydCBjb25zdCB2ZXJzaW9uOiBzdHJpbmcgPSAnNi4yLjEnO1xuXG5pZiAoIWRqc1ZlcnNpb24uc3RhcnRzV2l0aCgnMTQnKSkge1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoYERpc2NvcmQuanMgdiR7ZGpzVmVyc2lvbn0gaXMgaW5jb21wYXRpYmxlIHdpdGggRGlzY29yZCBQbGF5ZXIgdiR7dmVyc2lvbn0hIFBsZWFzZSB1c2UgPj12MTQueCBvZiBEaXNjb3JkLmpzYCk7XG59XG4iLCAiaW1wb3J0IHsgRGVmYXVsdExpc3RlbmVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IExpc3RlbmVyU2lnbmF0dXJlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIFBsYXllckV2ZW50c0VtaXR0ZXI8TCBleHRlbmRzIExpc3RlbmVyU2lnbmF0dXJlPEw+ID0gRGVmYXVsdExpc3RlbmVyPiBleHRlbmRzIEV2ZW50RW1pdHRlcjxMPiB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZXF1aXJlZEV2ZW50czogQXJyYXk8a2V5b2YgTD4gPSBbXSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCAuLi5hcmdzOiBQYXJhbWV0ZXJzPExbS10+KSB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpICYmICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uYXJncyk7XG4gICAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICAgICAgYE5vIGV2ZW50IGxpc3RlbmVyIGZvdW5kIGZvciBldmVudCBcIiR7U3RyaW5nKG5hbWUpfVwiLiBFdmVudHMgJHt0aGlzLnJlcXVpcmVkRXZlbnRzLm1hcCgobSkgPT4gYFwiJHtTdHJpbmcobSl9XCJgKS5qb2luKCcsICcpfSBtdXN0IGhhdmUgZXZlbnQgbGlzdGVuZXJzLmAsXG4gICAgICAgICAgICAgICAgJ1VuaGFuZGxlZEV2ZW50c1dhcm5pbmcnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLmVtaXQobmFtZSwgLi4uYXJncyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFN0YWdlQ2hhbm5lbCwgVm9pY2VDaGFubmVsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBUaW1lRGF0YSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuXG5jbGFzcyBVdGlsIHtcbiAgICAvKipcbiAgICAgKiBVdGlsc1xuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZHVyT2JqIFRoZSBkdXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkdXJhdGlvblN0cmluZyhkdXJPYmo6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKVxuICAgICAgICAgICAgLm1hcCgobSkgPT4gKGlzTmFOKG0pID8gMCA6IG0pKVxuICAgICAgICAgICAgLmpvaW4oJzonKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWlsbGlzZWNvbmRzIFRoZSB0aW1lIGluIG1zXG4gICAgICogQHJldHVybnMge1RpbWVEYXRhfVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZU1TKG1pbGxpc2Vjb25kczogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgICAgICBjb25zdCByb3VuZCA9IG1pbGxpc2Vjb25kcyA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlzOiByb3VuZChtaWxsaXNlY29uZHMgLyA4NjQwMDAwMCksXG4gICAgICAgICAgICBob3Vyczogcm91bmQobWlsbGlzZWNvbmRzIC8gMzYwMDAwMCkgJSAyNCxcbiAgICAgICAgICAgIG1pbnV0ZXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDYwMDAwKSAlIDYwLFxuICAgICAgICAgICAgc2Vjb25kczogcm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCkgJSA2MFxuICAgICAgICB9IGFzIFRpbWVEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICAgKiBAcGFyYW0ge1RpbWVEYXRhfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRUaW1lQ29kZShkdXJhdGlvbjogVGltZURhdGEpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gWydkYXlzJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGl0ZW1zLmZpbHRlcigoeCkgPT4gcmVxdWlyZWQuaW5jbHVkZXMoeCkpLm1hcCgobSkgPT4gZHVyYXRpb25bbSBhcyBrZXlvZiBUaW1lRGF0YV0pO1xuICAgICAgICBjb25zdCBmaW5hbCA9IHBhcnNlZFxuICAgICAgICAgICAgLnNsaWNlKHBhcnNlZC5maW5kSW5kZXgoKHgpID0+IHggIT09IDApKVxuICAgICAgICAgICAgLm1hcCgoeCkgPT4geC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAgICAgICAuam9pbignOicpO1xuXG4gICAgICAgIHJldHVybiBmaW5hbC5sZW5ndGggPD0gMyA/IGAwOiR7ZmluYWwucGFkU3RhcnQoMiwgJzAnKSB8fCAwfWAgOiBmaW5hbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyBsYXN0IGl0ZW0gb2YgdGhlIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgbGFzdDxUID0gYW55PihhcnI6IFRbXSk6IFQge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICAgICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5uZWwgJiYgY2hhbm5lbC5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiAhbWVtYmVyLnVzZXIuYm90KS5zaXplID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhZmVyIHJlcXVpcmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgTm9kZSByZXF1aXJlIGlkXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVxdWlyZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIGluIG1zIHRvIHdhaXRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgd2FpdCh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgICAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICAgICAgZm9yIChjb25zdCBsaWIgb2YgWydub2RlLWZldGNoJywgJ3VuZGljaSddKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlcXVpcmUobGliKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vP1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtZXNzYWdlLCB7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgZGV0YWlsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyByYW5kb21DaG9pY2U8VD4oc3JjOiBUW10pOiBUIHtcbiAgICAgICAgcmV0dXJuIHNyY1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBzcmMubGVuZ3RoKV07XG4gICAgfVxufVxuXG5leHBvcnQgeyBVdGlsIH07XG4iLCAiaW1wb3J0IHsgRmlsdGVyc05hbWUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmNvbnN0IGJhc3MgPSAoZzogbnVtYmVyKSA9PiBgYmFzcz1nPSR7Z306Zj0xMTA6dz0wLjNgO1xuXG5jbGFzcyBBdWRpb0ZpbHRlcnMge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbHRlcnM6IFJlY29yZDxGaWx0ZXJzTmFtZSwgc3RyaW5nPiA9IHtcbiAgICAgICAgYmFzc2Jvb3N0X2xvdzogYmFzcygxNSksXG4gICAgICAgIGJhc3Nib29zdDogYmFzcygyMCksXG4gICAgICAgIGJhc3Nib29zdF9oaWdoOiBiYXNzKDMwKSxcbiAgICAgICAgJzhEJzogJ2FwdWxzYXRvcj1oej0wLjA5JyxcbiAgICAgICAgdmFwb3J3YXZlOiAnYXJlc2FtcGxlPTQ4MDAwLGFzZXRyYXRlPTQ4MDAwKjAuOCcsXG4gICAgICAgIG5pZ2h0Y29yZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCoxLjI1JyxcbiAgICAgICAgbG9maTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjksZXh0cmFzdGVyZW89bT0yLjU6Yz1kaXNhYmxlZCcsXG4gICAgICAgIHBoYXNlcjogJ2FwaGFzZXI9aW5fZ2Fpbj0wLjQnLFxuICAgICAgICB0cmVtb2xvOiAndHJlbW9sbycsXG4gICAgICAgIHZpYnJhdG86ICd2aWJyYXRvPWY9Ni41JyxcbiAgICAgICAgcmV2ZXJzZTogJ2FyZXZlcnNlJyxcbiAgICAgICAgdHJlYmxlOiAndHJlYmxlPWc9NScsXG4gICAgICAgIG5vcm1hbGl6ZXIyOiAnZHluYXVkbm9ybT1nPTEwMScsXG4gICAgICAgIG5vcm1hbGl6ZXI6ICdhY29tcHJlc3NvcicsXG4gICAgICAgIHN1cnJvdW5kaW5nOiAnc3Vycm91bmQnLFxuICAgICAgICBwdWxzYXRvcjogJ2FwdWxzYXRvcj1oej0xJyxcbiAgICAgICAgc3ViYm9vc3Q6ICdhc3ViYm9vc3QnLFxuICAgICAgICBrYXJhb2tlOiAnc3RlcmVvdG9vbHM9bWxldj0wLjAzJyxcbiAgICAgICAgZmxhbmdlcjogJ2ZsYW5nZXInLFxuICAgICAgICBnYXRlOiAnYWdhdGUnLFxuICAgICAgICBoYWFzOiAnaGFhcycsXG4gICAgICAgIG1jb21wYW5kOiAnbWNvbXBhbmQnLFxuICAgICAgICBtb25vOiAncGFuPW1vbm98YzA9LjUqYzArLjUqYzEnLFxuICAgICAgICBtc3RscjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+bHInLFxuICAgICAgICBtc3RycjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+cnInLFxuICAgICAgICBjb21wcmVzc29yOiAnY29tcGFuZD1wb2ludHM9LTgwLy0xMDV8LTYyLy04MHwtMTUuNC8tMTUuNHwwLy0xMnwyMC8tNy42JyxcbiAgICAgICAgZXhwYW5kZXI6ICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy0xNjl8LTU0Ly04MHwtNDkuNS8tNjQuNnwtNDEuMS8tNDEuMXwtMjUuOC8tMTV8LTEwLjgvLTQuNXwwLzB8MjAvOC4zJyxcbiAgICAgICAgc29mdGxpbWl0ZXI6ICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy04MHwtMTIuNC8tMTIuNHwtNi8tOHwwLy02Ljh8MjAvLTIuOCcsXG4gICAgICAgIGNob3J1czogJ2Nob3J1cz0wLjc6MC45OjU1OjAuNDowLjI1OjInLFxuICAgICAgICBjaG9ydXMyZDogJ2Nob3J1cz0wLjY6MC45OjUwfDYwOjAuNHwwLjMyOjAuMjV8MC40OjJ8MS4zJyxcbiAgICAgICAgY2hvcnVzM2Q6ICdjaG9ydXM9MC41OjAuOTo1MHw2MHw0MDowLjR8MC4zMnwwLjM6MC4yNXwwLjR8MC4zOjJ8Mi4zfDEuMycsXG4gICAgICAgIGZhZGVpbjogJ2FmYWRlPXQ9aW46c3M9MDpkPTEwJyxcbiAgICAgICAgZGltOiBgYWZmdGZpbHQ9XCIncmVhbD1yZSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknOmltYWc9J2ltICogKDEtY2xpcCgoYi9uYikqYiwwLDEpKSdcImAsXG4gICAgICAgIGVhcnJhcGU6ICdjaGFubmVsc3BsaXQsc2lkZWNoYWluZ2F0ZT1sZXZlbF9pbj02NCdcbiAgICB9O1xuXG4gICAgcHVibGljIHN0YXRpYyBnZXQ8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihuYW1lOiBLKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnNbbmFtZV0gPz8gbmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhczxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICAgICAgcmV0dXJuIG5hbWUgaW4gdGhpcy5maWx0ZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8eyBuYW1lOiBGaWx0ZXJzTmFtZTsgdmFsdWU6IHN0cmluZyB9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZmlsdGVycykpIHtcbiAgICAgICAgICAgIHlpZWxkIHsgbmFtZTogayBhcyBGaWx0ZXJzTmFtZSwgdmFsdWU6IHYgYXMgc3RyaW5nIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBuYW1lcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykgYXMgRmlsdGVyc05hbWVbXTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEF1ZGlvRmlsdGVycy5sZW5ndGhcbiAgICBwdWJsaWMgc3RhdGljIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lcy5tYXAoKG0pID0+ICh0aGlzIGFzIGFueSlbbV0pLmpvaW4oJywnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGZmbXBlZyBhcmdzIGZyb20gdGhlIHNwZWNpZmllZCBmaWx0ZXJzIG5hbWVcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgbmFtZVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGU8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihmaWx0ZXJzPzogS1tdKSB7XG4gICAgICAgIGlmICghZmlsdGVycyB8fCAhQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcnNcbiAgICAgICAgICAgIC5maWx0ZXIoKHByZWRpY2F0ZSkgPT4gdHlwZW9mIHByZWRpY2F0ZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAubWFwKChtKSA9PiB0aGlzLmdldChtKSlcbiAgICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBhdWRpbyBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gZmlsdGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsdGVyXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBmZm1wZWcgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lKGZpbHRlck5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpbHRlcnNbZmlsdGVyTmFtZSBhcyBGaWx0ZXJzTmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIG11bHRpcGxlIGF1ZGlvIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmlsdGVyc0FycmF5IEFycmF5IG9mIGZpbHRlcnMgY29udGFpbmluZyB0aGUgZmlsdGVyIG5hbWUgYW5kIGZmbXBlZyBhcmdzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmVCdWxrKGZpbHRlcnNBcnJheTogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKSB7XG4gICAgICAgIGZpbHRlcnNBcnJheS5mb3JFYWNoKChhcnIpID0+IHRoaXMuZGVmaW5lKGFyci5uYW1lLCBhcnIudmFsdWUpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEF1ZGlvRmlsdGVycztcbmV4cG9ydCB7IEF1ZGlvRmlsdGVycyB9O1xuIiwgImltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vU3RydWN0dXJlcy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL1N0cnVjdHVyZXMvVHJhY2snO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICdodHRwJztcblxuZXhwb3J0IGNsYXNzIEJhc2VFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpZGVudGlmaWVyID0gJ2NvbS5kaXNjb3JkLXBsYXllci5leHRyYWN0b3InO1xuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdG9yIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEluaXRpYWxpemF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBwdWJsaWMgb3B0aW9uczogVCA9IDxUPnt9KSB7fVxuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGlzIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBCYXNlRXh0cmFjdG9yKS5pZGVudGlmaWVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY29uZmlndXJlcyB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBuZXcgb3B0aW9ucyB0byBhcHBseVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWNvbmZpZ3VyZShvcHRpb25zOiBUKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBhY3RpdmF0ZSgpIHtcbiAgICAgICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkZWFjdGl2YXRlKCkge1xuICAgICAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBpbmNvbWluZyBxdWVyeVxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gdmFsaWRhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUocXVlcnk6IHN0cmluZywgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdm9pZCB0eXBlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyZWFtIHRoZSBnaXZlbiB0cmFja1xuICAgICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc3RyZWFtKGluZm86IFRyYWNrKTogUHJvbWlzZTxSZWFkYWJsZSB8IHN0cmluZz4ge1xuICAgICAgICB2b2lkIGluZm87XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IEltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRoZSBnaXZlbiBxdWVyeVxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gaGFuZGxlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZShxdWVyeTogc3RyaW5nLCBjb250ZXh0OiBFeHRyYWN0b3JTZWFyY2hDb250ZXh0KTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgICAgIHZvaWQgY29udGV4dDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgSW1wbGVtZW50ZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcmVsYXRlZCB0cmFja3MgZm9yIHRoZSBnaXZlbiB0cmFja1xuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgc291cmNlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGdldFJlbGF0ZWRUcmFja3ModHJhY2s6IFRyYWNrKTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgICAgIHZvaWQgdHJhY2s7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzdHJlYW0gbWlkZGxld2FyZSB0byBoYW5kbGUgc3RyZWFtcyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW5jb21pbmcgc3RyZWFtXG4gICAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlUG9zdFN0cmVhbShzdHJlYW06IFJlYWRhYmxlLCBuZXh0OiBOZXh0RnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5leHQobnVsbCwgc3RyZWFtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhbiBldmVudCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBkaXNwYXRjaFxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAgICovXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIFBsYXllckV2ZW50cz4oZXZlbnQ6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UGxheWVyRXZlbnRzW0tdPikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZXh0cmFjdG9yIHJlc3BvbnNlXG4gICAgICogQHBhcmFtIHBsYXlsaXN0IFRoZSBwbGF5bGlzdFxuICAgICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVJlc3BvbnNlKHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsLCB0cmFja3M6IFRyYWNrW10gPSBwbGF5bGlzdD8udHJhY2tzIHx8IFtdKTogRXh0cmFjdG9ySW5mbyB7XG4gICAgICAgIHJldHVybiB7IHBsYXlsaXN0OiBwbGF5bGlzdCB8fCBudWxsLCB0cmFja3MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRlYnVnIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgTmV4dEZ1bmN0aW9uID0gKGVycm9yPzogRXJyb3IgfCBudWxsLCBzdHJlYW0/OiBSZWFkYWJsZSkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JJbmZvIHtcbiAgICBwbGF5bGlzdDogUGxheWxpc3QgfCBudWxsO1xuICAgIHRyYWNrczogVHJhY2tbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JTZWFyY2hDb250ZXh0IHtcbiAgICB0eXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbDtcbiAgICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xuICAgIHJlcXVlc3RPcHRpb25zPzogUmVxdWVzdE9wdGlvbnM7XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4vQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBrbm93bkV4dHJhY3RvcktleXMgPSBbXG4gICAgJ1Nwb3RpZnlFeHRyYWN0b3InLFxuICAgICdBcHBsZU11c2ljRXh0cmFjdG9yJyxcbiAgICAnU291bmRDbG91ZEV4dHJhY3RvcicsXG4gICAgJ1lvdVR1YmVFeHRyYWN0b3InLFxuICAgICdWaW1lb0V4dHJhY3RvcicsXG4gICAgJ1JldmVyYm5hdGlvbkV4dHJhY3RvcicsXG4gICAgJ0F0dGFjaG1lbnRFeHRyYWN0b3InXG5dO1xuY29uc3Qga25vd25FeHRyYWN0b3JMaWIgPSAnQGRpc2NvcmQtcGxheWVyL2V4dHJhY3Rvcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uRXZlbnRzIHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIGV4dHJhY3RvciB3YXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyByZWdpc3RlcmVkXG4gICAgICovXG4gICAgcmVnaXN0ZXJlZDogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgdW5yZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgZXh0cmFjdG9yIHdhcyB1bnJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgdW5yZWdpc3RlcmVkXG4gICAgICovXG4gICAgdW5yZWdpc3RlcmVkOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBhY3RpdmF0ZTogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgICAqL1xuICAgIGRlYWN0aXZhdGU6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGZhaWxzIHRvIGFjdGl2YXRlL2RlYWN0aXZhdGVcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgICAqL1xuICAgIGVycm9yOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yLCBlcnJvcjogRXJyb3IpID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxFeHRyYWN0b3JFeGVjdXRpb25FdmVudHM+IHtcbiAgICBwdWJsaWMgc3RvcmUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEJhc2VFeHRyYWN0b3I+KCk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgICAgICBzdXBlcihbJ2Vycm9yJ10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgZGVmYXVsdCBleHRyYWN0b3JzIGZyb20gYEBkaXNjb3JkLXBsYXllci9leHRyYWN0b3JgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGxvYWREZWZhdWx0KCkge1xuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBVdGlsLmltcG9ydChrbm93bkV4dHJhY3RvckxpYik7XG4gICAgICAgIGlmIChtb2QuZXJyb3IpIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogbW9kLmVycm9yIGFzIEVycm9yIH07XG5cbiAgICAgICAga25vd25FeHRyYWN0b3JLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFtb2QubW9kdWxlW2tleV0pIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIoPHR5cGVvZiBCYXNlRXh0cmFjdG9yPm1vZC5tb2R1bGVba2V5XSwge30pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGlmIHRoZSBnaXZlbiBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlZ2lzdGVyZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiByZWdpc3RlcmVkIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNpbmdsZSBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byByZWdpc3RlclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcjxPIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgdHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4+KF9leHRyYWN0b3I6IFQsIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKSB7XG4gICAgICAgIGlmICh0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fCB0aGlzLnN0b3JlLmhhcyhfZXh0cmFjdG9yLmlkZW50aWZpZXIpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBfZXh0cmFjdG9yKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLnNldChfZXh0cmFjdG9yLmlkZW50aWZpZXIsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBsb2FkZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgYXdhaXQgZXh0cmFjdG9yLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBhY3RpdmF0ZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2FjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kZWxldGUoX2V4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBhY3RpdmF0ZSEgRXJyb3I6ICR7ZX1gKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLCBleHRyYWN0b3IsIGUgYXMgRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byB1bnJlZ2lzdGVyXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXI8SyBleHRlbmRzIHN0cmluZyB8IEJhc2VFeHRyYWN0b3I+KF9leHRyYWN0b3I6IEspIHtcbiAgICAgICAgY29uc3QgZXh0cmFjdG9yID0gdHlwZW9mIF9leHRyYWN0b3IgPT09ICdzdHJpbmcnID8gdGhpcy5zdG9yZS5nZXQoX2V4dHJhY3RvcikgOiB0aGlzLnN0b3JlLmZpbmQoKHIpID0+IHIgPT09IF9leHRyYWN0b3IpO1xuICAgICAgICBpZiAoIWV4dHJhY3RvcikgcmV0dXJuO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBleHRyYWN0b3IuaWRlbnRpZmllciB8fCB0aGlzLnN0b3JlLmZpbmRLZXkoKGUpID0+IGUgPT09IGV4dHJhY3RvcikhO1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGlzYWJsZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3VucmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICBhd2FpdCBleHRyYWN0b3IuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBkZWFjdGl2YXRlZCFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVhY3RpdmF0ZScsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZmFpbGVkIHRvIGRlYWN0aXZhdGUhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXIgYWxsIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlckFsbCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuc3RvcmUubWFwKChlKSA9PiB0aGlzLnVucmVnaXN0ZXIoZSkpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW4gYWxsIHRoZSBleHRyYWN0b3JzXG4gICAgICogQHBhcmFtIGZuIFRoZSBydW5uZXIgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gZmlsdGVyQmxvY2tlZCBGaWx0ZXIgYmxvY2tlZCBleHRyYWN0b3JzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJ1bjxUID0gdW5rbm93bj4oZm46IEV4dHJhY3RvckV4ZWN1dGlvbkZOPFQ+LCBmaWx0ZXJCbG9ja2VkID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBibG9ja2VkID0gdGhpcy5wbGF5ZXIub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz8gW107XG5cbiAgICAgICAgbGV0IGVycjogRXJyb3IgfCBudWxsID0gbnVsbCxcbiAgICAgICAgICAgIGxhc3RFeHQ6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4dCBvZiB0aGlzLnN0b3JlLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyQmxvY2tlZCAmJiBibG9ja2VkLnNvbWUoKGUpID0+IGUgPT09IGV4dC5pZGVudGlmaWVyKSkgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfS4uLmApO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oZXh0KS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZmFpbGVkIHdpdGggZXJyb3I6ICR7ZX1gKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHlwZVV0aWwuaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoYCR7ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsYXN0RXh0ID0gZXh0O1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmICFUeXBlVXRpbC5pc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSFgKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogZXh0LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICAgICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8VD47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGVyciA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogbGFzdEV4dCEsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICByZXN1bHQ6IGZhbHNlXG4gICAgICAgICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUPjtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gICAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yO1xuICAgIGVycm9yOiBFcnJvciB8IG51bGw7XG4gICAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiBQcm9taXNlPFQgfCBib29sZWFuPjtcbiIsICJleHBvcnQgY2xhc3MgVHlwZVV0aWwge1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBUeXBlVXRpbDtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIHB1YmxpYyBzdGF0aWMgaXNGdW5jdGlvbih0OiB1bmtub3duKTogdCBpcyBGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTnVtYmVyKHQ6IHVua25vd24pOiB0IGlzIG51bWJlciB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmcodDogdW5rbm93bik6IHQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnc3RyaW5nJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzQm9vbGVhbih0OiB1bmtub3duKTogdCBpcyBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnYm9vbGVhbic7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc051bGxpc2godDogdW5rbm93bik6IHQgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0ID09IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0FycmF5KHQ6IHVua25vd24pOiB0IGlzIHVua25vd25bXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNFcnJvcih0OiB1bmtub3duKTogdCBpcyBFcnJvciB7XG4gICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgRXJyb3I7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMsIEJpcXVhZEZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIsIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVSZXBlYXRNb2RlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnM8VCA9IHVua25vd24+IHtcbiAgICBzdHJhdGVneT86IFF1ZXVlU3RyYXRlZ3k7XG4gICAgdm9sdW1lPzogbnVtYmVyIHwgYm9vbGVhbjtcbiAgICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICAgIGFfZmlsdGVyPzogUENNRmlsdGVyc1tdIHwgYm9vbGVhbjtcbiAgICBiaXF1YWQ/OiBCaXF1YWRGaWx0ZXJzIHwgYm9vbGVhbjtcbiAgICByZXNhbXBsZXI/OiBudW1iZXIgfCBib29sZWFuO1xuICAgIGRpc2FibGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgICBza2lwT25Ob1N0cmVhbT86IGJvb2xlYW47XG4gICAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIHJlcGVhdE1vZGU/OiBRdWV1ZVJlcGVhdE1vZGU7XG4gICAgbGVhdmVPbkVtcHR5PzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW1wdHlDb29sZG93bj86IG51bWJlcjtcbiAgICBsZWF2ZU9uRW5kPzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW5kQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbGVhdmVPblN0b3A/OiBib29sZWFuO1xuICAgIGxlYXZlT25TdG9wQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbWV0YWRhdGE/OiBUIHwgbnVsbDtcbiAgICBzZWxmRGVhZj86IGJvb2xlYW47XG4gICAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gICAgZGVmYXVsdEZGbXBlZ0ZpbHRlcnM/OiBGaWx0ZXJzTmFtZVtdO1xuICAgIGJ1ZmZlcmluZ1RpbWVvdXQ/OiBudW1iZXI7XG4gICAgbm9FbWl0SW5zZXJ0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG5leHBvcnQgY2xhc3MgR3VpbGROb2RlTWFuYWdlcjxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjYWNoZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZT4oKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGd1aWxkIHF1ZXVlIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAgICogQHBhcmFtIGd1aWxkIFRoZSBndWlsZCB3aGljaCB3aWxsIGJlIHRoZSBvd25lciBvZiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZTxUID0gTWV0YT4oZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSwgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KTogR3VpbGRRdWV1ZTxUPiB7XG4gICAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgICAgIGlmICghc2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgb3IgdW5rbm93biBndWlsZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2FjaGUuaGFzKHNlcnZlci5pZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChzZXJ2ZXIuaWQpIGFzIEd1aWxkUXVldWU8VD47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLnN0cmF0ZWd5ID8/PSAnRklGTyc7XG4gICAgICAgIG9wdGlvbnMudm9sdW1lID8/PSAxMDA7XG4gICAgICAgIG9wdGlvbnMuZXF1YWxpemVyID8/PSBbXTtcbiAgICAgICAgb3B0aW9ucy5hX2ZpbHRlciA/Pz0gW107XG4gICAgICAgIG9wdGlvbnMuZGlzYWJsZUhpc3RvcnkgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLnNraXBPbk5vU3RyZWFtID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5sZWF2ZU9uRW1wdHkgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVuZCA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPblN0b3AgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93biA/Pz0gMDtcbiAgICAgICAgb3B0aW9ucy5yZXNhbXBsZXIgPz89IDQ4MDAwO1xuICAgICAgICBvcHRpb25zLnNlbGZEZWFmID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/PSB0aGlzLnBsYXllci5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0O1xuICAgICAgICBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQgPz89IDEwMDA7XG5cbiAgICAgICAgaWYgKGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJykgYXMgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJykgJiYgIW9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSBhcyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXVlID0gbmV3IEd1aWxkUXVldWU8VD4odGhpcy5wbGF5ZXIsIHtcbiAgICAgICAgICAgIGd1aWxkOiBzZXJ2ZXIsXG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgICAgICAgdm9sdW1lOiBvcHRpb25zLnZvbHVtZSxcbiAgICAgICAgICAgIGVxdWFsaXplcjogb3B0aW9ucy5lcXVhbGl6ZXIsXG4gICAgICAgICAgICBmaWx0ZXJlcjogb3B0aW9ucy5hX2ZpbHRlcixcbiAgICAgICAgICAgIGJpcXVhZDogb3B0aW9ucy5iaXF1YWQsXG4gICAgICAgICAgICByZXNhbXBsZXI6IG9wdGlvbnMucmVzYW1wbGVyLFxuICAgICAgICAgICAgZGlzYWJsZUhpc3Rvcnk6IG9wdGlvbnMuZGlzYWJsZUhpc3RvcnksXG4gICAgICAgICAgICBza2lwT25Ob1N0cmVhbTogb3B0aW9ucy5za2lwT25Ob1N0cmVhbSxcbiAgICAgICAgICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtLFxuICAgICAgICAgICAgb25BZnRlckNyZWF0ZVN0cmVhbTogb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtLFxuICAgICAgICAgICAgcmVwZWF0TW9kZTogb3B0aW9ucy5yZXBlYXRNb2RlLFxuICAgICAgICAgICAgbGVhdmVPbkVtcHR5OiBvcHRpb25zLmxlYXZlT25FbXB0eSxcbiAgICAgICAgICAgIGxlYXZlT25FbXB0eUNvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duLFxuICAgICAgICAgICAgbGVhdmVPbkVuZDogb3B0aW9ucy5sZWF2ZU9uRW5kLFxuICAgICAgICAgICAgbGVhdmVPbkVuZENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93bixcbiAgICAgICAgICAgIGxlYXZlT25TdG9wOiBvcHRpb25zLmxlYXZlT25TdG9wLFxuICAgICAgICAgICAgbGVhdmVPblN0b3BDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uU3RvcENvb2xkb3duLFxuICAgICAgICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgICAgICAgc2VsZkRlYWY6IG9wdGlvbnMuc2VsZkRlYWYsXG4gICAgICAgICAgICBmZm1wZWdGaWx0ZXJzOiBvcHRpb25zLmRlZmF1bHRGRm1wZWdGaWx0ZXJzID8/IFtdLFxuICAgICAgICAgICAgYnVmZmVyaW5nVGltZW91dDogb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0LFxuICAgICAgICAgICAgbm9FbWl0SW5zZXJ0OiBvcHRpb25zLm5vRW1pdEluc2VydCA/PyBmYWxzZVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhY2hlLnNldChzZXJ2ZXIuaWQsIHF1ZXVlKTtcblxuICAgICAgICByZXR1cm4gcXVldWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGV4aXN0aW5nIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQ8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gKHRoaXMuY2FjaGUuZ2V0KHF1ZXVlLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+KSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgcXVldWUgZXhpc3RzXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBoYXMobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgaWQgPSBub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSA/IG5vZGUuaWQgOiB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSE7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgICAgIGlmICghcXVldWUpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGRlbGV0ZSBub24tZXhpc3RpbmcgcXVldWUnKTtcblxuICAgICAgICBxdWV1ZS5ub2RlLnN0b3AodHJ1ZSk7XG4gICAgICAgIHF1ZXVlLmNvbm5lY3Rpb24/LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICBxdWV1ZS5kaXNwYXRjaGVyPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcXVldWUuZGlzcGF0Y2hlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgICBxdWV1ZS50aW1lb3V0cy5mb3JFYWNoKCh0bSkgPT4gY2xlYXJUaW1lb3V0KHRtKSk7XG4gICAgICAgIHF1ZXVlLmhpc3RvcnkuY2xlYXIoKTtcbiAgICAgICAgcXVldWUudHJhY2tzLmNsZWFyKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZGVsZXRlKHF1ZXVlLmlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlPFQgPSBNZXRhPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZUlkKG5vZGUpISkgYXMgR3VpbGRRdWV1ZTxUPiB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHF1ZXVlIGlkXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlSWQobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICAgICAgcmV0dXJuIHE/LmlkIHx8IG51bGw7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBDaGFubmVsVHlwZSwgR3VpbGQsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgVm9pY2VCYXNlZENoYW5uZWwsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlLCBRdWV1ZVN0cmF0ZWd5IH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEJpcXVhZEZpbHRlcnMsIEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuL1RyYWNrJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuLi9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IHR5cGUgQXVkaW9QbGF5ZXIsIEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUgfSBmcm9tICdAZGlzY29yZGpzL3ZvaWNlJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlSGlzdG9yeSB9IGZyb20gJy4vR3VpbGRRdWV1ZUhpc3RvcnknO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVBsYXllck5vZGUgfSBmcm9tICcuL0d1aWxkUXVldWVQbGF5ZXJOb2RlJztcbmltcG9ydCB7IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnMgfSBmcm9tICcuL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUsIFF1ZXVlUmVwZWF0TW9kZSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlU3RhdGlzdGljcyB9IGZyb20gJy4vR3VpbGRRdWV1ZVN0YXRpc3RpY3MnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlSW5pdDxNZXRhID0gdW5rbm93bj4ge1xuICAgIGd1aWxkOiBHdWlsZDtcbiAgICBxdWV1ZVN0cmF0ZWd5OiBRdWV1ZVN0cmF0ZWd5O1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdIHwgYm9vbGVhbjtcbiAgICB2b2x1bWU6IG51bWJlciB8IGJvb2xlYW47XG4gICAgYmlxdWFkOiBCaXF1YWRGaWx0ZXJzIHwgYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICByZXNhbXBsZXI6IG51bWJlciB8IGJvb2xlYW47XG4gICAgZmlsdGVyZXI6IFBDTUZpbHRlcnNbXSB8IGJvb2xlYW47XG4gICAgZmZtcGVnRmlsdGVyczogRmlsdGVyc05hbWVbXTtcbiAgICBkaXNhYmxlSGlzdG9yeTogYm9vbGVhbjtcbiAgICBza2lwT25Ob1N0cmVhbTogYm9vbGVhbjtcbiAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtPzogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgICBsZWF2ZU9uRW1wdHk6IGJvb2xlYW47XG4gICAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG51bWJlcjtcbiAgICBsZWF2ZU9uRW5kOiBib29sZWFuO1xuICAgIGxlYXZlT25FbmRDb29sZG93bjogbnVtYmVyO1xuICAgIGxlYXZlT25TdG9wOiBib29sZWFuO1xuICAgIGxlYXZlT25TdG9wQ29vbGRvd246IG51bWJlcjtcbiAgICBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyO1xuICAgIHNlbGZEZWFmPzogYm9vbGVhbjtcbiAgICBtZXRhZGF0YT86IE1ldGEgfCBudWxsO1xuICAgIGJ1ZmZlcmluZ1RpbWVvdXQ6IG51bWJlcjtcbiAgICBub0VtaXRJbnNlcnQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VDb25uZWN0Q29uZmlnIHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gICAgc3RyZWFtOiBSZWFkYWJsZTtcbiAgICB0eXBlOiBTdHJlYW1UeXBlO1xufVxuXG5leHBvcnQgdHlwZSBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSAodHJhY2s6IFRyYWNrLCBxdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSwgcXVldWU6IEd1aWxkUXVldWUpID0+IFByb21pc2U8UmVhZGFibGUgfCBudWxsPjtcbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gKHN0cmVhbTogUmVhZGFibGUsIHF1ZXVlOiBHdWlsZFF1ZXVlKSA9PiBQcm9taXNlPFBvc3RQcm9jZXNzZWRSZXN1bHQgfCBudWxsPjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHJpZ2dlcmVkUmVhc29uID0gJ2ZpbHRlcnMnIHwgJ25vcm1hbCc7XG5cbmV4cG9ydCBlbnVtIEd1aWxkUXVldWVFdmVudCB7XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tBZGQgPSAnYXVkaW9UcmFja2FkZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzQWRkID0gJ2F1ZGlvVHJhY2tzQWRkJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tSZW1vdmUgPSAnYXVkaW9UcmFja1JlbW92ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzUmVtb3ZlID0gJ2F1ZGlvVHJhY2tzUmVtb3ZlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNyZWF0ZWRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uID0gJ2Nvbm5lY3Rpb24nLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYm90IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBjaGFubmVsXG4gICAgICovXG4gICAgZGlzY29ubmVjdCA9ICdkaXNjb25uZWN0JyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqL1xuICAgIGRlYnVnID0gJ2RlYnVnJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICAgKi9cbiAgICBlcnJvciA9ICdlcnJvcicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICovXG4gICAgZW1wdHlDaGFubmVsID0gJ2VtcHR5Q2hhbm5lbCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqL1xuICAgIGVtcHR5UXVldWUgPSAnZW1wdHlRdWV1ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllclN0YXJ0ID0gJ3BsYXllclN0YXJ0JyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBlcnJvcnMgd2hpbGUgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICovXG4gICAgcGxheWVyRXJyb3IgPSAncGxheWVyRXJyb3InLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllckZpbmlzaCA9ICdwbGF5ZXJGaW5pc2gnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHNraXBzIGN1cnJlbnQgdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJTa2lwID0gJ3BsYXllclNraXAnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgICAqL1xuICAgIHBsYXllclRyaWdnZXIgPSAncGxheWVyVHJpZ2dlcicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgdm9pY2VTdGF0ZVVwZGF0ZSA9ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdm9sdW1lIGlzIHVwZGF0ZWRcbiAgICAgKi9cbiAgICB2b2x1bWVDaGFuZ2UgPSAndm9sdW1lQ2hhbmdlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHBhdXNlZFxuICAgICAqL1xuICAgIHBsYXllclBhdXNlID0gJ3BsYXllclBhdXNlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHJlc3VtZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJSZXN1bWUgPSAncGxheWVyUmVzdW1lJyxcbiAgICAvKipcbiAgICAgKiBCaXF1YWQgRmlsdGVycyBVcGRhdGVcbiAgICAgKi9cbiAgICBiaXF1YWRGaWx0ZXJzVXBkYXRlID0gJ2JpcXVhZEZpbHRlcnNVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIEVxdWFsaXplciBVcGRhdGVcbiAgICAgKi9cbiAgICBlcXVhbGl6ZXJVcGRhdGUgPSAnZXF1YWxpemVyVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBEU1AgdXBkYXRlXG4gICAgICovXG4gICAgZHNwVXBkYXRlID0gJ2RzcFVwZGF0ZScsXG4gICAgLyoqXG4gICAgICogQXVkaW8gRmlsdGVycyBVcGRhdGVcbiAgICAgKi9cbiAgICBhdWRpb0ZpbHRlcnNVcGRhdGUgPSAnYXVkaW9GaWx0ZXJzVXBkYXRlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVFdmVudHM8TWV0YSA9IHVua25vd24+IHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tBZGQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFja3MgYXJyYXlcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc0FkZDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2tbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrUmVtb3ZlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzUmVtb3ZlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFja1tdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb246IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3Q6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICovXG4gICAgZGVidWc6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgbWVzc2FnZTogc3RyaW5nKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcjogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBlcnJvcjogRXJyb3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgZW1wdHlDaGFubmVsOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGVtcHR5UXVldWU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgcGxheWVyU3RhcnQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgcGxheWVyRXJyb3I6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yLCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIHBsYXllckZpbmlzaDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgc2tpcHBlZFxuICAgICAqL1xuICAgIHBsYXllclNraXA6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgd2hpY2ggd2FzIHBsYXllZCBpbiB0aGlzIGV2ZW50XG4gICAgICovXG4gICAgcGxheWVyVHJpZ2dlcjogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2ssIHJlYXNvbjogUGxheWVyVHJpZ2dlcmVkUmVhc29uKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2Ugc3RhdGUgaXMgdXBkYXRlZC4gQ29uc3VtaW5nIHRoaXMgZXZlbnQgbWF5IGRpc2FibGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciBpZiBgUGxheWVyLmlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKWAgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAgICogQHBhcmFtIG5ld1N0YXRlIFRoZSBuZXcgdm9pY2Ugc3RhdGVcbiAgICAgKi9cbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHBhdXNlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIHBsYXllclBhdXNlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyByZXN1bWVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgcGxheWVyUmVzdW1lOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllcidzIHZvbHVtZSBpcyBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZFZvbHVtZSBUaGUgb2xkIHZvbHVtZVxuICAgICAqIEBwYXJhbSBuZXdWb2x1bWUgVGhlIHVwZGF0ZWQgdm9sdW1lXG4gICAgICovXG4gICAgdm9sdW1lQ2hhbmdlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZFZvbHVtZTogbnVtYmVyLCBuZXdWb2x1bWU6IG51bWJlcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZXF1YWxpemVyIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIGVxdWFsaXplclVwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10sIG5ld0ZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYmlxdWFkIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBiaXF1YWRGaWx0ZXJzVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsLCBuZXdGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbCkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZHNwIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBkc3BVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogUENNRmlsdGVyc1tdLCBuZXdGaWx0ZXJzOiBQQ01GaWx0ZXJzW10pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGZmbXBlZyBhdWRpbyBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgYXVkaW9GaWx0ZXJzVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IEZpbHRlcnNOYW1lW10sIG5ld0ZpbHRlcnM6IEZpbHRlcnNOYW1lW10pID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlPE1ldGEgPSB1bmtub3duPiB7XG4gICAgI3RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAjZGVsZXRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX19jdXJyZW50OiBUcmFjayB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyB0cmFja3M6IFF1ZXVlPFRyYWNrPjtcbiAgICBwdWJsaWMgaGlzdG9yeSA9IG5ldyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBub2RlID0gbmV3IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBmaWx0ZXJzID0gbmV3IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoKSA9PiBudWxsO1xuICAgIHB1YmxpYyBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciA9IGFzeW5jIChzdHJlYW0pID0+ICh7XG4gICAgICAgIHN0cmVhbSxcbiAgICAgICAgdHlwZTogU3RyZWFtVHlwZS5SYXdcbiAgICB9KTtcbiAgICBwdWJsaWMgcmVwZWF0TW9kZSA9IFF1ZXVlUmVwZWF0TW9kZS5PRkY7XG4gICAgcHVibGljIHRpbWVvdXRzID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBOb2RlSlMuVGltZW91dD4oKTtcbiAgICBwdWJsaWMgc3RhdHMgPSBuZXcgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHVibGljIG9wdGlvbnM6IEd1aWxkTm9kZUluaXQ8TWV0YT4pIHtcbiAgICAgICAgdGhpcy50cmFja3MgPSBuZXcgUXVldWU8VHJhY2s+KG9wdGlvbnMucXVldWVTdHJhdGVneSk7XG4gICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pKSB0aGlzLm9uQmVmb3JlQ3JlYXRlU3RyZWFtID0gb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbTtcbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtKSkgdGhpcy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtO1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVsbGlzaChvcHRpb25zLnJlcGVhdE1vZGUpKSB0aGlzLnJlcGVhdE1vZGUgPSBvcHRpb25zLnJlcGVhdE1vZGU7XG5cbiAgICAgICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcblxuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVsbGlzaCh0aGlzLm9wdGlvbnMuYmlxdWFkKSAmJiAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gdGhpcy5vcHRpb25zLmJpcXVhZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5maWx0ZXJlcikpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gdGhpcy5vcHRpb25zLmZpbHRlcmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5yZXNhbXBsZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSA9IHRoaXMub3B0aW9ucy5yZXNhbXBsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kZWJ1ZyhgR3VpbGRRdWV1ZSBpbml0aWFsaXplZCBmb3IgZ3VpbGQgJHt0aGlzLm9wdGlvbnMuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMub3B0aW9ucy5ndWlsZC5pZH0pYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWUgaW4gbXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc3RvcmUucmVkdWNlKChhLCBjKSA9PiBhICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXR0ZWQgZHVyYXRpb24gb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgcmVjZWl2ZXIgZm9yIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvaWNlUmVjZWl2ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LnJlY2VpdmVyID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBkZWJ1ZyBtZXNzYWdlIHRvIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbSBUaGUgbWVzc2FnZSB0byB3cml0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2RlYnVnJywgdGhpcywgbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG1ldGFkYXRhIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1ldGFkYXRhITtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IG1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbSBNZXRhZGF0YSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TWV0YWRhdGEobTogTWV0YSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBjdXJyZW50IHRyYWNrIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5fX2N1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoaXMgcXVldWUgd2FzIGRlbGV0ZWQgcHJldmlvdXNseVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVsZXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNoYW5uZWwgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2hhbm5lbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uY2hhbm5lbCB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY2hhbm5lbChjOiBWb2ljZUJhc2VkQ2hhbm5lbCB8IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbCA9IGM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb25uZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZ3VpbGQgdGhpcyBxdWV1ZSBiZWxvbmdzIHRvXG4gICAgICovXG4gICAgcHVibGljIGdldCBndWlsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ndWlsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0cmFuc2l0aW9uIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRUcmFuc2l0aW9uaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuI3RyYW5zaXRpb25pbmcgPSBzdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBpZiB0aGlzIHF1ZXVlIGlzIGN1cnJlbnRseSB1bmRlciB0cmFuc2l0aW9uIG1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUcmFuc2l0aW9uaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhbnNpdGlvbmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcmVwZWF0IG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgcmVwZWF0IG1vZGUgdG8gYXBwbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UmVwZWF0TW9kZShtb2RlOiBRdWV1ZVJlcGVhdE1vZGUpIHtcbiAgICAgICAgdGhpcy5yZXBlYXRNb2RlID0gbW9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgcXVldWUgaGFzIG5vIHRyYWNrcyBsZWZ0IGluIGl0XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGN1cnJlbnRseSBob2xkcyBhY3RpdmUgYXVkaW8gcmVzb3VyY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQbGF5aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlICE9IG51bGwgJiYgIXRoaXMuZGlzcGF0Y2hlci5hdWRpb1Jlc291cmNlLmVuZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0cmFjayB0byB0aGUgcXVldWUuIFRoaXMgd2lsbCBlbWl0IGBhdWRpb1RyYWNrc0FkZGAgd2hlbiBtdWx0aXBsZSB0cmFja3MgYXJlIGFkZGVkLCBvdGhlcndpc2UgYGF1ZGlvVHJhY2tBZGRgLlxuICAgICAqIEBwYXJhbSB0cmFjayBUcmFjayBvciBwbGF5bGlzdCBvciBhcnJheSBvZiB0cmFja3MgdG8gYWRkXG4gICAgICovXG4gICAgcHVibGljIGFkZFRyYWNrKHRyYWNrOiBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCkge1xuICAgICAgICBjb25zdCB0b0FkZCA9IHRyYWNrIGluc3RhbmNlb2YgUGxheWxpc3QgPyB0cmFjay50cmFja3MgOiB0cmFjaztcbiAgICAgICAgdGhpcy50cmFja3MuYWRkKHRvQWRkKTtcbiAgICAgICAgY29uc3QgaXNNdWx0aSA9IEFycmF5LmlzQXJyYXkodG9BZGQpO1xuXG4gICAgICAgIGlmIChpc011bHRpKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgnYXVkaW9UcmFja3NBZGQnLCB0aGlzLCB0b0FkZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgnYXVkaW9UcmFja0FkZCcsIHRoaXMsIHRvQWRkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHRyYWNrIGZyb20gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUucmVtb3ZlKHRyYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHRoZSB0cmFjayB0byB0aGUgZ2l2ZW4gaW5kZXhcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0cmFjayBhdCAoZGVmYXVsdHMgdG8gMClcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zZXJ0VHJhY2sodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBtb3ZlXG4gICAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRvXG4gICAgICovXG4gICAgcHVibGljIG1vdmVUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5tb3ZlKHRyYWNrLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gY2xvbmUgYXRcbiAgICAgKi9cbiAgICBwdWJsaWMgY29weVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGluZGV4ID0gMCk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmNvcHkodHJhY2ssIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHNyYyBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgICAqIEBwYXJhbSBkZXN0IFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgICAqL1xuICAgIHB1YmxpYyBzd2FwVHJhY2tzKHNyYzogVHJhY2tSZXNvbHZhYmxlLCBkZXN0OiBUcmFja1Jlc29sdmFibGUpOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5zd2FwKHNyYywgZGVzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gY2hhbm5lbFJlc29sdmFibGUgVGhlIHZvaWNlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgICAqIEBwYXJhbSBvcHRpb25zIEpvaW4gY29uZmlnXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QoY2hhbm5lbFJlc29sdmFibGU6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgb3B0aW9uczogVm9pY2VDb25uZWN0Q29uZmlnID0ge30pIHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWxSZXNvbHZhYmxlKTtcbiAgICAgICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgdm9pY2UgYmFzZWQgY2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSksIHJlY2VpdmVkICR7Y2hhbm5lbD8udHlwZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjaGFubmVsLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSA/ICdzdGFnZScgOiAndm9pY2UnfSBjaGFubmVsICR7Y2hhbm5lbC5uYW1lfSAoSUQ6ICR7Y2hhbm5lbC5pZH0pYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gYXdhaXQgdGhpcy5wbGF5ZXIudm9pY2VVdGlscy5jb25uZWN0KGNoYW5uZWwsIHtcbiAgICAgICAgICAgIGRlYWY6IG9wdGlvbnMuZGVhZiA/PyB0aGlzLm9wdGlvbnMuc2VsZkRlYWYgPz8gdHJ1ZSxcbiAgICAgICAgICAgIG1heFRpbWU6IG9wdGlvbnM/LnRpbWVvdXQgPz8gdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICAgICAgICBxdWV1ZTogdGhpcyxcbiAgICAgICAgICAgIGF1ZGlvUGxheWVyOiBvcHRpb25zPy5hdWRpb1BsYXllclxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgnY29ubmVjdGlvbicsIHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmNoYW5uZWwhLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGFubmVsIS5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRTdXBwcmVzc2VkKGZhbHNlKS5jYXRjaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4jYXR0YWNoTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gbGF0ZW5jeSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci5ub2Rlcy5kZWxldGUodGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuI2RlbGV0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2aXZlcyB0aGlzIHF1ZXVlXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmV2aXZlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGVsZXRlZCB8fCB0aGlzLnBsYXllci5ub2Rlcy5oYXModGhpcy5pZCkpIHJldHVybjtcbiAgICAgICAgdGhpcy4jZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5zZXQodGhpcy5pZCwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHNlbGYgZGVhZlxuICAgICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGZEZWFmKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0RGVhZihtb2RlLCByZWFzb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBzZWxmIG11dGVcbiAgICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTZWxmTXV0ZShtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldE11dGUobW9kZSwgcmVhc29uKTtcbiAgICB9XG5cbiAgICAjYXR0YWNoTGlzdGVuZXJzKGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZXJyb3InLCAoZSkgPT4gdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2Vycm9yJywgdGhpcywgZSkpO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdkZWJ1ZycsIChtKSA9PiB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgnZGVidWcnLCB0aGlzLCBtKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2ZpbmlzaCcsIChyKSA9PiB0aGlzLiNwZXJmb3JtRmluaXNoKHIpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignc3RhcnQnLCAocikgPT4gdGhpcy4jcGVyZm9ybVN0YXJ0KHIpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZHNwJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LmlzKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLCBmKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KCdkc3BVcGRhdGUnLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycywgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IGY7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdiaXF1YWQnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgIT09IGYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgnYmlxdWFkRmlsdGVyc1VwZGF0ZScsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQsIGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCA9IGY7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdlcUJhbmRzJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LmlzKGYsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2VxdWFsaXplclVwZGF0ZScsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsIGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciA9IGY7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCd2b2x1bWUnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgIT09IGYpIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KCd2b2x1bWVDaGFuZ2UnLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lLCBmKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSBmO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAjcmVtb3ZlTGlzdGVuZXJzKGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICAgICAgZGlzcGF0Y2hlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAjcGVyZm9ybVN0YXJ0KHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuaXNUcmFuc2l0aW9uaW5nKCkgPyAnZmlsdGVycycgOiAnbm9ybWFsJztcblxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgYFBsYXllciB0cmlnZ2VyZWQgZm9yIFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICB9KX1gXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ3BsYXllclRyaWdnZXInLCB0aGlzLCB0cmFjayEsIHJlYXNvbik7XG4gICAgICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSkgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ3BsYXllclN0YXJ0JywgdGhpcywgdHJhY2spO1xuICAgICAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIH1cblxuICAgICNwZXJmb3JtRmluaXNoKHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgIGBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICAgICAgICAgIGlzVHJhbnNpdGlvbk1vZGU6IHRoaXMuaXNUcmFuc2l0aW9uaW5nKClcbiAgICAgICAgICAgIH0pfSB3YXMgbWFya2VkIGFzIGZpbmlzaGVkYFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnQWRkaW5nIHRyYWNrIHRvIGhpc3RvcnkgYW5kIGVtaXR0aW5nIGZpbmlzaCBldmVudCBzaW5jZSB0cmFuc2l0aW9uIG1vZGUgaXMgZGlzYWJsZWQuLi4nKTtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMubm9kZS5yZXNldFByb2dyZXNzKCk7XG4gICAgICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdCgncGxheWVyRmluaXNoJywgdGhpcywgdHJhY2spO1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ05vIG1vcmUgdHJhY2tzIGxlZnQgaW4gdGhlIHF1ZXVlIHRvIHBsYXkgYW5kIHJlcGVhdCBtb2RlIGlzIG9mZiwgaW5pdGlhdGluZyAjZW1pdEVuZCgpJyk7XG4gICAgICAgICAgICAgICAgdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuVFJBQ0spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19jdXJyZW50ID0gdGhpcy5oaXN0b3J5LnRyYWNrcy5kaXNwYXRjaCgpIHx8IHRyYWNrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQhLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBxdWV1ZSwgbW92aW5nIGxhc3QgdHJhY2sgZnJvbSB0aGUgaGlzdG9yeSB0byBjdXJyZW50IHF1ZXVlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhY2tzLmFkZCh0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudHJhY2tzLnNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLkFVVE9QTEFZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gYXV0b3BsYXksIGluaXRpYXRpbmcgYXV0b3BsYXkgaGFuZGxlci4uLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jaGFuZGxlQXV0b3BsYXkodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnSW5pdGlhbGl6aW5nIG5leHQgdHJhY2sgb2YgdGhlIHF1ZXVlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19jdXJyZW50ID0gdGhpcy50cmFja3MuZGlzcGF0Y2goKSE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgI2VtaXRFbmQoKSB7XG4gICAgICAgIHRoaXMuX19jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2VtcHR5UXVldWUnLCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja3Muc2l6ZSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duKS51bnJlZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgI2hhbmRsZUF1dG9wbGF5KHRyYWNrOiBUcmFjaykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRmluZGluZyByZWxhdGVkIHRyYWNrcyBmb3IgVHJhY2sgJHt0cmFjay50aXRsZX0gKCR7dHJhY2sudXJsfSkgW2V4dDoke3RyYWNrLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ31dYCk7XG4gICAgICAgICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgICAgICAgICAgIChhd2FpdCB0cmFjay5leHRyYWN0b3I/LmdldFJlbGF0ZWRUcmFja3ModHJhY2spKT8udHJhY2tzIHx8XG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4dC5nZXRSZWxhdGVkVHJhY2tzKHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLnRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZmFpbGVkIHRvIHByb3ZpZGUgcmVzdWx0cy5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBzdWNjZXNzZnVsbHkgcmV0dXJuZWQgcmVzdWx0cy5gKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy50cmFja3M7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKT8ucmVzdWx0O1xuICAgICAgICAgICAgaWYgKCF0cmFja3M/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IE5vIHJlbGF0ZWQgdHJhY2tzIGZvdW5kLmApO1xuICAgICAgICAgICAgICAgIHRocm93ICdubyByZWxhdGVkIHRyYWNrcyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IFBpY2tpbmcgcmFuZG9tIHRyYWNrIGZyb20gZmlyc3QgNSB0cmFja3MuLi5gKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRUcmFjayA9IFV0aWwucmFuZG9tQ2hvaWNlKHRyYWNrcy5zbGljZSgwLCA1KSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5vZGUucGxheShuZXh0VHJhY2ssIHtcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VlazogMCxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBQbGF5bGlzdEluaXREYXRhLCBQbGF5bGlzdEpTT04sIFRyYWNrSlNPTiwgVHJhY2tTb3VyY2UgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBQbGF5bGlzdCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuICAgIHB1YmxpYyB0cmFja3M6IFRyYWNrW107XG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIHB1YmxpYyB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgICBwdWJsaWMgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgICBwdWJsaWMgYXV0aG9yOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgdXJsOiBzdHJpbmc7XG4gICAgfTtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuICAgIC8qKlxuICAgICAqIFBsYXlsaXN0IGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyXG4gICAgICogQHBhcmFtIHtQbGF5bGlzdEluaXREYXRhfSBkYXRhIFRoZSBkYXRhXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5ZXJcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjcGxheWVyXG4gICAgICAgICAqIEB0eXBlIHtQbGF5ZXJ9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0cmFja3MgaW4gdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN0cmFja3NcbiAgICAgICAgICogQHR5cGUge1RyYWNrW119XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyYWNrcyA9IGRhdGEudHJhY2tzID8/IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXV0aG9yIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjYXV0aG9yXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjZGVzY3JpcHRpb25cbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdGh1bWJuYWlsIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdGh1bWJuYWlsXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgdHlwZTpcbiAgICAgICAgICogLSBgYWxidW1gXG4gICAgICAgICAqIC0gYHBsYXlsaXN0YFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN0eXBlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBkYXRhLnR5cGU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzb3VyY2Ugb2YgdGhpcyBwbGF5bGlzdDpcbiAgICAgICAgICogLSBgeW91dHViZWBcbiAgICAgICAgICogLSBgc291bmRjbG91ZGBcbiAgICAgICAgICogLSBgc3BvdGlmeWBcbiAgICAgICAgICogLSBgYXJiaXRyYXJ5YFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNzb3VyY2VcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc291cmNlID0gZGF0YS5zb3VyY2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNpZFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdXJsXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNyYXdQbGF5bGlzdFxuICAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgfVxuXG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCogdGhpcy50cmFja3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MucmVkdWNlKChwLCBjKSA9PiBwICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXR0ZWQgZXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgICAgICByZXR1cm4gVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0aGlzLmVzdGltYXRlZER1cmF0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBbd2l0aFRyYWNrcz10cnVlXSBJZiBpdCBzaG91bGQgYnVpbGQganNvbiB3aXRoIHRyYWNrc1xuICAgICAqIEByZXR1cm5zIHtQbGF5bGlzdEpTT059XG4gICAgICovXG4gICAgdG9KU09OKHdpdGhUcmFja3MgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgICAgICAgdHJhY2tzOiBbXSBhcyBUcmFja0pTT05bXVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh3aXRoVHJhY2tzKSBwYXlsb2FkLnRyYWNrcyA9IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpO1xuXG4gICAgICAgIHJldHVybiBwYXlsb2FkIGFzIFBsYXlsaXN0SlNPTjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUXVldWUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgdHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPignTElGTycpO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHt9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFRyYWNrKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCAoKHRoaXMucXVldWUgYXMgYW55KS5fX2N1cnJlbnQgYXMgVHJhY2sgfCBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmV4dFRyYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHByZXZpb3VzVHJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGhpc3RvcnkgaXMgZGlzYWJsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVIaXN0b3J5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBoaXN0b3J5IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdHJhY2sgdG8gdHJhY2sgaGlzdG9yeVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYWRkXG4gICAgICovXG4gICAgcHVibGljIHB1c2godHJhY2s6IFRyYWNrIHwgVHJhY2tbXSkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnRyYWNrcy5hZGQodHJhY2spO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBoaXN0b3J5XG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnRyYWNrcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhlIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy5uZXh0VHJhY2s7XG4gICAgICAgIGlmICghdHJhY2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gbmV4dCB0cmFjayBpbiB0aGUgcXVldWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVldWUubm9kZS5za2lwKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHByZXZpb3VzKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudFRyYWNrO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgcHJlc2VydmVDdXJyZW50KSB0aGlzLnF1ZXVlLm5vZGUuaW5zZXJ0KGN1cnJlbnQsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsaWFzIHRvIFtHdWlsZFF1ZXVlSGlzdG9yeV0ucHJldmlvdXMoKVxuICAgICAqL1xuICAgIHB1YmxpYyBiYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91cygpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBdWRpb1Jlc291cmNlLCBTdHJlYW1UeXBlIH0gZnJvbSAnQGRpc2NvcmRqcy92b2ljZSc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyB3YWl0Rm9yIH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcblxuZXhwb3J0IGNvbnN0IEZGTVBFR19TUkFURV9SRUdFWCA9IC9hc2V0cmF0ZT1cXGQrXFwqKFxcZChcXC5cXGQpPykvO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlUGxheU9wdGlvbnMge1xuICAgIHF1ZXVlPzogYm9vbGVhbjtcbiAgICBzZWVrPzogbnVtYmVyO1xuICAgIHRyYW5zaXRpb25Nb2RlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJUaW1lc3RhbXAge1xuICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICB9O1xuICAgIHRvdGFsOiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgfTtcbiAgICBwcm9ncmVzczogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YSA9IHVua25vd24+IHtcbiAgICAjcHJvZ3Jlc3MgPSAwO1xuICAgIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaW4gaWRsZSBtb2RlXG4gICAgICovXG4gICAgcHVibGljIGlzSWRsZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0lkbGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmcgdGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGlzQnVmZmVyaW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzQnVmZmVyaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZyBhIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BsYXlpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwYXVzZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQYXVzZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBwcm9ncmVzcyBoaXN0b3J5XG4gICAgICovXG4gICAgcHVibGljIHJlc2V0UHJvZ3Jlc3MoKSB7XG4gICAgICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcGxheWVyIHByb2dyZXNzXG4gICAgICovXG4gICAgcHVibGljIHNldFByb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RyZWFtIHRpbWUgZm9yIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uc3RyZWFtVGltZSA/PyAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgcGxheWJhY2sgZHVyYXRpb24gd2l0aCBoaXN0b3J5IGluY2x1ZGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBwbGF5YmFja1RpbWUoKSB7XG4gICAgICAgIGNvbnN0IGR1ciA9IHRoaXMuI3Byb2dyZXNzICsgdGhpcy5zdHJlYW1UaW1lO1xuXG4gICAgICAgIHJldHVybiBkdXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGR1cmF0aW9uIG11bHRpcGxpZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkge1xuICAgICAgICBjb25zdCBzcmF0ZUZpbHRlcnMgPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLnRvQXJyYXkoKS5maWx0ZXIoKGZmKSA9PiBGRk1QRUdfU1JBVEVfUkVHRVgudGVzdChmZikpO1xuICAgICAgICBjb25zdCBtdWx0aXBsaWVycyA9IHNyYXRlRmlsdGVyc1xuICAgICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KEZGTVBFR19TUkFURV9SRUdFWC5leGVjKG0pPy5bMV0gYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKChmKSA9PiAhaXNOYU4oZikpO1xuXG4gICAgICAgIHJldHVybiAhbXVsdGlwbGllcnMubGVuZ3RoID8gMSA6IG11bHRpcGxpZXJzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGN1cnJlbnQgKyBhY2N1bXVsYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIHByb2dyZXNzIG9mIHRoZSBwbGF5ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZFBsYXliYWNrVGltZSgpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy5wbGF5YmFja1RpbWU7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkgKiBkdXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWVyXG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s/LmR1cmF0aW9uTVMgPz8gMDtcblxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkdXIgLyB0aGlzLmdldER1cmF0aW9uTXVsdGlwbGllcigpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc3RyZWFtIHByb2dyZXNzXG4gICAgICogQHBhcmFtIGlnbm9yZUZpbHRlcnMgSWdub3JlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IFBsYXllclRpbWVzdGFtcCB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gaWdub3JlRmlsdGVycyA/IHRoaXMucGxheWJhY2tUaW1lIDogdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWU7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gaWdub3JlRmlsdGVycyA/IHRoaXMucXVldWUuY3VycmVudFRyYWNrLmR1cmF0aW9uTVMgOiB0aGlzLmVzdGltYXRlZER1cmF0aW9uO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjdXJyZW50OiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVMoY3VycmVudCkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjdXJyZW50XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdG90YWw6IHtcbiAgICAgICAgICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0b3RhbCkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0b3RhbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb2dyZXNzOiBNYXRoLnJvdW5kKChjdXJyZW50IC8gdG90YWwpICogMTAwKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBwcm9ncmVzcyBiYXIgZm9yIGN1cnJlbnQgcHJvZ3Jlc3NcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQcm9ncmVzcyBiYXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQcm9ncmVzc0JhcihvcHRpb25zPzogUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuZ2V0VGltZXN0YW1wKCk7XG4gICAgICAgIGlmICghdGltZXN0YW1wKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB7IGluZGljYXRvciA9ICdcdUQ4M0RcdUREMTgnLCBsZW5ndGggPSAxNSwgbGluZSA9ICdcdTI1QUMnLCB0aW1lY29kZXMgPSB0cnVlIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpIHx8IGxlbmd0aCA8IDAgfHwgIU51bWJlci5pc0Zpbml0ZShsZW5ndGgpKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJvZ3Jlc3NiYXIgbGVuZ3RoJyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5yb3VuZCgodGltZXN0YW1wLmN1cnJlbnQudmFsdWUgLyB0aW1lc3RhbXAudG90YWwudmFsdWUpICogbGVuZ3RoKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMSAmJiBpbmRleCA8PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhciA9IGxpbmUucmVwZWF0KGxlbmd0aCAtIDEpLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIGJhci5zcGxpY2UoaW5kZXgsIDAsIGluZGljYXRvcik7XG4gICAgICAgICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSBcdTI1MDMgJHtiYXIuam9pbignJyl9IFx1MjUwMyAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7YmFyLmpvaW4oJycpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSBcdTI1MDMgJHtpbmRpY2F0b3J9JHtsaW5lLnJlcGVhdChsZW5ndGggLSAxKX0gXHUyNTAzICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHtpbmRpY2F0b3J9JHtsaW5lLnJlcGVhdChsZW5ndGggLSAxKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VlayB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlZWsoZHVyYXRpb246IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXVlLmZpbHRlcnMudHJpZ2dlclJlcGxheShkdXJhdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCB2b2x1bWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9sdW1lID8/IDEwMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdm9sdW1lXG4gICAgICogQHBhcmFtIHZvbCBWb2x1bWUgYW1vdW50IHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnNldFZvbHVtZSh2b2wpO1xuICAgICAgICBpZiAocmVzKSB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gdm9sO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBiaXQgcmF0ZVxuICAgICAqIEBwYXJhbSByYXRlIFRoZSBiaXQgcmF0ZSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Qml0cmF0ZShyYXRlOiBudW1iZXIgfCAnYXV0bycpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5lbmNvZGVyPy5zZXRCaXRyYXRlKHJhdGUgPT09ICdhdXRvJyA/IHRoaXMucXVldWUuY2hhbm5lbD8uYml0cmF0ZSA/PyA2NDAwMCA6IHJhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBwYXVzZWQgc3RhdGVcbiAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlXG4gICAgICovXG4gICAgcHVibGljIHNldFBhdXNlZChzdGF0ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3RhdGUpIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBhdXNlKHRydWUpIHx8IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXN1bWUoKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgcGxheWJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFBhdXNlZCh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN1bWUgdGhlIHBsYXliYWNrXG4gICAgICovXG4gICAgcHVibGljIHJlc3VtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTa2lwIGN1cnJlbnQgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc2tpcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIHRyYWNrIGZyb20gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmUodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBmb3VuZFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZmluZCgodCwgaWR4KSA9PiB7XG4gICAgICAgICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZvdW5kVHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnJlbW92ZU9uZSgodCkgPT4gdC5pZCA9PT0gZm91bmRUcmFjay5pZCk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2F1ZGlvVHJhY2tSZW1vdmUnLCB0aGlzLnF1ZXVlLCBmb3VuZFRyYWNrKTtcblxuICAgICAgICByZXR1cm4gZm91bmRUcmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHNwZWNpZmljIHRyYWNrIG9uIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8ganVtcCB0byB3aXRob3V0IHJlbW92aW5nIG90aGVyIHRyYWNrc1xuICAgICAqL1xuICAgIHB1YmxpYyBqdW1wKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKHRyYWNrKTtcbiAgICAgICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnVuc2hpZnQocmVtb3ZlZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNraXAoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdHJhY2sgcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldFRyYWNrUG9zaXRpb24odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy50b0FycmF5KCkuZmluZEluZGV4KCh0LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycgPyB0cmFjayA6IHRyYWNrLmlkKSA9PT0gdC5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSByZXR1cm4gdHJhY2sgPT09IHQuaWQ7XG4gICAgICAgICAgICByZXR1cm4gaWR4ID09PSB0cmFjaztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2tpcCB0byB0aGUgZ2l2ZW4gdHJhY2ssIHJlbW92aW5nIG90aGVycyBvbiB0aGUgd2F5XG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBza2lwIHRvXG4gICAgICovXG4gICAgcHVibGljIHNraXBUbyh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbih0cmFjayk7XG4gICAgICAgIGlmIChpZHggPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShpZHgpO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5maWx0ZXIoKF8sIGkpID0+IGkgPD0gaWR4KTtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKDAsIGlkeCwgcmVtb3ZlZCk7XG4gICAgICAgIHRoaXMucXVldWUucGxheWVyLmV2ZW50cy5lbWl0KCdhdWRpb1RyYWNrc1JlbW92ZScsIHRoaXMucXVldWUsIHRvUmVtb3ZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBhIHRyYWNrIG9uIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdG8sIGRlZmF1bHRzIHRvIDAuXG4gICAgICovXG4gICAgcHVibGljIGluc2VydCh0cmFjazogVHJhY2ssIGluZGV4ID0gMCkge1xuICAgICAgICBpZiAoISh0cmFjayBpbnN0YW5jZW9mIFRyYWNrKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRyYWNrJyk7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHRoaXMucXVldWUucGxheWVyLmV2ZW50cy5lbWl0KCdhdWRpb1RyYWNrQWRkJywgdGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGZyb20pO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0cmFjayB0byBtb3ZlJyk7XG4gICAgICAgIHRoaXMuaW5zZXJ0KHJlbW92ZWQsIHRvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIGNsb25lXG4gICAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgICAqL1xuICAgIHB1YmxpYyBjb3B5KGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgICAgICBjb25zdCBzcmMgPSB0aGlzLnF1ZXVlLnRyYWNrcy5hdCh0aGlzLmdldFRyYWNrUG9zaXRpb24oZnJvbSkpO1xuICAgICAgICBpZiAoIXNyYykgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRyYWNrIHRvIGNvcHknKTtcbiAgICAgICAgdGhpcy5pbnNlcnQoc3JjLCB0byk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmaXJzdCBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgICAqIEBwYXJhbSBzZWNvbmQgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAgICovXG4gICAgcHVibGljIHN3YXAoZmlyc3Q6IFRyYWNrUmVzb2x2YWJsZSwgc2Vjb25kOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3Qgc3JjID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZpcnN0KTtcbiAgICAgICAgaWYgKHNyYyA8IDApIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzcmMgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgICAgIGNvbnN0IGRlc3QgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oc2Vjb25kKTtcbiAgICAgICAgaWYgKGRlc3QgPCAwKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGVzdCB0cmFjayB0byBzd2FwJyk7XG5cbiAgICAgICAgY29uc3Qgc3JjVCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY107XG4gICAgICAgIGNvbnN0IGRlc3RUID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF07XG5cbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbc3JjXSA9IGRlc3RUO1xuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XSA9IHNyY1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcCB0aGUgcGxheWJhY2tcbiAgICAgKiBAcGFyYW0gZm9yY2UgV2hldGhlciBvciBub3QgdG8gZm9yY2VmdWxseSBzdG9wIHRoZSBwbGF5YmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBzdG9wKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3MuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucXVldWUub3B0aW9ucy5sZWF2ZU9uU3RvcCkge1xuICAgICAgICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkgfHwgdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9LCB0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bikudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHJhdyBhdWRpbyByZXNvdXJjZVxuICAgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5UmF3KHJlc291cmNlOiBBdWRpb1Jlc291cmNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucGxheVN0cmVhbShyZXNvdXJjZSBhcyBBdWRpb1Jlc291cmNlPFRyYWNrPik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICAgKiBAcGFyYW0gcmVzIFRoZSB0cmFjayB0byBwbGF5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWluZyB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheShyZXM/OiBUcmFjayB8IG51bGwsIG9wdGlvbnM/OiBSZXNvdXJjZVBsYXlPcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoYFJlY2VpdmVkIHBsYXkgcmVxdWVzdCBmcm9tIGd1aWxkICR7dGhpcy5xdWV1ZS5ndWlsZC5uYW1lfSAoSUQ6ICR7dGhpcy5xdWV1ZS5ndWlsZC5pZH0pYCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBxdWV1ZTogdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2sgIT0gbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VlazogMFxuICAgICAgICAgICAgfSBhcyBSZXNvdXJjZVBsYXlPcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICApITtcblxuICAgICAgICBpZiAocmVzICYmIG9wdGlvbnMucXVldWUpIHtcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcXVldWUgdGhlIHRyYWNrLCBhZGRpbmcgdGhlIGdpdmVuIHRyYWNrIHRvIHF1ZXVlIGluc3RlYWQuLi4nKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmFkZFRyYWNrKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFjayA9IHJlcyB8fCB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLnNraXBPbk5vU3RyZWFtKSByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsYXkgcmVxdWVzdCByZWNlaXZlZCBidXQgdHJhY2sgd2FzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBwbGF5IHRoZSB0cmFjaywgaW5pdGlhbGl6aW5nLi4uJyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYEluaXRpYXRpbmcgc3RyZWFtIGV4dHJhY3Rpb24gcHJvY2Vzcy4uLmApO1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gdHJhY2sucmF3Py5zb3VyY2UgfHwgdHJhY2suc291cmNlO1xuICAgICAgICAgICAgY29uc3QgcXQ6IFNlYXJjaFF1ZXJ5VHlwZSA9IHRyYWNrLnF1ZXJ5VHlwZSB8fCAoc3JjID09PSAnc3BvdGlmeScgPyAnc3BvdGlmeVNvbmcnIDogc3JjID09PSAnYXBwbGVfbXVzaWMnID8gJ2FwcGxlTXVzaWNTb25nJyA6IHNyYyk7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBFeGVjdXRpbmcgb25CZWZvcmVDcmVhdGVTdHJlYW0gaG9vayAoUXVlcnlUeXBlOiAke3F0fSkuLi5gKTtcblxuICAgICAgICAgICAgY29uc3Qgc3RyZWFtU3JjID0ge1xuICAgICAgICAgICAgICAgIGVycm9yOiBudWxsIGFzIEVycm9yIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBzdHJlYW06IG51bGwgYXMgUmVhZGFibGUgfCBudWxsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm9uQmVmb3JlQ3JlYXRlU3RyZWFtPy4odHJhY2ssIHF0IHx8ICdhcmJpdHJhcnknLCB0aGlzLnF1ZXVlKS50aGVuKFxuICAgICAgICAgICAgICAgIChzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGU6IEVycm9yKSA9PiAoc3RyZWFtU3JjLmVycm9yID0gZSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgICAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIGRpZCBub3QgcGFuaWNcbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoJ0ZhaWxlZCB0byBnZXQgc3RyZWFtIGZyb20gb25CZWZvcmVDcmVhdGVTdHJlYW0hJyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jY3JlYXRlR2VuZXJpY1N0cmVhbSh0cmFjaykudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyPy5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gPFJlYWRhYmxlPnIucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHI/LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLmVycm9yID0gci5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSBzdHJlYW1TcmMuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoZTogRXJyb3IpID0+IChzdHJlYW1TcmMuZXJyb3IgPSBlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VlayA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5zZWVrID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IG9wdGlvbnMuc2VlaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgY29uc3QgY29va2llcyA9IHRyYWNrLnJhdz8uc291cmNlID09PSAneW91dHViZScgPyAoPGFueT50aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnl0ZGxPcHRpb25zPy5yZXF1ZXN0T3B0aW9ucyk/LmhlYWRlcnM/LmNvb2tpZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHBjbVN0cmVhbSA9IHRoaXMuI2NyZWF0ZUZGbXBlZ1N0cmVhbShzdHJlYW1TcmMuc3RyZWFtLCB0cmFjaywgb3B0aW9ucy5zZWVrID8/IDAsIGNvb2tpZXMpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uTW9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYFRyYW5zaXRpb24gbW9kZSBkZXRlY3RlZCwgcGxheWVyIHdpbGwgd2FpdCBmb3IgYnVmZmVyaW5nIHRpbWVvdXQgdG8gZXhwaXJlIChUaW1lb3V0OiAke3RoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0fW1zKWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhaXRGb3IodGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoJ0J1ZmZlcmluZyB0aW1lb3V0IGhhcyBleHBpcmVkIScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBQcmVwYXJpbmcgZmluYWwgc3RyZWFtIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUJpcXVhZDogdGhpcy5xdWV1ZS5vcHRpb25zLmJpcXVhZCA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZXF1YWxpemVyID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVWb2x1bWU6IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUZpbHRlcnM6IHRoaXMucXVldWUub3B0aW9ucy5maWx0ZXJlciA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGU6IHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSAnbnVtYmVyJyAmJiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID4gMCA/IHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBiaXF1YWRGaWx0ZXI6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXE6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyczogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uTW9kZTogISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmZtcGVnRmlsdGVyczogdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vlazogb3B0aW9ucy5zZWVrXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICApfWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmNyZWF0ZVN0cmVhbShwY21TdHJlYW0sIHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlQmlxdWFkOiB0aGlzLnF1ZXVlLm9wdGlvbnMuYmlxdWFkID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZXF1YWxpemVyID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlVm9sdW1lOiB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlRmlsdGVyczogdGhpcy5xdWV1ZS5vcHRpb25zLmZpbHRlcmVyID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSBmYWxzZSxcbiAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOiB0eXBlb2YgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA9PT0gJ251bWJlcicgJiYgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA+IDAgPyB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGJpcXVhZEZpbHRlcjogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXE6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsXG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLFxuICAgICAgICAgICAgICAgIHZvbHVtZTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSxcbiAgICAgICAgICAgICAgICBkYXRhOiB0cmFjayxcbiAgICAgICAgICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhd1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyghIW9wdGlvbnMudHJhbnNpdGlvbk1vZGUpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwZXJmb3JtUGxheShyZXNvdXJjZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYEZhaWxlZCB0byBpbml0aWFsaXplIGF1ZGlvIHBsYXllcjogJHtlfWApO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgICN0aHJvdyh0cmFjazogVHJhY2ssIGVycm9yPzogRXJyb3IgfCBudWxsKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBjb25zdCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQgPSAoXG4gICAgICAgICAgICBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IHN0cmVhbSBmb3IgdGhpcyB0cmFjayR7ZXJyb3IgPyBgXFxuXFxuJHtlcnJvci5zdGFjayB8fCBlcnJvcn1gIDogJyd9YClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLnNraXBPbk5vU3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnBsYXllci5ldmVudHMuZW1pdCgncGxheWVyU2tpcCcsIHRoaXMucXVldWUsIHRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMucXVldWUucGxheWVyLmV2ZW50cy5lbWl0KCdwbGF5ZXJFcnJvcicsIHRoaXMucXVldWUsIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCwgdHJhY2spO1xuICAgICAgICAgICAgY29uc3QgbmV4dFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICAgICAgICAgIGlmIChuZXh0VHJhY2spIHRoaXMucGxheShuZXh0VHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0O1xuICAgIH1cblxuICAgIGFzeW5jICNwZXJmb3JtUGxheShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhbGl6aW5nIGF1ZGlvIHBsYXllci4uLicpO1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIhLnBsYXlTdHJlYW0ocmVzb3VyY2UpO1xuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNwYXRjaGluZyBhdWRpby4uLicpO1xuICAgIH1cblxuICAgIGFzeW5jICNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrOiBUcmFjaykge1xuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLmJsb2NrU3RyZWFtRnJvbT8uc29tZSgoZXh0KSA9PiBleHQgPT09IGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY2FuU3RyZWFtID0gYXdhaXQgZXh0cmFjdG9yLnZhbGlkYXRlKHRyYWNrLnVybCwgdHJhY2sucXVlcnlUeXBlIHx8IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZSh0cmFjay51cmwpKTtcbiAgICAgICAgICAgIGlmICghY2FuU3RyZWFtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZXh0cmFjdG9yLnN0cmVhbSh0cmFjayk7XG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgaWYgKCFzdHJlYW1JbmZvIHx8ICFzdHJlYW1JbmZvLnJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgKTtcbiAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmZvIHx8IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBTdHJlYW0gZXh0cmFjdGlvbiB3YXMgc3VjY2Vzc2Z1bCBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gKEV4dHJhY3RvcjogJHtzdHJlYW1JbmZvLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ30pYCk7XG5cbiAgICAgICAgcmV0dXJuIHN0cmVhbUluZm87XG4gICAgfVxuXG4gICAgI2NyZWF0ZUZGbXBlZ1N0cmVhbShzdHJlYW06IFJlYWRhYmxlIHwgc3RyaW5nLCB0cmFjazogVHJhY2ssIHNlZWsgPSAwLCBjb29raWVzPzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZmbXBlZ1N0cmVhbSA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWdcbiAgICAgICAgICAgIC5jcmVhdGVTdHJlYW0oc3RyZWFtLCB7XG4gICAgICAgICAgICAgICAgZW5jb2RlckFyZ3M6IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuZmlsdGVycy5sZW5ndGggPyBbJy1hZicsIHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcudG9TdHJpbmcoKV0gOiBbXSxcbiAgICAgICAgICAgICAgICBzZWVrOiBzZWVrIC8gMTAwMCxcbiAgICAgICAgICAgICAgICBmbXQ6ICdzMTZsZScsXG4gICAgICAgICAgICAgICAgY29va2llc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbSA9IGAke2Vycn1gLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBTdHJlYW0gY2xvc2VkIGR1ZSB0byBhbiBlcnJvciBmcm9tIEZGbXBlZyBzdHJlYW06ICR7ZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlIHx8IGVycn1gKTtcblxuICAgICAgICAgICAgICAgIGlmIChtLmluY2x1ZGVzKCdwcmVtYXR1cmUgY2xvc2UnKSB8fCBtLmluY2x1ZGVzKCdlcGlwZScpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnBsYXllci5ldmVudHMuZW1pdCgncGxheWVyRXJyb3InLCB0aGlzLnF1ZXVlLCBlcnIsIHRyYWNrKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmZm1wZWdTdHJlYW07XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFlvdVR1YmUgfSBmcm9tICd5b3V0dWJlLXNyJztcbmltcG9ydCB7IFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCAqIGFzIHNvdW5kY2xvdWQgZnJvbSAnc291bmRjbG91ZC1zY3JhcGVyJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi9UeXBlVXRpbCc7XG5cbi8vICNyZWdpb24gc2NhcnkgdGhpbmdzIGJlbG93ICpzaWdoKlxuY29uc3Qgc3BvdGlmeVNvbmdSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoPzp0cmFja1xcL3xcXD91cmk9c3BvdGlmeTp0cmFjazopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5UGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoPzpwbGF5bGlzdFxcL3xcXD91cmk9c3BvdGlmeTpwbGF5bGlzdDopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5QWxidW1SZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoPzphbGJ1bVxcL3xcXD91cmk9c3BvdGlmeTphbGJ1bTopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCB2aW1lb1JlZ2V4ID0gL14oaHR0cHxodHRwcyk/OlxcL1xcLyh3d3dcXC58cGxheWVyXFwuKT92aW1lb1xcLmNvbVxcLyg/OmNoYW5uZWxzXFwvKD86XFx3K1xcLyk/fGdyb3Vwc1xcLyhbXi9dKilcXC92aWRlb3NcXC98dmlkZW9cXC98KShcXGQrKSg/OnxcXC9cXD8pJC87XG5jb25zdCByZXZlcmJuYXRpb25SZWdleCA9IC9eaHR0cHM6XFwvXFwvKHd3dy4pP3JldmVyYm5hdGlvbi5jb21cXC8oLispXFwvc29uZ1xcLyguKykkLztcbmNvbnN0IGF0dGFjaG1lbnRSZWdleCA9IC9eaHR0cHM/OlxcL1xcLy4rJC87XG5jb25zdCBhcHBsZU11c2ljU29uZ1JlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcLyhzb25nfGFsYnVtKVxcLy4rPyhcXC8uKz9cXD9pPXxcXC8pKFswLTldKykkLztcbmNvbnN0IGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL3BsYXlsaXN0XFwvLitcXC9wbFxcLih1LSk/W2EtekEtWjAtOV0rJC87XG5jb25zdCBhcHBsZU11c2ljQWxidW1SZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC9hbGJ1bVxcLy4rXFwvKFswLTldKykkLztcbi8vICNlbmRyZWdpb24gc2NhcnkgdGhpbmdzIGFib3ZlICpzaWdoKlxuXG5jbGFzcyBRdWVyeVJlc29sdmVyIHtcbiAgICAvKipcbiAgICAgKiBRdWVyeSByZXNvbHZlclxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGdldCByZWdleCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNwb3RpZnlBbGJ1bVJlZ2V4LFxuICAgICAgICAgICAgc3BvdGlmeVBsYXlsaXN0UmVnZXgsXG4gICAgICAgICAgICBzcG90aWZ5U29uZ1JlZ2V4LFxuICAgICAgICAgICAgdmltZW9SZWdleCxcbiAgICAgICAgICAgIHJldmVyYm5hdGlvblJlZ2V4LFxuICAgICAgICAgICAgYXR0YWNobWVudFJlZ2V4LFxuICAgICAgICAgICAgYXBwbGVNdXNpY0FsYnVtUmVnZXgsXG4gICAgICAgICAgICBhcHBsZU11c2ljUGxheWxpc3RSZWdleCxcbiAgICAgICAgICAgIGFwcGxlTXVzaWNTb25nUmVnZXhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIGZhbGxiYWNrU2VhcmNoRW5naW5lOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0gPSBRdWVyeVR5cGUuQVVUT19TRUFSQ0gpOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0ge1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzU3RyaW5nKHF1ZXJ5KSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBxdWVyeSAke3R5cGVvZiBxdWVyeX0sIGV4cGVjdGVkIGEgc3RyaW5nLmApO1xuICAgICAgICBpZiAoIXF1ZXJ5Lmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdRdWVyeSBpcyByZXF1aXJlZCEnKTtcbiAgICAgICAgcXVlcnkgPSAhcXVlcnkuaW5jbHVkZXMoJ3lvdXR1YmUuY29tJykgPyBxdWVyeS50cmltKCkgOiBxdWVyeS5yZXBsYWNlKC8obSh1c2ljKT98Z2FtaW5nKVxcLi8sICcnKS50cmltKCk7XG5cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBpZiAoKHNvdW5kY2xvdWQudmFsaWRhdGVVUkwgfHwgc291bmRjbG91ZC5kZWZhdWx0LnZhbGlkYXRlVVJMKShxdWVyeSwgJ3RyYWNrJykpIHJldHVybiBRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSztcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBpZiAoKHNvdW5kY2xvdWQudmFsaWRhdGVVUkwgfHwgc291bmRjbG91ZC5kZWZhdWx0LnZhbGlkYXRlVVJMKShxdWVyeSwgJ3BsYXlsaXN0JykgfHwgcXVlcnkuaW5jbHVkZXMoJy9zZXRzLycpKSByZXR1cm4gUXVlcnlUeXBlLlNPVU5EQ0xPVURfUExBWUxJU1Q7XG4gICAgICAgIGlmIChZb3VUdWJlLmlzUGxheWxpc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1Q7XG4gICAgICAgIGlmIChRdWVyeVJlc29sdmVyLnZhbGlkYXRlSWQocXVlcnkpIHx8IFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVVUkwocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLllPVVRVQkVfVklERU87XG4gICAgICAgIGlmIChzcG90aWZ5U29uZ1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLlNQT1RJRllfU09ORztcbiAgICAgICAgaWYgKHNwb3RpZnlQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLlNQT1RJRllfUExBWUxJU1Q7XG4gICAgICAgIGlmIChzcG90aWZ5QWxidW1SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5TUE9USUZZX0FMQlVNO1xuICAgICAgICBpZiAodmltZW9SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIFF1ZXJ5VHlwZS5WSU1FTztcbiAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLlJFVkVSQk5BVElPTjtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLkFQUExFX01VU0lDX0FMQlVNO1xuICAgICAgICBpZiAoYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiBRdWVyeVR5cGUuQVBQTEVfTVVTSUNfUExBWUxJU1Q7XG4gICAgICAgIGlmIChhcHBsZU11c2ljU29uZ1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gUXVlcnlUeXBlLkFQUExFX01VU0lDX1NPTkc7XG4gICAgICAgIGlmIChhdHRhY2htZW50UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiBRdWVyeVR5cGUuQVJCSVRSQVJZO1xuXG4gICAgICAgIHJldHVybiBmYWxsYmFja1NlYXJjaEVuZ2luZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdmltZW8gaWQgZnJvbSB1cmxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VmltZW9JRChxdWVyeTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBRdWVyeVJlc29sdmVyLnJlc29sdmUocXVlcnkpID09PSBRdWVyeVR5cGUuVklNRU9cbiAgICAgICAgICAgID8gcXVlcnlcbiAgICAgICAgICAgICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgICAgICAgICAgICAuZmlsdGVyKCh4KSA9PiAhIXgpXG4gICAgICAgICAgICAgICAgICAucG9wKClcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVJZChxOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIFlvdVR1YmUuUmVnZXguVklERU9fSUQudGVzdChxKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVVUkwocTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBZb3VUdWJlLlJlZ2V4LlZJREVPX1VSTC50ZXN0KHEpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUXVlcnlSZXNvbHZlciB9O1xuIiwgImltcG9ydCB7IFNub3dmbGFrZSwgVXNlciwgVXNlclJlc29sdmFibGUsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9TdHJ1Y3R1cmVzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vU3RydWN0dXJlcy9UcmFjayc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL1N0cnVjdHVyZXMvUGxheWxpc3QnO1xuaW1wb3J0IHsgZG93bmxvYWRPcHRpb25zIH0gZnJvbSAneXRkbC1jb3JlJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUgfSBmcm9tICcuLi91dGlscy9RdWVyeUNhY2hlJztcblxuZXhwb3J0IHR5cGUgRmlsdGVyc05hbWUgPSBrZXlvZiBRdWV1ZUZpbHRlcnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU2VhcmNoUmVzdWx0IHtcbiAgICBwbGF5bGlzdDogUGxheWxpc3QgfCBudWxsO1xuICAgIHRyYWNrczogVHJhY2tbXTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7QXVkaW9GaWx0ZXJzfSBRdWV1ZUZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICAgIGJhc3Nib29zdF9sb3c/OiBib29sZWFuO1xuICAgIGJhc3Nib29zdD86IGJvb2xlYW47XG4gICAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAgICc4RCc/OiBib29sZWFuO1xuICAgIHZhcG9yd2F2ZT86IGJvb2xlYW47XG4gICAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgICBwaGFzZXI/OiBib29sZWFuO1xuICAgIHRyZW1vbG8/OiBib29sZWFuO1xuICAgIHZpYnJhdG8/OiBib29sZWFuO1xuICAgIHJldmVyc2U/OiBib29sZWFuO1xuICAgIHRyZWJsZT86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcjI/OiBib29sZWFuO1xuICAgIHN1cnJvdW5kaW5nPzogYm9vbGVhbjtcbiAgICBwdWxzYXRvcj86IGJvb2xlYW47XG4gICAgc3ViYm9vc3Q/OiBib29sZWFuO1xuICAgIGthcmFva2U/OiBib29sZWFuO1xuICAgIGZsYW5nZXI/OiBib29sZWFuO1xuICAgIGdhdGU/OiBib29sZWFuO1xuICAgIGhhYXM/OiBib29sZWFuO1xuICAgIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgICBtb25vPzogYm9vbGVhbjtcbiAgICBtc3Rscj86IGJvb2xlYW47XG4gICAgbXN0cnI/OiBib29sZWFuO1xuICAgIGNvbXByZXNzb3I/OiBib29sZWFuO1xuICAgIGV4cGFuZGVyPzogYm9vbGVhbjtcbiAgICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gICAgY2hvcnVzPzogYm9vbGVhbjtcbiAgICBjaG9ydXMyZD86IGJvb2xlYW47XG4gICAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICAgIGZhZGVpbj86IGJvb2xlYW47XG4gICAgZGltPzogYm9vbGVhbjtcbiAgICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgICBsb2ZpPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqIEB0eXBlZGVmIHtzdHJpbmd9IFRyYWNrU291cmNlXG4gKi9cbmV4cG9ydCB0eXBlIFRyYWNrU291cmNlID0gJ3NvdW5kY2xvdWQnIHwgJ3lvdXR1YmUnIHwgJ3Nwb3RpZnknIHwgJ2FwcGxlX211c2ljJyB8ICdhcmJpdHJhcnknO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhd1RyYWNrRGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlIFRoZSB0aXRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF1dGhvciBUaGUgYXV0aG9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSB1cmxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aHVtYm5haWwgVGhlIHRodW1ibmFpbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGR1cmF0aW9uIFRoZSBkdXJhdGlvblxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZpZXdzIFRoZSB2aWV3c1xuICogQHByb3BlcnR5IHtVc2VyfSByZXF1ZXN0ZWRCeSBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAqIEBwcm9wZXJ0eSB7UGxheWxpc3R9IFtwbGF5bGlzdF0gVGhlIHBsYXlsaXN0XG4gKiBAcHJvcGVydHkge1RyYWNrU291cmNlfSBbc291cmNlPVwiYXJiaXRyYXJ5XCJdIFRoZSBzb3VyY2VcbiAqIEBwcm9wZXJ0eSB7YW55fSBbZW5naW5lXSBUaGUgZW5naW5lXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsaXZlXSBJZiB0aGlzIHRyYWNrIGlzIGxpdmVcbiAqIEBwcm9wZXJ0eSB7YW55fSBbcmF3XSBUaGUgcmF3IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYXdUcmFja0RhdGEge1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBhdXRob3I6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICBkdXJhdGlvbjogc3RyaW5nO1xuICAgIHZpZXdzOiBudW1iZXI7XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICAgIHNvdXJjZT86IFRyYWNrU291cmNlO1xuICAgIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbGl2ZT86IGJvb2xlYW47XG4gICAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGU7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGltZURhdGFcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkYXlzIFRpbWUgaW4gZGF5c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGhvdXJzIFRpbWUgaW4gaG91cnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtaW51dGVzIFRpbWUgaW4gbWludXRlc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHNlY29uZHMgVGltZSBpbiBzZWNvbmRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZURhdGEge1xuICAgIGRheXM6IG51bWJlcjtcbiAgICBob3VyczogbnVtYmVyO1xuICAgIG1pbnV0ZXM6IG51bWJlcjtcbiAgICBzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0aW1lY29kZXNdIElmIGl0IHNob3VsZCByZW5kZXIgdGltZSBjb2Rlc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcXVldWVdIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbGVuZ3RoXSBUaGUgYmFyIGxlbmd0aFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtsaW5lXSBUaGUgYmFyIHRyYWNrXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2luZGljYXRvcl0gVGhlIGluZGljYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclByb2dyZXNzYmFyT3B0aW9ucyB7XG4gICAgdGltZWNvZGVzPzogYm9vbGVhbjtcbiAgICBsZW5ndGg/OiBudW1iZXI7XG4gICAgbGluZT86IHN0cmluZztcbiAgICBpbmRpY2F0b3I/OiBzdHJpbmc7XG4gICAgcXVldWU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzZWFyY2ggcXVlcnkgdHlwZVxuICogVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBBVVRPXG4gKiAtIFlPVVRVQkVcbiAqIC0gWU9VVFVCRV9QTEFZTElTVFxuICogLSBTT1VORENMT1VEX1RSQUNLXG4gKiAtIFNPVU5EQ0xPVURfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRFxuICogLSBTUE9USUZZX1NPTkdcbiAqIC0gU1BPVElGWV9BTEJVTVxuICogLSBTUE9USUZZX1BMQVlMSVNUXG4gKiAtIFNQT1RJRllfU0VBUkNIXG4gKiAtIEZBQ0VCT09LXG4gKiAtIFZJTUVPXG4gKiAtIEFSQklUUkFSWVxuICogLSBSRVZFUkJOQVRJT05cbiAqIC0gWU9VVFVCRV9TRUFSQ0hcbiAqIC0gWU9VVFVCRV9WSURFT1xuICogLSBTT1VORENMT1VEX1NFQVJDSFxuICogLSBBUFBMRV9NVVNJQ19TT05HXG4gKiAtIEFQUExFX01VU0lDX0FMQlVNXG4gKiAtIEFQUExFX01VU0lDX1BMQVlMSVNUXG4gKiAtIEFQUExFX01VU0lDX1NFQVJDSFxuICogLSBGSUxFXG4gKiAtIEFVVE9fU0VBUkNIXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBRdWVyeVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5VHlwZSA9IHtcbiAgICBBVVRPOiAnYXV0bycsXG4gICAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICAgIFlPVVRVQkVfUExBWUxJU1Q6ICd5b3V0dWJlUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVURfVFJBQ0s6ICdzb3VuZGNsb3VkVHJhY2snLFxuICAgIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVUQ6ICdzb3VuZGNsb3VkJyxcbiAgICBTUE9USUZZX1NPTkc6ICdzcG90aWZ5U29uZycsXG4gICAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gICAgU1BPVElGWV9QTEFZTElTVDogJ3Nwb3RpZnlQbGF5bGlzdCcsXG4gICAgU1BPVElGWV9TRUFSQ0g6ICdzcG90aWZ5U2VhcmNoJyxcbiAgICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgICBWSU1FTzogJ3ZpbWVvJyxcbiAgICBBUkJJVFJBUlk6ICdhcmJpdHJhcnknLFxuICAgIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gICAgWU9VVFVCRV9TRUFSQ0g6ICd5b3V0dWJlU2VhcmNoJyxcbiAgICBZT1VUVUJFX1ZJREVPOiAneW91dHViZVZpZGVvJyxcbiAgICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICAgIEFQUExFX01VU0lDX1NPTkc6ICdhcHBsZU11c2ljU29uZycsXG4gICAgQVBQTEVfTVVTSUNfQUxCVU06ICdhcHBsZU11c2ljQWxidW0nLFxuICAgIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgICBBUFBMRV9NVVNJQ19TRUFSQ0g6ICdhcHBsZU11c2ljU2VhcmNoJyxcbiAgICBGSUxFOiAnZmlsZScsXG4gICAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2VhcmNoUXVlcnlUeXBlID0ga2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZSB8ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJFdmVudHMge1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWUsIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gYW55O1xufVxuXG5leHBvcnQgZW51bSBQbGF5ZXJFdmVudCB7XG4gICAgZGVidWcgPSAnZGVidWcnLFxuICAgIGVycm9yID0gJ2Vycm9yJyxcbiAgICB2b2ljZVN0YXRlVXBkYXRlID0gJ3ZvaWNlU3RhdGVVcGRhdGUnXG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBsYXlPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmaWx0ZXJzVXBkYXRlPWZhbHNlXSBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtlbmNvZGVyQXJncz1bXV0gRkZtcGVnIGFyZ3MgcGFzc2VkIHRvIGVuY29kZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc2Vla10gVGltZSB0byBzZWVrIHRvIGJlZm9yZSBwbGF5aW5nXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpbW1lZGlhdGU9ZmFsc2VdIElmIGl0IHNob3VsZCBzdGFydCBwbGF5aW5nIHRoZSBwcm92aWRlZCB0cmFjayBpbW1lZGlhdGVseVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlPcHRpb25zIHtcbiAgICBmaWx0ZXJzVXBkYXRlPzogYm9vbGVhbjtcbiAgICBlbmNvZGVyQXJncz86IHN0cmluZ1tdO1xuICAgIHNlZWs/OiBudW1iZXI7XG4gICAgaW1tZWRpYXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUXVlcnlFeHRyYWN0b3JTZWFyY2ggPSBgZXh0OiR7c3RyaW5nfWA7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VhcmNoT3B0aW9uc1xuICogQHByb3BlcnR5IHtVc2VyUmVzb2x2YWJsZX0gcmVxdWVzdGVkQnkgVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHNlYXJjaFxuICogQHByb3BlcnR5IHt0eXBlb2YgUXVlcnlUeXBlfHN0cmluZ30gW3NlYXJjaEVuZ2luZT0nYXV0byddIFRoZSBxdWVyeSBzZWFyY2ggZW5naW5lLCBjYW4gYmUgZXh0cmFjdG9yIG5hbWUgdG8gdGFyZ2V0IHNwZWNpZmljIG9uZSAoY3VzdG9tKVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Jsb2NrRXh0cmFjdG9yc1tdXSBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVDYWNoZV0gSWYgaXQgc2hvdWxkIGlnbm9yZSBxdWVyeSBjYWNoZSBsb29rdXBcbiAqIEBwcm9wZXJ0eSB7U2VhcmNoUXVlcnlUeXBlfSBbZmFsbGJhY2tTZWFyY2hFbmdpbmU9J2F1dG9TZWFyY2gnXSBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlclJlc29sdmFibGU7XG4gICAgc2VhcmNoRW5naW5lPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2g7XG4gICAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gICAgaWdub3JlQ2FjaGU/OiBib29sZWFuO1xuICAgIGZhbGxiYWNrU2VhcmNoRW5naW5lPzogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdO1xufVxuXG4vKipcbiAqIFRoZSBxdWV1ZSByZXBlYXQgbW9kZS4gVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBPRkZcbiAqIC0gVFJBQ0tcbiAqIC0gUVVFVUVcbiAqIC0gQVVUT1BMQVlcbiAqIEB0eXBlZGVmIHtudW1iZXJ9IFF1ZXVlUmVwZWF0TW9kZVxuICovXG5leHBvcnQgZW51bSBRdWV1ZVJlcGVhdE1vZGUge1xuICAgIE9GRiA9IDAsXG4gICAgVFJBQ0sgPSAxLFxuICAgIFFVRVVFID0gMixcbiAgICBBVVRPUExBWSA9IDNcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQbGF5bGlzdEluaXREYXRhXG4gKiBAcHJvcGVydHkge1RyYWNrW119IHRyYWNrcyBUaGUgdHJhY2tzIG9mIHRoaXMgcGxheWxpc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZSBUaGUgcGxheWxpc3QgdGl0bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aHVtYm5haWwgVGhlIHRodW1ibmFpbFxuICogQHByb3BlcnR5IHthbGJ1bXxwbGF5bGlzdH0gdHlwZSBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAqIEBwcm9wZXJ0eSB7VHJhY2tTb3VyY2V9IHNvdXJjZSBUaGUgcGxheWxpc3Qgc291cmNlXG4gKiBAcHJvcGVydHkge29iamVjdH0gYXV0aG9yIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXV0aG9yLm5hbWVdIFRoZSBhdXRob3IgbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthdXRob3IudXJsXSBUaGUgYXV0aG9yIHVybFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBwbGF5bGlzdCBpZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCBUaGUgcGxheWxpc3QgdXJsXG4gKiBAcHJvcGVydHkge2FueX0gW3Jhd1BsYXlsaXN0XSBUaGUgcmF3IHBsYXlsaXN0IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEluaXREYXRhIHtcbiAgICB0cmFja3M6IFRyYWNrW107XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gICAgYXV0aG9yOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgdXJsOiBzdHJpbmc7XG4gICAgfTtcbiAgICBpZDogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUcmFja0pTT05cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZSBUaGUgdHJhY2sgdGl0bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBUaGUgdHJhY2sgZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdXRob3IgVGhlIGF1dGhvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCBUaGUgdXJsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGh1bWJuYWlsIFRoZSB0aHVtYm5haWxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkdXJhdGlvbiBUaGUgZHVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkdXJhdGlvbk1TIFRoZSBkdXJhdGlvbiBpbiBtc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHZpZXdzIFRoZSB2aWV3cyBjb3VudFxuICogQHByb3BlcnR5IHtTbm93Zmxha2V9IHJlcXVlc3RlZEJ5IFRoZSBpZCBvZiB0aGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAqIEBwcm9wZXJ0eSB7UGxheWxpc3RKU09OfSBbcGxheWxpc3RdIFRoZSBwbGF5bGlzdCBpbmZvIChpZiBhbnkpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2tKU09OIHtcbiAgICBpZDogU25vd2ZsYWtlO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBhdXRob3I6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICBkdXJhdGlvbjogc3RyaW5nO1xuICAgIGR1cmF0aW9uTVM6IG51bWJlcjtcbiAgICB2aWV3czogbnVtYmVyO1xuICAgIHJlcXVlc3RlZEJ5OiBTbm93Zmxha2U7XG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdEpTT047XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGxheWxpc3RKU09OXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgVGhlIHBsYXlsaXN0IGlkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSBwbGF5bGlzdCB1cmxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZSBUaGUgcGxheWxpc3QgdGl0bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBUaGUgcGxheWxpc3QgZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aHVtYm5haWwgVGhlIHRodW1ibmFpbFxuICogQHByb3BlcnR5IHthbGJ1bXxwbGF5bGlzdH0gdHlwZSBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAqIEBwcm9wZXJ0eSB7VHJhY2tTb3VyY2V9IHNvdXJjZSBUaGUgdHJhY2sgc291cmNlXG4gKiBAcHJvcGVydHkge29iamVjdH0gYXV0aG9yIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXV0aG9yLm5hbWVdIFRoZSBhdXRob3IgbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthdXRob3IudXJsXSBUaGUgYXV0aG9yIHVybFxuICogQHByb3BlcnR5IHtUcmFja0pTT05bXX0gdHJhY2tzIFRoZSB0cmFja3MgZGF0YSAoaWYgYW55KVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SlNPTiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gICAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgICBhdXRob3I6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICB1cmw6IHN0cmluZztcbiAgICB9O1xuICAgIHRyYWNrczogVHJhY2tKU09OW107XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGxheWVySW5pdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2F1dG9SZWdpc3RlckV4dHJhY3Rvcj10cnVlXSBJZiBpdCBzaG91bGQgYXV0b21hdGljYWxseSByZWdpc3RlciBgQGRpc2NvcmQtcGxheWVyL2V4dHJhY3RvcmBcbiAqIEBwcm9wZXJ0eSB7WVRETERvd25sb2FkT3B0aW9uc30gW3l0ZGxPcHRpb25zXSBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gYHl0ZGwtY29yZWBcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY29ubmVjdGlvblRpbWVvdXQ9MjAwMDBdIFRoZSB2b2ljZSBjb25uZWN0aW9uIHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Ntb290aFZvbHVtZT10cnVlXSBUb2dnbGUgc21vb3RoIHZvbHVtZSB0cmFuc2l0aW9uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsYWdNb25pdG9yPTMwMDAwXSBUaW1lIGluIG1zIHRvIHJlLW1vbml0b3IgZXZlbnQgbG9vcCBsYWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvY2tWb2ljZVN0YXRlSGFuZGxlcl0gUHJldmVudCB2b2ljZSBzdGF0ZSBoYW5kbGVyIGZyb20gYmVpbmcgb3ZlcnJpZGRlblxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Jsb2NrRXh0cmFjdG9yc10gTGlzdCBvZiBleHRyYWN0b3JzIHRvIGRpc2FibGUgcXVlcnlpbmcgbWV0YWRhdGEgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Jsb2NrU3RyZWFtRnJvbV0gTGlzdCBvZiBleHRyYWN0b3JzIHRvIGRpc2FibGUgc3RyZWFtaW5nIGZyb21cbiAqIEBwcm9wZXJ0eSB7UXVlcnlDYWNoZSB8IG51bGx9IFtxdWVyeUNhY2hlXSBRdWVyeSBjYWNoZSBwcm92aWRlclxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlSW5zdGFuY2VdIElnbm9yZSBwbGF5ZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gICAgYXV0b1JlZ2lzdGVyRXh0cmFjdG9yPzogYm9vbGVhbjtcbiAgICB5dGRsT3B0aW9ucz86IGRvd25sb2FkT3B0aW9ucztcbiAgICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgICBzbW9vdGhWb2x1bWU/OiBib29sZWFuO1xuICAgIGxhZ01vbml0b3I/OiBudW1iZXI7XG4gICAgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyPzogYm9vbGVhbjtcbiAgICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgICBibG9ja1N0cmVhbUZyb20/OiBzdHJpbmdbXTtcbiAgICBxdWVyeUNhY2hlPzogUXVlcnlDYWNoZSB8IG51bGw7XG4gICAgaWdub3JlSW5zdGFuY2U/OiBib29sZWFuO1xufVxuIiwgImltcG9ydCB7IFVzZXIsIGVzY2FwZU1hcmtkb3duLCBTbm93Zmxha2VVdGlsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUmF3VHJhY2tEYXRhLCBTZWFyY2hRdWVyeVR5cGUsIFRyYWNrSlNPTiB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuXG5leHBvcnQgdHlwZSBUcmFja1Jlc29sdmFibGUgPSBUcmFjayB8IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IGNsYXNzIFRyYWNrIHtcbiAgICBwdWJsaWMgcGxheWVyITogUGxheWVyO1xuICAgIHB1YmxpYyB0aXRsZSE6IHN0cmluZztcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24hOiBzdHJpbmc7XG4gICAgcHVibGljIGF1dGhvciE6IHN0cmluZztcbiAgICBwdWJsaWMgdXJsITogc3RyaW5nO1xuICAgIHB1YmxpYyB0aHVtYm5haWwhOiBzdHJpbmc7XG4gICAgcHVibGljIGR1cmF0aW9uITogc3RyaW5nO1xuICAgIHB1YmxpYyB2aWV3cyE6IG51bWJlcjtcbiAgICBwdWJsaWMgcmVxdWVzdGVkQnk6IFVzZXIgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgcGxheWxpc3Q/OiBQbGF5bGlzdDtcbiAgICBwdWJsaWMgcXVlcnlUeXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbDtcbiAgICBwdWJsaWMgcmF3OiBSYXdUcmFja0RhdGEgPSB7XG4gICAgICAgIHNvdXJjZTogJ2FyYml0cmFyeSdcbiAgICB9IGFzIFJhd1RyYWNrRGF0YTtcbiAgICBwdWJsaWMgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG5cbiAgICAvKipcbiAgICAgKiBUcmFjayBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIFRyYWNrXG4gICAgICogQHBhcmFtIHtSYXdUcmFja0RhdGF9IGRhdGEgVHJhY2sgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBkYXRhOiBSYXdUcmFja0RhdGEpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5ZXIgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBUcmFja1xuICAgICAgICAgKiBAbmFtZSBUcmFjayNwbGF5ZXJcbiAgICAgICAgICogQHR5cGUge1BsYXllcn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3BsYXllcicsIHsgdmFsdWU6IHBsYXllciwgZW51bWVyYWJsZTogZmFsc2UgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRpdGxlIG9mIHRoaXMgdHJhY2tcbiAgICAgICAgICogQG5hbWUgVHJhY2sjdGl0bGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlc2NyaXB0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICAgICAgICogQG5hbWUgVHJhY2sjZGVzY3JpcHRpb25cbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEF1dGhvciBvZiB0aGlzIHRyYWNrXG4gICAgICAgICAqIEBuYW1lIFRyYWNrI2F1dGhvclxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogVVJMIG9mIHRoaXMgdHJhY2tcbiAgICAgICAgICogQG5hbWUgVHJhY2sjdXJsXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaHVtYm5haWwgb2YgdGhpcyB0cmFja1xuICAgICAgICAgKiBAbmFtZSBUcmFjayN0aHVtYm5haWxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIER1cmF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICAgICAgICogQG5hbWUgVHJhY2sjZHVyYXRpb25cbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFZpZXdzIGNvdW50IG9mIHRoaXMgdHJhY2tcbiAgICAgICAgICogQG5hbWUgVHJhY2sjdmlld3NcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcnNvbiB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICAgICAgICogQG5hbWUgVHJhY2sjcmVxdWVzdGVkQnlcbiAgICAgICAgICogQHR5cGUge1VzZXJ9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB0aGlzIHRyYWNrIGJlbG9uZ3MgdG8gcGxheWxpc3RcbiAgICAgICAgICogQG5hbWUgVHJhY2sjZnJvbVBsYXlsaXN0XG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cblxuICAgICAgICAvKipcbiAgICAgICAgICogUmF3IHRyYWNrIGRhdGFcbiAgICAgICAgICogQG5hbWUgVHJhY2sjcmF3XG4gICAgICAgICAqIEB0eXBlIHtSYXdUcmFja0RhdGF9XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdHJhY2sgaWRcbiAgICAgICAgICogQG5hbWUgVHJhY2sjaWRcbiAgICAgICAgICogQHR5cGUge1Nub3dmbGFrZX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3Qgd2hpY2ggdHJhY2sgYmVsb25nc1xuICAgICAgICAgKiBAbmFtZSBUcmFjayNwbGF5bGlzdFxuICAgICAgICAgKiBAdHlwZSB7UGxheWxpc3R9XG4gICAgICAgICAqL1xuXG4gICAgICAgIHZvaWQgdGhpcy5fcGF0Y2goZGF0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGF0Y2goZGF0YTogUmF3VHJhY2tEYXRhKSB7XG4gICAgICAgIHRoaXMudGl0bGUgPSBlc2NhcGVNYXJrZG93bihkYXRhLnRpdGxlID8/ICcnKTtcbiAgICAgICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvciA/PyAnJztcbiAgICAgICAgdGhpcy51cmwgPSBkYXRhLnVybCA/PyAnJztcbiAgICAgICAgdGhpcy50aHVtYm5haWwgPSBkYXRhLnRodW1ibmFpbCA/PyAnJztcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGRhdGEuZHVyYXRpb24gPz8gJyc7XG4gICAgICAgIHRoaXMudmlld3MgPSBkYXRhLnZpZXdzID8/IDA7XG4gICAgICAgIHRoaXMucXVlcnlUeXBlID0gZGF0YS5xdWVyeVR5cGU7XG4gICAgICAgIHRoaXMucmVxdWVzdGVkQnkgPSBkYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgICAgIHRoaXMucGxheWxpc3QgPSBkYXRhLnBsYXlsaXN0O1xuICAgICAgICB0aGlzLnJhdyA9IE9iamVjdC5hc3NpZ24oe30sIHsgc291cmNlOiBkYXRhLnJhdz8uc291cmNlID8/IGRhdGEuc291cmNlIH0sIGRhdGEucmF3ID8/IGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZSBpbiB3aGljaCB0aGlzIHRyYWNrIGlzIGxvY2F0ZWRcbiAgICAgKiBAdHlwZSB7UXVldWV9XG4gICAgICovXG4gICAgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT4gcS50cmFja3Muc29tZSgoYWIpID0+IGFiLmlkID09PSB0aGlzLmlkKSkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IGR1cmF0aW9uTVMoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdGltZXMgPSAobjogbnVtYmVyLCB0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGxldCB0biA9IDE7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQ7IGkrKykgdG4gKj0gbjtcbiAgICAgICAgICAgIHJldHVybiB0IDw9IDAgPyAxMDAwIDogdG4gKiAxMDAwO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmR1cmF0aW9uXG4gICAgICAgICAgICAuc3BsaXQoJzonKVxuICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgLm1hcCgobSwgaSkgPT4gcGFyc2VJbnQobSkgKiB0aW1lcyg2MCwgaSkpXG4gICAgICAgICAgICAucmVkdWNlKChhLCBjKSA9PiBhICsgYywgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgICAqIEB0eXBlIHtUcmFja1NvdXJjZX1cbiAgICAgKi9cbiAgICBnZXQgc291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYXc/LnNvdXJjZSA/PyAnYXJiaXRyYXJ5JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSYXcgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAgICogQHJldHVybnMge1RyYWNrSlNPTn1cbiAgICAgKi9cbiAgICB0b0pTT04oaGlkZVBsYXlsaXN0PzogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICBkdXJhdGlvbk1TOiB0aGlzLmR1cmF0aW9uTVMsXG4gICAgICAgICAgICB2aWV3czogdGhpcy52aWV3cyxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5Py5pZCB8fCBudWxsLFxuICAgICAgICAgICAgcGxheWxpc3Q6IGhpZGVQbGF5bGlzdCA/IG51bGwgOiB0aGlzLnBsYXlsaXN0Py50b0pTT04oKSA/PyBudWxsXG4gICAgICAgIH0gYXMgVHJhY2tKU09OO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTbm93Zmxha2VVdGlsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQWJvcnRTaWduYWwgdG8gY2FuY2VsIHRoaXMgZW50cnlcbiAgICAgKi9cbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZWQgZW50cmllc1xuICAgICAqL1xuICAgIHB1YmxpYyBlbnRyaWVzOiBBcnJheTxBc3luY1F1ZXVlRW50cnk+ID0gW107XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBlbnRyaWVzIHF1ZXVlXG4gICAgICogQHBhcmFtIGNvbnN1bWUgV2hldGhlciBvciBub3QgdG8gY29uc3VtZSBhbGwgZW50cmllcyBiZWZvcmUgY2xlYXJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoY29uc3VtZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChjb25zdW1lKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNvbnN1bWUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudHJpZXMgPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBxdWV1ZS4gUmV0dXJucyBgMGAgaWYgbm8gZW50cmllcyBhcmUgYXZhaWxhYmxlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWNxdWlyZSBhbiBlbnRyeS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBsb2NrIHRoZSBxdWV1ZVxuICAgICAqIGNvbnN0IGVudHJ5ID0gYXN5bmNRdWV1ZS5hY3F1aXJlKCk7XG4gICAgICogLy8gd2FpdCB1bnRpbCBwcmV2aW91cyB0YXNrIGlzIGNvbXBsZXRlZFxuICAgICAqIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgKiAvLyBkbyBzb21ldGhpbmcgZXhwZW5zaXZlXG4gICAgICogYXdhaXQgcGVyZm9ybVNvbWV0aGluZ0V4cGVuc2l2ZSgpO1xuICAgICAqIC8vIG1ha2Ugc3VyZSB0byByZWxlYXNlIHRoZSBsb2NrIG9uY2UgZG9uZVxuICAgICAqIGFzeW5jUXVldWUucmVsZWFzZSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhY3F1aXJlKG9wdGlvbnM/OiBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gbmV3IEFzeW5jUXVldWVFbnRyeSh0aGlzLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodGhpcy5lbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgZW50cnkuY29uc3VtZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZSB0aGUgY3VycmVudCBhY3F1aXNpdGlvbiBhbmQgbW92ZSB0byBuZXh0IGVudHJ5LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2hpZnQoKTtcbiAgICAgICAgdGhpcy5lbnRyaWVzWzBdPy5jb25zdW1lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VsIGFsbCBlbnRyaWVzXG4gICAgICovXG4gICAgcHVibGljIGNhbmNlbEFsbCgpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jYW5jZWwoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBnaXZlbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBlbnRyeSBUaGUgZW50cnkgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUVudHJ5KGVudHJ5OiBBc3luY1F1ZXVlRW50cnkpIHtcbiAgICAgICAgY29uc3QgZW50cnlJZHggPSB0aGlzLmVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG5cbiAgICAgICAgaWYgKGVudHJ5SWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNwbGljZShlbnRyeUlkeCwgMSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3luY1F1ZXVlRW50cnkge1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgICBwdWJsaWMgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBvbkFib3J0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHJlc29sdmUhOiAoKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgcmVqZWN0ITogKGVycjogRXJyb3IpID0+IHZvaWQ7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBBc3luY1F1ZXVlLCBwdWJsaWMgb3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zPy5zaWduYWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWJvcnRTaWduYWwodGhpcy5vcHRpb25zLnNpZ25hbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QWJvcnRTaWduYWwoc2lnbmFsOiBBYm9ydFNpZ25hbCkge1xuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5zaWduYWwgPSBzaWduYWw7XG4gICAgICAgIHRoaXMub25BYm9ydCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucXVldWUucmVtb3ZlRW50cnkodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uc3VtZSgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIHRoaXMucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWxlYXNlKCkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIHRoaXMucmVqZWN0KG5ldyBFcnJvcignQ2FuY2VsbGVkJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbnVwKCkge1xuICAgICAgICBpZiAodGhpcy5vbkFib3J0KSB0aGlzLnNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IG51bGw7XG4gICAgICAgIHRoaXMub25BYm9ydCA9IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRhc2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lLCBRdWV1ZUZpbHRlcnMgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgQXVkaW9GaWx0ZXJzIGZyb20gJy4uL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEJpcXVhZEZpbHRlcnMsIEVxdWFsaXplciwgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgRkZtcGVnU3RyZWFtT3B0aW9ucywgY3JlYXRlRkZtcGVnU3RyZWFtIH0gZnJvbSAnLi4vdXRpbHMvRkZtcGVnU3RyZWFtJztcblxudHlwZSBGaWx0ZXJzID0ga2V5b2YgdHlwZW9mIEF1ZGlvRmlsdGVycy5maWx0ZXJzO1xuXG5jb25zdCBtYWtlQmFuZHMgPSAoYXJyOiBudW1iZXJbXSkgPT4ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgICB7XG4gICAgICAgICAgICBsZW5ndGg6IEVxdWFsaXplci5CQU5EX0NPVU5UXG4gICAgICAgIH0sXG4gICAgICAgIChfLCBpKSA9PiAoe1xuICAgICAgICAgICAgYmFuZDogaSxcbiAgICAgICAgICAgIGdhaW46IGFycltpXSA/IGFycltpXSAvIDMwIDogMFxuICAgICAgICB9KVxuICAgICkgYXMgRXF1YWxpemVyQmFuZFtdO1xufTtcblxuZXhwb3J0IGNvbnN0IEVxdWFsaXplckNvbmZpZ3VyYXRpb25QcmVzZXQgPSB7XG4gICAgRmxhdDogbWFrZUJhbmRzKFtdKSxcbiAgICBDbGFzc2ljYWw6IG1ha2VCYW5kcyhbLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTcuMiwgLTcuMiwgLTcuMiwgLTkuNl0pLFxuICAgIENsdWI6IG1ha2VCYW5kcyhbLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIDguMCwgNS42LCA1LjYsIDUuNiwgMy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgRGFuY2U6IG1ha2VCYW5kcyhbOS42LCA3LjIsIDIuNCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC01LjYsIC03LjIsIC03LjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgRnVsbEJhc3M6IG1ha2VCYW5kcyhbLTguMCwgOS42LCA5LjYsIDUuNiwgMS42LCAtNC4wLCAtOC4wLCAtMTAuNCwgLTExLjIsIC0xMS4yXSksXG4gICAgRnVsbEJhc3NUcmVibGU6IG1ha2VCYW5kcyhbNy4yLCA1LjYsIC0xLjExMDIyZS0xNSwgLTcuMiwgLTQuOCwgMS42LCA4LjAsIDExLjIsIDEyLjAsIDEyLjBdKSxcbiAgICBGdWxsVHJlYmxlOiBtYWtlQmFuZHMoWy05LjYsIC05LjYsIC05LjYsIC00LjAsIDIuNCwgMTEuMiwgMTYuMCwgMTYuMCwgMTYuMCwgMTYuOF0pLFxuICAgIEhlYWRwaG9uZXM6IG1ha2VCYW5kcyhbNC44LCAxMS4yLCA1LjYsIC0zLjIsIC0yLjQsIDEuNiwgNC44LCA5LjYsIDEyLjgsIDE0LjRdKSxcbiAgICBMYXJnZUhhbGw6IG1ha2VCYW5kcyhbMTAuNCwgMTAuNCwgNS42LCA1LjYsIC0xLjExMDIyZS0xNSwgLTQuOCwgLTQuOCwgLTQuOCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBMaXZlOiBtYWtlQmFuZHMoWy00LjgsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDUuNiwgNS42LCA0LjAsIDIuNCwgMi40LCAyLjRdKSxcbiAgICBQYXJ0eTogbWFrZUJhbmRzKFs3LjIsIDcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgNy4yLCA3LjJdKSxcbiAgICBQb3A6IG1ha2VCYW5kcyhbLTEuNiwgNC44LCA3LjIsIDguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0yLjQsIC0xLjYsIC0xLjZdKSxcbiAgICBSZWdnYWU6IG1ha2VCYW5kcyhbLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTEuMTEwMjJlLTE1LCA2LjQsIDYuNCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIFJvY2s6IG1ha2VCYW5kcyhbOC4wLCA0LjgsIC01LjYsIC04LjAsIC0zLjIsIDQuMCwgOC44LCAxMS4yLCAxMS4yLCAxMS4yXSksXG4gICAgU2thOiBtYWtlQmFuZHMoWy0yLjQsIC00LjgsIC00LjAsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDguOCwgOS42LCAxMS4yLCA5LjZdKSxcbiAgICBTb2Z0OiBtYWtlQmFuZHMoWzQuOCwgMS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0xLjExMDIyZS0xNSwgNC4wLCA4LjAsIDkuNiwgMTEuMiwgMTIuMF0pLFxuICAgIFNvZnRSb2NrOiBtYWtlQmFuZHMoWzQuMCwgNC4wLCAyLjQsIC0xLjExMDIyZS0xNSwgLTQuMCwgLTUuNiwgLTMuMiwgLTEuMTEwMjJlLTE1LCAyLjQsIDguOF0pLFxuICAgIFRlY2hubzogbWFrZUJhbmRzKFs4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNS42LCAtNC44LCAtMS4xMTAyMmUtMTUsIDguMCwgOS42LCA5LjYsIDguOF0pXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY2xhc3MgRkZtcGVnRmlsdGVyZXI8TWV0YSA9IHVua25vd24+IHtcbiAgICAjZmZtcGVnRmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAgICNzZXRGaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlIH0gPSB0aGlzLmFmO1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpO1xuICAgICAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID0gdGhpcy5maWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKSAmJiAhZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJyk7XG4gICAgICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IFsuLi5uZXcgU2V0KGZpbHRlcnMpXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICAgICAgICBxdWV1ZS5wbGF5ZXIuZXZlbnRzLmVtaXQoJ2F1ZGlvRmlsdGVyc1VwZGF0ZScsIHF1ZXVlLCBwcmV2LCB0aGlzLiNmZm1wZWdGaWx0ZXJzLnNsaWNlKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBmZm1wZWcgc3RyZWFtXG4gICAgICogQHBhcmFtIHNvdXJjZSBUaGUgc3RyZWFtIHNvdXJjZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBzdHJlYW0gb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVTdHJlYW0oc291cmNlOiBzdHJpbmcgfCBSZWFkYWJsZSwgb3B0aW9uczogRkZtcGVnU3RyZWFtT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gY3JlYXRlRkZtcGVnU3RyZWFtKHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGZmbXBlZyBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBib29sZWFuKSB7XG4gICAgICAgIGxldCBfZmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID8gW10gOiAoT2JqZWN0LmtleXMoQXVkaW9GaWx0ZXJzLmZpbHRlcnMpIGFzIEZpbHRlcnNbXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBPYmplY3QuZW50cmllcyhmaWx0ZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHJlcykgPT4gcmVzWzFdID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKF9maWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50bHkgYWN0aXZlIGZmbXBlZyBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXIocylcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSBmaWx0ZXJzID0gW2ZpbHRlcnNdO1xuICAgICAgICBjb25zdCBmcmVzaDogRmlsdGVyc1tdID0gW107XG5cbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICAgICAgICBmcmVzaC5wdXNoKGYpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyh0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmYgRmlsdGVycyBsaXN0XG4gICAgICovXG4gICAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IGZmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGVuYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnMubmFtZXMuZmlsdGVyKChmKSA9PiAhdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBlbmFibGVkXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAgICovXG4gICAgcHVibGljIGlzRW5hYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRW5hYmxlZChmaWx0ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgYSB2YWxpZCBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZhbGlkRmlsdGVyKGZpbHRlcjogc3RyaW5nKTogZmlsdGVyIGlzIEZpbHRlcnNOYW1lIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5oYXMoZmlsdGVyIGFzIEZpbHRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgY3VycmVudCBmaWx0ZXJzIHRvIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmaWx0ZXIpID0+IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gSlNPTiBvYmplY3RcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IChvYmpbZmlsdGVyXSA9IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSkpO1xuXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGN1cnJlbnQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUge1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgZ3JhcGggPSBuZXcgQUZpbHRlckdyYXBoPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBmZm1wZWcgPSBuZXcgRkZtcGVnRmlsdGVyZXI8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICAgIHB1YmxpYyBfbGFzdEZpbHRlcnNDYWNoZTogR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUgPSB7XG4gICAgICAgIGJpcXVhZDogbnVsbCxcbiAgICAgICAgZXF1YWxpemVyOiBbXSxcbiAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgIHZvbHVtZTogMTAwLFxuICAgICAgICBzYW1wbGVSYXRlOiAtMVxuICAgIH07XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWb2x1bWUgdHJhbnNmb3JtZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZHNwPy52b2x1bWUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAxNSBCYW5kIEVxdWFsaXplclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaWdpdGFsIGJpcXVhZCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmJpcXVhZCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERTUCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5maWx0ZXJzIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXVkaW8gcmVzYW1wbGVyXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJlc2FtcGxlciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxheSBjdXJyZW50IHRyYWNrIGluIHRyYW5zaXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBzZWVrIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHRyaWdnZXJSZXBsYXkoc2VlayA9IDApIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLmFjcXVpcmUoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRoaXMucXVldWUuY3VycmVudFRyYWNrLCB7XG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlZWssXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbk1vZGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQUZpbHRlckdyYXBoPE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAgIHB1YmxpYyBnZXQgZmZtcGVnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5mZm1wZWcuZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmFmLmVxdWFsaXplcj8uYmFuZE11bHRpcGxpZXJzIHx8IFtdKS5tYXAoKG0sIGkpID0+ICh7XG4gICAgICAgICAgICBiYW5kOiBpLFxuICAgICAgICAgICAgZ2FpbjogbVxuICAgICAgICB9KSkgYXMgRXF1YWxpemVyQmFuZFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gcmV0dXJuICh0aGlzLmFmLmJpcXVhZD8uZ2V0RmlsdGVyTmFtZSgpIGFzIEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGwpIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5maWx0ZXJzPy5maWx0ZXJzIHx8IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi52b2x1bWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFmLnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZHVtcCgpOiBGaWx0ZXJHcmFwaCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmZm1wZWc6IHRoaXMuZmZtcGVnLFxuICAgICAgICAgICAgZXF1YWxpemVyOiB0aGlzLmVxdWFsaXplcixcbiAgICAgICAgICAgIGJpcXVhZDogdGhpcy5iaXF1YWQsXG4gICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICAgICAgICBzYW1wbGVSYXRlOiB0aGlzLnJlc2FtcGxlcj8udGFyZ2V0U2FtcGxlUmF0ZSB8fCB0aGlzLnJlc2FtcGxlcj8uc2FtcGxlUmF0ZSB8fCA0ODAwMCxcbiAgICAgICAgICAgIHZvbHVtZTogdGhpcy52b2x1bWU/LnZvbHVtZSA/PyAxMDBcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyR3JhcGgge1xuICAgIGZmbXBlZzogRmlsdGVyc1tdO1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogRXhjbHVkZTxCaXF1YWRGaWx0ZXJzLCBudW1iZXI+IHwgbnVsbDtcbiAgICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gICAgdm9sdW1lOiBudW1iZXI7XG4gICAgc2FtcGxlUmF0ZTogbnVtYmVyO1xufVxuIiwgImltcG9ydCAqIGFzIHByaXNtIGZyb20gJ3ByaXNtLW1lZGlhJztcbmltcG9ydCB0eXBlIHsgRHVwbGV4LCBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRkZtcGVnU3RyZWFtT3B0aW9ucyB7XG4gICAgZm10Pzogc3RyaW5nO1xuICAgIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICBza2lwPzogYm9vbGVhbjtcbiAgICBjb29raWVzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbTogc3RyaW5nLCBmbXQ/OiBzdHJpbmcsIGNvb2tpZXM/OiBzdHJpbmcpIHtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgICBcIi1yZWNvbm5lY3RcIiwgXCIxXCIsXG4gICAgICAgIFwiLXJlY29ubmVjdF9zdHJlYW1lZFwiLCBcIjFcIixcbiAgICAgICAgXCItcmVjb25uZWN0X2RlbGF5X21heFwiLCBcIjVcIixcbiAgICAgICAgXCItaVwiLCBzdHJlYW0sXG4gICAgICAgIFwiLWFuYWx5emVkdXJhdGlvblwiLCBcIjBcIixcbiAgICAgICAgXCItbG9nbGV2ZWxcIiwgXCIwXCIsXG4gICAgICAgIFwiLWZcIiwgYCR7dHlwZW9mIGZtdCA9PT0gXCJzdHJpbmdcIiA/IGZtdCA6IFwiczE2bGVcIn1gLFxuICAgICAgICBcIi1hclwiLCBcIjQ4MDAwXCIsXG4gICAgICAgIFwiLWFjXCIsIFwiMlwiXG4gICAgXTtcblxuICAgIGlmICh0eXBlb2YgY29va2llcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9mZm1wZWcub3JnL2ZmbXBlZy1wcm90b2NvbHMuaHRtbCNIVFRQLUNvb2tpZXNcbiAgICAgICAgYXJncy5wdXNoKCctY29va2llcycsIGNvb2tpZXMuc3RhcnRzV2l0aCgnXCInKSA/IGNvb2tpZXMgOiBgXCIke2Nvb2tpZXN9XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHJldHVybiBbXG4gICAgICAgIFwiLWFuYWx5emVkdXJhdGlvblwiLCBcIjBcIixcbiAgICAgICAgXCItbG9nbGV2ZWxcIiwgXCIwXCIsXG4gICAgICAgIFwiLWZcIiwgYCR7dHlwZW9mIGZtdCA9PT0gXCJzdHJpbmdcIiA/IGZtdCA6IFwiczE2bGVcIn1gLFxuICAgICAgICBcIi1hclwiLCBcIjQ4MDAwXCIsXG4gICAgICAgIFwiLWFjXCIsIFwiMlwiXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIEZGbXBlZyBzdHJlYW1cbiAqIEBwYXJhbSBzdHJlYW0gVGhlIHNvdXJjZSBzdHJlYW1cbiAqIEBwYXJhbSBvcHRpb25zIEZGbXBlZyBzdHJlYW0gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRkZtcGVnU3RyZWFtKHN0cmVhbTogUmVhZGFibGUgfCBEdXBsZXggfCBzdHJpbmcsIG9wdGlvbnM/OiBGRm1wZWdTdHJlYW1PcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnM/LnNraXAgJiYgdHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHJldHVybiBzdHJlYW07XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgY29uc3QgYXJncyA9IHR5cGVvZiBzdHJlYW0gPT09ICdzdHJpbmcnID8gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbSwgb3B0aW9ucy5mbXQsIG9wdGlvbnMuY29va2llcykgOiBGRk1QRUdfQVJHU19QSVBFRChvcHRpb25zLmZtdCk7XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihvcHRpb25zLnNlZWspKSBhcmdzLnVuc2hpZnQoJy1zcycsIFN0cmluZyhvcHRpb25zLnNlZWspKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmVuY29kZXJBcmdzKSkgYXJncy5wdXNoKC4uLm9wdGlvbnMuZW5jb2RlckFyZ3MpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCB0cmFuc2NvZGVyID0gbmV3IChwcmlzbS5GRm1wZWcgfHwgKDxhbnk+cHJpc20pLmRlZmF1bHQuRkZtcGVnKSh7IHNoZWxsOiBmYWxzZSwgYXJncyB9KTtcbiAgICB0cmFuc2NvZGVyLm9uKCdjbG9zZScsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcblxuICAgIGlmICh0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykge1xuICAgICAgICBzdHJlYW0ub24oJ2Vycm9yJywgKCkgPT4gdHJhbnNjb2Rlci5kZXN0cm95KCkpO1xuICAgICAgICBzdHJlYW0ucGlwZSh0cmFuc2NvZGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhbnNjb2Rlcjtcbn1cbiIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhIHtcbiAgICBsYXRlbmN5OiB7XG4gICAgICAgIGV2ZW50TG9vcDogbnVtYmVyO1xuICAgICAgICB2b2ljZUNvbm5lY3Rpb246IG51bWJlcjtcbiAgICB9O1xuICAgIHN0YXR1czoge1xuICAgICAgICBidWZmZXJpbmc6IGJvb2xlYW47XG4gICAgICAgIHBsYXlpbmc6IGJvb2xlYW47XG4gICAgICAgIHBhdXNlZDogYm9vbGVhbjtcbiAgICAgICAgaWRsZTogYm9vbGVhbjtcbiAgICB9O1xuICAgIHRyYWNrc0NvdW50OiBudW1iZXI7XG4gICAgaGlzdG9yeVNpemU6IG51bWJlcjtcbiAgICBleHRyYWN0b3JzOiBudW1iZXI7XG4gICAgbGlzdGVuZXJzOiBudW1iZXI7XG4gICAgbWVtb3J5VXNhZ2U6IE5vZGVKUy5NZW1vcnlVc2FnZTtcbiAgICB2ZXJzaW9uczoge1xuICAgICAgICBub2RlOiBzdHJpbmc7XG4gICAgICAgIHBsYXllcjogc3RyaW5nO1xuICAgIH07XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHt9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBzdGF0aXN0aWNzIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYXRlbmN5OiB7XG4gICAgICAgICAgICAgICAgZXZlbnRMb29wOiB0aGlzLnF1ZXVlLnBsYXllci5ldmVudExvb3BMYWcsXG4gICAgICAgICAgICAgICAgdm9pY2VDb25uZWN0aW9uOiB0aGlzLnF1ZXVlLnBpbmdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBidWZmZXJpbmc6IHRoaXMucXVldWUubm9kZS5pc0J1ZmZlcmluZygpLFxuICAgICAgICAgICAgICAgIHBsYXlpbmc6IHRoaXMucXVldWUubm9kZS5pc1BsYXlpbmcoKSxcbiAgICAgICAgICAgICAgICBwYXVzZWQ6IHRoaXMucXVldWUubm9kZS5pc1BhdXNlZCgpLFxuICAgICAgICAgICAgICAgIGlkbGU6IHRoaXMucXVldWUubm9kZS5pc0lkbGUoKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRyYWNrc0NvdW50OiB0aGlzLnF1ZXVlLnRyYWNrcy5zaXplLFxuICAgICAgICAgICAgaGlzdG9yeVNpemU6IHRoaXMucXVldWUuaGlzdG9yeS50cmFja3Muc2l6ZSxcbiAgICAgICAgICAgIGV4dHJhY3RvcnM6IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMuc2l6ZSxcbiAgICAgICAgICAgIGxpc3RlbmVyczogdGhpcy5xdWV1ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5jaGFubmVsPy5tZW1iZXJzLmZpbHRlcigobSkgPT4gIW0udXNlci5ib3QpLnNpemUgfHwgMCxcbiAgICAgICAgICAgIG1lbW9yeVVzYWdlOiBwcm9jZXNzLm1lbW9yeVVzYWdlKCksXG4gICAgICAgICAgICB2ZXJzaW9uczoge1xuICAgICAgICAgICAgICAgIG5vZGU6IHByb2Nlc3MudmVyc2lvbixcbiAgICAgICAgICAgICAgICBwbGF5ZXI6ICc2LjIuMSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uLy4uL1BsYXllcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGluc3RhbmNlcyA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgUGxheWVyPigpO1xuZXhwb3J0IGNvbnN0IGdsb2JhbFJlZ2lzdHJ5ID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCB1bmtub3duPigpO1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uLy4uL1BsYXllcic7XG5pbXBvcnQgeyBpbnN0YW5jZXMgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkUGxheWVyKHBsYXllcjogUGxheWVyKSB7XG4gICAgaWYgKGluc3RhbmNlcy5oYXMocGxheWVyLmlkKSkgcmV0dXJuIHRydWU7XG5cbiAgICBpbnN0YW5jZXMuc2V0KHBsYXllci5pZCwgcGxheWVyKTtcblxuICAgIHJldHVybiBpbnN0YW5jZXMuaGFzKHBsYXllci5pZCk7XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vLi4vUGxheWVyJztcbmltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclBsYXllcihwbGF5ZXI6IFBsYXllcikge1xuICAgIHJldHVybiBpbnN0YW5jZXMuZGVsZXRlKHBsYXllci5pZCk7XG59XG4iLCAiaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBsYXllcnMoKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlcy5hcnJheSgpO1xufVxuIiwgImltcG9ydCB7IGdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbFJlZ2lzdHJ5KCkge1xuICAgIHJldHVybiBnbG9iYWxSZWdpc3RyeTtcbn1cbiIsICJpbXBvcnQgeyBVc2VyUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGFzc1Rocm91Z2gsIHR5cGUgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRW5kQmVoYXZpb3JUeXBlIH0gZnJvbSAnQGRpc2NvcmRqcy92b2ljZSc7XG5pbXBvcnQgKiBhcyBwcmlzbSBmcm9tICdwcmlzbS1tZWRpYSc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgUmF3VHJhY2tEYXRhIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlUmVjZWl2ZXJPcHRpb25zIHtcbiAgICBtb2RlPzogJ29wdXMnIHwgJ3BjbSc7XG4gICAgZW5kPzogRW5kQmVoYXZpb3JUeXBlO1xuICAgIHNpbGVuY2VEdXJhdGlvbj86IG51bWJlcjtcbiAgICBjcmM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBSYXdUcmFja0luaXQgPSBQYXJ0aWFsPE9taXQ8UmF3VHJhY2tEYXRhLCAnYXV0aG9yJyB8ICdwbGF5bGlzdCcgfCAnc291cmNlJyB8ICdlbmdpbmUnIHwgJ3JhdycgfCAncXVlcnlUeXBlJyB8ICdkZXNjcmlwdGlvbicgfCAndmlld3MnPj47XG5cbmV4cG9ydCBjbGFzcyBWb2ljZVJlY2VpdmVyTm9kZSB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyKSB7fVxuXG4gICAgcHVibGljIGNyZWF0ZVJhd1RyYWNrKHN0cmVhbTogUmVhZGFibGUsIGRhdGE6IFJhd1RyYWNrSW5pdCA9IHt9KSB7XG4gICAgICAgIGRhdGEudGl0bGUgPz89IGBSZWNvcmRpbmcgJHtEYXRlLm5vdygpfWA7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBUcmFjayh0aGlzLmRpc3BhdGNoZXIucXVldWUucGxheWVyLCB7XG4gICAgICAgICAgICBhdXRob3I6ICdEaXNjb3JkJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLnRpdGxlLFxuICAgICAgICAgICAgdGl0bGU6IGRhdGEudGl0bGUsXG4gICAgICAgICAgICBkdXJhdGlvbjogZGF0YS5kdXJhdGlvbiB8fCAnMDowMCcsXG4gICAgICAgICAgICB2aWV3czogMCxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBkYXRhLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgdGh1bWJuYWlsOiBkYXRhLnRodW1ibmFpbCB8fCAnaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vZW1iZWQvYXZhdGFycy8wLnBuZycsXG4gICAgICAgICAgICB1cmw6IGRhdGEudXJsIHx8ICdodHRwczovL2Rpc2NvcmQuY29tJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ2FyYml0cmFyeScsXG4gICAgICAgICAgICByYXc6IHtcbiAgICAgICAgICAgICAgICBlbmdpbmU6IHN0cmVhbSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdhcmJpdHJhcnknXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlIG11bHRpcGxlIHN0cmVhbXMgdG9nZXRoZXJcbiAgICAgKiBAcGFyYW0gc3RyZWFtcyBUaGUgYXJyYXkgb2Ygc3RyZWFtcyB0byBtZXJnZVxuICAgICAqL1xuICAgIHB1YmxpYyBtZXJnZVJlY29yZGluZ3Moc3RyZWFtczogUmVhZGFibGVbXSkge1xuICAgICAgICAvLyBUT0RPXG4gICAgICAgIHZvaWQgc3RyZWFtcztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNvcmQgYSB1c2VyIGluIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gdXNlciBUaGUgdXNlciB0byByZWNvcmRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBSZWNvcmRpbmcgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyByZWNvcmRVc2VyKFxuICAgICAgICB1c2VyOiBVc2VyUmVzb2x2YWJsZSxcbiAgICAgICAgb3B0aW9uczogVm9pY2VSZWNlaXZlck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBlbmQ6IEVuZEJlaGF2aW9yVHlwZS5BZnRlclNpbGVuY2UsXG4gICAgICAgICAgICBtb2RlOiAncGNtJyxcbiAgICAgICAgICAgIHNpbGVuY2VEdXJhdGlvbjogMTAwMFxuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IF91c2VyID0gdGhpcy5kaXNwYXRjaGVyLnF1ZXVlLnBsYXllci5jbGllbnQudXNlcnMucmVzb2x2ZUlkKHVzZXIpO1xuXG4gICAgICAgIGNvbnN0IHBhc3NUaHJvdWdoID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVyID0gdGhpcy5kaXNwYXRjaGVyLnZvaWNlQ29ubmVjdGlvbi5yZWNlaXZlcjtcblxuICAgICAgICBpZiAoIXJlY2VpdmVyKSB0aHJvdyBuZXcgRXJyb3IoJ1ZvaWNlIHJlY2VpdmVyIGlzIG5vdCBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PycpO1xuXG4gICAgICAgIHJlY2VpdmVyLnNwZWFraW5nLm9uKCdzdGFydCcsICh1c2VySWQpID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VySWQgPT09IF91c2VyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjZWl2ZVN0cmVhbSA9IHJlY2VpdmVyLnN1YnNjcmliZShfdXNlciwge1xuICAgICAgICAgICAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiBvcHRpb25zLmVuZCB8fCBFbmRCZWhhdmlvclR5cGUuQWZ0ZXJTaWxlbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IG9wdGlvbnMuc2lsZW5jZUR1cmF0aW9uID8/IDEwMDBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubW9kZSA9PT0gJ3BjbScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBjbSA9IHJlY2VpdmVTdHJlYW0ucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyAocHJpc20ub3B1cyB8fCAoPGFueT5wcmlzbSkuZGVmYXVsdC5vcHVzKS5EZWNvZGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHM6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZTogOTYwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlOiA0ODAwMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBjbS5waXBlKHBhc3NUaHJvdWdoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXZlU3RyZWFtLnBpcGUocGFzc1Rocm91Z2gpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkudW5yZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoIGFzIFJlYWRhYmxlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBRdWVyeUV4dHJhY3RvclNlYXJjaCwgUXVlcnlUeXBlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHREYXRhIHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoIHwgbnVsbDtcbiAgICBleHRyYWN0b3I/OiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgICB0cmFja3M/OiBUcmFja1tdO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hSZXN1bHQge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHByaXZhdGUgX2RhdGE6IFNlYXJjaFJlc3VsdERhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAgICAgICB0cmFjay5leHRyYWN0b3IgPz89IHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA/Pz0gX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFF1ZXJ5VHlwZSh0eXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCkge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZXF1ZXN0ZWRCeSh1c2VyOiBVc2VyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuZXh0cmFjdG9yID0gZXh0cmFjdG9yO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmFja3ModHJhY2tzOiBUcmFja1tdKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRQbGF5bGlzdChwbGF5bGlzdDogUGxheWxpc3QpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSB8fCBRdWVyeVR5cGUuQVVUTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXlsaXN0IHJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYWNrcyByZXN1bHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRyYWNrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEudHJhY2tzIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RlZCBieVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmUtZXhlY3V0ZSB0aGlzIHNlYXJjaFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgICAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzUGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlsaXN0ICE9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyB0cmFja3NcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICAgICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGVudW0gRXJyb3JTdGF0dXNDb2RlIHtcbiAgICBTVFJFQU1fRVJST1IgPSAnU3RyZWFtRXJyb3InLFxuICAgIEFVRElPX1BMQVlFUl9FUlJPUiA9ICdBdWRpb1BsYXllckVycm9yJyxcbiAgICBQTEFZRVJfRVJST1IgPSAnUGxheWVyRXJyb3InLFxuICAgIE5PX0FVRElPX1JFU09VUkNFID0gJ05vQXVkaW9SZXNvdXJjZScsXG4gICAgVU5LTk9XTl9HVUlMRCA9ICdVbmtub3duR3VpbGQnLFxuICAgIElOVkFMSURfQVJHX1RZUEUgPSAnSW52YWxpZEFyZ1R5cGUnLFxuICAgIFVOS05PV05fRVhUUkFDVE9SID0gJ1Vua25vd25FeHRyYWN0b3InLFxuICAgIElOVkFMSURfRVhUUkFDVE9SID0gJ0ludmFsaWRFeHRyYWN0b3InLFxuICAgIElOVkFMSURfQ0hBTk5FTF9UWVBFID0gJ0ludmFsaWRDaGFubmVsVHlwZScsXG4gICAgSU5WQUxJRF9UUkFDSyA9ICdJbnZhbGlkVHJhY2snLFxuICAgIFVOS05PV05fUkVQRUFUX01PREUgPSAnVW5rbm93blJlcGVhdE1vZGUnLFxuICAgIFRSQUNLX05PVF9GT1VORCA9ICdUcmFja05vdEZvdW5kJyxcbiAgICBOT19DT05ORUNUSU9OID0gJ05vQ29ubmVjdGlvbicsXG4gICAgREVTVFJPWUVEX1FVRVVFID0gJ0Rlc3Ryb3llZFF1ZXVlJ1xufVxuXG5leHBvcnQgY2xhc3MgUGxheWVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHN0YXR1c0NvZGU6IEVycm9yU3RhdHVzQ29kZTtcbiAgICBjcmVhdGVkQXQgPSBuZXcgRGF0ZSgpO1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBjb2RlOiBFcnJvclN0YXR1c0NvZGUgPSBFcnJvclN0YXR1c0NvZGUuUExBWUVSX0VSUk9SKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5tZXNzYWdlID0gYFske2NvZGV9XSAke21lc3NhZ2V9YDtcbiAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gY29kZTtcbiAgICAgICAgdGhpcy5uYW1lID0gY29kZTtcblxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzKTtcbiAgICB9XG5cbiAgICBnZXQgY3JlYXRlZFRpbWVzdGFtcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICB9XG5cbiAgICB2YWx1ZU9mKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXNDb2RlO1xuICAgIH1cblxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgICAgICAgY29kZTogdGhpcy5zdGF0dXNDb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgICAgICAgY3JlYXRlZDogdGhpcy5jcmVhdGVkVGltZXN0YW1wXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBWb2ljZUNoYW5uZWwsIFN0YWdlQ2hhbm5lbCwgU25vd2ZsYWtlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLCBqb2luVm9pY2VDaGFubmVsLCBWb2ljZUNvbm5lY3Rpb24sIGdldFZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzLCBBdWRpb1BsYXllciB9IGZyb20gJ0BkaXNjb3JkanMvdm9pY2UnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9TdHJ1Y3R1cmVzJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcblxuY2xhc3MgVm9pY2VVdGlscyB7XG4gICAgcHVibGljIGNhY2hlOiBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgdXRpbHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNhY2hlIHdoZXJlIHZvaWNlIHV0aWxzIHN0b3JlcyBzdHJlYW0gbWFuYWdlcnNcbiAgICAgICAgICogQHR5cGUge0NvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgQ29sbGVjdGlvbjxTbm93Zmxha2UsIFN0cmVhbURpc3BhdGNoZXI+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsLCBjcmVhdGluZyBiYXNpYyBzdHJlYW0gZGlzcGF0Y2ggbWFuYWdlclxuICAgICAqIEBwYXJhbSB7U3RhZ2VDaGFubmVsfFZvaWNlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gSm9pbiBvcHRpb25zXG4gICAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QoXG4gICAgICAgIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAgIGRlYWY/OiBib29sZWFuO1xuICAgICAgICAgICAgbWF4VGltZT86IG51bWJlcjtcbiAgICAgICAgICAgIHF1ZXVlOiBHdWlsZFF1ZXVlO1xuICAgICAgICAgICAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcjtcbiAgICAgICAgfVxuICAgICk6IFByb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj4ge1xuICAgICAgICBpZiAoIW9wdGlvbnM/LnF1ZXVlKSB0aHJvdyBuZXcgRXJyb3IoJ0d1aWxkUXVldWUgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMuam9pbihjaGFubmVsLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgc3ViID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoY29ubiwgY2hhbm5lbCwgb3B0aW9ucy5xdWV1ZSwgb3B0aW9ucy5tYXhUaW1lLCBvcHRpb25zLmF1ZGlvUGxheWVyKTtcbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoY2hhbm5lbC5ndWlsZC5pZCwgc3ViKTtcbiAgICAgICAgcmV0dXJuIHN1YjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IFtjaGFubmVsXSBUaGUgdm9pY2Uvc3RhZ2UgY2hhbm5lbCB0byBqb2luXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBqb2luKFxuICAgICAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBkZWFmPzogYm9vbGVhbjtcbiAgICAgICAgICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgY29uc3QgY29ubiA9IGpvaW5Wb2ljZUNoYW5uZWwoe1xuICAgICAgICAgICAgZ3VpbGRJZDogY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgICAgICAgIGNoYW5uZWxJZDogY2hhbm5lbC5pZCxcbiAgICAgICAgICAgIGFkYXB0ZXJDcmVhdG9yOiBjaGFubmVsLmd1aWxkLnZvaWNlQWRhcHRlckNyZWF0b3IgYXMgdW5rbm93biBhcyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICAgICAgICAgICAgc2VsZkRlYWY6IEJvb2xlYW4ob3B0aW9ucz8uZGVhZiksXG4gICAgICAgICAgICBkZWJ1ZzogdGhpcy5wbGF5ZXIuZXZlbnRzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcygnZGVidWcnKVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29ubjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzY29ubmVjdChjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24gfCBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgICAgIGlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgU3RyZWFtRGlzcGF0Y2hlcikgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHJldHVybiBjb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBEaXNjb3JkIFBsYXllciB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtTbm93Zmxha2V9IGd1aWxkIFRoZSBndWlsZCBpZFxuICAgICAqIEByZXR1cm5zIHtTdHJlYW1EaXNwYXRjaGVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb25uZWN0aW9uKGd1aWxkOiBTbm93Zmxha2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGd1aWxkKSB8fCBnZXRWb2ljZUNvbm5lY3Rpb24oZ3VpbGQpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgVm9pY2VVdGlscyB9O1xuIiwgImltcG9ydCB7XG4gICAgQXVkaW9QbGF5ZXIsXG4gICAgQXVkaW9QbGF5ZXJFcnJvcixcbiAgICBBdWRpb1BsYXllclN0YXR1cyxcbiAgICBBdWRpb1Jlc291cmNlLFxuICAgIGNyZWF0ZUF1ZGlvUGxheWVyLFxuICAgIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gICAgZW50ZXJzU3RhdGUsXG4gICAgU3RyZWFtVHlwZSxcbiAgICBWb2ljZUNvbm5lY3Rpb24sXG4gICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICAgIFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24sXG4gICAgdmVyc2lvblxufSBmcm9tICdAZGlzY29yZGpzL3ZvaWNlJztcbmltcG9ydCB7IFN0YWdlQ2hhbm5lbCwgVm9pY2VDaGFubmVsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL1N0cnVjdHVyZXMvVHJhY2snO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWVyRXJyb3IsIEVycm9yU3RhdHVzQ29kZSB9IGZyb20gJy4uL1N0cnVjdHVyZXMvUGxheWVyRXJyb3InO1xuaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgQmlxdWFkRmlsdGVycywgUENNRmlsdGVycywgRmlsdGVyc0NoYWluIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBQb3N0UHJvY2Vzc2VkUmVzdWx0IH0gZnJvbSAnLi4vU3RydWN0dXJlcyc7XG5pbXBvcnQgeyBWb2ljZVJlY2VpdmVyTm9kZSB9IGZyb20gJy4uL1N0cnVjdHVyZXMvVm9pY2VSZWNlaXZlck5vZGUnO1xuXG5jb25zdCBuZWVkc0tlZXBBbGl2ZVBhdGNoID0gKCgpID0+IHtcbiAgICBpZiAoJ0RQX05PX0tFRVBBTElWRV9QQVRDSCcgaW4gcHJvY2Vzcy5lbnYpIHJldHVybiBmYWxzZTtcbiAgICAvLyB3ZSBkb250IGNhcmUgYWJvdXQgZGV2IHZlcnNpb24gYW5kIHNlbXZlcjptYWpvciA+PSAxXG4gICAgaWYgKHZlcnNpb24uaW5jbHVkZXMoJy1kZXYnKSB8fCB2ZXJzaW9uLnN0YXJ0c1dpdGgoJzEnKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjb25zdCBbLCBtaW5vciwgcGF0Y2hdID0gdmVyc2lvbi5zcGxpdCgnLicpLm1hcCgobikgPT4gcGFyc2VJbnQobikpO1xuXG4gICAgaWYgKGlzTmFOKG1pbm9yKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gd2UgbmVlZCBhIHBhdGNoIGlmIHNlbXZlcjptaW5vciBpcyA8IDE1IGFuZCBzZW12ZXI6cGF0Y2ggPCAxXG4gICAgcmV0dXJuIG1pbm9yID4gMTQgPyBmYWxzZSA6IG1pbm9yIDwgMTUgJiYgcGF0Y2ggPCAxO1xufSkoKTtcblxuaW50ZXJmYWNlIENyZWF0ZVN0cmVhbU9wcyB7XG4gICAgdHlwZT86IFN0cmVhbVR5cGU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhPzogYW55O1xuICAgIGRpc2FibGVWb2x1bWU/OiBib29sZWFuO1xuICAgIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICAgIGRpc2FibGVCaXF1YWQ/OiBib29sZWFuO1xuICAgIGVxPzogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZEZpbHRlcj86IEJpcXVhZEZpbHRlcnM7XG4gICAgZGlzYWJsZUZpbHRlcnM/OiBib29sZWFuO1xuICAgIGRlZmF1bHRGaWx0ZXJzPzogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZT86IG51bWJlcjtcbiAgICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbiAgICBzYW1wbGVSYXRlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlRXZlbnRzIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gICAgZXJyb3I6IChlcnJvcjogQXVkaW9QbGF5ZXJFcnJvcikgPT4gYW55O1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgc3RhcnQ6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgICBmaW5pc2g6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgICBkc3A6IChmaWx0ZXJzOiBQQ01GaWx0ZXJzW10pID0+IGFueTtcbiAgICBlcUJhbmRzOiAoZmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiBhbnk7XG4gICAgc2FtcGxlUmF0ZTogKGZpbHRlcnM6IG51bWJlcikgPT4gYW55O1xuICAgIGJpcXVhZDogKGZpbHRlcnM6IEJpcXVhZEZpbHRlcnMpID0+IGFueTtcbiAgICB2b2x1bWU6ICh2b2x1bWU6IG51bWJlcikgPT4gYW55O1xuICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xufVxuXG5jbGFzcyBTdHJlYW1EaXNwYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPFZvaWNlRXZlbnRzPiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHZvaWNlQ29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uO1xuICAgIHB1YmxpYyByZWFkb25seSBhdWRpb1BsYXllcjogQXVkaW9QbGF5ZXI7XG4gICAgcHVibGljIHJlY2VpdmVyID0gbmV3IFZvaWNlUmVjZWl2ZXJOb2RlKHRoaXMpO1xuICAgIHB1YmxpYyBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWw7XG4gICAgcHVibGljIGF1ZGlvUmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkeUxvY2sgPSBmYWxzZTtcbiAgICBwdWJsaWMgZHNwID0gbmV3IEZpbHRlcnNDaGFpbigpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgY29ubmVjdGlvbiBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvblxuICAgICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgY29ubmVjdGVkIGNoYW5uZWxcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiwgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLCBwdWJsaWMgcXVldWU6IEd1aWxkUXVldWUsIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyID0gMjAwMDAsIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgICAgICogQHR5cGUge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1ZGlvIHBsYXllclxuICAgICAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyID1cbiAgICAgICAgICAgIGF1ZGlvUGxheWVyIHx8XG4gICAgICAgICAgICBjcmVhdGVBdWRpb1BsYXllcih7XG4gICAgICAgICAgICAgICAgZGVidWc6IHRoaXMucXVldWUucGxheWVyLmV2ZW50cy5ldmVudE5hbWVzKCkuaW5jbHVkZXMoJ2RlYnVnJylcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdm9pY2UgY2hhbm5lbFxuICAgICAgICAgKiBAdHlwZSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7XG5cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvciBhcyBBdWRpb1BsYXllckVycm9yKSk7XG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignZXJyb3InLCAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKSk7XG5cbiAgICAgICAgdGhpcy5kc3Aub25VcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZHNwKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycykgdGhpcy5lbWl0KCdkc3AnLCB0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5iaXF1YWQ/LmZpbHRlcikgdGhpcy5lbWl0KCdiaXF1YWQnLCB0aGlzLmRzcC5iaXF1YWQ/LmZpbHRlcik7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AuZXF1YWxpemVyKSB0aGlzLmVtaXQoJ2VxQmFuZHMnLCB0aGlzLmRzcC5lcXVhbGl6ZXIuZ2V0RVEoKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3Audm9sdW1lKSB0aGlzLmVtaXQoJ3ZvbHVtZScsIHRoaXMuZHNwLnZvbHVtZS52b2x1bWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLnJlc2FtcGxlcikgdGhpcy5lbWl0KCdzYW1wbGVSYXRlJywgdGhpcy5kc3AucmVzYW1wbGVyLnRhcmdldFNhbXBsZVJhdGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZHNwLm9uRXJyb3IgPSAoZSkgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG5cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ3N0YXRlQ2hhbmdlJywgYXN5bmMgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5lZWRzS2VlcEFsaXZlUGF0Y2gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBEZXRlY3RlZCBAZGlzY29yZGpzL3ZvaWNlIHZlcnNpb24gJHt2ZXJzaW9ufSB3aGljaCBuZWVkcyBrZWVwQWxpdmUgcGF0Y2gsIGFwcGx5aW5nIHBhdGNoLi4uYCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkTmV0d29ya2luZyA9IFJlZmxlY3QuZ2V0KG9sZFN0YXRlLCAnbmV0d29ya2luZycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld05ldHdvcmtpbmcgPSBSZWZsZWN0LmdldChuZXdTdGF0ZSwgJ25ldHdvcmtpbmcnKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtTdGF0ZUNoYW5nZUhhbmRsZXIgPSAoXzogb2JqZWN0LCBuZXdOZXR3b3JrU3RhdGU6IG9iamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdVZHAgPSBSZWZsZWN0LmdldChuZXdOZXR3b3JrU3RhdGUsICd1ZHAnKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChuZXdVZHA/LmtlZXBBbGl2ZUludGVydmFsKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgb2xkTmV0d29ya2luZz8ub2ZmKCdzdGF0ZUNoYW5nZScsIG5ldHdvcmtTdGF0ZUNoYW5nZUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIG5ld05ldHdvcmtpbmc/Lm9uKCdzdGF0ZUNoYW5nZScsIG5ldHdvcmtTdGF0ZUNoYW5nZUhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnJlYXNvbiA9PT0gVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbi5XZWJTb2NrZXRDbG9zZSAmJiBuZXdTdGF0ZS5jbG9zZUNvZGUgPT09IDQwMTQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGVudGVyc1N0YXRlKHRoaXMudm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZywgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLnZvaWNlQ29ubmVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW5BdHRlbXB0cyA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgVXRpbC53YWl0KCh0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW5BdHRlbXB0cyArIDEpICogNTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLnZvaWNlQ29ubmVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyciBhcyBBdWRpb1BsYXllckVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMucmVhZHlMb2NrICYmIChuZXdTdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nIHx8IG5ld1N0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlNpZ25hbGxpbmcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkeUxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVudGVyc1N0YXRlKHRoaXMudm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHksIHRoaXMuY29ubmVjdGlvblRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWR5TG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignc3RhdGVDaGFuZ2UnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiYgbmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnBsYXllci5ldmVudHMuZW1pdCgncGxheWVyUGF1c2UnLCB0aGlzLnF1ZXVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmIG5ld1N0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRzLmVtaXQoJ3BsYXllclJlc3VtZScsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSB8fCBvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkJ1ZmZlcmluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdzdGFydCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlICYmIG9sZFN0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgICAgICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN1YnNjcmliZSh0aGlzLmF1ZGlvUGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyBiZWVuIHBhdXNlZCBtYW51YWxseVxuICAgICAqL1xuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkO1xuICAgIH1cblxuICAgIHNldCBwYXVzZWQodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHZhbCA/IHRoaXMucGF1c2UodHJ1ZSkgOiB0aGlzLnJlc3VtZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5LlxuICAgICAqL1xuICAgIGlzUGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXVzZWQgfHwgdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkF1dG9QYXVzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnVmZmVyaW5nXG4gICAgICovXG4gICAgaXNCdWZmZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmdcbiAgICAgKi9cbiAgICBpc1BsYXlpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpZGxlXG4gICAgICovXG4gICAgaXNJZGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgaXNEZXN0cm95ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgaXNEaXNjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gcGxheVxuICAgICAqL1xuICAgIGlzUmVhZHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBzaWduYWxsaW5nXG4gICAgICovXG4gICAgaXNTaWduYWxsaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuU2lnbmFsbGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBjb25uZWN0aW5nXG4gICAgICovXG4gICAgaXNDb25uZWN0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHN0cmVhbVxuICAgICAqIEBwYXJhbSB7UmVhZGFibGV9IHNyYyBUaGUgc3RyZWFtIHNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3BzXSBPcHRpb25zXG4gICAgICogQHJldHVybnMge0F1ZGlvUmVzb3VyY2V9XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlU3RyZWFtKHNyYzogUmVhZGFibGUsIG9wcz86IENyZWF0ZVN0cmVhbU9wcykge1xuICAgICAgICBpZiAoIW9wcz8uZGlzYWJsZUZpbHRlcnMpIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYXRpbmcgRFNQIGZpbHRlcnMgcGlwZWxpbmUuLi4nKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gIW9wcz8uZGlzYWJsZUZpbHRlcnNcbiAgICAgICAgICAgID8gdGhpcy5kc3AuY3JlYXRlKHNyYywge1xuICAgICAgICAgICAgICAgICAgZHNwOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogb3BzPy5kZWZhdWx0RmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGJpcXVhZDogb3BzPy5iaXF1YWRGaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IG9wcy5iaXF1YWRGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUJpcXVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgcmVzYW1wbGVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2FtcGxlUmF0ZTogb3BzPy5zYW1wbGVSYXRlLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVSZXNhbXBsZXJcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBlcXVhbGl6ZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICBiYW5kTXVsdGlwbGllcjogb3BzPy5lcSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRXF1YWxpemVyXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdm9sdW1lOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdm9sdW1lOiBvcHM/LnZvbHVtZSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlVm9sdW1lXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IHNyYztcblxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKCdFeGVjdXRpbmcgb25BZnRlckNyZWF0ZVN0cmVhbSBob29rLi4uJyk7XG4gICAgICAgIGNvbnN0IHBvc3RTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLm9uQWZ0ZXJDcmVhdGVTdHJlYW0/LihzdHJlYW0sIHRoaXMucXVldWUpLmNhdGNoKFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW06IHN0cmVhbSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5XG4gICAgICAgICAgICAgICAgfSBhcyBQb3N0UHJvY2Vzc2VkUmVzdWx0KVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoJ1ByZXBhcmluZyBBdWRpb1Jlc291cmNlLi4uJyk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IGNyZWF0ZUF1ZGlvUmVzb3VyY2UocG9zdFN0cmVhbT8uc3RyZWFtID8/IHN0cmVhbSwge1xuICAgICAgICAgICAgaW5wdXRUeXBlOiBwb3N0U3RyZWFtPy50eXBlID8/IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBvcHM/LmRhdGEsXG4gICAgICAgICAgICAvLyB2b2x1bWUgY29udHJvbHMgaGFwcGVuIGZyb20gQXVkaW9GaWx0ZXIgRFNQIHV0aWxpdHlcbiAgICAgICAgICAgIGlubGluZVZvbHVtZTogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5yZXNhbXBsZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LmZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8uYmlxdWFkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8uZXF1YWxpemVyIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllciBzdGF0dXNcbiAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0IHN0YXR1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIGZyb20gdm9pY2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9QbGF5ZXIpIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCh0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcHMgdGhlIHBsYXllclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGVuZCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgdGhlIHN0cmVhbSBwbGF5YmFja1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVycG9sYXRlU2lsZW5jZT1mYWxzZV0gSWYgdHJ1ZSwgdGhlIHBsYXllciB3aWxsIHBsYXkgNSBwYWNrZXRzIG9mIHNpbGVuY2UgYWZ0ZXIgcGF1c2luZyB0byBwcmV2ZW50IGF1ZGlvIGdsaXRjaGVzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIHBhdXNlKGludGVycG9sYXRlU2lsZW5jZT86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuYXVkaW9QbGF5ZXIucGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlKTtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgcmVzdW1lKCkge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci51bnBhdXNlKCk7XG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgc3RyZWFtXG4gICAgICogQHBhcmFtIHtBdWRpb1Jlc291cmNlPFRyYWNrPn0gW3Jlc291cmNlPXRoaXMuYXVkaW9SZXNvdXJjZV0gVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBwbGF5U3RyZWFtKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiA9IHRoaXMuYXVkaW9SZXNvdXJjZSEpIHtcbiAgICAgICAgaWYgKCFyZXNvdXJjZSkgdGhyb3cgbmV3IFBsYXllckVycm9yKCdBdWRpbyByZXNvdXJjZSBpcyBub3QgYXZhaWxhYmxlIScsIEVycm9yU3RhdHVzQ29kZS5OT19BVURJT19SRVNPVVJDRSk7XG4gICAgICAgIGlmIChyZXNvdXJjZS5lbmRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5lbWl0KCdmaW5pc2gnLCByZXNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHRoaXMuYXVkaW9SZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUodGhpcy52b2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSwgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucGxheShyZXNvdXJjZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBwbGF5YmFjayB2b2x1bWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIHZvbHVtZSBhbW91bnRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzZXRWb2x1bWUodmFsdWU6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIDEwMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwLnZvbHVtZS52b2x1bWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXliYWNrIHRpbWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBzdHJlYW1UaW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2UucGxheWJhY2tEdXJhdGlvbjtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgYXMgU3RyZWFtRGlzcGF0Y2hlciB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9TdHJ1Y3R1cmVzL1NlYXJjaFJlc3VsdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL1N0cnVjdHVyZXMvVHJhY2snO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVPcHRpb25zIHtcbiAgICBjaGVja0ludGVydmFsPzogbnVtYmVyO1xufVxuXG4vLyA1aFxuY29uc3QgREVGQVVMVF9FWFBJUllfVElNRU9VVCA9IDE4XzAwMF8wMDA7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUNhY2hlIHtcbiAgICAjZGVmYXVsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFRyYWNrPj4oKTtcbiAgICBwdWJsaWMgdGltZXI6IE5vZGVKUy5UaW1lcjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwbGF5ZXI6IFBsYXllcixcbiAgICAgICAgcHVibGljIG9wdGlvbnM6IFF1ZXJ5Q2FjaGVPcHRpb25zID0ge1xuICAgICAgICAgICAgY2hlY2tJbnRlcnZhbDogREVGQVVMVF9FWFBJUllfVElNRU9VVFxuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCh0aGlzLmNsZWFudXAuYmluZCh0aGlzKSwgdGhpcy5jaGVja0ludGVydmFsKS51bnJlZigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2hlY2tJbnRlcnZhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jaGVja0ludGVydmFsID8/IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFudXAoKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2lkLCB2YWx1ZV0gb2YgdGhpcy4jZGVmYXVsdENhY2hlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUuaGFzRXhwaXJlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXREYXRhKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuI2RlZmF1bHRDYWNoZS52YWx1ZXMoKV07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KSB7XG4gICAgICAgIGRhdGEudHJhY2tzLmZvckVhY2goKGQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNkZWZhdWx0Q2FjaGUuaGFzKGQudXJsKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLnNldChkLnVybCwgbmV3IERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlKGQpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlc29sdmUoY29udGV4dDogUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNkZWZhdWx0Q2FjaGUuZ2V0KGNvbnRleHQucXVlcnkpO1xuICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICAgICAgICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IGNvbnRleHQucmVxdWVzdGVkQnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcy5wbGF5ZXIsIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBjb250ZXh0LnF1ZXJ5LFxuICAgICAgICAgICAgdHJhY2tzOiBbcmVzdWx0LmRhdGFdLFxuICAgICAgICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICAgICAgICBxdWVyeVR5cGU6IGNvbnRleHQucXVlcnlUeXBlLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IGNvbnRleHQucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VCA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgZXhwaXJlQWZ0ZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZGF0YTogVCwgZXhwaXJlQWZ0ZXI6IG51bWJlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBleHBpcmVBZnRlciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwaXJlQWZ0ZXIgPSBEYXRlLm5vdygpICsgZXhwaXJlQWZ0ZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzRXhwaXJlZCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmV4cGlyZUFmdGVyICE9PSAnbnVtYmVyJyB8fCBpc05hTih0aGlzLmV4cGlyZUFmdGVyKSB8fCB0aGlzLmV4cGlyZUFmdGVyIDwgMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3coKSA8PSB0aGlzLmV4cGlyZUFmdGVyO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0IHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlcjtcbiAgICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBgZXh0OiR7c3RyaW5nfWA7XG59XG4iLCAiaW1wb3J0IHsgQ2xpZW50LCBTbm93Zmxha2VVdGlsLCBWb2ljZVN0YXRlLCBJbnRlbnRzQml0RmllbGQsIFVzZXIsIENoYW5uZWxUeXBlLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXlsaXN0LCBUcmFjaywgR3VpbGRRdWV1ZUV2ZW50cywgVm9pY2VDb25uZWN0Q29uZmlnLCBHdWlsZE5vZGVDcmVhdGVPcHRpb25zLCBHdWlsZE5vZGVNYW5hZ2VyLCBTZWFyY2hSZXN1bHQsIEd1aWxkUXVldWUgfSBmcm9tICcuL1N0cnVjdHVyZXMnO1xuaW1wb3J0IHsgVm9pY2VVdGlscyB9IGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscyc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMsIFF1ZXJ5VHlwZSwgU2VhcmNoT3B0aW9ucywgUGxheWVySW5pdE9wdGlvbnMsIFBsYXlsaXN0SW5pdERhdGEsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgUXVlcnlSZXNvbHZlciB9IGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi91dGlscy9VdGlsJztcbmltcG9ydCB7IGdlbmVyYXRlRGVwZW5kZW5jeVJlcG9ydCB9IGZyb20gJ0BkaXNjb3JkanMvdm9pY2UnO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgKiBhcyBfaW50ZXJuYWxzIGZyb20gJy4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUgfSBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5cbmNvbnN0IGtTaW5nbGV0b24gPSBTeW1ib2woJ0luc3RhbmNlRGlzY29yZFBsYXllclNpbmdsZXRvbicpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICAgIHRyYWNrOiBUcmFjaztcbiAgICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICAgIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0O1xuICAgIHF1ZXVlOiBHdWlsZFF1ZXVlPFQ+O1xufVxuXG5leHBvcnQgY2xhc3MgUGxheWVyIGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxQbGF5ZXJFdmVudHM+IHtcbiAgICAjbGFzdExhdGVuY3kgPSAtMTtcbiAgICAjdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyID0gdGhpcy5oYW5kbGVWb2ljZVN0YXRlLmJpbmQodGhpcyk7XG4gICAgI2xhZ01vbml0b3JUaW1lb3V0ITogTm9kZUpTLlRpbWVvdXQ7XG4gICAgI2xhZ01vbml0b3JJbnRlcnZhbCE6IE5vZGVKUy5UaW1lcjtcbiAgICBwdWJsaWMgc3RhdGljIF9zaW5nbGV0b25LZXkgPSBrU2luZ2xldG9uO1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHB1YmxpYyByZWFkb25seSBjbGllbnQhOiBDbGllbnQ7XG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnMhOiBQbGF5ZXJJbml0T3B0aW9ucztcbiAgICBwdWJsaWMgbm9kZXMgPSBuZXcgR3VpbGROb2RlTWFuYWdlcih0aGlzKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdm9pY2VVdGlscyA9IG5ldyBWb2ljZVV0aWxzKHRoaXMpO1xuICAgIHB1YmxpYyBleHRyYWN0b3JzID0gbmV3IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQodGhpcyk7XG4gICAgcHVibGljIGV2ZW50cyA9IG5ldyBQbGF5ZXJFdmVudHNFbWl0dGVyPEd1aWxkUXVldWVFdmVudHM+KFsnZXJyb3InLCAncGxheWVyRXJyb3InXSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBEaXNjb3JkIFBsYXllclxuICAgICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgVGhlIERpc2NvcmQgQ2xpZW50XG4gICAgICogQHBhcmFtIHtQbGF5ZXJJbml0T3B0aW9uc30gW29wdGlvbnNdIFRoZSBwbGF5ZXIgaW5pdCBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVJbnN0YW5jZSAmJiBrU2luZ2xldG9uIGluIFBsYXllcikgcmV0dXJuICg8YW55PlBsYXllcilba1NpbmdsZXRvbl0gYXMgUGxheWVyO1xuXG4gICAgICAgIHN1cGVyKFsnZXJyb3InXSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaXNjb3JkLmpzIGNsaWVudFxuICAgICAgICAgKiBAdHlwZSB7Q2xpZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuY2xpZW50Py5vcHRpb25zPy5pbnRlbnRzICYmICFuZXcgSW50ZW50c0JpdEZpZWxkKHRoaXMuY2xpZW50Py5vcHRpb25zPy5pbnRlbnRzKS5oYXMoSW50ZW50c0JpdEZpZWxkLkZsYWdzLkd1aWxkVm9pY2VTdGF0ZXMpKSB7XG4gICAgICAgICAgICBVdGlsLndhcm4oJ2NsaWVudCBpcyBtaXNzaW5nIFwiR3VpbGRWb2ljZVN0YXRlc1wiIGludGVudCcsICdJbnZhbGlkSW50ZW50c0JpdEZpZWxkJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGV4dHJhY3RvcnMgY29sbGVjdGlvblxuICAgICAgICAgKiBAdHlwZSB7RXh0cmFjdG9yTW9kZWx9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhdXRvUmVnaXN0ZXJFeHRyYWN0b3I6IHRydWUsXG4gICAgICAgICAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI6IGZhbHNlLFxuICAgICAgICAgICAgYmxvY2tFeHRyYWN0b3JzOiBbXSxcbiAgICAgICAgICAgIGJsb2NrU3RyZWFtRnJvbTogW10sXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogMjAwMDAsXG4gICAgICAgICAgICBzbW9vdGhWb2x1bWU6IHRydWUsXG4gICAgICAgICAgICBsYWdNb25pdG9yOiAzMDAwMCxcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGU6IG9wdGlvbnMucXVlcnlDYWNoZSA9PT0gbnVsbCA/IG51bGwgOiBuZXcgUXVlcnlDYWNoZSh0aGlzKSxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB5dGRsT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGhpZ2hXYXRlck1hcms6IDEgPDwgMjUsXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucy55dGRsT3B0aW9uc1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuY2xpZW50Lm9uKCd2b2ljZVN0YXRlVXBkYXRlJywgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvUmVnaXN0ZXJFeHRyYWN0b3IpIHtcbiAgICAgICAgICAgIFV0aWwud2FybignVXNlIG9mIFwiPFBsYXllcj5bb3B0aW9ucy5hdXRvUmVnaXN0ZXJFeHRyYWN0b3JdXCIgaXMgZGVwcmVjYXRlZCwgdXNlIFwiYXdhaXQgPFBsYXllcj4uZXh0cmFjdG9ycy5sb2FkRGVmYXVsdCgpXCIgaW5zdGVhZCEnKTtcbiAgICAgICAgICAgIHRoaXMuZXh0cmFjdG9ycy5sb2FkRGVmYXVsdCgpLnRoZW4oKHIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoci5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBkZWZhdWx0IGV4dHJhY3RvcnM6ICR7ci5lcnJvcj8uc3RhY2sgPz8gci5lcnJvcn1gKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnRGVmYXVsdCBleHRyYWN0b3JzIGxvYWRlZCEnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBbRGVwZW5kZW5jaWVzIFJlcG9ydF1cXG4ke3RoaXMuc2NhbkRlcHMoKX1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMubGFnTW9uaXRvciA9PT0gJ251bWJlcicgJiYgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYFtMYWcgTW9uaXRvcl0gRXZlbnQgbG9vcCBsYXRlbmN5OiAke3RoaXMuI2xhc3RMYXRlbmN5fW1zYCk7XG4gICAgICAgICAgICAgICAgfSwgMCkudW5yZWYoKTtcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yKS51bnJlZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2ludGVybmFscy5hZGRQbGF5ZXIodGhpcyk7XG5cbiAgICAgICAgaWYgKCEoa1NpbmdsZXRvbiBpbiBQbGF5ZXIpKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUGxheWVyLCBrU2luZ2xldG9uLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnZGVidWcnLCBtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGRpc2NvcmQtcGxheWVyIHNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gY2xpZW50IFRoZSBjbGllbnQgdGhhdCBpbnN0YW50aWF0ZWQgcGxheWVyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHNpbmdsZXRvbihjbGllbnQ6IENsaWVudCwgb3B0aW9uczogUGxheWVySW5pdE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFBsYXllcihjbGllbnQsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBpZ25vcmVJbnN0YW5jZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBhY3RpdmUgbWFzdGVyIHBsYXllciBpbnN0YW5jZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbFBsYXllcnMoKSB7XG4gICAgICAgIHJldHVybiBfaW50ZXJuYWxzLmdldFBsYXllcnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBhbGwgbWFzdGVyIHBsYXllciBpbnN0YW5jZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyQWxsUGxheWVycygpIHtcbiAgICAgICAgcmV0dXJuIF9pbnRlcm5hbHMuaW5zdGFuY2VzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgcXVlcnkgY2FjaGUgcHJvdmlkZXIgaW4gdXNlXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeUNhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnF1ZXJ5Q2FjaGUgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyB0byBgUGxheWVyLm5vZGVzYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgbG9vcCBsYXRlbmN5IGluIG1zLiBJZiB5b3VyIGJvdCBpcyBsYWdneSBhbmQgdGhpcyByZXR1cm5zIGEgbnVtYmVyIGFib3ZlIDIwbXMgZm9yIGV4YW1wbGUsXG4gICAgICogc29tZSBleHBlbnNpdmUgdGFzayBpcyBiZWluZyBleGVjdXRlZCBvbiB0aGUgY3VycmVudCB0aHJlYWQgd2hpY2ggaXMgc2xvd2luZyBkb3duIHRoZSBldmVudCBsb29wLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHVibGljIGdldCBldmVudExvb3BMYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYXN0TGF0ZW5jeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgc3RhdGlzdGljcyB0aGF0IGNvdWxkIGJlIHVzZWZ1bC4gU3RhdGlzdGljcyBnZW5lcmF0b3IgaXMgc3RpbGwgZXhwZXJpbWVudGFsLlxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzdGF0cyA9IHBsYXllci5nZW5lcmF0ZVN0YXRpc3RpY3MoKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHN0YXRzKTtcbiAgICAgKlxuICAgICAqIC8vIG91dHB1dHMgc29tZXRoaW5nIGxpa2VcbiAgICAgKiAvLyB7XG4gICAgICogLy8gICBpbnN0YW5jZXM6IG51bWJlcixcbiAgICAgKiAvLyAgIHF1ZXVlc0NvdW50OiBudW1iZXIsXG4gICAgICogLy8gICBxdWVyeUNhY2hlRW5hYmxlZDogYm9vbGVhbixcbiAgICAgKiAvLyAgIHF1ZXVlczogW1xuICAgICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgICAqIC8vICAgICAgLi4uXG4gICAgICogLy8gICBdXG4gICAgICogLy8gfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZVN0YXRpc3RpY3MoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnN0YW5jZXM6IF9pbnRlcm5hbHMuaW5zdGFuY2VzLnNpemUsXG4gICAgICAgICAgICBxdWV1ZXNDb3VudDogdGhpcy5xdWV1ZXMuY2FjaGUuc2l6ZSxcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGVFbmFibGVkOiB0aGlzLnF1ZXJ5Q2FjaGUgIT0gbnVsbCxcbiAgICAgICAgICAgIHF1ZXVlczogdGhpcy5xdWV1ZXMuY2FjaGUubWFwKChtKSA9PiBtLnN0YXRzLmdlbmVyYXRlKCkpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSBldmVyeSBzaW5nbGUgcXVldWVzIG1hbmFnZWQgYnkgdGhpcyBtYXN0ZXIgcGxheWVyIGluc3RhbmNlXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHVzZSBtZSB3aGVuIHlvdSB3YW50IHRvIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZSBldmVyeSBzaW5nbGUgcXVldWVzIGluIGV4aXN0ZW5jZSBcdUQ4M0RcdUREMkFcbiAgICAgKiBhd2FpdCBwbGF5ZXIuZGVzdHJveSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLm5vZGVzLmNhY2hlLmZvckVhY2goKG5vZGUpID0+IG5vZGUuZGVsZXRlKCkpO1xuICAgICAgICB0aGlzLmNsaWVudC5vZmYoJ3ZvaWNlU3RhdGVVcGRhdGUnLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5leHRyYWN0b3JzLnVucmVnaXN0ZXJBbGwoKTtcbiAgICAgICAgaWYgKHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpO1xuICAgICAgICBpZiAodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpO1xuICAgICAgICBfaW50ZXJuYWxzLmNsZWFyUGxheWVyKHRoaXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5nZXQob2xkU3RhdGUuZ3VpbGQuaWQpO1xuICAgICAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICAgICAgLy8gZGlzcGF0Y2ggdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAgICAgIGNvbnN0IHdhc0hhbmRsZWQgPSB0aGlzLmV2ZW50cy5lbWl0KCd2b2ljZVN0YXRlVXBkYXRlJywgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgICAgIGlmICh3YXNIYW5kbGVkICYmICF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKSByZXR1cm47XG5cbiAgICAgICAgaWYgKG9sZFN0YXRlLmNoYW5uZWxJZCAmJiAhbmV3U3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLyogbm9vcCAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5ldmVudHMuZW1pdCgnZGlzY29ubmVjdCcsIHF1ZXVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb2xkU3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5tZW1iZXI/LmlkID09PSBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy5pZCkge1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKSB7XG4gICAgICAgICAgICAgICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc2VydmVyTXV0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlLmNoYW5uZWw/LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSAmJiBuZXdTdGF0ZS5zdXBwcmVzcyAhPSBudWxsICYmIG9sZFN0YXRlLnN1cHByZXNzICE9PSBuZXdTdGF0ZS5zdXBwcmVzcykge1xuICAgICAgICAgICAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnN1cHByZXNzKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUuc3VwcHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCkpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KCdlbXB0eUNoYW5uZWwnLCBxdWV1ZSk7XG4gICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5zZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCwgdGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3U3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCA9PT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2xkU3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkge1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmNvbm5lY3Rpb24gJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHF1ZXVlLmNoYW5uZWwgPSBuZXdTdGF0ZS5jaGFubmVsITtcbiAgICAgICAgICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChlbXB0eVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmNvbm5lY3Rpb24gJiYgIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5lbWl0KCdlbXB0eUNoYW5uZWwnLCBxdWV1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCAhPT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS50aW1lb3V0cy5oYXMoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHkpIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuZW1pdCgnZW1wdHlDaGFubmVsJywgcXVldWUpO1xuICAgICAgICAgICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gLCB0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLmRlbGV0ZShgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHBhc3Npbmcgdm9pY2Ugc3RhdGUgdXBkYXRlIGRhdGEgdG8gdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHZvaWNlIHN0YXRlIGhhbmRsZXJcbiAgICAgKlxuICAgICAqIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgKiAgIC8vIHRoaXMgaXMgZGVmaW5pdGVseSBhIHJvY2tldCBzY2llbmNlLCByaWdodCBoZXJlXG4gICAgICogICBwbGF5ZXIuaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBrZWVwIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyLCBldmVuIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAgICovXG4gICAgcHVibGljIGxvY2tWb2ljZVN0YXRlSGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5sb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIHN0b3AgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdW5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdm9pY2Ugc3RhdGUgaGFuZGxlciBpcyBsb2NrZWQuXG4gICAgICovXG4gICAgcHVibGljIGlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhdGUgYXVkaW8gcGxheWVyXG4gICAgICogQHBhcmFtIGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhlIG11c2ljIHNob3VsZCBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHRyYWNrIG9yIHNvdXJjZSB0byBwbGF5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWVyXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgcXVldWUgbWFuYWdlbWVudCwganVzdCB1c2UgdGhpcyBtZXRob2QgXHVEODNEXHVERTA0XG4gICAgICogY29uc3QgcXVlcnkgPSAndGhpcyBpcyBteSBzdXBlciBjb29sIHNlYXJjaCBxdWVyeSB0aGF0IEkgd2FudCB0byBwbGF5JztcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICAgY29uc3QgeyB0cmFjayB9ID0gYXdhaXQgcGxheWVyLnBsYXkodm9pY2VDaGFubmVsLCBxdWVyeSk7XG4gICAgICogICBjb25zb2xlLmxvZyhgXHVEODNDXHVERjg5IEkgYW0gcGxheWluZyAke3RyYWNrLnRpdGxlfSBcdUQ4M0NcdURGODlgKTtcbiAgICAgKiB9IGNhdGNoKGUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBcdUQ4M0RcdURFMkQgRmFpbGVkIHRvIHBsYXkgZXJyb3Igb2ggbm86XFxuXFxuJHtlfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gICAgICAgIGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgICAgICAgcXVlcnk6IHN0cmluZyB8IFRyYWNrIHwgU2VhcmNoUmVzdWx0IHwgVHJhY2tbXSB8IFBsYXlsaXN0LFxuICAgICAgICBvcHRpb25zOiBTZWFyY2hPcHRpb25zICYge1xuICAgICAgICAgICAgbm9kZU9wdGlvbnM/OiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+O1xuICAgICAgICAgICAgY29ubmVjdGlvbk9wdGlvbnM/OiBWb2ljZUNvbm5lY3RDb25maWc7XG4gICAgICAgICAgICBhZnRlclNlYXJjaD86IChyZXN1bHQ6IFNlYXJjaFJlc3VsdCkgPT4gUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xuICAgICAgICB9ID0ge31cbiAgICApOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgICAgICBjb25zdCB2YyA9IHRoaXMuY2xpZW50LmNoYW5uZWxzLnJlc29sdmUoY2hhbm5lbCk7XG4gICAgICAgIGlmICghdmM/LmlzVm9pY2VCYXNlZCgpKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgdm9pY2UgY2hhbm5lbCcpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVzdWx0ID0gcXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQgPyBxdWVyeSA6IGF3YWl0IHRoaXMuc2VhcmNoKHF1ZXJ5LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IG9wdGlvbnMuYWZ0ZXJTZWFyY2g/LihvcmlnaW5hbFJlc3VsdCkpIHx8IG9yaWdpbmFsUmVzdWx0O1xuICAgICAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyByZXN1bHRzIGZvdW5kIGZvciBcIiR7cXVlcnl9XCIgKEV4dHJhY3RvcjogJHtyZXN1bHQuZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8ICdOL0EnfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5jcmVhdGUodmMuZ3VpbGQsIG9wdGlvbnMubm9kZU9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS50YXNrc1F1ZXVlLmFjcXVpcmUoKTtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFdhaXRpbmcgZm9yIHRoZSBxdWV1ZSB0byByZXNvbHZlLi4uYCk7XG4gICAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyByZXNvbHZlZCFgKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFxdWV1ZS5jaGFubmVsKSBhd2FpdCBxdWV1ZS5jb25uZWN0KHZjLCBvcHRpb25zLmNvbm5lY3Rpb25PcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKCFyZXN1bHQucGxheWxpc3QpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQudHJhY2tzWzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVldWUuYWRkVHJhY2socmVzdWx0LnBsYXlsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcXVldWUuaXNQbGF5aW5nKCkpIGF3YWl0IHF1ZXVlLm5vZGUucGxheSgpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFJlbGVhc2luZyBhbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZS4uLmApO1xuICAgICAgICAgICAgcXVldWUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHJhY2s6IHJlc3VsdC50cmFja3NbMF0sXG4gICAgICAgICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICAgICAgICBzZWFyY2hSZXN1bHQ6IHJlc3VsdCxcbiAgICAgICAgICAgIHF1ZXVlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VhcmNoIHRyYWNrc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QgfCBTZWFyY2hSZXN1bHR9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnlcbiAgICAgKiBAcGFyYW0ge1NlYXJjaE9wdGlvbnN9IG9wdGlvbnMgVGhlIHNlYXJjaCBvcHRpb25zXG4gICAgICogQHJldHVybnMge1Byb21pc2U8U2VhcmNoUmVzdWx0Pn1cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc2VhcmNoUXVlcnkgPSAncGFzcyB1cmwgb3IgdGV4dCBvciBkaXNjb3JkLXBsYXllciB0cmFjayBjb25zdHJ1Y3RhYmxlIG9iamVjdHMsIHdlIGdvdCB5b3UgY292ZXJlZCBcdUQ4M0RcdURFMEUnO1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsYXllci5zZWFyY2goc2VhcmNoUXVlcnkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0KTsgLy8gTG9ncyBgU2VhcmNoUmVzdWx0YCBvYmplY3RcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcgfCBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCB8IFNlYXJjaFJlc3VsdCwgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICAgICAgaWYgKHF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0KSByZXR1cm4gcXVlcnk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucmVxdWVzdGVkQnkgIT0gbnVsbCkgb3B0aW9ucy5yZXF1ZXN0ZWRCeSA9IHRoaXMuY2xpZW50LnVzZXJzLnJlc29sdmUob3B0aW9ucy5yZXF1ZXN0ZWRCeSkhO1xuICAgICAgICBvcHRpb25zLmJsb2NrRXh0cmFjdG9ycyA/Pz0gdGhpcy5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycztcbiAgICAgICAgb3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZSA/Pz0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIO1xuXG4gICAgICAgIGlmIChxdWVyeSBpbnN0YW5jZW9mIFRyYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHF1ZXJ5LnBsYXlsaXN0IHx8IG51bGwsXG4gICAgICAgICAgICAgICAgdHJhY2tzOiBbcXVlcnldLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeS50aXRsZSxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IHF1ZXJ5LmV4dHJhY3RvcixcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IHF1ZXJ5LnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocXVlcnkgaW5zdGFuY2VvZiBQbGF5bGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHBsYXlsaXN0OiBxdWVyeSxcbiAgICAgICAgICAgICAgICB0cmFja3M6IHF1ZXJ5LnRyYWNrcyxcbiAgICAgICAgICAgICAgICBxdWVyeTogcXVlcnkudGl0bGUsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBxdWVyeS50cmFja3NbMF0/LmV4dHJhY3RvcixcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5KSkge1xuICAgICAgICAgICAgY29uc3QgdHJhY2tzID0gcXVlcnkuZmlsdGVyKCh0KSA9PiB0IGluc3RhbmNlb2YgVHJhY2spO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHBsYXlsaXN0OiBudWxsLFxuICAgICAgICAgICAgICAgIHRyYWNrcyxcbiAgICAgICAgICAgICAgICBxdWVyeTogJ0BAIyV7e1VzZXJMb2FkZWRDb250ZW50fX0lI0BAJyxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IG51bGwsXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtxdWVyeX1gKTtcblxuICAgICAgICBsZXQgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuXG4gICAgICAgIHRoaXMuZGVidWcoYFNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5zZWFyY2hFbmdpbmV9YCk7XG5cbiAgICAgICAgY29uc3QgcXVlcnlUeXBlID0gb3B0aW9ucy5zZWFyY2hFbmdpbmUgPT09IFF1ZXJ5VHlwZS5BVVRPID8gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHF1ZXJ5LCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKSA6IG9wdGlvbnMuc2VhcmNoRW5naW5lO1xuXG4gICAgICAgIHRoaXMuZGVidWcoYFF1ZXJ5IHR5cGUgaWRlbnRpZmllZCBhcyAke3F1ZXJ5VHlwZX1gKTtcblxuICAgICAgICAvLyBmb3JjZSBwYXJ0aWN1bGFyIGV4dHJhY3RvclxuICAgICAgICBpZiAob3B0aW9ucy5zZWFyY2hFbmdpbmUuc3RhcnRzV2l0aCgnZXh0OicpKSB7XG4gICAgICAgICAgICBleHRyYWN0b3IgPSB0aGlzLmV4dHJhY3RvcnMuZ2V0KG9wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KSkhO1xuICAgICAgICAgICAgaWYgKCFleHRyYWN0b3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBxdWVyeSBhbGwgZXh0cmFjdG9yc1xuICAgICAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgICAgICAgLy8gY2FjaGUgdmFsaWRhdGlvblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgQ2hlY2tpbmcgY2FjaGUuLi5gKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LnJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIGNhY2hlIGhpdFxuICAgICAgICAgICAgICAgIGlmIChyZXM/Lmhhc1RyYWNrcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYENhY2hlIGhpdCBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBDYWNoZSBtaXNzIGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRlYnVnKGBFeGVjdXRpbmcgZXh0cmFjdG9ycy4uLmApO1xuXG4gICAgICAgICAgICAvLyBjYWNoZSBtaXNzXG4gICAgICAgICAgICBleHRyYWN0b3IgPVxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4dC52YWxpZGF0ZShxdWVyeSwgcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKT8uZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBubyBleHRyYWN0b3JzIGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgYXBwcm9wcmlhdGUgZXh0cmFjdG9yJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBtZXRhZGF0YSBxdWVyeSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IuLi5gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0cmFjdG9yXG4gICAgICAgICAgICAuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSBhcyBVc2VyXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpO1xuXG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoJ01ldGFkYXRhIHF1ZXJ5IHdhcyBzdWNjZXNzZnVsIScpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHBsYXlsaXN0OiByZXMucGxheWxpc3QsXG4gICAgICAgICAgICAgICAgdHJhY2tzOiByZXMudHJhY2tzLFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5hZGREYXRhKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlYnVnKCdGYWlsZWQgdG8gZmluZCByZXN1bHQgdXNpbmcgYXBwcm9wcmlhdGUgZXh0cmFjdG9yLiBRdWVyeWluZyBhbGwgZXh0cmFjdG9ycy4uLicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKFxuICAgICAgICAgICAgYXN5bmMgKGV4dCkgPT5cbiAgICAgICAgICAgICAgICAhb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSAmJlxuICAgICAgICAgICAgICAgIChhd2FpdCBleHQudmFsaWRhdGUocXVlcnkpKSAmJlxuICAgICAgICAgICAgICAgIGV4dC5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlclxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Py5yZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEZhaWxlZCB0byBxdWVyeSBtZXRhZGF0YSBxdWVyeSB1c2luZyAke3Jlc3VsdD8uZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgJ04vQSd9IGV4dHJhY3Rvci5gKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiByZXN1bHQ/LmV4dHJhY3RvclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlYnVnKGBNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCB1c2luZyAke3Jlc3VsdC5leHRyYWN0b3IuaWRlbnRpZmllcn0hYCk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICBwbGF5bGlzdDogcmVzdWx0LnJlc3VsdC5wbGF5bGlzdCxcbiAgICAgICAgICAgIHRyYWNrczogcmVzdWx0LnJlc3VsdC50cmFja3MsXG4gICAgICAgICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgQGRpc2NvcmRqcy92b2ljZWAgbW9kdWxlLiBVc2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc29sZS5sb2cocGxheWVyLnNjYW5EZXBzKCkpO1xuICAgICAqIC8vIC0+IGxvZ3MgZGVwZW5kZW5jaWVzIHJlcG9ydFxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgcHVibGljIHNjYW5EZXBzKCkge1xuICAgICAgICBjb25zdCBsaW5lID0gJy0nLnJlcGVhdCg1MCk7XG4gICAgICAgIGNvbnN0IGRlcHNSZXBvcnQgPSBnZW5lcmF0ZURlcGVuZGVuY3lSZXBvcnQoKTtcbiAgICAgICAgY29uc3QgZXh0cmFjdG9yUmVwb3J0ID0gdGhpcy5leHRyYWN0b3JzLnN0b3JlXG4gICAgICAgICAgICAubWFwKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG0uaWRlbnRpZmllcjtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgIHJldHVybiBgJHtkZXBzUmVwb3J0fVxcbkxvYWRlZCBFeHRyYWN0b3JzOlxcbiR7ZXh0cmFjdG9yUmVwb3J0IHx8ICdOb25lJ31cXG4ke2xpbmV9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCogdGhpcy5ub2Rlcy5jYWNoZS52YWx1ZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGBQbGF5bGlzdGAgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBpbml0aWFsaXplIGEgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUGxheWxpc3QoZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgICAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHRoaXMsIGRhdGEpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL1N0cnVjdHVyZXMnO1xuaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuZXhwb3J0IGNvbnN0IGdldFBsYXllciA9ICgpID0+IHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmZpcnN0KCkgfHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRRdWV1ZSA9IDxUID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpID0+IHtcbiAgICBjb25zdCBwbGF5ZXIgPSBnZXRQbGF5ZXIoKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gKHBsYXllci5ub2Rlcy5yZXNvbHZlKG5vZGUpIGFzIEd1aWxkUXVldWU8VD4pIHx8IG51bGw7XG59O1xuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vU3RydWN0dXJlcyc7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZS5oaXN0b3J5O1xufVxuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vU3RydWN0dXJlcyc7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlPE1ldGE+KG5vZGUpO1xuICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHF1ZXVlLm5vZGU7XG59XG4iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9TdHJ1Y3R1cmVzJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZTtcbn1cbiIsICJpbXBvcnQgeyBnZXRQbGF5ZXIgfSBmcm9tICcuL2NvbW1vbic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VNYXN0ZXJQbGF5ZXIoKSB7XG4gICAgcmV0dXJuIGdldFBsYXllcigpO1xufVxuIiwgImltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9TdHJ1Y3R1cmVzJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG50eXBlIFNldHRlckZOPFQsIFA+ID0gKHByZXZpb3VzOiBQKSA9PiBUO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxUPihub2RlKTtcbiAgICBjb25zdCBzZXR0ZXIgPSAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4ge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG1ldGFkYXRhKSkgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKHF1ZXVlLm1ldGFkYXRhKSk7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlPy5tZXRhZGF0YSBhcyBUO1xuICAgIH07XG5cbiAgICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn1cbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL1N0cnVjdHVyZXMnO1xuaW1wb3J0IHsgZ2V0UXVldWUgfSBmcm9tICcuL2NvbW1vbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZWxpbmVEaXNwYXRjaGVyT3B0aW9ucyB7XG4gICAgaWdub3JlRmlsdGVyczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKG5vZGU6IE5vZGVSZXNvbHZhYmxlLCBvcHRpb25zPzogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPikge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHtcbiAgICAgICAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmdldFRpbWVzdGFtcChvcHRpb25zPy5pZ25vcmVGaWx0ZXJzKSE7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB2b2x1bWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS52b2x1bWU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgICAgICB9LFxuICAgICAgICBwYXVzZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnBhdXNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VtZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgICAgICB9LFxuICAgICAgICBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2wpO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBzZXRQb3NpdGlvbih0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNlZWsodGltZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL1N0cnVjdHVyZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG5leHBvcnQgZnVuY3Rpb24gb25BZnRlckNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59XG4iLCAiaW1wb3J0IHsgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi4vLi4vU3RydWN0dXJlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvbkJlZm9yZUNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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S0FBSyxNQUFNLElBQU0sSUFBTSxJQUFNLElBQUksQ0FBQztBQUFBLEVBQ2pGLFlBQVksVUFBVSxDQUFDLEtBQUssTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLEtBQUssS0FBSyxNQUFNLElBQUksQ0FBQztBQUFBLEVBQzdFLFdBQVcsVUFBVSxDQUFDLE1BQU0sTUFBTSxLQUFLLEtBQUssYUFBYyxNQUFNLE1BQU0sTUFBTSxhQUFjLFdBQVksQ0FBQztBQUFBLEVBQ3ZHLE1BQU0sVUFBVSxDQUFDLE1BQU0sYUFBYyxHQUFLLEtBQUssS0FBSyxLQUFLLEdBQUssS0FBSyxLQUFLLEdBQUcsQ0FBQztBQUFBLEVBQzVFLE9BQU8sVUFBVSxDQUFDLEtBQUssS0FBSyxhQUFjLGFBQWMsYUFBYyxhQUFjLGFBQWMsYUFBYyxLQUFLLEdBQUcsQ0FBQztBQUFBLEVBQ3pILEtBQUssVUFBVSxDQUFDLE1BQU0sS0FBSyxLQUFLLEdBQUssS0FBSyxhQUFjLE1BQU0sTUFBTSxNQUFNLElBQUksQ0FBQztBQUFBLEVBQy9FLFFBQVEsVUFBVSxDQUFDLGFBQWMsYUFBYyxhQUFjLE1BQU0sYUFBYyxLQUFLLEtBQUssYUFBYyxhQUFjLFdBQVksQ0FBQztBQUFBLEVBQ3BJLE1BQU0sVUFBVSxDQUFDLEdBQUssS0FBSyxNQUFNLElBQU0sTUFBTSxHQUFLLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUFBLEVBQ3hFLEtBQUssVUFBVSxDQUFDLE1BQU0sTUFBTSxJQUFNLGFBQWMsR0FBSyxLQUFLLEtBQUssS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUFBLEVBQzlFLE1BQU0sVUFBVSxDQUFDLEtBQUssS0FBSyxhQUFjLE1BQU0sYUFBYyxHQUFLLEdBQUssS0FBSyxNQUFNLEVBQUksQ0FBQztBQUFBLEVBQ3ZGLFVBQVUsVUFBVSxDQUFDLEdBQUssR0FBSyxLQUFLLGFBQWMsSUFBTSxNQUFNLE1BQU0sYUFBYyxLQUFLLEdBQUcsQ0FBQztBQUFBLEVBQzNGLFFBQVEsVUFBVSxDQUFDLEdBQUssS0FBSyxhQUFjLE1BQU0sTUFBTSxhQUFjLEdBQUssS0FBSyxLQUFLLEdBQUcsQ0FBQztBQUM1RjtBQXhDQTtBQTBDTyxJQUFNLGlCQUFOLE1BQXFDO0FBQUEsRUFFakMsWUFBbUIsSUFBa0M7QUFBbEM7QUFFMUI7QUFIQSx1Q0FBNEIsQ0FBQztBQUFBLEVBQ2dDO0FBQUEsRUFvQnRELGFBQWEsUUFBMkIsU0FBOEI7QUFDekUsV0FBTyxtQkFBbUIsUUFBUSxPQUFPO0FBQUEsRUFDN0M7QUFBQSxFQU1PLFdBQVcsU0FBeUQ7QUFDdkUsUUFBSSxXQUFzQixDQUFDO0FBQzNCLFFBQUksT0FBTyxZQUFZLFdBQVc7QUFDOUIsaUJBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSyxPQUFPLEtBQUsscUJBQWEsT0FBTztBQUFBLElBQ2hFLFdBQVcsTUFBTSxRQUFRLE9BQU8sR0FBRztBQUMvQixpQkFBVztBQUFBLElBQ2YsT0FBTztBQUNILGlCQUFXLE9BQU8sUUFBUSxPQUFPLEVBQzVCLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxJQUFJLEVBQy9CLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtBQUFBLElBQ3hCO0FBRUEsV0FBTyxzQkFBSyw0QkFBTCxXQUFpQjtBQUFBLEVBQzVCO0FBQUEsRUFLQSxJQUFXLFVBQVU7QUFDakIsV0FBTyxtQkFBSztBQUFBLEVBQ2hCO0FBQUEsRUFFQSxJQUFXLFFBQVEsU0FBb0I7QUFDbkMsU0FBSyxXQUFXLE9BQU87QUFBQSxFQUMzQjtBQUFBLEVBTU8sT0FBTyxTQUE4QjtBQUN4QyxRQUFJLENBQUMsTUFBTSxRQUFRLE9BQU87QUFBRyxnQkFBVSxDQUFDLE9BQU87QUFDL0MsVUFBTSxRQUFtQixDQUFDO0FBRTFCLFlBQVEsUUFBUSxDQUFDLE1BQU07QUFDbkIsVUFBSSxLQUFLLFFBQVEsU0FBUyxDQUFDO0FBQUc7QUFDOUIsWUFBTSxLQUFLLENBQUM7QUFBQSxJQUNoQixDQUFDO0FBRUQsV0FBTyxzQkFBSyw0QkFBTCxXQUFpQixtQkFBSyxnQkFBZSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsU0FBUyxDQUFDLENBQUMsRUFBRSxPQUFPLEtBQUs7QUFBQSxFQUNoRztBQUFBLEVBTU8sWUFBWSxJQUFlO0FBQzlCLHVCQUFLLGdCQUFpQjtBQUFBLEVBQzFCO0FBQUEsRUFLTyxvQkFBb0I7QUFDdkIsV0FBTyxtQkFBSztBQUFBLEVBQ2hCO0FBQUEsRUFLTyxxQkFBcUI7QUFDeEIsV0FBTyxxQkFBYSxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsbUJBQUssZ0JBQWUsU0FBUyxDQUFDLENBQUM7QUFBQSxFQUM1RTtBQUFBLEVBTU8sVUFBNkIsUUFBb0I7QUFDcEQsV0FBTyxtQkFBSyxnQkFBZSxTQUFTLE1BQU07QUFBQSxFQUM5QztBQUFBLEVBTU8sV0FBOEIsUUFBb0I7QUFDckQsV0FBTyxDQUFDLEtBQUssVUFBVSxNQUFNO0FBQUEsRUFDakM7QUFBQSxFQU1PLGNBQWMsUUFBdUM7QUFDeEQsV0FBTyxxQkFBYSxJQUFJLE1BQWlCO0FBQUEsRUFDN0M7QUFBQSxFQUtPLFVBQVU7QUFDYixXQUFPLEtBQUssUUFBUSxJQUFJLENBQUMsV0FBVyxxQkFBYSxJQUFJLE1BQU0sQ0FBQztBQUFBLEVBQ2hFO0FBQUEsRUFLTyxTQUFTO0FBQ1osVUFBTSxNQUFNLENBQUM7QUFFYixTQUFLLFFBQVEsUUFBUSxDQUFDLFdBQVksSUFBSSxVQUFVLHFCQUFhLElBQUksTUFBTSxDQUFFO0FBRXpFLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFLTyxXQUFXO0FBQ2QsV0FBTyxxQkFBYSxPQUFPLEtBQUssT0FBTztBQUFBLEVBQzNDO0FBQ0o7QUE5SWE7QUFDVDtBQUdBO0FBQUEsZ0JBQVcsZ0NBQUMsU0FBb0I7QUFDNUIsUUFBTSxFQUFFLE1BQU0sSUFBSSxLQUFLO0FBQ3ZCLFFBQU0sT0FBTyxtQkFBSyxnQkFBZSxNQUFNO0FBQ3ZDLFFBQU0sZ0JBQWdCLEtBQUssUUFBUSxLQUFLLENBQUMsT0FBTyxPQUFPLGVBQWUsT0FBTyxXQUFXLEtBQUssQ0FBQyxRQUFRLEtBQUssQ0FBQyxPQUFPLE9BQU8sZUFBZSxPQUFPLFdBQVc7QUFDM0osUUFBTSxXQUFXLE1BQU0sS0FBSyxhQUFhLGFBQWEsR0FBRyxRQUFRLFNBQVM7QUFDMUUscUJBQUssZ0JBQWlCLENBQUMsR0FBRyxJQUFJLElBQUksT0FBTyxDQUFDO0FBRTFDLFNBQU8sS0FBSyxHQUFHLGNBQWMsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNO0FBQy9DLFVBQU0sT0FBTyxPQUFPLEtBQUssc0JBQXNCLE9BQU8sTUFBTSxtQkFBSyxnQkFBZSxNQUFNLENBQUM7QUFDdkYsV0FBTztBQUFBLEVBQ1gsQ0FBQztBQUNMLEdBWFc7QUFvSlIsSUFBTSx5QkFBTixNQUE2QztBQUFBLEVBV3pDLFlBQW1CLE9BQXlCO0FBQXpCO0FBVjFCLFNBQU8sUUFBUSxJQUFJLGFBQW1CLElBQUk7QUFDMUMsU0FBTyxTQUFTLElBQUksZUFBcUIsSUFBSTtBQUM3QyxTQUFPLG1CQUFtQjtBQUMxQixTQUFPLG9CQUE2QztBQUFBLE1BQ2hELFFBQVE7QUFBQSxNQUNSLFdBQVcsQ0FBQztBQUFBLE1BQ1osU0FBUyxDQUFDO0FBQUEsTUFDVixRQUFRO0FBQUEsTUFDUixZQUFZO0FBQUEsSUFDaEI7QUFFSSxRQUFJLE9BQU8sS0FBSyxNQUFNLFFBQVEsV0FBVyxVQUFVO0FBQy9DLFdBQUssa0JBQWtCLFNBQVMsS0FBSyxNQUFNLFFBQVE7QUFBQSxJQUN2RDtBQUFBLEVBQ0o7QUFBQSxFQUtBLElBQVcsU0FBUztBQUNoQixXQUFPLEtBQUssTUFBTSxZQUFZLEtBQUssVUFBVTtBQUFBLEVBQ2pEO0FBQUEsRUFLQSxJQUFXLFlBQVk7QUFDbkIsV0FBTyxLQUFLLE1BQU0sWUFBWSxhQUFhO0FBQUEsRUFDL0M7QUFBQSxFQUtBLElBQVcsU0FBUztBQUNoQixXQUFPLEtBQUssTUFBTSxZQUFZLFVBQVU7QUFBQSxFQUM1QztBQUFBLEVBS0EsSUFBVyxVQUFVO0FBQ2pCLFdBQU8sS0FBSyxNQUFNLFlBQVksV0FBVztBQUFBLEVBQzdDO0FBQUEsRUFLQSxJQUFXLFlBQVk7QUFDbkIsV0FBTyxLQUFLLE1BQU0sWUFBWSxhQUFhO0FBQUEsRUFDL0M7QUFBQSxFQU1BLE1BQWEsY0FBYyxPQUFPLEdBQUc7QUFDakMsUUFBSSxDQUFDLEtBQUssTUFBTTtBQUFjLGFBQU87QUFDckMsVUFBTSxRQUFRLEtBQUssTUFBTSxLQUFLLFdBQVcsUUFBUTtBQUNqRCxRQUFJO0FBQ0EsWUFBTSxNQUFNLFFBQVE7QUFDcEIsWUFBTSxLQUFLLE1BQU0sS0FBSyxLQUFLLEtBQUssTUFBTSxjQUFjO0FBQUEsUUFDaEQsT0FBTztBQUFBLFFBQ1A7QUFBQSxRQUNBLGdCQUFnQjtBQUFBLE1BQ3BCLENBQUM7QUFDRCxXQUFLLE1BQU0sS0FBSyxXQUFXLFFBQVE7QUFDbkMsYUFBTztBQUFBLElBQ1gsUUFBRTtBQUNFLFdBQUssTUFBTSxLQUFLLFdBQVcsUUFBUTtBQUNuQyxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0o7QUFDSjtBQXpFYTtBQTJFTixJQUFNLGVBQU4sTUFBbUM7QUFBQSxFQUMvQixZQUFtQixJQUFrQztBQUFsQztBQUFBLEVBQW1DO0FBQUEsRUFFN0QsSUFBVyxTQUFTO0FBQ2hCLFdBQU8sS0FBSyxHQUFHLE9BQU87QUFBQSxFQUMxQjtBQUFBLEVBRUEsSUFBVyxZQUFZO0FBQ25CLFlBQVEsS0FBSyxHQUFHLFdBQVcsbUJBQW1CLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPO0FBQUEsTUFDN0QsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLElBQ1YsRUFBRTtBQUFBLEVBQ047QUFBQSxFQUVBLElBQVcsU0FBUztBQUNoQixXQUFPO0FBQUEsRUFFWDtBQUFBLEVBRUEsSUFBVyxVQUFVO0FBQ2pCLFdBQU8sS0FBSyxHQUFHLFNBQVMsV0FBVyxDQUFDO0FBQUEsRUFDeEM7QUFBQSxFQUVBLElBQVcsU0FBUztBQUNoQixXQUFPLEtBQUssR0FBRztBQUFBLEVBQ25CO0FBQUEsRUFFQSxJQUFXLFlBQVk7QUFDbkIsV0FBTyxLQUFLLEdBQUc7QUFBQSxFQUNuQjtBQUFBLEVBRU8sT0FBb0I7QUFDdkIsV0FBTztBQUFBLE1BQ0gsUUFBUSxLQUFLO0FBQUEsTUFDYixXQUFXLEtBQUs7QUFBQSxNQUNoQixRQUFRLEtBQUs7QUFBQSxNQUNiLFNBQVMsS0FBSztBQUFBLE1BQ2QsWUFBWSxLQUFLLFdBQVcsb0JBQW9CLEtBQUssV0FBVyxjQUFjO0FBQUEsTUFDOUUsUUFBUSxLQUFLLFFBQVEsVUFBVTtBQUFBLElBQ25DO0FBQUEsRUFDSjtBQUNKO0FBekNhOzs7QVIvUGIsb0JBQTJCOzs7QVVVcEIsSUFBTSx1QkFBTixNQUEyQztBQUFBLEVBQ3ZDLFlBQW1CLE9BQXlCO0FBQXpCO0FBQUEsRUFBMEI7QUFBQSxFQUs3QyxXQUFXO0FBQ2QsV0FBTztBQUFBLE1BQ0gsU0FBUztBQUFBLFFBQ0wsV0FBVyxLQUFLLE1BQU0sT0FBTztBQUFBLFFBQzdCLGlCQUFpQixLQUFLLE1BQU07QUFBQSxNQUNoQztBQUFBLE1BQ0EsUUFBUTtBQUFBLFFBQ0osV0FBVyxLQUFLLE1BQU0sS0FBSyxZQUFZO0FBQUEsUUFDdkMsU0FBUyxLQUFLLE1BQU0sS0FBSyxVQUFVO0FBQUEsUUFDbkMsUUFBUSxLQUFLLE1BQU0sS0FBSyxTQUFTO0FBQUEsUUFDakMsTUFBTSxLQUFLLE1BQU0sS0FBSyxPQUFPO0FBQUEsTUFDakM7QUFBQSxNQUNBLGFBQWEsS0FBSyxNQUFNLE9BQU87QUFBQSxNQUMvQixhQUFhLEtBQUssTUFBTSxRQUFRLE9BQU87QUFBQSxNQUN2QyxZQUFZLEtBQUssTUFBTSxPQUFPLFdBQVc7QUFBQSxNQUN6QyxXQUFXLEtBQUssTUFBTSxNQUFNLFFBQVEsSUFBSSxNQUFNLFNBQVMsUUFBUSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxHQUFHLEVBQUUsUUFBUTtBQUFBLE1BQ2xHLGFBQWEsUUFBUSxZQUFZO0FBQUEsTUFDakMsVUFBVTtBQUFBLFFBQ04sTUFBTSxRQUFRO0FBQUEsUUFDZCxRQUFRO0FBQUEsTUFDWjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0o7QUE3QmE7OztBVnNDTixJQUFLLGtCQUFMLGtCQUFLQyxxQkFBTDtBQUlILEVBQUFBLGlCQUFBLG1CQUFnQjtBQUloQixFQUFBQSxpQkFBQSxvQkFBaUI7QUFJakIsRUFBQUEsaUJBQUEsc0JBQW1CO0FBSW5CLEVBQUFBLGlCQUFBLHVCQUFvQjtBQUlwQixFQUFBQSxpQkFBQSxnQkFBYTtBQUliLEVBQUFBLGlCQUFBLGdCQUFhO0FBSWIsRUFBQUEsaUJBQUEsV0FBUTtBQUlSLEVBQUFBLGlCQUFBLFdBQVE7QUFJUixFQUFBQSxpQkFBQSxrQkFBZTtBQUlmLEVBQUFBLGlCQUFBLGdCQUFhO0FBSWIsRUFBQUEsaUJBQUEsaUJBQWM7QUFJZCxFQUFBQSxpQkFBQSxpQkFBYztBQUlkLEVBQUFBLGlCQUFBLGtCQUFlO0FBSWYsRUFBQUEsaUJBQUEsZ0JBQWE7QUFJYixFQUFBQSxpQkFBQSxtQkFBZ0I7QUFJaEIsRUFBQUEsaUJBQUEsc0JBQW1CO0FBSW5CLEVBQUFBLGlCQUFBLGtCQUFlO0FBSWYsRUFBQUEsaUJBQUEsaUJBQWM7QUFJZCxFQUFBQSxpQkFBQSxrQkFBZTtBQUlmLEVBQUFBLGlCQUFBLHlCQUFzQjtBQUl0QixFQUFBQSxpQkFBQSxxQkFBa0I7QUFJbEIsRUFBQUEsaUJBQUEsZUFBWTtBQUlaLEVBQUFBLGlCQUFBLHdCQUFxQjtBQTVGYixTQUFBQTtBQUFBLEdBQUE7QUE5RFo7QUEyU08sSUFBTSxhQUFOLE1BQWlDO0FBQUEsRUFtQjdCLFlBQW1CLFFBQXVCLFNBQThCO0FBQXJEO0FBQXVCO0FBNlVqRDtBQTZCQTtBQUlBO0FBZ0JBO0FBNkNBO0FBV0EsdUJBQU07QUF4Y04sdUNBQWlCO0FBQ2pCLGlDQUFXO0FBQ1gsU0FBUSxZQUEwQjtBQUVsQyxTQUFPLFVBQVUsSUFBSSxrQkFBd0IsSUFBSTtBQUNqRCxTQUFPLGFBQXNDO0FBQzdDLFNBQU8sT0FBTyxJQUFJLHFCQUEyQixJQUFJO0FBQ2pELFNBQU8sVUFBVSxJQUFJLHVCQUE2QixJQUFJO0FBQ3RELFNBQU8sdUJBQW9ELG1DQUFZLE1BQVo7QUFDM0QsU0FBTyxzQkFBa0QsOEJBQU8sWUFBWTtBQUFBLE1BQ3hFO0FBQUEsTUFDQSxNQUFNLHlCQUFXO0FBQUEsSUFDckIsSUFIeUQ7QUFJekQsU0FBTztBQUNQLFNBQU8sV0FBVyxJQUFJLHlCQUFtQztBQUN6RCxTQUFPLFFBQVEsSUFBSSxxQkFBMkIsSUFBSTtBQUNsRCxTQUFPLGFBQWEsSUFBSSxXQUFXO0FBRy9CLFNBQUssU0FBUyxJQUFJLG9CQUFhLFFBQVEsYUFBYTtBQUNwRCxRQUFJLFNBQVMsV0FBVyxRQUFRLG9CQUFvQjtBQUFHLFdBQUssdUJBQXVCLFFBQVE7QUFDM0YsUUFBSSxTQUFTLFdBQVcsUUFBUSxtQkFBbUI7QUFBRyxXQUFLLHNCQUFzQixRQUFRO0FBQ3pGLFFBQUksQ0FBQyxTQUFTLFVBQVUsUUFBUSxVQUFVO0FBQUcsV0FBSyxhQUFhLFFBQVE7QUFFdkUsWUFBUSxhQUFSLFFBQVEsV0FBYTtBQUVyQixRQUFJLENBQUMsU0FBUyxVQUFVLEtBQUssUUFBUSxNQUFNLEtBQUssQ0FBQyxTQUFTLFVBQVUsS0FBSyxRQUFRLE1BQU0sR0FBRztBQUN0RixXQUFLLFFBQVEsa0JBQWtCLFNBQVMsS0FBSyxRQUFRO0FBQUEsSUFDekQ7QUFFQSxRQUFJLE1BQU0sUUFBUSxLQUFLLFFBQVEsU0FBUyxHQUFHO0FBQ3ZDLFdBQUssUUFBUSxrQkFBa0IsWUFBWSxLQUFLLFFBQVE7QUFBQSxJQUM1RDtBQUVBLFFBQUksTUFBTSxRQUFRLEtBQUssUUFBUSxRQUFRLEdBQUc7QUFDdEMsV0FBSyxRQUFRLGtCQUFrQixVQUFVLEtBQUssUUFBUTtBQUFBLElBQzFEO0FBRUEsUUFBSSxTQUFTLFNBQVMsS0FBSyxRQUFRLFNBQVMsR0FBRztBQUMzQyxXQUFLLFFBQVEsa0JBQWtCLGFBQWEsS0FBSyxRQUFRO0FBQUEsSUFDN0Q7QUFFQSxRQUFJLFNBQVMsUUFBUSxLQUFLLFFBQVEsYUFBYSxHQUFHO0FBQzlDLFdBQUssUUFBUSxPQUFPLFlBQVksS0FBSyxRQUFRLGFBQWE7QUFBQSxJQUM5RDtBQUVBLFNBQUssTUFBTSxvQ0FBb0MsS0FBSyxRQUFRLE1BQU0sYUFBYSxLQUFLLFFBQVEsTUFBTSxLQUFLO0FBQUEsRUFDM0c7QUFBQSxFQUtBLElBQVcsb0JBQW9CO0FBQzNCLFdBQU8sS0FBSyxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxJQUFJLEVBQUUsWUFBWSxDQUFDO0FBQUEsRUFDakU7QUFBQSxFQUtBLElBQVcsb0JBQW9CO0FBQzNCLFdBQU8sS0FBSyxjQUFjLEtBQUssUUFBUSxLQUFLLGlCQUFpQixDQUFDO0FBQUEsRUFDbEU7QUFBQSxFQUtBLElBQVcsZ0JBQWdCO0FBQ3ZCLFdBQU8sS0FBSyxZQUFZLFlBQVk7QUFBQSxFQUN4QztBQUFBLEVBTU8sTUFBTSxHQUFXO0FBQ3BCLFNBQUssT0FBTyxPQUFPLEtBQUssU0FBUyxNQUFNLENBQUM7QUFBQSxFQUM1QztBQUFBLEVBS0EsSUFBVyxXQUFXO0FBQ2xCLFdBQU8sS0FBSyxRQUFRO0FBQUEsRUFDeEI7QUFBQSxFQUVBLElBQVcsU0FBUyxHQUFTO0FBQ3pCLFNBQUssUUFBUSxXQUFXO0FBQUEsRUFDNUI7QUFBQSxFQU1PLFlBQVksR0FBUztBQUN4QixTQUFLLFFBQVEsV0FBVztBQUFBLEVBQzVCO0FBQUEsRUFLQSxJQUFXLGVBQWU7QUFDdEIsV0FBTyxLQUFLLFlBQVksZUFBZSxZQUFZLEtBQUs7QUFBQSxFQUM1RDtBQUFBLEVBS0EsSUFBVyxVQUFVO0FBQ2pCLFdBQU8sbUJBQUs7QUFBQSxFQUNoQjtBQUFBLEVBS0EsSUFBVyxVQUFVO0FBQ2pCLFdBQU8sS0FBSyxZQUFZLFdBQVc7QUFBQSxFQUN2QztBQUFBLEVBRUEsSUFBVyxRQUFRLEdBQTZCO0FBQzVDLFFBQUksS0FBSyxZQUFZO0FBQ2pCLFVBQUksR0FBRztBQUNILGFBQUssV0FBVyxVQUFVO0FBQUEsTUFDOUIsT0FBTztBQUNILGFBQUssT0FBTztBQUFBLE1BQ2hCO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUtBLElBQVcsYUFBYTtBQUNwQixXQUFPLEtBQUssWUFBWSxtQkFBbUI7QUFBQSxFQUMvQztBQUFBLEVBS0EsSUFBVyxRQUFRO0FBQ2YsV0FBTyxLQUFLLFFBQVE7QUFBQSxFQUN4QjtBQUFBLEVBS0EsSUFBVyxLQUFLO0FBQ1osV0FBTyxLQUFLLE1BQU07QUFBQSxFQUN0QjtBQUFBLEVBTU8saUJBQWlCLE9BQWdCO0FBQ3BDLHVCQUFLLGdCQUFpQjtBQUFBLEVBQzFCO0FBQUEsRUFLTyxrQkFBa0I7QUFDckIsV0FBTyxtQkFBSztBQUFBLEVBQ2hCO0FBQUEsRUFNTyxjQUFjLE1BQXVCO0FBQ3hDLFNBQUssYUFBYTtBQUFBLEVBQ3RCO0FBQUEsRUFLQSxJQUFXLE9BQU87QUFDZCxXQUFPLEtBQUssT0FBTztBQUFBLEVBQ3ZCO0FBQUEsRUFLTyxVQUFVO0FBQ2IsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQSxFQUtPLFFBQVE7QUFDWCxTQUFLLE9BQU8sTUFBTTtBQUNsQixTQUFLLFFBQVEsTUFBTTtBQUFBLEVBQ3ZCO0FBQUEsRUFLTyxVQUFVO0FBQ2IsV0FBTyxLQUFLLE9BQU8sT0FBTztBQUFBLEVBQzlCO0FBQUEsRUFLTyxZQUFZO0FBQ2YsV0FBTyxLQUFLLFlBQVksaUJBQWlCLFFBQVEsQ0FBQyxLQUFLLFdBQVcsY0FBYztBQUFBLEVBQ3BGO0FBQUEsRUFNTyxTQUFTLE9BQW1DO0FBQy9DLFVBQU0sUUFBUSxpQkFBaUIsV0FBVyxNQUFNLFNBQVM7QUFDekQsU0FBSyxPQUFPLElBQUksS0FBSztBQUNyQixVQUFNLFVBQVUsTUFBTSxRQUFRLEtBQUs7QUFFbkMsUUFBSSxTQUFTO0FBQ1QsV0FBSyxPQUFPLE9BQU8sS0FBSyxrQkFBa0IsTUFBTSxLQUFLO0FBQUEsSUFDekQsT0FBTztBQUNILFdBQUssT0FBTyxPQUFPLEtBQUssaUJBQWlCLE1BQU0sS0FBSztBQUFBLElBQ3hEO0FBQUEsRUFDSjtBQUFBLEVBTU8sWUFBWSxPQUF3QjtBQUN2QyxXQUFPLEtBQUssS0FBSyxPQUFPLEtBQUs7QUFBQSxFQUNqQztBQUFBLEVBT08sWUFBWSxPQUFjLFFBQVEsR0FBUztBQUM5QyxXQUFPLEtBQUssS0FBSyxPQUFPLE9BQU8sS0FBSztBQUFBLEVBQ3hDO0FBQUEsRUFPTyxVQUFVLE9BQXdCLFFBQVEsR0FBUztBQUN0RCxXQUFPLEtBQUssS0FBSyxLQUFLLE9BQU8sS0FBSztBQUFBLEVBQ3RDO0FBQUEsRUFPTyxVQUFVLE9BQXdCLFFBQVEsR0FBUztBQUN0RCxXQUFPLEtBQUssS0FBSyxLQUFLLE9BQU8sS0FBSztBQUFBLEVBQ3RDO0FBQUEsRUFPTyxXQUFXLEtBQXNCLE1BQTZCO0FBQ2pFLFdBQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxJQUFJO0FBQUEsRUFDbkM7QUFBQSxFQU9BLE1BQWEsUUFBUSxtQkFBZ0QsVUFBOEIsQ0FBQyxHQUFHO0FBQ25HLFVBQU0sVUFBVSxLQUFLLE9BQU8sT0FBTyxTQUFTLFFBQVEsaUJBQWlCO0FBQ3JFLFFBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxhQUFhLEdBQUc7QUFDckMsWUFBTSxJQUFJLE1BQU0sd0NBQXdDLDRCQUFZLGNBQWMsNEJBQVksOEJBQThCLFNBQVMsTUFBTTtBQUFBLElBQy9JO0FBRUEsU0FBSyxNQUFNLGlCQUFpQixRQUFRLFNBQVMsNEJBQVksa0JBQWtCLFVBQVUsbUJBQW1CLFFBQVEsYUFBYSxRQUFRLEtBQUs7QUFFMUksUUFBSSxLQUFLLFlBQVk7QUFDakIsV0FBSyxNQUFNLDJCQUEyQjtBQUN0Qyw0QkFBSyxzQ0FBTCxXQUFzQixLQUFLO0FBQzNCLFdBQUssV0FBVyxXQUFXO0FBQUEsSUFDL0I7QUFFQSxTQUFLLGFBQWEsTUFBTSxLQUFLLE9BQU8sV0FBVyxRQUFRLFNBQVM7QUFBQSxNQUM1RCxNQUFNLFFBQVEsUUFBUSxLQUFLLFFBQVEsWUFBWTtBQUFBLE1BQy9DLFNBQVMsU0FBUyxXQUFXLEtBQUssUUFBUSxxQkFBcUI7QUFBQSxNQUMvRCxPQUFPO0FBQUEsTUFDUCxhQUFhLFNBQVM7QUFBQSxJQUMxQixDQUFDO0FBRUQsU0FBSyxPQUFPLE9BQU8sS0FBSyxjQUFjLElBQUk7QUFFMUMsUUFBSSxLQUFLLFFBQVMsU0FBUyw0QkFBWSxpQkFBaUI7QUFDcEQsWUFBTSxLQUFLLFFBQVMsTUFBTSxRQUFRLEdBQUksTUFBTSxjQUFjLEtBQUssRUFBRSxNQUFNLFlBQVk7QUFDL0UsZUFBTyxNQUFNLEtBQUssUUFBUyxNQUFNLFFBQVEsR0FBSSxNQUFNLGtCQUFrQixJQUFJLEVBQUUsTUFBTSxLQUFLLElBQUk7QUFBQSxNQUM5RixDQUFDO0FBQUEsSUFDTDtBQUVBLDBCQUFLLHNDQUFMLFdBQXNCLEtBQUs7QUFFM0IsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUtBLElBQVcsT0FBTztBQUNkLFdBQU8sS0FBSyxZQUFZLEtBQUssT0FBTztBQUFBLEVBQ3hDO0FBQUEsRUFLTyxTQUFTO0FBQ1osUUFBSSxLQUFLLE9BQU8sTUFBTSxPQUFPLEtBQUssRUFBRSxHQUFHO0FBQ25DLHlCQUFLLFVBQVc7QUFBQSxJQUNwQjtBQUFBLEVBQ0o7QUFBQSxFQU1PLFNBQVM7QUFDWixRQUFJLENBQUMsS0FBSyxXQUFXLEtBQUssT0FBTyxNQUFNLElBQUksS0FBSyxFQUFFO0FBQUc7QUFDckQsdUJBQUssVUFBVztBQUNoQixTQUFLLE9BQU8sTUFBTSxNQUFNLElBQUksS0FBSyxJQUFJLElBQUk7QUFBQSxFQUM3QztBQUFBLEVBT08sWUFBWSxNQUFnQixRQUFpQjtBQUNoRCxXQUFPLEtBQUssTUFBTSxRQUFRLEdBQUksTUFBTSxRQUFRLE1BQU0sTUFBTTtBQUFBLEVBQzVEO0FBQUEsRUFPTyxZQUFZLE1BQWdCLFFBQWlCO0FBQ2hELFdBQU8sS0FBSyxNQUFNLFFBQVEsR0FBSSxNQUFNLFFBQVEsTUFBTSxNQUFNO0FBQUEsRUFDNUQ7QUE4SUo7QUE1ZWE7QUFDVDtBQUNBO0FBOFZBO0FBQUEscUJBQWdCLGdDQUFDLFlBQThCO0FBQzNDLGFBQVcsR0FBRyxTQUFTLENBQUMsTUFBTSxLQUFLLE9BQU8sT0FBTyxLQUFLLFNBQVMsTUFBTSxDQUFDLENBQUM7QUFDdkUsYUFBVyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEtBQUssT0FBTyxPQUFPLEtBQUssU0FBUyxNQUFNLENBQUMsQ0FBQztBQUN2RSxhQUFXLEdBQUcsVUFBVSxDQUFDLE1BQU0sc0JBQUssa0NBQUwsV0FBb0IsRUFBRTtBQUNyRCxhQUFXLEdBQUcsU0FBUyxDQUFDLE1BQU0sc0JBQUssZ0NBQUwsV0FBbUIsRUFBRTtBQUNuRCxhQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU07QUFDeEIsUUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsa0JBQWtCLFNBQVMsQ0FBQyxHQUFHO0FBQ3ZELFdBQUssT0FBTyxPQUFPLEtBQUssYUFBYSxNQUFNLEtBQUssUUFBUSxrQkFBa0IsU0FBUyxDQUFDO0FBQUEsSUFDeEY7QUFDQSxTQUFLLFFBQVEsa0JBQWtCLFVBQVU7QUFBQSxFQUM3QyxDQUFDO0FBQ0QsYUFBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNO0FBQzNCLFFBQUksS0FBSyxRQUFRLGtCQUFrQixXQUFXLEdBQUc7QUFDN0MsV0FBSyxPQUFPLE9BQU8sS0FBSyx1QkFBdUIsTUFBTSxLQUFLLFFBQVEsa0JBQWtCLFFBQVEsQ0FBQztBQUFBLElBQ2pHO0FBQ0EsU0FBSyxRQUFRLGtCQUFrQixTQUFTO0FBQUEsRUFDNUMsQ0FBQztBQUNELGFBQVcsR0FBRyxXQUFXLENBQUMsTUFBTTtBQUM1QixRQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsS0FBSyxRQUFRLGtCQUFrQixTQUFTLEdBQUc7QUFDekQsV0FBSyxPQUFPLE9BQU8sS0FBSyxtQkFBbUIsTUFBTSxLQUFLLFFBQVEsa0JBQWtCLFdBQVcsQ0FBQztBQUFBLElBQ2hHO0FBQ0EsU0FBSyxRQUFRLGtCQUFrQixZQUFZO0FBQUEsRUFDL0MsQ0FBQztBQUNELGFBQVcsR0FBRyxVQUFVLENBQUMsTUFBTTtBQUMzQixRQUFJLEtBQUssUUFBUSxrQkFBa0IsV0FBVztBQUFHLFdBQUssT0FBTyxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sS0FBSyxRQUFRLGtCQUFrQixRQUFRLENBQUM7QUFDdkksU0FBSyxRQUFRLGtCQUFrQixTQUFTO0FBQUEsRUFDNUMsQ0FBQztBQUNMLEdBM0JnQjtBQTZCaEI7QUFBQSxxQkFBZ0IsZ0NBQUMsWUFBOEI7QUFDM0MsYUFBVyxtQkFBbUI7QUFDbEMsR0FGZ0I7QUFJaEI7QUFBQSxrQkFBYSxnQ0FBQyxVQUFpQztBQUMzQyxRQUFNLFFBQVEsVUFBVSxZQUFZLEtBQUs7QUFDekMsUUFBTSxTQUFTLEtBQUssZ0JBQWdCLElBQUksWUFBWTtBQUVwRCxPQUFLO0FBQUEsSUFDRCw4QkFBOEIsS0FBSyxVQUFVO0FBQUEsTUFDekMsT0FBTyxPQUFPO0FBQUEsTUFDZDtBQUFBLElBQ0osQ0FBQztBQUFBLEVBQ0w7QUFFQSxPQUFLLE9BQU8sT0FBTyxLQUFLLGlCQUFpQixNQUFNLE9BQVEsTUFBTTtBQUM3RCxNQUFJLFNBQVMsQ0FBQyxLQUFLLGdCQUFnQjtBQUFHLFNBQUssT0FBTyxPQUFPLEtBQUssZUFBZSxNQUFNLEtBQUs7QUFDeEYsT0FBSyxpQkFBaUIsS0FBSztBQUMvQixHQWRhO0FBZ0JiO0FBQUEsbUJBQWMsZ0NBQUMsVUFBaUM7QUFDNUMsUUFBTSxRQUFRLFVBQVUsWUFBWSxLQUFLO0FBRXpDLE9BQUs7QUFBQSxJQUNELFNBQVMsS0FBSyxVQUFVO0FBQUEsTUFDcEIsT0FBTyxPQUFPO0FBQUEsTUFDZCxrQkFBa0IsS0FBSyxnQkFBZ0I7QUFBQSxJQUMzQyxDQUFDO0FBQUEsRUFDTDtBQUVBLE1BQUksU0FBUyxDQUFDLEtBQUssZ0JBQWdCLEdBQUc7QUFDbEMsU0FBSyxNQUFNLHdGQUF3RjtBQUNuRyxTQUFLLFFBQVEsS0FBSyxLQUFLO0FBQ3ZCLFNBQUssS0FBSyxjQUFjO0FBQ3hCLFNBQUssT0FBTyxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sS0FBSztBQUNuRCxRQUFJLEtBQUssT0FBTyxPQUFPLEtBQUssS0FBSyw0QkFBb0M7QUFDakUsV0FBSyxNQUFNLHdGQUF3RjtBQUNuRyw0QkFBSyxzQkFBTDtBQUFBLElBQ0osT0FBTztBQUNILFVBQUksS0FBSyw4QkFBc0M7QUFDM0MsYUFBSyxNQUFNLHVFQUF1RTtBQUNsRixhQUFLLFlBQVksS0FBSyxRQUFRLE9BQU8sU0FBUyxLQUFLO0FBQ25ELGVBQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxXQUFZLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFBQSxNQUMzRDtBQUNBLFVBQUksS0FBSyw4QkFBc0M7QUFDM0MsYUFBSyxNQUFNLHFGQUFxRjtBQUNoRyxhQUFLLE9BQU8sSUFBSSxLQUFLLFFBQVEsT0FBTyxTQUFTLEtBQUssS0FBSztBQUFBLE1BQzNEO0FBQ0EsVUFBSSxDQUFDLEtBQUssT0FBTyxNQUFNO0FBQ25CLFlBQUksS0FBSyxpQ0FBeUM7QUFDOUMsZUFBSyxNQUFNLGdFQUFnRTtBQUMzRSxnQ0FBSyxvQ0FBTCxXQUFxQjtBQUNyQjtBQUFBLFFBQ0o7QUFBQSxNQUNKLE9BQU87QUFDSCxhQUFLLE1BQU0seUNBQXlDO0FBQ3BELGFBQUssWUFBWSxLQUFLLE9BQU8sU0FBUztBQUN0QyxhQUFLLEtBQUssS0FBSyxLQUFLLFdBQVc7QUFBQSxVQUMzQixPQUFPO0FBQUEsUUFDWCxDQUFDO0FBQUEsTUFDTDtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0osR0EzQ2M7QUE2Q2Q7QUFBQSxhQUFRLGtDQUFHO0FBQ1AsT0FBSyxZQUFZO0FBQ2pCLE9BQUssT0FBTyxPQUFPLEtBQUssY0FBYyxJQUFJO0FBQzFDLE1BQUksS0FBSyxRQUFRLFlBQVk7QUFDekIsVUFBTSxTQUFxQiwwQkFBVyxNQUFNO0FBQ3hDLFVBQUksS0FBSyxPQUFPO0FBQU0sZUFBTyxhQUFhLEVBQUU7QUFDNUMsV0FBSyxZQUFZLFdBQVc7QUFBQSxJQUNoQyxHQUFHLEtBQUssUUFBUSxrQkFBa0IsRUFBRSxNQUFNO0FBQUEsRUFDOUM7QUFDSixHQVRRO0FBV0Y7QUFBQSxvQkFBZSxzQ0FBQyxPQUFjO0FBQ2hDLE1BQUk7QUFDQSxTQUFLLE1BQU0sZ0RBQWdELE1BQU0sVUFBVSxNQUFNLGFBQWEsTUFBTSxXQUFXLGNBQWMsUUFBUTtBQUNySSxVQUFNLFVBQ0QsTUFBTSxNQUFNLFdBQVcsaUJBQWlCLEtBQUssSUFBSSxXQUU5QyxNQUFNLEtBQUssT0FBTyxXQUFXLElBQUksT0FBTyxRQUFRO0FBQzVDLFdBQUssTUFBTSxrQ0FBa0MsSUFBSSxZQUFZO0FBQzdELFlBQU0sTUFBTSxNQUFNLElBQUksaUJBQWlCLEtBQUs7QUFDNUMsVUFBSSxDQUFDLElBQUksT0FBTyxRQUFRO0FBQ3BCLGFBQUssTUFBTSx5QkFBeUIsSUFBSSx1Q0FBdUM7QUFDL0UsZUFBTztBQUFBLE1BQ1g7QUFFQSxXQUFLLE1BQU0seUJBQXlCLElBQUksMkNBQTJDO0FBRW5GLGFBQU8sSUFBSTtBQUFBLElBQ2YsQ0FBQyxJQUNGO0FBQ1AsUUFBSSxDQUFDLFFBQVEsUUFBUTtBQUNqQixXQUFLLE1BQU0sc0NBQXNDO0FBQ2pELFlBQU07QUFBQSxJQUNWO0FBRUEsU0FBSyxNQUFNLHlEQUF5RDtBQUNwRSxVQUFNLFlBQVksS0FBSyxhQUFhLE9BQU8sTUFBTSxHQUFHLENBQUMsQ0FBQztBQUN0RCxVQUFNLEtBQUssS0FBSyxLQUFLLFdBQVc7QUFBQSxNQUM1QixPQUFPO0FBQUEsTUFDUCxNQUFNO0FBQUEsTUFDTixnQkFBZ0I7QUFBQSxJQUNwQixDQUFDO0FBQUEsRUFDTCxRQUFFO0FBQ0UsV0FBTyxzQkFBSyxzQkFBTDtBQUFBLEVBQ1g7QUFDSixHQWxDcUI7OztBV252QnpCLElBQUFDLGdCQUEyQjtBQUVwQixJQUFNLFlBQVksSUFBSSx5QkFBMkI7QUFDakQsSUFBTSxpQkFBaUIsSUFBSSx5QkFBNEI7OztBQ0R2RCxTQUFTLFVBQVUsUUFBZ0I7QUFDdEMsTUFBSSxVQUFVLElBQUksT0FBTyxFQUFFO0FBQUcsV0FBTztBQUVyQyxZQUFVLElBQUksT0FBTyxJQUFJLE1BQU07QUFFL0IsU0FBTyxVQUFVLElBQUksT0FBTyxFQUFFO0FBQ2xDO0FBTmdCOzs7QUNBVCxTQUFTLFlBQVksUUFBZ0I7QUFDeEMsU0FBTyxVQUFVLE9BQU8sT0FBTyxFQUFFO0FBQ3JDO0FBRmdCOzs7QUNEVCxTQUFTLGFBQWE7QUFDekIsU0FBTyxVQUFVLE1BQU07QUFDM0I7QUFGZ0I7OztBQ0FULFNBQVMsb0JBQW9CO0FBQ2hDLFNBQU87QUFDWDtBQUZnQjs7O0FoQmtDVCxJQUFNLG1CQUFOLE1BQXVDO0FBQUEsRUFFbkMsWUFBbUIsUUFBZ0I7QUFBaEI7QUFEMUIsU0FBTyxRQUFRLElBQUkseUJBQStCO0FBQUEsRUFDUDtBQUFBLEVBT3BDLE9BQWlCLE9BQXdCLFVBQXFDLENBQUMsR0FBa0I7QUFDcEcsVUFBTSxTQUFTLEtBQUssT0FBTyxPQUFPLE9BQU8sUUFBUSxLQUFLO0FBQ3RELFFBQUksQ0FBQyxRQUFRO0FBQ1QsWUFBTSxJQUFJLE1BQU0sMEJBQTBCO0FBQUEsSUFDOUM7QUFFQSxRQUFJLEtBQUssTUFBTSxJQUFJLE9BQU8sRUFBRSxHQUFHO0FBQzNCLGFBQU8sS0FBSyxNQUFNLElBQUksT0FBTyxFQUFFO0FBQUEsSUFDbkM7QUFFQSxZQUFRLGFBQVIsUUFBUSxXQUFhO0FBQ3JCLFlBQVEsV0FBUixRQUFRLFNBQVc7QUFDbkIsWUFBUSxjQUFSLFFBQVEsWUFBYyxDQUFDO0FBQ3ZCLFlBQVEsYUFBUixRQUFRLFdBQWEsQ0FBQztBQUN0QixZQUFRLG1CQUFSLFFBQVEsaUJBQW1CO0FBQzNCLFlBQVEsbUJBQVIsUUFBUSxpQkFBbUI7QUFDM0IsWUFBUSxpQkFBUixRQUFRLGVBQWlCO0FBQ3pCLFlBQVEseUJBQVIsUUFBUSx1QkFBeUI7QUFDakMsWUFBUSxlQUFSLFFBQVEsYUFBZTtBQUN2QixZQUFRLHVCQUFSLFFBQVEscUJBQXVCO0FBQy9CLFlBQVEsZ0JBQVIsUUFBUSxjQUFnQjtBQUN4QixZQUFRLHdCQUFSLFFBQVEsc0JBQXdCO0FBQ2hDLFlBQVEsY0FBUixRQUFRLFlBQWM7QUFDdEIsWUFBUSxhQUFSLFFBQVEsV0FBYTtBQUNyQixZQUFRLHNCQUFSLFFBQVEsb0JBQXNCLEtBQUssT0FBTyxRQUFRO0FBQ2xELFlBQVEscUJBQVIsUUFBUSxtQkFBcUI7QUFFN0IsUUFBSSxrQkFBa0IsRUFBRSxJQUFJLHlCQUF5QixLQUFLLENBQUMsUUFBUSxzQkFBc0I7QUFDckYsY0FBUSx1QkFBdUIsa0JBQWtCLEVBQUUsSUFBSSx5QkFBeUI7QUFBQSxJQUNwRjtBQUVBLFFBQUksa0JBQWtCLEVBQUUsSUFBSSx3QkFBd0IsS0FBSyxDQUFDLFFBQVEscUJBQXFCO0FBQ25GLGNBQVEsc0JBQXNCLGtCQUFrQixFQUFFLElBQUksd0JBQXdCO0FBQUEsSUFDbEY7QUFFQSxVQUFNLFFBQVEsSUFBSSxXQUFjLEtBQUssUUFBUTtBQUFBLE1BQ3pDLE9BQU87QUFBQSxNQUNQLGVBQWUsUUFBUTtBQUFBLE1BQ3ZCLFFBQVEsUUFBUTtBQUFBLE1BQ2hCLFdBQVcsUUFBUTtBQUFBLE1BQ25CLFVBQVUsUUFBUTtBQUFBLE1BQ2xCLFFBQVEsUUFBUTtBQUFBLE1BQ2hCLFdBQVcsUUFBUTtBQUFBLE1BQ25CLGdCQUFnQixRQUFRO0FBQUEsTUFDeEIsZ0JBQWdCLFFBQVE7QUFBQSxNQUN4QixzQkFBc0IsUUFBUTtBQUFBLE1BQzlCLHFCQUFxQixRQUFRO0FBQUEsTUFDN0IsWUFBWSxRQUFRO0FBQUEsTUFDcEIsY0FBYyxRQUFRO0FBQUEsTUFDdEIsc0JBQXNCLFFBQVE7QUFBQSxNQUM5QixZQUFZLFFBQVE7QUFBQSxNQUNwQixvQkFBb0IsUUFBUTtBQUFBLE1BQzVCLGFBQWEsUUFBUTtBQUFBLE1BQ3JCLHFCQUFxQixRQUFRO0FBQUEsTUFDN0IsVUFBVSxRQUFRO0FBQUEsTUFDbEIsbUJBQW1CLFFBQVEscUJBQXFCO0FBQUEsTUFDaEQsVUFBVSxRQUFRO0FBQUEsTUFDbEIsZUFBZSxRQUFRLHdCQUF3QixDQUFDO0FBQUEsTUFDaEQsa0JBQWtCLFFBQVE7QUFBQSxNQUMxQixjQUFjLFFBQVEsZ0JBQWdCO0FBQUEsSUFDMUMsQ0FBQztBQUVELFNBQUssTUFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLO0FBRS9CLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFNTyxJQUFjLE1BQXNCO0FBQ3ZDLFVBQU0sUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUMvQixRQUFJLENBQUM7QUFBTyxhQUFPO0FBRW5CLFdBQVEsS0FBSyxNQUFNLElBQUksTUFBTSxFQUFFLEtBQXVCO0FBQUEsRUFDMUQ7QUFBQSxFQU1PLElBQUksTUFBc0I7QUFDN0IsVUFBTSxLQUFLLGdCQUFnQixhQUFhLEtBQUssS0FBSyxLQUFLLE9BQU8sT0FBTyxPQUFPLFVBQVUsSUFBSTtBQUMxRixXQUFPLEtBQUssTUFBTSxJQUFJLEVBQUU7QUFBQSxFQUM1QjtBQUFBLEVBTU8sT0FBTyxNQUFzQjtBQUNoQyxVQUFNLFFBQVEsS0FBSyxRQUFRLElBQUk7QUFDL0IsUUFBSSxDQUFDO0FBQU8sWUFBTSxJQUFJLE1BQU0sa0NBQWtDO0FBRTlELFVBQU0sS0FBSyxLQUFLLElBQUk7QUFDcEIsVUFBTSxZQUFZLG1CQUFtQjtBQUNyQyxVQUFNLFlBQVksbUJBQW1CO0FBQ3JDLFVBQU0sWUFBWSxXQUFXO0FBQzdCLFVBQU0sU0FBUyxRQUFRLENBQUMsT0FBTyxhQUFhLEVBQUUsQ0FBQztBQUMvQyxVQUFNLFFBQVEsTUFBTTtBQUNwQixVQUFNLE9BQU8sTUFBTTtBQUVuQixXQUFPLEtBQUssTUFBTSxPQUFPLE1BQU0sRUFBRTtBQUFBLEVBQ3JDO0FBQUEsRUFNTyxRQUFrQixNQUFzQjtBQUMzQyxRQUFJLGdCQUFnQixZQUFZO0FBQzVCLGFBQU87QUFBQSxJQUNYO0FBRUEsV0FBTyxLQUFLLE1BQU0sSUFBSSxLQUFLLE9BQU8sT0FBTyxPQUFPLFVBQVUsSUFBSSxDQUFFO0FBQUEsRUFDcEU7QUFBQSxFQU1PLFVBQVUsTUFBc0I7QUFDbkMsVUFBTSxJQUFJLEtBQUssUUFBUSxJQUFJO0FBQzNCLFdBQU8sR0FBRyxNQUFNO0FBQUEsRUFDcEI7QUFDSjtBQXZJYTs7O0FpQm5DYixvQkFBMkM7QUFDM0MsSUFBQUMsZ0JBQWdDO0FBQ2hDLElBQUFDLFNBQXVCO0FBY2hCLElBQU0sb0JBQU4sTUFBd0I7QUFBQSxFQUNwQixZQUFtQixZQUE4QjtBQUE5QjtBQUFBLEVBQStCO0FBQUEsRUFFbEQsZUFBZSxRQUFrQixPQUFxQixDQUFDLEdBQUc7QUFDN0QsU0FBSyxVQUFMLEtBQUssUUFBVSxhQUFhLEtBQUssSUFBSTtBQUVyQyxXQUFPLElBQUksTUFBTSxLQUFLLFdBQVcsTUFBTSxRQUFRO0FBQUEsTUFDM0MsUUFBUTtBQUFBLE1BQ1IsYUFBYSxLQUFLO0FBQUEsTUFDbEIsT0FBTyxLQUFLO0FBQUEsTUFDWixVQUFVLEtBQUssWUFBWTtBQUFBLE1BQzNCLE9BQU87QUFBQSxNQUNQLGFBQWEsS0FBSztBQUFBLE1BQ2xCLFdBQVcsS0FBSyxhQUFhO0FBQUEsTUFDN0IsS0FBSyxLQUFLLE9BQU87QUFBQSxNQUNqQixRQUFRO0FBQUEsTUFDUixLQUFLO0FBQUEsUUFDRCxRQUFRO0FBQUEsUUFDUixRQUFRO0FBQUEsTUFDWjtBQUFBLElBQ0osQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQU1PLGdCQUFnQixTQUFxQjtBQUd4QyxVQUFNLElBQUksTUFBTSxpQkFBaUI7QUFBQSxFQUNyQztBQUFBLEVBT08sV0FDSCxNQUNBLFVBQWdDO0FBQUEsSUFDNUIsS0FBSyw4QkFBZ0I7QUFBQSxJQUNyQixNQUFNO0FBQUEsSUFDTixpQkFBaUI7QUFBQSxFQUNyQixHQUNGO0FBQ0UsVUFBTSxRQUFRLEtBQUssV0FBVyxNQUFNLE9BQU8sT0FBTyxNQUFNLFVBQVUsSUFBSTtBQUV0RSxVQUFNLGNBQWMsSUFBSSwwQkFBWTtBQUNwQyxVQUFNLFdBQVcsS0FBSyxXQUFXLGdCQUFnQjtBQUVqRCxRQUFJLENBQUM7QUFBVSxZQUFNLElBQUksTUFBTSwwRUFBMEU7QUFFekcsYUFBUyxTQUFTLEdBQUcsU0FBUyxDQUFDLFdBQVc7QUFDdEMsVUFBSSxXQUFXLE9BQU87QUFDbEIsY0FBTSxnQkFBZ0IsU0FBUyxVQUFVLE9BQU87QUFBQSxVQUM1QyxLQUFLO0FBQUEsWUFDRCxVQUFVLFFBQVEsT0FBTyw4QkFBZ0I7QUFBQSxZQUN6QyxVQUFVLFFBQVEsbUJBQW1CO0FBQUEsVUFDekM7QUFBQSxRQUNKLENBQUM7QUFFRCxxQkFBYSxZQUFZO0FBQ3JCLGNBQUksUUFBUSxTQUFTLE9BQU87QUFDeEIsa0JBQU0sTUFBTSxjQUFjO0FBQUEsY0FFdEIsS0FBVyxlQUFxQixlQUFRLE1BQU0sUUFBUTtBQUFBLGdCQUNsRCxVQUFVO0FBQUEsZ0JBQ1YsV0FBVztBQUFBLGdCQUNYLE1BQU07QUFBQSxjQUNWLENBQUM7QUFBQSxZQUNMO0FBQ0EsbUJBQU8sSUFBSSxLQUFLLFdBQVc7QUFBQSxVQUMvQixPQUFPO0FBQ0gsbUJBQU8sY0FBYyxLQUFLLFdBQVc7QUFBQSxVQUN6QztBQUFBLFFBQ0osQ0FBQyxFQUFFLE1BQU07QUFBQSxNQUNiO0FBQUEsSUFDSixDQUFDO0FBRUQsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQWxGYTs7O0FDRE4sSUFBTSxlQUFOLE1BQW1CO0FBQUEsRUFDZixZQUFtQixRQUF3QixPQUF5QjtBQUFqRDtBQUF3QjtBQUM5QyxTQUFLLE1BQU0sUUFBUSxRQUFRLENBQUMsVUFBVTtBQUNsQyxZQUFNLGNBQU4sTUFBTSxZQUFjLEtBQUssTUFBTSxhQUFhO0FBQzVDLFlBQU0sZ0JBQU4sTUFBTSxjQUFnQixNQUFNLGVBQWU7QUFBQSxJQUMvQyxDQUFDO0FBQUEsRUFDTDtBQUFBLEVBRU8sYUFBYSxNQUE4QztBQUM5RCxTQUFLLE1BQU0sWUFBWTtBQUN2QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRU8sZUFBZSxNQUFZO0FBQzlCLFNBQUssTUFBTSxjQUFjO0FBQ3pCLFNBQUssTUFBTSxRQUFRLFFBQVEsQ0FBQyxVQUFVO0FBQ2xDLFlBQU0sY0FBYztBQUFBLElBQ3hCLENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRU8sYUFBYSxXQUEwQjtBQUMxQyxTQUFLLE1BQU0sWUFBWTtBQUN2QixTQUFLLE1BQU0sUUFBUSxRQUFRLENBQUMsVUFBVTtBQUNsQyxZQUFNLFlBQVk7QUFBQSxJQUN0QixDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVPLFVBQVUsUUFBaUI7QUFDOUIsU0FBSyxNQUFNLFNBQVM7QUFDcEIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVPLFNBQVMsT0FBZTtBQUMzQixTQUFLLE1BQU0sUUFBUTtBQUNuQixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRU8sWUFBWSxVQUFvQjtBQUNuQyxTQUFLLE1BQU0sV0FBVztBQUN0QixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBS0EsSUFBVyxRQUFRO0FBQ2YsV0FBTyxLQUFLLE1BQU07QUFBQSxFQUN0QjtBQUFBLEVBS0EsSUFBVyxZQUFZO0FBQ25CLFdBQU8sS0FBSyxNQUFNLGFBQWEsVUFBVTtBQUFBLEVBQzdDO0FBQUEsRUFLQSxJQUFXLFlBQVk7QUFDbkIsV0FBTyxLQUFLLE1BQU0sYUFBYTtBQUFBLEVBQ25DO0FBQUEsRUFLQSxJQUFXLFdBQVc7QUFDbEIsV0FBTyxLQUFLLE1BQU07QUFBQSxFQUN0QjtBQUFBLEVBS0EsSUFBVyxTQUFTO0FBQ2hCLFdBQU8sS0FBSyxNQUFNLFVBQVUsQ0FBQztBQUFBLEVBQ2pDO0FBQUEsRUFLQSxJQUFXLGNBQWM7QUFDckIsV0FBTyxLQUFLLE1BQU0sZUFBZTtBQUFBLEVBQ3JDO0FBQUEsRUFLQSxNQUFhLFVBQVU7QUFDbkIsV0FBTyxLQUFLLE9BQU8sT0FBTyxLQUFLLE9BQU87QUFBQSxNQUNsQyxjQUFjLEtBQUs7QUFBQSxNQUNuQixhQUFhLEtBQUs7QUFBQSxJQUN0QixDQUFDO0FBQUEsRUFDTDtBQUFBLEVBS08sVUFBVTtBQUNiLFdBQU8sQ0FBQyxLQUFLLE9BQU87QUFBQSxFQUN4QjtBQUFBLEVBS08sY0FBYztBQUNqQixXQUFPLEtBQUssWUFBWTtBQUFBLEVBQzVCO0FBQUEsRUFLTyxZQUFZO0FBQ2YsV0FBTyxLQUFLLE9BQU8sU0FBUztBQUFBLEVBQ2hDO0FBQUEsRUFLTyxTQUFTO0FBQ1osV0FBTztBQUFBLE1BQ0gsT0FBTyxLQUFLO0FBQUEsTUFDWixXQUFXLEtBQUs7QUFBQSxNQUNoQixVQUFVLEtBQUssVUFBVSxPQUFPLEtBQUssS0FBSztBQUFBLE1BQzFDLFFBQVEsS0FBSyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFBQSxNQUM3QyxXQUFXLEtBQUssV0FBVyxjQUFjO0FBQUEsTUFDekMsYUFBYSxLQUFLLGFBQWEsT0FBTyxLQUFLO0FBQUEsSUFDL0M7QUFBQSxFQUNKO0FBQ0o7QUFsSWE7OztBQ2hCTixJQUFLLGtCQUFMLGtCQUFLQyxxQkFBTDtBQUNILEVBQUFBLGlCQUFBLGtCQUFlO0FBQ2YsRUFBQUEsaUJBQUEsd0JBQXFCO0FBQ3JCLEVBQUFBLGlCQUFBLGtCQUFlO0FBQ2YsRUFBQUEsaUJBQUEsdUJBQW9CO0FBQ3BCLEVBQUFBLGlCQUFBLG1CQUFnQjtBQUNoQixFQUFBQSxpQkFBQSxzQkFBbUI7QUFDbkIsRUFBQUEsaUJBQUEsdUJBQW9CO0FBQ3BCLEVBQUFBLGlCQUFBLHVCQUFvQjtBQUNwQixFQUFBQSxpQkFBQSwwQkFBdUI7QUFDdkIsRUFBQUEsaUJBQUEsbUJBQWdCO0FBQ2hCLEVBQUFBLGlCQUFBLHlCQUFzQjtBQUN0QixFQUFBQSxpQkFBQSxxQkFBa0I7QUFDbEIsRUFBQUEsaUJBQUEsbUJBQWdCO0FBQ2hCLEVBQUFBLGlCQUFBLHFCQUFrQjtBQWRWLFNBQUFBO0FBQUEsR0FBQTtBQWlCTCxJQUFNLGNBQU4sY0FBMEIsTUFBTTtBQUFBLEVBS25DLFlBQVksU0FBaUIsT0FBd0Isa0NBQThCO0FBQy9FLFVBQU07QUFIVixxQkFBWSxJQUFJLEtBQUs7QUFLakIsU0FBSyxVQUFVLElBQUksU0FBUztBQUM1QixTQUFLLGFBQWE7QUFDbEIsU0FBSyxPQUFPO0FBRVosVUFBTSxrQkFBa0IsSUFBSTtBQUFBLEVBQ2hDO0FBQUEsRUFFQSxJQUFJLG1CQUFtQjtBQUNuQixXQUFPLEtBQUssVUFBVSxRQUFRO0FBQUEsRUFDbEM7QUFBQSxFQUVBLFVBQVU7QUFDTixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBLEVBRUEsU0FBUztBQUNMLFdBQU87QUFBQSxNQUNILE9BQU8sS0FBSztBQUFBLE1BQ1osTUFBTSxLQUFLO0FBQUEsTUFDWCxTQUFTLEtBQUs7QUFBQSxNQUNkLFNBQVMsS0FBSztBQUFBLElBQ2xCO0FBQUEsRUFDSjtBQUFBLEVBRUEsV0FBVztBQUNQLFdBQU8sS0FBSztBQUFBLEVBQ2hCO0FBQ0o7QUFuQ2E7OztBQ2hCYixJQUFBQyxnQkFBd0k7OztBQ0R4SSxJQUFBQyxnQkFhTztBQUdQLElBQUFDLGdCQUE2QjtBQUk3QixJQUFBQyxvQkFBdUU7QUFJdkUsSUFBTSx1QkFBdUIsTUFBTTtBQUMvQixNQUFJLDJCQUEyQixRQUFRO0FBQUssV0FBTztBQUVuRCxNQUFJLHNCQUFRLFNBQVMsTUFBTSxLQUFLLHNCQUFRLFdBQVcsR0FBRztBQUFHLFdBQU87QUFFaEUsUUFBTSxDQUFDLEVBQUUsT0FBTyxLQUFLLElBQUksc0JBQVEsTUFBTSxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sU0FBUyxDQUFDLENBQUM7QUFFbEUsTUFBSSxNQUFNLEtBQUs7QUFBRyxXQUFPO0FBR3pCLFNBQU8sUUFBUSxLQUFLLFFBQVEsUUFBUSxNQUFNLFFBQVE7QUFDdEQsR0FBRztBQWdDSCxJQUFNLG1CQUFOLGNBQStCLDJCQUEwQjtBQUFBLEVBZXJELFlBQVksWUFBNkIsU0FBNkMsT0FBbUMsb0JBQTRCLEtBQU8sYUFBMkI7QUFDbkwsVUFBTTtBQUQ0RTtBQUFtQztBQVp6SCxTQUFPLFdBQVcsSUFBSSxrQkFBa0IsSUFBSTtBQUc1QyxTQUFRLFlBQVk7QUFDcEIsU0FBTyxNQUFNLElBQUksK0JBQWE7QUFlMUIsU0FBSyxrQkFBa0I7QUFNdkIsU0FBSyxjQUNELG1CQUNBLGlDQUFrQjtBQUFBLE1BQ2QsT0FBTyxLQUFLLE1BQU0sT0FBTyxPQUFPLFdBQVcsRUFBRSxTQUFTLE9BQU87QUFBQSxJQUNqRSxDQUFDO0FBTUwsU0FBSyxVQUFVO0FBRWYsU0FBSyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsTUFBTSxLQUFLLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQztBQUNsRSxTQUFLLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxVQUFVLEtBQUssS0FBSyxLQUFLLFNBQVMsS0FBeUIsQ0FBQztBQUM5RixTQUFLLFlBQVksR0FBRyxTQUFTLENBQUMsTUFBTSxLQUFLLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQztBQUM5RCxTQUFLLFlBQVksR0FBRyxTQUFTLENBQUMsVUFBVSxLQUFLLEtBQUssS0FBSyxTQUFTLEtBQUssQ0FBQztBQUV0RSxTQUFLLElBQUksV0FBVyxNQUFNO0FBQ3RCLFVBQUksQ0FBQyxLQUFLO0FBQUs7QUFDZixVQUFJLEtBQUssSUFBSSxTQUFTO0FBQVMsYUFBSyxLQUFLLE9BQU8sS0FBSyxJQUFJLFNBQVMsT0FBTztBQUN6RSxVQUFJLEtBQUssSUFBSSxRQUFRO0FBQVEsYUFBSyxLQUFLLFVBQVUsS0FBSyxJQUFJLFFBQVEsTUFBTTtBQUN4RSxVQUFJLEtBQUssSUFBSTtBQUFXLGFBQUssS0FBSyxXQUFXLEtBQUssSUFBSSxVQUFVLE1BQU0sQ0FBQztBQUN2RSxVQUFJLEtBQUssSUFBSTtBQUFRLGFBQUssS0FBSyxVQUFVLEtBQUssSUFBSSxPQUFPLE1BQU07QUFDL0QsVUFBSSxLQUFLLElBQUk7QUFBVyxhQUFLLEtBQUssY0FBYyxLQUFLLElBQUksVUFBVSxnQkFBZ0I7QUFBQSxJQUN2RjtBQUVBLFNBQUssSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLEtBQUssU0FBUyxDQUFxQjtBQUVsRSxTQUFLLGdCQUFnQixHQUFHLGVBQWUsT0FBTyxVQUFVLGFBQWE7QUFDakUsVUFBSSxxQkFBcUI7QUFDckIsYUFBSyxNQUFNLE1BQU0scUNBQXFDLHNFQUF3RDtBQUM5RyxjQUFNLGdCQUFnQixRQUFRLElBQUksVUFBVSxZQUFZO0FBQ3hELGNBQU0sZ0JBQWdCLFFBQVEsSUFBSSxVQUFVLFlBQVk7QUFFeEQsY0FBTSw0QkFBNEIsd0JBQUMsR0FBVyxvQkFBNEI7QUFDdEUsZ0JBQU0sU0FBUyxRQUFRLElBQUksaUJBQWlCLEtBQUs7QUFDakQsd0JBQWMsUUFBUSxpQkFBaUI7QUFBQSxRQUMzQyxHQUhrQztBQUtsQyx1QkFBZSxJQUFJLGVBQWUseUJBQXlCO0FBQzNELHVCQUFlLEdBQUcsZUFBZSx5QkFBeUI7QUFBQSxNQUM5RDtBQUVBLFVBQUksU0FBUyxXQUFXLG9DQUFzQixjQUFjO0FBQ3hELFlBQUksU0FBUyxXQUFXLDhDQUFnQyxrQkFBa0IsU0FBUyxjQUFjLE1BQU07QUFDbkcsY0FBSTtBQUNBLHNCQUFNLDJCQUFZLEtBQUssaUJBQWlCLG9DQUFzQixZQUFZLEtBQUssaUJBQWlCO0FBQUEsVUFDcEcsUUFBRTtBQUNFLGdCQUFJO0FBQ0Esa0JBQUksS0FBSyxnQkFBZ0IsTUFBTSxXQUFXLG9DQUFzQjtBQUFXLHFCQUFLLGdCQUFnQixRQUFRO0FBQUEsWUFDNUcsU0FBUyxLQUFQO0FBQ0UsbUJBQUssS0FBSyxTQUFTLEdBQXVCO0FBQUEsWUFDOUM7QUFBQSxVQUNKO0FBQUEsUUFDSixXQUFXLEtBQUssZ0JBQWdCLGlCQUFpQixHQUFHO0FBQ2hELGdCQUFNLEtBQUssTUFBTSxLQUFLLGdCQUFnQixpQkFBaUIsS0FBSyxHQUFJO0FBQ2hFLGVBQUssZ0JBQWdCLE9BQU87QUFBQSxRQUNoQyxPQUFPO0FBQ0gsY0FBSTtBQUNBLGdCQUFJLEtBQUssZ0JBQWdCLE1BQU0sV0FBVyxvQ0FBc0I7QUFBVyxtQkFBSyxnQkFBZ0IsUUFBUTtBQUFBLFVBQzVHLFNBQVMsS0FBUDtBQUNFLGlCQUFLLEtBQUssU0FBUyxHQUF1QjtBQUFBLFVBQzlDO0FBQUEsUUFDSjtBQUFBLE1BQ0osV0FBVyxTQUFTLFdBQVcsb0NBQXNCLFdBQVc7QUFDNUQsYUFBSyxJQUFJO0FBQUEsTUFDYixXQUFXLENBQUMsS0FBSyxjQUFjLFNBQVMsV0FBVyxvQ0FBc0IsY0FBYyxTQUFTLFdBQVcsb0NBQXNCLGFBQWE7QUFDMUksYUFBSyxZQUFZO0FBQ2pCLFlBQUk7QUFDQSxvQkFBTSwyQkFBWSxLQUFLLGlCQUFpQixvQ0FBc0IsT0FBTyxLQUFLLGlCQUFpQjtBQUFBLFFBQy9GLFFBQUU7QUFDRSxjQUFJLEtBQUssZ0JBQWdCLE1BQU0sV0FBVyxvQ0FBc0IsV0FBVztBQUN2RSxnQkFBSTtBQUNBLG1CQUFLLGdCQUFnQixRQUFRO0FBQUEsWUFDakMsU0FBUyxLQUFQO0FBQ0UsbUJBQUssS0FBSyxTQUFTLEdBQXVCO0FBQUEsWUFDOUM7QUFBQSxVQUNKO0FBQUEsUUFDSixVQUFFO0FBQ0UsZUFBSyxZQUFZO0FBQUEsUUFDckI7QUFBQSxNQUNKO0FBQUEsSUFDSixDQUFDO0FBRUQsU0FBSyxZQUFZLEdBQUcsZUFBZSxDQUFDLFVBQVUsYUFBYTtBQUN2RCxVQUFJLFNBQVMsV0FBVyxnQ0FBa0IsVUFBVSxTQUFTLFdBQVcsZ0NBQWtCLFFBQVE7QUFDOUYsYUFBSyxNQUFNLE9BQU8sT0FBTyxLQUFLLGVBQWUsS0FBSyxLQUFLO0FBQUEsTUFDM0Q7QUFFQSxVQUFJLFNBQVMsV0FBVyxnQ0FBa0IsVUFBVSxTQUFTLFdBQVcsZ0NBQWtCLFFBQVE7QUFDOUYsYUFBSyxNQUFNLE9BQU8sT0FBTyxLQUFLLGdCQUFnQixLQUFLLEtBQUs7QUFBQSxNQUM1RDtBQUVBLFVBQUksU0FBUyxXQUFXLGdDQUFrQixTQUFTO0FBQy9DLFlBQUksU0FBUyxXQUFXLGdDQUFrQixRQUFRLFNBQVMsV0FBVyxnQ0FBa0IsV0FBVztBQUMvRixpQkFBTyxLQUFLLEtBQUssU0FBUyxLQUFLLGFBQWM7QUFBQSxRQUNqRDtBQUFBLE1BQ0osV0FBVyxTQUFTLFdBQVcsZ0NBQWtCLFFBQVEsU0FBUyxXQUFXLGdDQUFrQixNQUFNO0FBQ2pHLGFBQUssS0FBSyxVQUFVLEtBQUssYUFBYztBQUN2QyxhQUFLLElBQUksUUFBUTtBQUNqQixhQUFLLGdCQUFnQjtBQUFBLE1BQ3pCO0FBQUEsSUFDSixDQUFDO0FBRUQsU0FBSyxnQkFBZ0IsVUFBVSxLQUFLLFdBQVc7QUFBQSxFQUNuRDtBQUFBLEVBS0EsSUFBSSxTQUFTO0FBQ1QsV0FBTyxLQUFLLFlBQVksTUFBTSxXQUFXLGdDQUFrQjtBQUFBLEVBQy9EO0FBQUEsRUFFQSxJQUFJLE9BQU8sS0FBYztBQUNyQixVQUFNLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxPQUFPO0FBQUEsRUFDekM7QUFBQSxFQUtBLFdBQVc7QUFDUCxXQUFPLEtBQUssVUFBVSxLQUFLLFlBQVksTUFBTSxXQUFXLGdDQUFrQjtBQUFBLEVBQzlFO0FBQUEsRUFLQSxjQUFjO0FBQ1YsV0FBTyxLQUFLLFlBQVksTUFBTSxXQUFXLGdDQUFrQjtBQUFBLEVBQy9EO0FBQUEsRUFLQSxZQUFZO0FBQ1IsV0FBTyxLQUFLLFlBQVksTUFBTSxXQUFXLGdDQUFrQjtBQUFBLEVBQy9EO0FBQUEsRUFLQSxTQUFTO0FBQ0wsV0FBTyxLQUFLLFlBQVksTUFBTSxXQUFXLGdDQUFrQjtBQUFBLEVBQy9EO0FBQUEsRUFLQSxjQUFjO0FBQ1YsV0FBTyxLQUFLLGdCQUFnQixNQUFNLFdBQVcsb0NBQXNCO0FBQUEsRUFDdkU7QUFBQSxFQUtBLGlCQUFpQjtBQUNiLFdBQU8sS0FBSyxnQkFBZ0IsTUFBTSxXQUFXLG9DQUFzQjtBQUFBLEVBQ3ZFO0FBQUEsRUFLQSxVQUFVO0FBQ04sV0FBTyxLQUFLLGdCQUFnQixNQUFNLFdBQVcsb0NBQXNCO0FBQUEsRUFDdkU7QUFBQSxFQUtBLGVBQWU7QUFDWCxXQUFPLEtBQUssZ0JBQWdCLE1BQU0sV0FBVyxvQ0FBc0I7QUFBQSxFQUN2RTtBQUFBLEVBS0EsZUFBZTtBQUNYLFdBQU8sS0FBSyxnQkFBZ0IsTUFBTSxXQUFXLG9DQUFzQjtBQUFBLEVBQ3ZFO0FBQUEsRUFRQSxNQUFNLGFBQWEsS0FBZSxLQUF1QjtBQUNyRCxRQUFJLENBQUMsS0FBSztBQUFnQixXQUFLLE1BQU0sTUFBTSxvQ0FBb0M7QUFDL0UsVUFBTSxTQUFTLENBQUMsS0FBSyxpQkFDZixLQUFLLElBQUksT0FBTyxLQUFLO0FBQUEsTUFDakIsS0FBSztBQUFBLFFBQ0QsU0FBUyxLQUFLO0FBQUEsUUFDZCxVQUFVLEtBQUs7QUFBQSxNQUNuQjtBQUFBLE1BQ0EsUUFBUSxLQUFLLGVBQ1A7QUFBQSxRQUNJLFFBQVEsSUFBSTtBQUFBLFFBQ1osVUFBVSxLQUFLO0FBQUEsTUFDbkIsSUFDQTtBQUFBLE1BQ04sV0FBVztBQUFBLFFBQ1Asa0JBQWtCLEtBQUs7QUFBQSxRQUN2QixVQUFVLEtBQUs7QUFBQSxNQUNuQjtBQUFBLE1BQ0EsV0FBVztBQUFBLFFBQ1AsZ0JBQWdCLEtBQUs7QUFBQSxRQUNyQixVQUFVLEtBQUs7QUFBQSxNQUNuQjtBQUFBLE1BQ0EsUUFBUTtBQUFBLFFBQ0osUUFBUSxLQUFLO0FBQUEsUUFDYixVQUFVLEtBQUs7QUFBQSxNQUNuQjtBQUFBLElBQ0osQ0FBQyxJQUNEO0FBRU4sU0FBSyxNQUFNLE1BQU0sdUNBQXVDO0FBQ3hELFVBQU0sYUFBYSxNQUFNLEtBQUssTUFBTSxzQkFBc0IsUUFBUSxLQUFLLEtBQUssRUFBRTtBQUFBLE1BQzFFLE9BQ0s7QUFBQSxRQUNHO0FBQUEsUUFDQSxNQUFNLEtBQUssUUFBUSx5QkFBVztBQUFBLE1BQ2xDO0FBQUEsSUFDUjtBQUVBLFNBQUssTUFBTSxNQUFNLDRCQUE0QjtBQUM3QyxTQUFLLG9CQUFnQixtQ0FBb0IsWUFBWSxVQUFVLFFBQVE7QUFBQSxNQUNuRSxXQUFXLFlBQVksUUFBUSxLQUFLLFFBQVEseUJBQVc7QUFBQSxNQUN2RCxVQUFVLEtBQUs7QUFBQSxNQUVmLGNBQWM7QUFBQSxJQUNsQixDQUFDO0FBRUQsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQSxFQUVBLElBQVcsWUFBWTtBQUNuQixXQUFPLEtBQUssS0FBSztBQUFBLEVBQ3JCO0FBQUEsRUFFQSxJQUFXLFVBQVU7QUFDakIsV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUNyQjtBQUFBLEVBRUEsSUFBVyxTQUFTO0FBQ2hCLFdBQU8sS0FBSyxLQUFLLFVBQVU7QUFBQSxFQUMvQjtBQUFBLEVBRUEsSUFBVyxZQUFZO0FBQ25CLFdBQU8sS0FBSyxLQUFLLGFBQWE7QUFBQSxFQUNsQztBQUFBLEVBTUEsSUFBSSxTQUFTO0FBQ1QsV0FBTyxLQUFLLFlBQVksTUFBTTtBQUFBLEVBQ2xDO0FBQUEsRUFNQSxhQUFhO0FBQ1QsUUFBSTtBQUNBLFVBQUksS0FBSztBQUFhLGFBQUssWUFBWSxLQUFLLElBQUk7QUFDaEQsVUFBSSxLQUFLLGdCQUFnQixNQUFNLFdBQVcsb0NBQXNCO0FBQVcsYUFBSyxnQkFBZ0IsUUFBUTtBQUFBLElBQzVHLFFBQUU7QUFBQSxJQUFPO0FBQUEsRUFDYjtBQUFBLEVBTUEsTUFBTTtBQUNGLFFBQUk7QUFDQSxXQUFLLFlBQVksS0FBSztBQUFBLElBQzFCLFFBQUU7QUFBQSxJQUVGO0FBQUEsRUFDSjtBQUFBLEVBT0EsTUFBTSxvQkFBOEI7QUFDaEMsVUFBTSxVQUFVLEtBQUssWUFBWSxNQUFNLGtCQUFrQjtBQUN6RCxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBTUEsU0FBUztBQUNMLFVBQU0sVUFBVSxLQUFLLFlBQVksUUFBUTtBQUN6QyxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBT0EsTUFBTSxXQUFXLFdBQWlDLEtBQUssZUFBZ0I7QUFDbkUsUUFBSSxDQUFDO0FBQVUsWUFBTSxJQUFJLFlBQVksNkVBQXFFO0FBQzFHLFFBQUksU0FBUyxPQUFPO0FBQ2hCLGFBQU8sS0FBSyxLQUFLLEtBQUssVUFBVSxRQUFRO0FBQUEsSUFDNUM7QUFDQSxRQUFJLENBQUMsS0FBSztBQUFlLFdBQUssZ0JBQWdCO0FBQzlDLFFBQUksS0FBSyxnQkFBZ0IsTUFBTSxXQUFXLG9DQUFzQixPQUFPO0FBQ25FLFVBQUk7QUFDQSxrQkFBTSwyQkFBWSxLQUFLLGlCQUFpQixvQ0FBc0IsT0FBTyxLQUFLLGlCQUFpQjtBQUFBLE1BQy9GLFNBQVMsS0FBUDtBQUNFLGVBQU8sS0FBSyxLQUFLLEtBQUssU0FBUyxHQUF1QjtBQUFBLE1BQzFEO0FBQUEsSUFDSjtBQUVBLFFBQUk7QUFDQSxXQUFLLFlBQVksS0FBSyxRQUFRO0FBQUEsSUFDbEMsU0FBUyxHQUFQO0FBQ0UsV0FBSyxLQUFLLFNBQVMsQ0FBcUI7QUFBQSxJQUM1QztBQUVBLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFPQSxVQUFVLE9BQWU7QUFDckIsUUFBSSxDQUFDLEtBQUssSUFBSTtBQUFRLGFBQU87QUFDN0IsV0FBTyxLQUFLLElBQUksT0FBTyxVQUFVLEtBQUs7QUFBQSxFQUMxQztBQUFBLEVBTUEsSUFBSSxTQUFTO0FBQ1QsUUFBSSxDQUFDLEtBQUssSUFBSTtBQUFRLGFBQU87QUFDN0IsV0FBTyxLQUFLLElBQUksT0FBTztBQUFBLEVBQzNCO0FBQUEsRUFNQSxJQUFJLGFBQWE7QUFDYixRQUFJLENBQUMsS0FBSztBQUFlLGFBQU87QUFDaEMsV0FBTyxLQUFLLGNBQWM7QUFBQSxFQUM5QjtBQUNKO0FBallNOzs7QURoRU4sSUFBQUMsZ0JBQTJCO0FBSTNCLElBQU0sYUFBTixNQUFpQjtBQUFBLEVBT2IsWUFBbUIsUUFBZ0I7QUFBaEI7QUFLZixTQUFLLFFBQVEsSUFBSSx5QkFBd0M7QUFBQSxFQUM3RDtBQUFBLEVBUUEsTUFBYSxRQUNULFNBQ0EsU0FNeUI7QUFDekIsUUFBSSxDQUFDLFNBQVM7QUFBTyxZQUFNLElBQUksTUFBTSx3QkFBd0I7QUFDN0QsVUFBTSxPQUFPLE1BQU0sS0FBSyxLQUFLLFNBQVMsT0FBTztBQUM3QyxVQUFNLE1BQU0sSUFBSSxpQkFBaUIsTUFBTSxTQUFTLFFBQVEsT0FBTyxRQUFRLFNBQVMsUUFBUSxXQUFXO0FBQ25HLFNBQUssTUFBTSxJQUFJLFFBQVEsTUFBTSxJQUFJLEdBQUc7QUFDcEMsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQVFBLE1BQWEsS0FDVCxTQUNBLFNBSUY7QUFDRSxVQUFNLFdBQU8sZ0NBQWlCO0FBQUEsTUFDMUIsU0FBUyxRQUFRLE1BQU07QUFBQSxNQUN2QixXQUFXLFFBQVE7QUFBQSxNQUNuQixnQkFBZ0IsUUFBUSxNQUFNO0FBQUEsTUFDOUIsVUFBVSxRQUFRLFNBQVMsSUFBSTtBQUFBLE1BQy9CLE9BQU8sS0FBSyxPQUFPLE9BQU8sV0FBVyxFQUFFLFNBQVMsT0FBTztBQUFBLElBQzNELENBQUM7QUFFRCxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBT08sV0FBVyxZQUFnRDtBQUM5RCxRQUFJLHNCQUFzQjtBQUFrQixtQkFBYSxXQUFXO0FBRXBFLFFBQUk7QUFDQSxVQUFJLFdBQVcsTUFBTSxXQUFXLG9DQUFzQjtBQUFXLGVBQU8sV0FBVyxRQUFRO0FBQUEsSUFDL0YsUUFBRTtBQUFBLElBRUY7QUFBQSxFQUNKO0FBQUEsRUFPTyxjQUFjLE9BQWtCO0FBQ25DLFdBQU8sS0FBSyxNQUFNLElBQUksS0FBSyxTQUFLLGtDQUFtQixLQUFLO0FBQUEsRUFDNUQ7QUFDSjtBQXBGTTs7O0FFSU4sSUFBTSx5QkFBeUI7QUFYL0I7QUFhTyxJQUFNLGFBQU4sTUFBaUI7QUFBQSxFQUdiLFlBQ0ksUUFDQSxVQUE2QjtBQUFBLElBQ2hDLGVBQWU7QUFBQSxFQUNuQixHQUNGO0FBSlM7QUFDQTtBQUpYLHNDQUFnQixvQkFBSSxJQUFrRDtBQVFsRSxTQUFLLFFBQVEsWUFBWSxLQUFLLFFBQVEsS0FBSyxJQUFJLEdBQUcsS0FBSyxhQUFhLEVBQUUsTUFBTTtBQUFBLEVBQ2hGO0FBQUEsRUFFQSxJQUFXLGdCQUFnQjtBQUN2QixXQUFPLEtBQUssUUFBUSxpQkFBaUI7QUFBQSxFQUN6QztBQUFBLEVBRUEsTUFBYSxVQUFVO0FBQ25CLGVBQVcsQ0FBQyxJQUFJLEtBQUssS0FBSyxtQkFBSyxnQkFBZTtBQUMxQyxVQUFJLE1BQU0sV0FBVyxHQUFHO0FBQ3BCLDJCQUFLLGVBQWMsT0FBTyxFQUFFO0FBQUEsTUFDaEM7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUFBLEVBRUEsTUFBYSxRQUFRO0FBQ2pCLHVCQUFLLGVBQWMsTUFBTTtBQUFBLEVBQzdCO0FBQUEsRUFFQSxNQUFhLFVBQVU7QUFDbkIsV0FBTyxDQUFDLEdBQUcsbUJBQUssZUFBYyxPQUFPLENBQUM7QUFBQSxFQUMxQztBQUFBLEVBRUEsTUFBYSxRQUFRLE1BQW9CO0FBQ3JDLFNBQUssT0FBTyxRQUFRLENBQUMsTUFBTTtBQUN2QixVQUFJLG1CQUFLLGVBQWMsSUFBSSxFQUFFLEdBQUc7QUFBRztBQUNuQyx5QkFBSyxlQUFjLElBQUksRUFBRSxLQUFLLElBQUksOEJBQThCLENBQUMsQ0FBQztBQUFBLElBQ3RFLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFFQSxNQUFhLFFBQVEsU0FBb0M7QUFDckQsVUFBTSxTQUFTLG1CQUFLLGVBQWMsSUFBSSxRQUFRLEtBQUs7QUFDbkQsUUFBSSxDQUFDO0FBQ0QsYUFBTyxJQUFJLGFBQWEsS0FBSyxRQUFRO0FBQUEsUUFDakMsT0FBTyxRQUFRO0FBQUEsUUFDZixhQUFhLFFBQVE7QUFBQSxRQUNyQixXQUFXLFFBQVE7QUFBQSxNQUN2QixDQUFDO0FBRUwsV0FBTyxJQUFJLGFBQWEsS0FBSyxRQUFRO0FBQUEsTUFDakMsT0FBTyxRQUFRO0FBQUEsTUFDZixRQUFRLENBQUMsT0FBTyxJQUFJO0FBQUEsTUFDcEIsVUFBVTtBQUFBLE1BQ1YsV0FBVyxRQUFRO0FBQUEsTUFDbkIsYUFBYSxRQUFRO0FBQUEsSUFDekIsQ0FBQztBQUFBLEVBQ0w7QUFDSjtBQXhEYTtBQUNUO0FBeURHLElBQU0sZ0NBQU4sTUFBaUQ7QUFBQSxFQUU3QyxZQUFtQixNQUFTLGNBQXNCLHdCQUF3QjtBQUF2RDtBQUQxQixTQUFPLGNBQWM7QUFFakIsUUFBSSxPQUFPLGdCQUFnQixVQUFVO0FBQ2pDLFdBQUssY0FBYyxLQUFLLElBQUksSUFBSTtBQUFBLElBQ3BDO0FBQUEsRUFDSjtBQUFBLEVBRU8sYUFBYTtBQUNoQixRQUFJLE9BQU8sS0FBSyxnQkFBZ0IsWUFBWSxNQUFNLEtBQUssV0FBVyxLQUFLLEtBQUssY0FBYztBQUFHLGFBQU87QUFDcEcsV0FBTyxLQUFLLElBQUksS0FBSyxLQUFLO0FBQUEsRUFDOUI7QUFDSjtBQVphOzs7QUN2RWIsSUFBQUMsa0JBQW1IO0FBTW5ILElBQUFDLGdCQUF5QztBQU96QyxJQUFNLGFBQWEsT0FBTyxnQ0FBZ0M7QUFiMUQ7QUFzQk8sSUFBTSxVQUFOLGNBQXFCLG9CQUFrQztBQUFBLEVBbUJuRCxZQUFZLFFBQWdCLFVBQTZCLENBQUMsR0FBRztBQUVoRSxRQUFJLENBQUMsUUFBUSxrQkFBa0IsY0FBYztBQUFRLGFBQWEsUUFBUTtBQUUxRSxVQUFNLENBQUMsT0FBTyxDQUFDO0FBdEJuQixxQ0FBZTtBQUNmLGtEQUE0QixLQUFLLGlCQUFpQixLQUFLLElBQUk7QUFDM0Q7QUFDQTtBQUVBLFNBQWdCLEtBQUssOEJBQWMsU0FBUyxFQUFFLFNBQVM7QUFHdkQsU0FBTyxRQUFRLElBQUksaUJBQWlCLElBQUk7QUFDeEMsU0FBZ0IsYUFBYSxJQUFJLFdBQVcsSUFBSTtBQUNoRCxTQUFPLGFBQWEsSUFBSSwwQkFBMEIsSUFBSTtBQUN0RCxTQUFPLFNBQVMsSUFBSSxvQkFBc0MsQ0FBQyxTQUFTLGFBQWEsQ0FBQztBQWlCOUUsU0FBSyxTQUFTO0FBRWQsUUFBSSxLQUFLLFFBQVEsU0FBUyxXQUFXLENBQUMsSUFBSSxnQ0FBZ0IsS0FBSyxRQUFRLFNBQVMsT0FBTyxFQUFFLElBQUksZ0NBQWdCLE1BQU0sZ0JBQWdCLEdBQUc7QUFDbEksV0FBSyxLQUFLLCtDQUErQyx3QkFBd0I7QUFBQSxJQUNyRjtBQU1BLFNBQUssVUFBVTtBQUFBLE1BQ1gsdUJBQXVCO0FBQUEsTUFDdkIsdUJBQXVCO0FBQUEsTUFDdkIsaUJBQWlCLENBQUM7QUFBQSxNQUNsQixpQkFBaUIsQ0FBQztBQUFBLE1BQ2xCLG1CQUFtQjtBQUFBLE1BQ25CLGNBQWM7QUFBQSxNQUNkLFlBQVk7QUFBQSxNQUNaLFlBQVksUUFBUSxlQUFlLE9BQU8sT0FBTyxJQUFJLFdBQVcsSUFBSTtBQUFBLE1BQ3BFLEdBQUc7QUFBQSxNQUNILGFBQWE7QUFBQSxRQUNULGVBQWUsS0FBSztBQUFBLFFBQ3BCLEdBQUcsUUFBUTtBQUFBLE1BQ2Y7QUFBQSxJQUNKO0FBRUEsU0FBSyxPQUFPLEdBQUcsb0JBQW9CLG1CQUFLLDBCQUF5QjtBQUVqRSxRQUFJLEtBQUssU0FBUyx1QkFBdUI7QUFDckMsV0FBSyxLQUFLLHdIQUF3SDtBQUNsSSxXQUFLLFdBQVcsWUFBWSxFQUFFLEtBQUssQ0FBQyxNQUFNO0FBQ3RDLFlBQUksRUFBRSxPQUFPO0FBQ1QsZUFBSyxLQUFLLFNBQVMsSUFBSSxNQUFNLHNDQUFzQyxFQUFFLE9BQU8sU0FBUyxFQUFFLE9BQU8sQ0FBQztBQUFBLFFBQ25HLE9BQU87QUFDSCxlQUFLLE1BQU0sNEJBQTRCO0FBQUEsUUFDM0M7QUFFQSxhQUFLLE1BQU07QUFBQSxFQUEwQixLQUFLLFNBQVMsR0FBRztBQUFBLE1BQzFELENBQUM7QUFBQSxJQUNMO0FBRUEsUUFBSSxPQUFPLEtBQUssUUFBUSxlQUFlLFlBQVksS0FBSyxRQUFRLGFBQWEsR0FBRztBQUM1RSx5QkFBSyxxQkFBc0IsWUFBWSxNQUFNO0FBQ3pDLGNBQU0sUUFBUSxZQUFZLElBQUk7QUFDOUIsMkJBQUssb0JBQXFCLFdBQVcsTUFBTTtBQUN2Qyw2QkFBSyxjQUFlLFlBQVksSUFBSSxJQUFJO0FBQ3hDLGVBQUssTUFBTSxxQ0FBcUMsbUJBQUssaUJBQWdCO0FBQUEsUUFDekUsR0FBRyxDQUFDLEVBQUUsTUFBTTtBQUFBLE1BQ2hCLEdBQUcsS0FBSyxRQUFRLFVBQVUsRUFBRSxNQUFNO0FBQUEsSUFDdEM7QUFFQSxJQUFXLFVBQVUsSUFBSTtBQUV6QixRQUFJLEVBQUUsY0FBYyxVQUFTO0FBQ3pCLGFBQU8sZUFBZSxTQUFRLFlBQVk7QUFBQSxRQUN0QyxPQUFPO0FBQUEsUUFDUCxVQUFVO0FBQUEsUUFDVixjQUFjO0FBQUEsUUFDZCxZQUFZO0FBQUEsTUFDaEIsQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBQUEsRUFFTyxNQUFNLEdBQVc7QUFDcEIsV0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDO0FBQUEsRUFDL0I7QUFBQSxFQU9BLE9BQWMsVUFBVSxRQUFnQixVQUE2QixDQUFDLEdBQUc7QUFDckUsV0FBTyxJQUFJLFFBQU8sUUFBUTtBQUFBLE1BQ3RCLEdBQUc7QUFBQSxNQUNILGdCQUFnQjtBQUFBLElBQ3BCLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFLQSxPQUFjLGdCQUFnQjtBQUMxQixXQUFrQixXQUFXO0FBQUEsRUFDakM7QUFBQSxFQUtBLE9BQWMsa0JBQWtCO0FBQzVCLFdBQWtCLFVBQVUsTUFBTTtBQUFBLEVBQ3RDO0FBQUEsRUFLQSxJQUFXLGFBQWE7QUFDcEIsV0FBTyxLQUFLLFFBQVEsY0FBYztBQUFBLEVBQ3RDO0FBQUEsRUFLQSxJQUFXLFNBQVM7QUFDaEIsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQSxFQU9BLElBQVcsZUFBZTtBQUN0QixXQUFPLG1CQUFLO0FBQUEsRUFDaEI7QUFBQSxFQXVCTyxxQkFBcUI7QUFDeEIsV0FBTztBQUFBLE1BQ0gsV0FBc0IsVUFBVTtBQUFBLE1BQ2hDLGFBQWEsS0FBSyxPQUFPLE1BQU07QUFBQSxNQUMvQixtQkFBbUIsS0FBSyxjQUFjO0FBQUEsTUFDdEMsUUFBUSxLQUFLLE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDM0Q7QUFBQSxFQUNKO0FBQUEsRUFTQSxNQUFhLFVBQVU7QUFDbkIsU0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUM7QUFDaEQsU0FBSyxPQUFPLElBQUksb0JBQW9CLG1CQUFLLDBCQUF5QjtBQUNsRSxTQUFLLG1CQUFtQjtBQUN4QixTQUFLLE9BQU8sbUJBQW1CO0FBQy9CLFVBQU0sS0FBSyxXQUFXLGNBQWM7QUFDcEMsUUFBSSxtQkFBSztBQUFxQixvQkFBYyxtQkFBSyxvQkFBbUI7QUFDcEUsUUFBSSxtQkFBSztBQUFvQixvQkFBYyxtQkFBSyxtQkFBa0I7QUFDbEUsSUFBVyxZQUFZLElBQUk7QUFBQSxFQUMvQjtBQUFBLEVBRVEsa0JBQWtCLFVBQXNCLFVBQXNCO0FBQ2xFLFVBQU0sUUFBUSxLQUFLLE1BQU0sSUFBSSxTQUFTLE1BQU0sRUFBRTtBQUM5QyxRQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sY0FBYyxDQUFDLE1BQU07QUFBUztBQUduRCxVQUFNLGFBQWEsS0FBSyxPQUFPLEtBQUssb0JBQW9CLE9BQU8sVUFBVSxRQUFRO0FBRWpGLFFBQUksY0FBYyxDQUFDLEtBQUssUUFBUTtBQUF1QjtBQUV2RCxRQUFJLFNBQVMsYUFBYSxDQUFDLFNBQVMsYUFBYSxTQUFTLFFBQVEsT0FBTyxTQUFTLE1BQU0sUUFBUSxJQUFJLElBQUk7QUFDcEcsVUFBSTtBQUNBLGNBQU0sT0FBTztBQUFBLE1BQ2pCLFFBQUU7QUFBQSxNQUVGO0FBQ0EsYUFBTyxLQUFLLEtBQUssT0FBTyxLQUFLLGNBQWMsS0FBSztBQUFBLElBQ3BEO0FBRUEsUUFBSSxDQUFDLFNBQVMsYUFBYSxTQUFTLGFBQWEsU0FBUyxRQUFRLE9BQU8sU0FBUyxNQUFNLFFBQVEsSUFBSSxJQUFJO0FBQ3BHLFVBQUksU0FBUyxjQUFjLFFBQVEsU0FBUyxlQUFlLFNBQVMsWUFBWTtBQUM1RSxjQUFNLEtBQUssVUFBVSxTQUFTLFVBQVU7QUFBQSxNQUM1QyxXQUFXLFNBQVMsU0FBUyxTQUFTLDRCQUFZLG1CQUFtQixTQUFTLFlBQVksUUFBUSxTQUFTLGFBQWEsU0FBUyxVQUFVO0FBQ3ZJLGNBQU0sS0FBSyxVQUFVLFNBQVMsUUFBUTtBQUN0QyxZQUFJLFNBQVMsVUFBVTtBQUNuQixtQkFBUyxNQUFNLFFBQVEsSUFBSSxNQUFNLGtCQUFrQixJQUFJLEVBQUUsTUFBTSxLQUFLLElBQUk7QUFBQSxRQUM1RTtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBRUEsUUFBSSxDQUFDLFNBQVMsYUFBYSxTQUFTLGNBQWMsTUFBTSxRQUFRLElBQUk7QUFDaEUsVUFBSSxDQUFDLEtBQUssYUFBYSxNQUFNLE9BQU87QUFBRztBQUN2QyxZQUFNLFVBQVUsV0FBVyxNQUFNO0FBQzdCLFlBQUksQ0FBQyxLQUFLLGFBQWEsTUFBTSxPQUFRO0FBQUc7QUFDeEMsWUFBSSxDQUFDLEtBQUssTUFBTSxJQUFJLE1BQU0sTUFBTSxFQUFFO0FBQUc7QUFDckMsWUFBSSxNQUFNLFFBQVE7QUFBYyxnQkFBTSxPQUFPO0FBQzdDLGFBQUssT0FBTyxLQUFLLGdCQUFnQixLQUFLO0FBQUEsTUFDMUMsR0FBRyxNQUFNLFFBQVEsd0JBQXdCLENBQUMsRUFBRSxNQUFNO0FBQ2xELFlBQU0sU0FBUyxJQUFJLFNBQVMsU0FBUyxNQUFNLE1BQU0sT0FBTztBQUFBLElBQzVEO0FBRUEsUUFBSSxTQUFTLGFBQWEsU0FBUyxjQUFjLE1BQU0sUUFBUSxJQUFJO0FBQy9ELFlBQU0sZUFBZSxNQUFNLFNBQVMsSUFBSSxTQUFTLFNBQVMsTUFBTSxJQUFJO0FBQ3BFLFlBQU0sZUFBZSxLQUFLLGFBQWEsTUFBTSxPQUFPO0FBQ3BELFVBQUksQ0FBQyxnQkFBZ0IsY0FBYztBQUMvQixxQkFBYSxZQUFZO0FBQ3pCLGNBQU0sU0FBUyxPQUFPLFNBQVMsU0FBUyxNQUFNLElBQUk7QUFBQSxNQUN0RDtBQUFBLElBQ0o7QUFFQSxRQUFJLFNBQVMsYUFBYSxTQUFTLGFBQWEsU0FBUyxjQUFjLFNBQVMsV0FBVztBQUN2RixVQUFJLFNBQVMsUUFBUSxPQUFPLFNBQVMsTUFBTSxRQUFRLElBQUksSUFBSTtBQUN2RCxZQUFJLE1BQU0sY0FBYyxTQUFTLFFBQVEsT0FBTyxTQUFTLE1BQU0sUUFBUSxJQUFJO0FBQUksZ0JBQU0sVUFBVSxTQUFTO0FBQ3hHLGNBQU0sZUFBZSxNQUFNLFNBQVMsSUFBSSxTQUFTLFNBQVMsTUFBTSxJQUFJO0FBQ3BFLGNBQU0sZUFBZSxLQUFLLGFBQWEsTUFBTSxPQUFPO0FBQ3BELFlBQUksQ0FBQyxnQkFBZ0IsY0FBYztBQUMvQix1QkFBYSxZQUFZO0FBQ3pCLGdCQUFNLFNBQVMsT0FBTyxTQUFTLFNBQVMsTUFBTSxJQUFJO0FBQUEsUUFDdEQsT0FBTztBQUNILGdCQUFNLFVBQVUsV0FBVyxNQUFNO0FBQzdCLGdCQUFJLE1BQU0sY0FBYyxDQUFDLEtBQUssYUFBYSxNQUFNLE9BQVE7QUFBRztBQUM1RCxnQkFBSSxDQUFDLEtBQUssTUFBTSxJQUFJLE1BQU0sTUFBTSxFQUFFO0FBQUc7QUFDckMsZ0JBQUksTUFBTSxRQUFRO0FBQWMsb0JBQU0sT0FBTztBQUM3QyxpQkFBSyxPQUFPLEtBQUssZ0JBQWdCLEtBQUs7QUFBQSxVQUMxQyxHQUFHLE1BQU0sUUFBUSx3QkFBd0IsQ0FBQyxFQUFFLE1BQU07QUFDbEQsZ0JBQU0sU0FBUyxJQUFJLFNBQVMsU0FBUyxNQUFNLE1BQU0sT0FBTztBQUFBLFFBQzVEO0FBQUEsTUFDSixPQUFPO0FBQ0gsWUFBSSxTQUFTLGNBQWMsTUFBTSxRQUFRLElBQUk7QUFDekMsY0FBSSxDQUFDLEtBQUssYUFBYSxNQUFNLE9BQU87QUFBRztBQUN2QyxjQUFJLE1BQU0sU0FBUyxJQUFJLFNBQVMsU0FBUyxNQUFNLElBQUk7QUFBRztBQUN0RCxnQkFBTSxVQUFVLFdBQVcsTUFBTTtBQUM3QixnQkFBSSxDQUFDLEtBQUssYUFBYSxNQUFNLE9BQVE7QUFBRztBQUN4QyxnQkFBSSxDQUFDLEtBQUssTUFBTSxJQUFJLE1BQU0sTUFBTSxFQUFFO0FBQUc7QUFDckMsZ0JBQUksTUFBTSxRQUFRO0FBQWMsb0JBQU0sT0FBTztBQUM3QyxpQkFBSyxPQUFPLEtBQUssZ0JBQWdCLEtBQUs7QUFBQSxVQUMxQyxHQUFHLE1BQU0sUUFBUSx3QkFBd0IsQ0FBQyxFQUFFLE1BQU07QUFDbEQsZ0JBQU0sU0FBUyxJQUFJLFNBQVMsU0FBUyxNQUFNLE1BQU0sT0FBTztBQUFBLFFBQzVELE9BQU87QUFDSCxnQkFBTSxlQUFlLE1BQU0sU0FBUyxJQUFJLFNBQVMsU0FBUyxNQUFNLElBQUk7QUFDcEUsZ0JBQU0sZUFBZSxLQUFLLGFBQWEsTUFBTSxPQUFRO0FBQ3JELGNBQUksQ0FBQyxnQkFBZ0IsY0FBYztBQUMvQix5QkFBYSxZQUFZO0FBQ3pCLGtCQUFNLFNBQVMsT0FBTyxTQUFTLFNBQVMsTUFBTSxJQUFJO0FBQUEsVUFDdEQ7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUEsRUFnQk8saUJBQWlCLFVBQXNCLFVBQTRCO0FBQ3RFLFNBQUssa0JBQWtCLFVBQVUsUUFBUTtBQUFBLEVBQzdDO0FBQUEsRUFLTyx3QkFBd0I7QUFDM0IsU0FBSyxRQUFRLHdCQUF3QjtBQUFBLEVBQ3pDO0FBQUEsRUFLTywwQkFBMEI7QUFDN0IsU0FBSyxRQUFRLHdCQUF3QjtBQUFBLEVBQ3pDO0FBQUEsRUFLTyw0QkFBNEI7QUFDL0IsV0FBTyxDQUFDLENBQUMsS0FBSyxRQUFRO0FBQUEsRUFDMUI7QUFBQSxFQW1CQSxNQUFhLEtBQ1QsU0FDQSxPQUNBLFVBSUksQ0FBQyxHQUNxQztBQUMxQyxVQUFNLEtBQUssS0FBSyxPQUFPLFNBQVMsUUFBUSxPQUFPO0FBQy9DLFFBQUksQ0FBQyxJQUFJLGFBQWE7QUFBRyxZQUFNLElBQUksTUFBTSwwQkFBMEI7QUFFbkUsVUFBTSxpQkFBaUIsaUJBQWlCLGVBQWUsUUFBUSxNQUFNLEtBQUssT0FBTyxPQUFPLE9BQU87QUFDL0YsVUFBTSxTQUFVLE1BQU0sUUFBUSxjQUFjLGNBQWMsS0FBTTtBQUNoRSxRQUFJLE9BQU8sUUFBUSxHQUFHO0FBQ2xCLFlBQU0sSUFBSSxNQUFNLHlCQUF5QixzQkFBc0IsT0FBTyxXQUFXLGNBQWMsUUFBUTtBQUFBLElBQzNHO0FBRUEsVUFBTSxRQUFRLEtBQUssTUFBTSxPQUFPLEdBQUcsT0FBTyxRQUFRLFdBQVc7QUFFN0QsU0FBSyxNQUFNLG9DQUFvQztBQUMvQyxVQUFNLFFBQVEsTUFBTSxXQUFXLFFBQVE7QUFDdkMsU0FBSyxNQUFNLHNCQUFzQixNQUFNLCtCQUErQjtBQUV0RSxTQUFLLE1BQU0sa0RBQWtEO0FBQzdELFVBQU0sTUFBTSxRQUFRO0FBQ3BCLFNBQUssTUFBTSxzQkFBc0IsTUFBTSxrQkFBa0I7QUFFekQsUUFBSTtBQUNBLFVBQUksQ0FBQyxNQUFNO0FBQVMsY0FBTSxNQUFNLFFBQVEsSUFBSSxRQUFRLGlCQUFpQjtBQUVyRSxVQUFJLENBQUMsT0FBTyxVQUFVO0FBQ2xCLGNBQU0sU0FBUyxPQUFPLE9BQU8sRUFBRTtBQUFBLE1BQ25DLE9BQU87QUFDSCxjQUFNLFNBQVMsT0FBTyxRQUFRO0FBQUEsTUFDbEM7QUFDQSxVQUFJLENBQUMsTUFBTSxVQUFVO0FBQUcsY0FBTSxNQUFNLEtBQUssS0FBSztBQUFBLElBQ2xELFVBQUU7QUFDRSxXQUFLLE1BQU0sbURBQW1EO0FBQzlELFlBQU0sV0FBVyxRQUFRO0FBQUEsSUFDN0I7QUFFQSxXQUFPO0FBQUEsTUFDSCxPQUFPLE9BQU8sT0FBTztBQUFBLE1BQ3JCLFdBQVcsT0FBTztBQUFBLE1BQ2xCLGNBQWM7QUFBQSxNQUNkO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQWNBLE1BQWEsT0FBTyxPQUEyRCxVQUF5QixDQUFDLEdBQTBCO0FBQy9ILFFBQUksaUJBQWlCO0FBQWMsYUFBTztBQUUxQyxRQUFJLFFBQVEsZUFBZTtBQUFNLGNBQVEsY0FBYyxLQUFLLE9BQU8sTUFBTSxRQUFRLFFBQVEsV0FBVztBQUNwRyxZQUFRLG9CQUFSLFFBQVEsa0JBQW9CLEtBQUssUUFBUTtBQUN6QyxZQUFRLHlCQUFSLFFBQVEsdUJBQXlCLFVBQVU7QUFFM0MsUUFBSSxpQkFBaUIsT0FBTztBQUN4QixhQUFPLElBQUksYUFBYSxNQUFNO0FBQUEsUUFDMUIsVUFBVSxNQUFNLFlBQVk7QUFBQSxRQUM1QixRQUFRLENBQUMsS0FBSztBQUFBLFFBQ2QsT0FBTyxNQUFNO0FBQUEsUUFDYixXQUFXLE1BQU07QUFBQSxRQUNqQixXQUFXLE1BQU07QUFBQSxRQUNqQixhQUFhLFFBQVE7QUFBQSxNQUN6QixDQUFDO0FBQUEsSUFDTDtBQUVBLFFBQUksaUJBQWlCLFVBQVU7QUFDM0IsYUFBTyxJQUFJLGFBQWEsTUFBTTtBQUFBLFFBQzFCLFVBQVU7QUFBQSxRQUNWLFFBQVEsTUFBTTtBQUFBLFFBQ2QsT0FBTyxNQUFNO0FBQUEsUUFDYixXQUFXLE1BQU0sT0FBTyxJQUFJO0FBQUEsUUFDNUIsV0FBVyxVQUFVO0FBQUEsUUFDckIsYUFBYSxRQUFRO0FBQUEsTUFDekIsQ0FBQztBQUFBLElBQ0w7QUFFQSxRQUFJLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFDdEIsWUFBTSxTQUFTLE1BQU0sT0FBTyxDQUFDLE1BQU0sYUFBYSxLQUFLO0FBQ3JELGFBQU8sSUFBSSxhQUFhLE1BQU07QUFBQSxRQUMxQixVQUFVO0FBQUEsUUFDVjtBQUFBLFFBQ0EsT0FBTztBQUFBLFFBQ1AsV0FBVztBQUFBLFFBQ1gsV0FBVyxVQUFVO0FBQUEsUUFDckIsYUFBYSxRQUFRO0FBQUEsTUFDekIsQ0FBQztBQUFBLElBQ0w7QUFFQSxTQUFLLE1BQU0sYUFBYSxPQUFPO0FBRS9CLFFBQUksWUFBa0M7QUFFdEMsWUFBUSxpQkFBUixRQUFRLGVBQWlCLFVBQVU7QUFFbkMsU0FBSyxNQUFNLHdCQUF3QixRQUFRLGNBQWM7QUFFekQsVUFBTSxZQUFZLFFBQVEsaUJBQWlCLFVBQVUsT0FBTyxjQUFjLFFBQVEsT0FBTyxRQUFRLG9CQUFvQixJQUFJLFFBQVE7QUFFakksU0FBSyxNQUFNLDRCQUE0QixXQUFXO0FBR2xELFFBQUksUUFBUSxhQUFhLFdBQVcsTUFBTSxHQUFHO0FBQ3pDLGtCQUFZLEtBQUssV0FBVyxJQUFJLFFBQVEsYUFBYSxVQUFVLENBQUMsQ0FBQztBQUNqRSxVQUFJLENBQUM7QUFDRCxlQUFPLElBQUksYUFBYSxNQUFNO0FBQUEsVUFDMUI7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0EsYUFBYSxRQUFRO0FBQUEsUUFDekIsQ0FBQztBQUFBLElBQ1Q7QUFHQSxRQUFJLENBQUMsV0FBVztBQUVaLFVBQUksQ0FBQyxRQUFRLGFBQWE7QUFDdEIsYUFBSyxNQUFNLG1CQUFtQjtBQUM5QixjQUFNQyxPQUFNLE1BQU0sS0FBSyxZQUFZLFFBQVE7QUFBQSxVQUN2QztBQUFBLFVBQ0E7QUFBQSxVQUNBLGFBQWEsUUFBUTtBQUFBLFFBQ3pCLENBQUM7QUFFRCxZQUFJQSxNQUFLLFVBQVUsR0FBRztBQUNsQixlQUFLLE1BQU0sdUJBQXVCLE9BQU87QUFDekMsaUJBQU9BO0FBQUEsUUFDWDtBQUVBLGFBQUssTUFBTSx3QkFBd0IsT0FBTztBQUFBLE1BQzlDO0FBRUEsV0FBSyxNQUFNLHlCQUF5QjtBQUdwQyxtQkFFUSxNQUFNLEtBQUssV0FBVyxJQUFJLE9BQU8sUUFBUTtBQUNyQyxZQUFJLFFBQVEsaUJBQWlCLFNBQVMsSUFBSSxVQUFVO0FBQUcsaUJBQU87QUFDOUQsZUFBTyxJQUFJLFNBQVMsT0FBTyxTQUE0QjtBQUFBLE1BQzNELENBQUMsSUFDRixhQUFhO0FBQUEsSUFDeEI7QUFHQSxRQUFJLENBQUMsV0FBVztBQUNaLFdBQUssTUFBTSxzQ0FBc0M7QUFDakQsYUFBTyxJQUFJLGFBQWEsTUFBTTtBQUFBLFFBQzFCO0FBQUEsUUFDQTtBQUFBLFFBQ0EsYUFBYSxRQUFRO0FBQUEsTUFDekIsQ0FBQztBQUFBLElBQ0w7QUFFQSxTQUFLLE1BQU0sa0NBQWtDLFVBQVUseUJBQXlCO0FBQ2hGLFVBQU0sTUFBTSxNQUFNLFVBQ2IsT0FBTyxPQUFPO0FBQUEsTUFDWCxNQUFNO0FBQUEsTUFDTixhQUFhLFFBQVE7QUFBQSxJQUN6QixDQUFDLEVBQ0EsTUFBTSxNQUFNLElBQUk7QUFFckIsUUFBSSxLQUFLO0FBQ0wsV0FBSyxNQUFNLGdDQUFnQztBQUMzQyxZQUFNQyxVQUFTLElBQUksYUFBYSxNQUFNO0FBQUEsUUFDbEM7QUFBQSxRQUNBO0FBQUEsUUFDQSxVQUFVLElBQUk7QUFBQSxRQUNkLFFBQVEsSUFBSTtBQUFBLFFBQ1o7QUFBQSxRQUNBLGFBQWEsUUFBUTtBQUFBLE1BQ3pCLENBQUM7QUFFRCxVQUFJLENBQUMsUUFBUSxhQUFhO0FBQ3RCLGFBQUssTUFBTSx5QkFBeUI7QUFDcEMsY0FBTSxLQUFLLFlBQVksUUFBUUEsT0FBTTtBQUFBLE1BQ3pDO0FBRUEsYUFBT0E7QUFBQSxJQUNYO0FBRUEsU0FBSyxNQUFNLCtFQUErRTtBQUMxRixVQUFNLFNBQVMsTUFBTSxLQUFLLFdBQVc7QUFBQSxNQUNqQyxPQUFPLFFBQ0gsQ0FBQyxRQUFRLGlCQUFpQixTQUFTLElBQUksVUFBVSxLQUNoRCxNQUFNLElBQUksU0FBUyxLQUFLLEtBQ3pCLElBQUksT0FBTyxPQUFPO0FBQUEsUUFDZCxNQUFNO0FBQUEsUUFDTixhQUFhLFFBQVE7QUFBQSxNQUN6QixDQUFDO0FBQUEsSUFDVDtBQUNBLFFBQUksQ0FBQyxRQUFRLFFBQVE7QUFDakIsV0FBSyxNQUFNLHdDQUF3QyxRQUFRLFVBQVUsY0FBYyxrQkFBa0I7QUFDckcsYUFBTyxJQUFJLGFBQWEsTUFBTTtBQUFBLFFBQzFCO0FBQUEsUUFDQTtBQUFBLFFBQ0EsYUFBYSxRQUFRO0FBQUEsUUFDckIsV0FBVyxRQUFRO0FBQUEsTUFDdkIsQ0FBQztBQUFBLElBQ0w7QUFFQSxTQUFLLE1BQU0sdUNBQXVDLE9BQU8sVUFBVSxhQUFhO0FBRWhGLFVBQU0sT0FBTyxJQUFJLGFBQWEsTUFBTTtBQUFBLE1BQ2hDO0FBQUEsTUFDQTtBQUFBLE1BQ0EsVUFBVSxPQUFPLE9BQU87QUFBQSxNQUN4QixRQUFRLE9BQU8sT0FBTztBQUFBLE1BQ3RCLFdBQVcsT0FBTztBQUFBLE1BQ2xCLGFBQWEsUUFBUTtBQUFBLElBQ3pCLENBQUM7QUFFRCxRQUFJLENBQUMsUUFBUSxhQUFhO0FBQ3RCLFdBQUssTUFBTSx5QkFBeUI7QUFDcEMsWUFBTSxLQUFLLFlBQVksUUFBUSxJQUFJO0FBQUEsSUFDdkM7QUFFQSxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBVU8sV0FBVztBQUNkLFVBQU0sT0FBTyxJQUFJLE9BQU8sRUFBRTtBQUMxQixVQUFNLGlCQUFhLHdDQUF5QjtBQUM1QyxVQUFNLGtCQUFrQixLQUFLLFdBQVcsTUFDbkMsSUFBSSxDQUFDLE1BQU07QUFDUixhQUFPLEVBQUU7QUFBQSxJQUNiLENBQUMsRUFDQSxLQUFLLElBQUk7QUFDZCxXQUFPLEdBQUc7QUFBQTtBQUFBLEVBQW1DLG1CQUFtQjtBQUFBLEVBQVc7QUFBQSxFQUMvRTtBQUFBLEVBRUEsRUFBUyxPQUFPLFlBQVk7QUFDeEIsV0FBTyxLQUFLLE1BQU0sTUFBTSxPQUFPO0FBQUEsRUFDbkM7QUFBQSxFQU1PLGVBQWUsTUFBd0I7QUFDMUMsV0FBTyxJQUFJLFNBQVMsTUFBTSxJQUFJO0FBQUEsRUFDbEM7QUFDSjtBQTFsQk8sSUFBTSxTQUFOO0FBQU07QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUpTLE9BS0ssZ0JBQWdCOzs7QUN4QjNCLElBQU0sWUFBWSw2QkFBTTtBQUMzQixTQUFPLFVBQVUsTUFBTSxLQUFLO0FBQ2hDLEdBRnlCO0FBSWxCLElBQU0sV0FBVyx3QkFBYyxTQUF5QjtBQUMzRCxRQUFNLFNBQVMsVUFBVTtBQUN6QixNQUFJLENBQUM7QUFBUSxXQUFPO0FBRXBCLFNBQVEsT0FBTyxNQUFNLFFBQVEsSUFBSSxLQUF1QjtBQUM1RCxHQUx3Qjs7O0FDSmpCLFNBQVMsV0FBMkIsTUFBc0I7QUFDN0QsUUFBTSxRQUFRLFNBQWUsSUFBSTtBQUNqQyxNQUFJLENBQUM7QUFBTyxXQUFPO0FBRW5CLFNBQU8sTUFBTTtBQUNqQjtBQUxnQjs7O0FDQVQsU0FBUyxVQUEwQixNQUFzQjtBQUM1RCxRQUFNLFFBQVEsU0FBZSxJQUFJO0FBQ2pDLE1BQUksQ0FBQztBQUFPLFdBQU87QUFFbkIsU0FBTyxNQUFNO0FBQ2pCO0FBTGdCOzs7QUNBVCxTQUFTLFNBQXlCLE1BQXNCO0FBQzNELFFBQU0sUUFBUSxTQUFlLElBQUk7QUFDakMsTUFBSSxDQUFDO0FBQU8sV0FBTztBQUVuQixTQUFPO0FBQ1g7QUFMZ0I7OztBQ0RULFNBQVMsa0JBQWtCO0FBQzlCLFNBQU8sVUFBVTtBQUNyQjtBQUZnQjs7O0FDSVQsU0FBUyxZQUF5QixNQUFzQjtBQUMzRCxRQUFNLFFBQVEsU0FBWSxJQUFJO0FBQzlCLFFBQU0sU0FBUyx3QkFBQyxhQUFpQztBQUM3QyxRQUFJLE9BQU87QUFDUCxVQUFJLFNBQVMsV0FBVyxRQUFRO0FBQUcsZUFBTyxNQUFNLFlBQVksU0FBUyxNQUFNLFFBQVEsQ0FBQztBQUNwRixhQUFPLE1BQU0sWUFBWSxRQUFRO0FBQUEsSUFDckM7QUFBQSxFQUNKLEdBTGU7QUFPZixRQUFNLFNBQVMsNkJBQU07QUFDakIsV0FBTyxPQUFPO0FBQUEsRUFDbEIsR0FGZTtBQUlmLFNBQU8sQ0FBQyxRQUFRLE1BQU07QUFDMUI7QUFkZ0I7OztBQ0NULFNBQVMsWUFBWSxNQUFzQixTQUE4QztBQUM1RixRQUFNLFFBQVEsU0FBUyxJQUFJO0FBQzNCLE1BQUksQ0FBQztBQUFPLFdBQU87QUFFbkIsU0FBTyxPQUFPLGtCQUFrQjtBQUFBLElBQzVCLElBQUksWUFBWTtBQUNaLGFBQU8sTUFBTSxLQUFLLGFBQWEsU0FBUyxhQUFhO0FBQUEsSUFDekQ7QUFBQSxJQUNBLElBQUksU0FBUztBQUNULGFBQU8sTUFBTSxLQUFLO0FBQUEsSUFDdEI7QUFBQSxJQUNBLElBQUksU0FBUztBQUNULGFBQU8sTUFBTSxLQUFLLFNBQVM7QUFBQSxJQUMvQjtBQUFBLElBQ0EsUUFBUTtBQUNKLGFBQU8sTUFBTSxLQUFLLE1BQU07QUFBQSxJQUM1QjtBQUFBLElBQ0EsU0FBUztBQUNMLGFBQU8sTUFBTSxLQUFLLE9BQU87QUFBQSxJQUM3QjtBQUFBLElBQ0EsVUFBVSxLQUFhO0FBQ25CLGFBQU8sTUFBTSxLQUFLLFVBQVUsR0FBRztBQUFBLElBQ25DO0FBQUEsSUFDQSxNQUFNLFlBQVksTUFBYztBQUM1QixhQUFPLE1BQU0sS0FBSyxLQUFLLElBQUk7QUFBQSxJQUMvQjtBQUFBLEVBQ0osQ0FBQztBQUNMO0FBM0JnQjs7O0FDSlQsU0FBUyxvQkFBb0IsU0FBcUM7QUFDckUsb0JBQWtCLEVBQUUsSUFBSSwwQkFBMEIsT0FBTztBQUM3RDtBQUZnQjs7O0FDQVQsU0FBUyxxQkFBcUIsU0FBc0M7QUFDdkUsb0JBQWtCLEVBQUUsSUFBSSwyQkFBMkIsT0FBTztBQUM5RDtBQUZnQjs7O0F2Q2VoQixJQUFBQyxvQkFXTztBQUNQLElBQUFDLGdCQUE4RTtBQUd2RSxJQUFNQyxXQUFrQjtBQUUvQixJQUFJLENBQUMsZ0JBQUFDLFFBQVcsV0FBVyxJQUFJLEdBQUc7QUFDOUIsVUFBUSxZQUFZLGVBQWUsZ0JBQUFBLGdEQUFtREQsNENBQTJDO0FBQ3JJOyIsCiAgIm5hbWVzIjogWyJ2ZXJzaW9uIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF92b2ljZSIsICJpbXBvcnRfdXRpbHMiLCAiUGxheWVyRXZlbnQiLCAiUXVldWVSZXBlYXRNb2RlIiwgImltcG9ydF9wcm9taXNlcyIsICJpbXBvcnRfZGlzY29yZCIsICJ3YWl0Rm9yIiwgIkd1aWxkUXVldWVFdmVudCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3ZvaWNlIiwgInByaXNtIiwgIkVycm9yU3RhdHVzQ29kZSIsICJpbXBvcnRfdm9pY2UiLCAiaW1wb3J0X3ZvaWNlIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZXF1YWxpemVyIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfdm9pY2UiLCAicmVzIiwgInJlc3VsdCIsICJpbXBvcnRfZXF1YWxpemVyIiwgImltcG9ydF92b2ljZSIsICJ2ZXJzaW9uIiwgImRqc1ZlcnNpb24iXQp9Cg==
|